mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
2132 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f5a96a15b | ||
|
|
840bdf95e3 | ||
|
|
01deb07ae9 | ||
|
|
6c37613bf0 | ||
|
|
188c7364f8 | ||
|
|
09ead55502 | ||
|
|
f7f9513fba | ||
|
|
dd2d2389c8 | ||
|
|
03b43a85c8 | ||
|
|
fb709e2e10 | ||
|
|
dad653492a | ||
|
|
0db133ffb2 | ||
|
|
6d1682911b | ||
|
|
d1de479c49 | ||
|
|
ad7e231f39 | ||
|
|
f36d239b85 | ||
|
|
540865d045 | ||
|
|
5ed0da7b08 | ||
|
|
e61be66d4f | ||
|
|
d263f0c91a | ||
|
|
fee0cebcec | ||
|
|
3745308642 | ||
|
|
8843fa3ed4 | ||
|
|
464d6e9ec4 | ||
|
|
8b9ad131d1 | ||
|
|
5ef944e8b8 | ||
|
|
53c3cb382c | ||
|
|
179c557e5b | ||
|
|
8da458e1a8 | ||
|
|
3eb3dd7d4b | ||
|
|
c9a1159a2e | ||
|
|
8664668524 | ||
|
|
3ba4cf699a | ||
|
|
8bc39ce44f | ||
|
|
2d03eae413 | ||
|
|
0d848b342f | ||
|
|
ad6030b0e8 | ||
|
|
bdb2a221a5 | ||
|
|
44f505e687 | ||
|
|
d931dacd47 | ||
|
|
1da425ae2f | ||
|
|
9ceea4ac81 | ||
|
|
a1010b8cf8 | ||
|
|
19a300a4ba | ||
|
|
1bc1803628 | ||
|
|
7fdead0100 | ||
|
|
3dcdc11c1b | ||
|
|
e8326529b5 | ||
|
|
2d5476f6c8 | ||
|
|
c7b4cf636f | ||
|
|
d81c796dc0 | ||
|
|
1a3680bba6 | ||
|
|
600bca149a | ||
|
|
3a56d632e1 | ||
|
|
7f3f0327c2 | ||
|
|
cc0c71b277 | ||
|
|
e5ce286c63 | ||
|
|
86a0cf9424 | ||
|
|
eaea6ac837 | ||
|
|
4efc3ff822 | ||
|
|
c22a6563d9 | ||
|
|
f9683efb74 | ||
|
|
08945923e6 | ||
|
|
4745c62853 | ||
|
|
7c593899e7 | ||
|
|
9151e7066a | ||
|
|
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 | ||
|
|
12c22d0311 | ||
|
|
d28f5e87c0 | ||
|
|
471fabfff5 | ||
|
|
2e1a6d9d43 | ||
|
|
d2d22e849e | ||
|
|
6c41bfa44d | ||
|
|
d54bcc85e7 | ||
|
|
6d94ddb114 | ||
|
|
7fd720bf39 | ||
|
|
e10558e444 | ||
|
|
7c48d5ee1f | ||
|
|
10ffd870e2 | ||
|
|
3a4ab156b0 | ||
|
|
651d863069 | ||
|
|
a3c595a4a9 | ||
|
|
7660714a9e | ||
|
|
71002dfb65 | ||
|
|
013cfdcdaf | ||
|
|
5ad6add91e | ||
|
|
2f5b49f4ae | ||
|
|
353479fe72 | ||
|
|
6f5c935837 | ||
|
|
1bf91d4281 | ||
|
|
8d2dd55c94 | ||
|
|
6a86e8ea97 | ||
|
|
a817d95d6c | ||
|
|
7cdb5ccba8 | ||
|
|
22b8d462c2 | ||
|
|
066052ddd2 | ||
|
|
d673010420 | ||
|
|
fffd1b986d | ||
|
|
dc852b6398 | ||
|
|
64471be009 | ||
|
|
d43ffe09b3 | ||
|
|
e0c1107a25 | ||
|
|
3475aefd04 | ||
|
|
4e4a18c71a | ||
|
|
9a2f2c1fb2 | ||
|
|
b2ee2cc7b8 | ||
|
|
ee0b4f96a8 | ||
|
|
665f9ee5b5 | ||
|
|
4eb8903bed | ||
|
|
d11b2f05bb | ||
|
|
11f7e6e1b4 | ||
|
|
72acbc567b | ||
|
|
1170ac6105 | ||
|
|
bdc724d548 | ||
|
|
74cd03de0b | ||
|
|
5e9bb67d10 | ||
|
|
e969172543 | ||
|
|
f570260dfe | ||
|
|
7ecf65551e | ||
|
|
fb6ec8aaa7 | ||
|
|
0ba6a7adf0 | ||
|
|
0019abe5e7 | ||
|
|
30d2883436 | ||
|
|
cc5881dca2 | ||
|
|
d17f5dfd9e | ||
|
|
4c037c644f | ||
|
|
a08f0da30d | ||
|
|
654cfd7a47 | ||
|
|
88e79cd3a8 | ||
|
|
4543c7a0b3 | ||
|
|
f5bc9735af | ||
|
|
107a27aa25 | ||
|
|
5c29ce0695 | ||
|
|
41e1b7bd4e | ||
|
|
462a570d3c | ||
|
|
7f1af4215a | ||
|
|
7a141a923c | ||
|
|
0db1d1c8ca | ||
|
|
201b0ba53c | ||
|
|
3e54d6651c | ||
|
|
6d770ab68f | ||
|
|
6ca149de1d | ||
|
|
2e76ce740e | ||
|
|
a664b9dd0c | ||
|
|
d49701f470 | ||
|
|
67fae52b32 | ||
|
|
bb9f6ff082 | ||
|
|
ad7fc977df | ||
|
|
0479a89982 | ||
|
|
d7b9791514 | ||
|
|
832d379ace | ||
|
|
b8f3078966 | ||
|
|
d496aaae55 | ||
|
|
87e60cfd78 | ||
|
|
2077fa3837 | ||
|
|
eaa03e15ed | ||
|
|
95bedf0bfc | ||
|
|
3a1b17f1f9 | ||
|
|
9fe9bf617f | ||
|
|
3c34da8bd3 | ||
|
|
9fa7adaa61 | ||
|
|
54a2f5347a | ||
|
|
a716d3ad49 | ||
|
|
8f70604466 | ||
|
|
2044e191a2 | ||
|
|
8fe9ec0521 | ||
|
|
034e510ba5 | ||
|
|
bdec1ac64d | ||
|
|
36a0d760e9 | ||
|
|
a901e85c3c | ||
|
|
6e9dc2339d | ||
|
|
3864e712ef | ||
|
|
8376f1e4a4 | ||
|
|
1b0fd752d3 | ||
|
|
bef473a48b | ||
|
|
0c60078d27 | ||
|
|
2f65462ce0 | ||
|
|
ace6156c65 | ||
|
|
ada8feba34 | ||
|
|
75d685a7f4 | ||
|
|
6b7f20323b | ||
|
|
c2ab5bc09d | ||
|
|
95d5b8bdbc | ||
|
|
da7b3182e8 | ||
|
|
08790f2f0a | ||
|
|
896270e617 | ||
|
|
fb40ee986f | ||
|
|
20b82e4bc9 | ||
|
|
513347911e | ||
|
|
1a3960e95d | ||
|
|
7d9a47b7c3 | ||
|
|
c80d085e33 | ||
|
|
98518e5c8c | ||
|
|
2b7a488d64 | ||
|
|
25aa6669be | ||
|
|
ef9e1c4e4f | ||
|
|
cf483c28e3 | ||
|
|
fecc39d97d | ||
|
|
339370a703 | ||
|
|
359e5157a8 | ||
|
|
207bd8d77c | ||
|
|
ba5454808e | ||
|
|
9196ba91bb | ||
|
|
5ff1b02e49 | ||
|
|
4f92d620eb | ||
|
|
e7f5779659 | ||
|
|
512cfc4858 | ||
|
|
437ba70b9e | ||
|
|
fadca563bc | ||
|
|
7a601b196e | ||
|
|
bf6bd246fd | ||
|
|
168ff4c050 | ||
|
|
d6fdbafa3c | ||
|
|
3e1570a716 | ||
|
|
160c0b4ac0 | ||
|
|
cf0bc3914f | ||
|
|
96154627d3 | ||
|
|
6f07b62a3f | ||
|
|
cae17b91b8 | ||
|
|
69b68f3a44 | ||
|
|
20a3e7e4b8 | ||
|
|
119a8fff1e | ||
|
|
8094b1bd92 | ||
|
|
98fc4d78aa | ||
|
|
d773c2e90d | ||
|
|
7929e7ab9c | ||
|
|
e8e95f113c | ||
|
|
429c791377 | ||
|
|
e536eea5b6 | ||
|
|
0a5b5eadeb | ||
|
|
12351d3a8a | ||
|
|
aa8eb955e9 | ||
|
|
8e52c18200 | ||
|
|
7421b2e553 | ||
|
|
8aa4dce6f4 | ||
|
|
feeceefe99 | ||
|
|
60483e3216 | ||
|
|
49837e0c20 | ||
|
|
c7668ad882 | ||
|
|
4f37563be1 | ||
|
|
e468723abc | ||
|
|
9c3ab95048 | ||
|
|
99bfde32a8 | ||
|
|
bf5651e127 | ||
|
|
f854a12043 | ||
|
|
dd09f02f53 | ||
|
|
268f43d668 | ||
|
|
d95b7504ab | ||
|
|
4d2b6ee99e | ||
|
|
6ad6984fe7 | ||
|
|
97d48a204a | ||
|
|
c6e8915627 | ||
|
|
496b3e5a78 | ||
|
|
01be9e68ee | ||
|
|
cc56ddb354 | ||
|
|
3ce527b0b9 | ||
|
|
94d4d92cc0 | ||
|
|
72b268b253 | ||
|
|
2c7885bbc1 | ||
|
|
36120a9122 | ||
|
|
6305ec3f31 | ||
|
|
b319731a2d | ||
|
|
885740dad6 | ||
|
|
b178268cbc | ||
|
|
3ae556893f | ||
|
|
43b297636d | ||
|
|
8cd17698fe | ||
|
|
3886c406ab | ||
|
|
b56671c20d | ||
|
|
f3cbad065f | ||
|
|
4b3b1a80f6 | ||
|
|
7abcc39c8c | ||
|
|
a5b915d571 | ||
|
|
0fcdca653a | ||
|
|
9ec801d495 | ||
|
|
4ccbdcb93c | ||
|
|
53f909f2a1 | ||
|
|
f8603705a8 | ||
|
|
3bc1b97a68 | ||
|
|
27ed17e62e | ||
|
|
f3d5090d51 | ||
|
|
d030f9be99 | ||
|
|
774d18ed8f | ||
|
|
d39f5eedf1 | ||
|
|
1a1e21f344 | ||
|
|
96c7bc30d8 | ||
|
|
0328b1cb3c | ||
|
|
ad0cc7f39d | ||
|
|
42a491ab8b | ||
|
|
ef4b25591b | ||
|
|
fbc99cf7e6 | ||
|
|
5d0e9484ce | ||
|
|
1bc6a6dfe5 | ||
|
|
30be3265fb | ||
|
|
ecaad7979f | ||
|
|
d638edbeae | ||
|
|
91779b6de9 | ||
|
|
3abb0e80d5 | ||
|
|
f4c1cc576b | ||
|
|
986235dce7 | ||
|
|
1f0c88a934 | ||
|
|
94f7dd2238 | ||
|
|
79fd12eb75 | ||
|
|
05a98be1e5 | ||
|
|
24eb1d3fe2 | ||
|
|
75d1bcdc69 | ||
|
|
7549eff9c1 | ||
|
|
6e2b4f7514 | ||
|
|
846cff5721 | ||
|
|
efd25ec4d2 | ||
|
|
5c94b50386 | ||
|
|
c0fbc9ef8c | ||
|
|
1f429fb488 | ||
|
|
ec28ea299f | ||
|
|
08558aa118 | ||
|
|
7e319b797f | ||
|
|
3957a11f25 | ||
|
|
743922d45a | ||
|
|
5f70776cf3 | ||
|
|
289f91997c | ||
|
|
163ea9ecdd | ||
|
|
9be941acc8 | ||
|
|
e95314f072 | ||
|
|
6fef6b578a | ||
|
|
dd59814563 | ||
|
|
b704b20695 | ||
|
|
71885b8a79 | ||
|
|
59a6963a89 | ||
|
|
6e9dfdff30 | ||
|
|
470419d732 | ||
|
|
5b05653881 | ||
|
|
899dc07883 | ||
|
|
83dfd408e9 | ||
|
|
417171cfe1 | ||
|
|
e8e82a1ca3 | ||
|
|
6843aa7cc8 | ||
|
|
952acc983d | ||
|
|
650f267be7 | ||
|
|
3ace4c57f7 | ||
|
|
ab1b603c78 | ||
|
|
8430f694e5 | ||
|
|
71f0cafc78 | ||
|
|
4614287a55 | ||
|
|
f477f811df | ||
|
|
95bb5a1ae4 | ||
|
|
70699037ae | ||
|
|
7edddec920 | ||
|
|
8f3779c94c | ||
|
|
917bc48348 | ||
|
|
581dc36c47 | ||
|
|
a4286ba950 | ||
|
|
5fa85f268f | ||
|
|
ada6f6882a | ||
|
|
78a0030d46 | ||
|
|
e2d6aecd81 | ||
|
|
a2e99e8ddb | ||
|
|
b499a074cf | ||
|
|
188e579df7 | ||
|
|
d82e4801ff | ||
|
|
d258d146b8 | ||
|
|
96e6b3f53e | ||
|
|
ae6b0f0d40 | ||
|
|
2c2c4740a8 | ||
|
|
14740e8a89 | ||
|
|
b357257f4d | ||
|
|
4428e62b99 | ||
|
|
575ad0d8a2 | ||
|
|
5ad9deb199 | ||
|
|
e99f6edb56 | ||
|
|
3149d1232b | ||
|
|
3c6218f20e | ||
|
|
68f04a50aa | ||
|
|
ec01672f6c | ||
|
|
be6b1bb3ee | ||
|
|
6f4557a103 | ||
|
|
dc96f62f9e | ||
|
|
2f86bd8bda | ||
|
|
fbe43b61d4 | ||
|
|
546d4163a9 | ||
|
|
55132f2955 | ||
|
|
ebdd2d4a23 | ||
|
|
4c63827517 | ||
|
|
401067f637 | ||
|
|
8e6609c192 | ||
|
|
1f1ffcbfa6 | ||
|
|
065dd713c1 | ||
|
|
71132d48ff | ||
|
|
d77e0c62c1 | ||
|
|
e853c36039 | ||
|
|
2be3220824 | ||
|
|
6ae39e50ae | ||
|
|
c783acc973 | ||
|
|
e5210b5137 | ||
|
|
41f0950c04 | ||
|
|
9f439cd7fb | ||
|
|
c911c5c045 | ||
|
|
27a7873e08 | ||
|
|
5fe233384e | ||
|
|
d42ad45423 | ||
|
|
84235478ef | ||
|
|
509b35a19f | ||
|
|
65296e86a3 | ||
|
|
c9b7bb73b9 | ||
|
|
795f42cbaa | ||
|
|
d540ec0cb8 | ||
|
|
202cba1a14 | ||
|
|
20d5b81085 | ||
|
|
d8b806592d | ||
|
|
84f9b83fc2 | ||
|
|
7cb5106656 | ||
|
|
6f21df7624 | ||
|
|
4c7dc565e7 | ||
|
|
3c60fba430 | ||
|
|
224eef9ffa | ||
|
|
42beadcf34 | ||
|
|
80ed2d6d30 | ||
|
|
c2bf6fe7f5 | ||
|
|
084a9ab976 | ||
|
|
356b942114 | ||
|
|
2c5d720146 | ||
|
|
64f83eee07 | ||
|
|
542cf9c52b | ||
|
|
0bbccc1bc1 | ||
|
|
6f014f8638 | ||
|
|
66ca5aca89 | ||
|
|
33afa30c30 | ||
|
|
1634d787ec | ||
|
|
df7b529e23 | ||
|
|
56d90bedd0 | ||
|
|
8369d253f8 | ||
|
|
516d3e226c | ||
|
|
f4208cb27d | ||
|
|
47b785a8fd | ||
|
|
6a2bf3fd2f | ||
|
|
ff678642e6 | ||
|
|
e3eb1b90c5 | ||
|
|
49125f077c | ||
|
|
324031cb68 | ||
|
|
f2ab426d38 | ||
|
|
587ab35d65 | ||
|
|
16a6dda3dd | ||
|
|
034137f533 | ||
|
|
6f75e18bfa | ||
|
|
15191b068d | ||
|
|
ee9cc24e52 | ||
|
|
0584fbf42b | ||
|
|
f5f9ccee7f | ||
|
|
0d183e2e89 | ||
|
|
b9eacfefc8 | ||
|
|
0239127db4 | ||
|
|
281d1ea91c | ||
|
|
df92ecaa55 | ||
|
|
60d40c8ad8 | ||
|
|
f428c561c9 | ||
|
|
8fbb7a1d93 | ||
|
|
e98223b2b3 | ||
|
|
410fe2843d | ||
|
|
dc8d69e0f4 | ||
|
|
a056765e38 | ||
|
|
97cd1e3886 | ||
|
|
4e7da98bfa | ||
|
|
0a56f5282d | ||
|
|
04b9ca2fd4 | ||
|
|
ddbe3df6de | ||
|
|
ab5c88a7f3 | ||
|
|
4046a0efe9 | ||
|
|
5aefc7cdff | ||
|
|
70eb779ce5 | ||
|
|
39f5d28348 | ||
|
|
e70407f16b | ||
|
|
c25475296d | ||
|
|
1363af0317 | ||
|
|
e97b7454e9 | ||
|
|
2418356eff | ||
|
|
735caa03b1 | ||
|
|
f577aece08 | ||
|
|
b7f1bfdb92 | ||
|
|
b5301e280b | ||
|
|
741816db52 | ||
|
|
546a6e2a68 | ||
|
|
1be5e8c63e | ||
|
|
917a25317a | ||
|
|
949167e6ad | ||
|
|
a359905a06 | ||
|
|
4ce606306d | ||
|
|
707fcd29ea | ||
|
|
970cbe35b8 | ||
|
|
fa9e8aa5c0 | ||
|
|
a5e6d37049 | ||
|
|
dacac135fb | ||
|
|
0ddf0d5d0d | ||
|
|
90a5251fa7 | ||
|
|
a97c69e06f | ||
|
|
a323eb43ed | ||
|
|
79243b77fd | ||
|
|
5ab2720ddc | ||
|
|
c72a49b77f | ||
|
|
a0d92b80df | ||
|
|
1a32a6252b | ||
|
|
6df7cbaf6e | ||
|
|
0a90cd3a0a | ||
|
|
c529939481 | ||
|
|
db70630eaa | ||
|
|
24862d9759 | ||
|
|
cb5f2685cd | ||
|
|
baa298873a | ||
|
|
a8f57d37bf | ||
|
|
d97ee52f4e | ||
|
|
1cfdb6decd | ||
|
|
f93272f0bd | ||
|
|
e783e953d9 | ||
|
|
39cac919c7 | ||
|
|
fec82173d9 | ||
|
|
35efed73d4 | ||
|
|
21b8e16afc | ||
|
|
6efee51101 | ||
|
|
1490425ecb | ||
|
|
afac6a918d | ||
|
|
bf0e488c06 | ||
|
|
37c2bee3ae | ||
|
|
4debcabb88 | ||
|
|
5a0c637ad0 | ||
|
|
d91215680a | ||
|
|
0cbcbd4614 | ||
|
|
19135f08c3 | ||
|
|
855cc52f0f | ||
|
|
4e5da23474 | ||
|
|
3cca4ec0ac | ||
|
|
e393f7feb4 | ||
|
|
b76ac7bab0 | ||
|
|
a3c842ba18 | ||
|
|
1640370c9d | ||
|
|
b6427fa05a | ||
|
|
2a04d854cc | ||
|
|
6d190d7d7c | ||
|
|
b8a2bd595a | ||
|
|
8b7d5546f7 | ||
|
|
b63423ce37 | ||
|
|
0b02b68538 | ||
|
|
bbd1646ae5 | ||
|
|
299a9c7bc9 | ||
|
|
37f8d5b5e1 | ||
|
|
2a6a59c047 | ||
|
|
c4da2dd557 | ||
|
|
583392d179 | ||
|
|
1488796779 | ||
|
|
7458a2f9ff | ||
|
|
348dab4b9f | ||
|
|
5c824e0771 | ||
|
|
b9c88a758c | ||
|
|
a51d637e58 | ||
|
|
d002dfa70c | ||
|
|
d118017d27 | ||
|
|
d10d328eb1 | ||
|
|
e472d7b8b1 | ||
|
|
a54d6f3a8a | ||
|
|
67ccb24b41 | ||
|
|
42ff3f58d9 | ||
|
|
ad778571a2 | ||
|
|
bb12b86445 | ||
|
|
ab61b06c34 | ||
|
|
de6b2f3307 | ||
|
|
5fd56c75d5 | ||
|
|
6aa70a3e93 | ||
|
|
93186947c2 | ||
|
|
77444284e3 | ||
|
|
6950b028df | ||
|
|
565767ef42 | ||
|
|
a1f26d64d5 | ||
|
|
be30e1c658 | ||
|
|
3aec4dd2ea | ||
|
|
ed34caa565 | ||
|
|
81b8c57bae | ||
|
|
0780b7239a | ||
|
|
1d626f7378 | ||
|
|
ff3438b810 | ||
|
|
1762c2cefd | ||
|
|
7aaf99c9b1 | ||
|
|
07cd9aa994 | ||
|
|
6ae4aa50e2 | ||
|
|
22fbcc244b | ||
|
|
1a3177409c | ||
|
|
de4b538d82 | ||
|
|
70b1ec97db | ||
|
|
a97e328484 | ||
|
|
e446b86b90 | ||
|
|
901e8da911 | ||
|
|
e9036d675e | ||
|
|
351e348ac0 | ||
|
|
feea9bfd30 | ||
|
|
f1282b857d | ||
|
|
70e0ce1d73 | ||
|
|
a5673e7fb6 | ||
|
|
d06529fd14 | ||
|
|
a02f19f5a3 | ||
|
|
a9a62fff15 | ||
|
|
7625c92307 | ||
|
|
7dd318ca76 | ||
|
|
e5bc2845cd | ||
|
|
4ddd8d9d2b | ||
|
|
37ffdb9020 | ||
|
|
39037d5bfb | ||
|
|
31d882b07e | ||
|
|
fd9275b213 | ||
|
|
cfa63cff35 | ||
|
|
5e6fd11cc2 | ||
|
|
62a8b52df4 | ||
|
|
783670095c | ||
|
|
23cfa86f93 | ||
|
|
dce00d01d9 | ||
|
|
768ec76ff0 | ||
|
|
211cb9567a | ||
|
|
1e68a45515 | ||
|
|
72c00f869c | ||
|
|
c76137efc0 | ||
|
|
88f196e4d4 | ||
|
|
4fe5980065 | ||
|
|
7c7b1fb9c4 | ||
|
|
ed3d38cf05 | ||
|
|
837e9a6325 | ||
|
|
1364e9be51 | ||
|
|
2fbfaf448d | ||
|
|
bf82caccfc | ||
|
|
325dbc8e16 | ||
|
|
bd2fb0af51 | ||
|
|
3c904dff61 | ||
|
|
9b22b2973f | ||
|
|
025bb35ac7 | ||
|
|
7fb5d0cadd | ||
|
|
8157c6f56b | ||
|
|
0154c21c3d | ||
|
|
8c841903a5 | ||
|
|
648596dbb2 | ||
|
|
212c74d8a3 | ||
|
|
4495e15fa7 | ||
|
|
da96e11b37 | ||
|
|
b7a9843770 | ||
|
|
55432774c7 | ||
|
|
ca76802ee4 | ||
|
|
cec54837bc | ||
|
|
e0c35b0665 | ||
|
|
865980b8f7 | ||
|
|
9367a4797f | ||
|
|
4ed58c743d | ||
|
|
cfd95360cb | ||
|
|
22144e79d3 | ||
|
|
3acbf06beb | ||
|
|
7b41346db8 | ||
|
|
878b321b89 | ||
|
|
a903123cb8 | ||
|
|
577fb95384 | ||
|
|
770a1d4553 | ||
|
|
c038b51941 | ||
|
|
4bebcef6ef | ||
|
|
d4888098e5 | ||
|
|
a349daeaeb | ||
|
|
b8685103d0 | ||
|
|
26d789612b | ||
|
|
7a57a0b594 | ||
|
|
66eabd8bdc | ||
|
|
be82b55408 | ||
|
|
526ca1761a | ||
|
|
10de952ed6 | ||
|
|
2517650ecb | ||
|
|
47b739527a | ||
|
|
8655d966ad | ||
|
|
3fb4973aab | ||
|
|
1d4149168d | ||
|
|
26ab33754f | ||
|
|
88f08803ee | ||
|
|
c05717d15c | ||
|
|
bc66f558b9 | ||
|
|
71e1bd9af2 | ||
|
|
57b0739219 | ||
|
|
d60241cc86 | ||
|
|
d725e8e385 | ||
|
|
034cb25099 | ||
|
|
fbc0947420 | ||
|
|
9020d7c044 | ||
|
|
ffe2ccf1f6 | ||
|
|
434ab9f2c0 | ||
|
|
cd3defda42 | ||
|
|
fd85f7f112 | ||
|
|
e42ccf0d82 | ||
|
|
bf4baff363 | ||
|
|
c1a9737313 | ||
|
|
a4081498f8 | ||
|
|
9efd923382 | ||
|
|
b16149d641 | ||
|
|
2d940e72c2 | ||
|
|
9f103abfb5 | ||
|
|
689a209ed9 | ||
|
|
d91a451fc7 | ||
|
|
1ae4672230 | ||
|
|
3edf5fd770 | ||
|
|
412af86cb8 | ||
|
|
5b41ab4774 | ||
|
|
06c0cb916b | ||
|
|
b3a49ce627 | ||
|
|
0651568bfb | ||
|
|
ce31e23006 | ||
|
|
7ccd8caf71 | ||
|
|
598a7028ea | ||
|
|
4ed1efe9ce | ||
|
|
6a4bf3fa65 | ||
|
|
5b2b3a2b53 | ||
|
|
596cd9368f | ||
|
|
f8d50faedb | ||
|
|
ccc9c197ae | ||
|
|
ed2dcc35e8 | ||
|
|
c5a654e692 | ||
|
|
3ac69ed4e0 | ||
|
|
208a3ff480 | ||
|
|
6739a1471b | ||
|
|
230d91ecd8 | ||
|
|
8de2cd15ed | ||
|
|
4603f3b2e7 | ||
|
|
9d6b8b4715 | ||
|
|
7cbc4bc144 | ||
|
|
d239e71826 | ||
|
|
ecaa2a41c9 | ||
|
|
fc71805489 | ||
|
|
74d94781cb | ||
|
|
897c2c5ab6 | ||
|
|
b556425037 | ||
|
|
6131d17c02 | ||
|
|
875b3157bf | ||
|
|
4ce9048f8d | ||
|
|
04f1b1df48 | ||
|
|
f9c36345c3 | ||
|
|
ec3967d080 | ||
|
|
05a88b5b7e | ||
|
|
b6b2cf04a7 | ||
|
|
49247e9ec2 | ||
|
|
6629b75aa6 | ||
|
|
e702b453ec | ||
|
|
38190d92fc | ||
|
|
109ca5735b | ||
|
|
4dde499f51 | ||
|
|
5fd18a215e | ||
|
|
b283548c0f | ||
|
|
2352ce77c9 | ||
|
|
2054afc741 | ||
|
|
9d3b9964b5 | ||
|
|
79c1d21a0f | ||
|
|
1d69228872 | ||
|
|
f5953a09da | ||
|
|
a17f6c8ae1 | ||
|
|
f9ad5dda56 | ||
|
|
ff6a10698e | ||
|
|
6072a63f99 | ||
|
|
1bd935b2b4 | ||
|
|
9823af0cb4 | ||
|
|
45384bd498 | ||
|
|
56bfde998b | ||
|
|
870feb8592 | ||
|
|
2670e2b035 | ||
|
|
eccea65641 | ||
|
|
231ad86176 | ||
|
|
9658b02502 | ||
|
|
30c6b6e5a1 | ||
|
|
b44e58dd7f | ||
|
|
bce31e8b51 | ||
|
|
011c654c2a | ||
|
|
2457b52658 | ||
|
|
a3adaa6a7b | ||
|
|
a6f168d1ac | ||
|
|
f792029a20 | ||
|
|
2a5dd5b224 | ||
|
|
fb7dcfd62d | ||
|
|
245a1a92cf | ||
|
|
aa7ab2065b | ||
|
|
719f6e876b | ||
|
|
8724dc8ccc | ||
|
|
63f9d0bdeb | ||
|
|
d7fd12cb32 | ||
|
|
850ab6dedb | ||
|
|
b20fa497b9 | ||
|
|
1abc7ee2ef | ||
|
|
d7a032afcd | ||
|
|
587c764950 | ||
|
|
1abbcb6435 | ||
|
|
17f3d7005a | ||
|
|
ac59620728 | ||
|
|
ba8b55391d | ||
|
|
03c1e725ce | ||
|
|
4cefaf2808 | ||
|
|
757801e32f | ||
|
|
749ea2a580 | ||
|
|
dc373fb51f | ||
|
|
0443c4db2d | ||
|
|
d699ba3a98 | ||
|
|
92d2782ceb | ||
|
|
e76ebb1a74 | ||
|
|
cacde403c0 | ||
|
|
906b0ee30e | ||
|
|
cd7549390e | ||
|
|
f30cab30f4 | ||
|
|
1356d4e579 | ||
|
|
63c83d014b | ||
|
|
b8e426d3a3 | ||
|
|
c5344da2ba | ||
|
|
7606a70bb8 | ||
|
|
7d850d7c09 | ||
|
|
c1b704075e | ||
|
|
07a6411a75 | ||
|
|
b32bc5ef47 | ||
|
|
6c106b88c0 | ||
|
|
f2c9581bac | ||
|
|
c46667581d | ||
|
|
59e5ba351c | ||
|
|
a8a710f863 | ||
|
|
f603b731a9 | ||
|
|
3ca872cea8 | ||
|
|
970953ca12 | ||
|
|
7cf6372519 | ||
|
|
1d381233e0 | ||
|
|
6f0c24b90b | ||
|
|
f29c172267 | ||
|
|
e9c5598254 | ||
|
|
dd5728a441 | ||
|
|
ec1d77c32e | ||
|
|
40887930f9 | ||
|
|
6bf8243014 | ||
|
|
419805ce9f | ||
|
|
81089416a2 | ||
|
|
efc7799960 | ||
|
|
7702583314 | ||
|
|
fcbef97e39 | ||
|
|
8beef260da | ||
|
|
618a5b62ee | ||
|
|
c579924485 | ||
|
|
9b9fadfa19 | ||
|
|
daf64010f9 | ||
|
|
f0bd24f810 | ||
|
|
5969a8b679 | ||
|
|
6b3ba29558 | ||
|
|
f217047ac0 | ||
|
|
935c852364 | ||
|
|
9e28965259 | ||
|
|
a829f3143a | ||
|
|
3fc01d09ce | ||
|
|
a4ae90e2e9 | ||
|
|
4928828874 | ||
|
|
af90ac3758 | ||
|
|
d4e6798ba8 | ||
|
|
03b250990d | ||
|
|
5bc0ce0888 | ||
|
|
a0bbf7df6f | ||
|
|
6b90f22cef | ||
|
|
d290576543 | ||
|
|
75871e52ea | ||
|
|
b40459335b | ||
|
|
51b16ca965 | ||
|
|
5dafa937de | ||
|
|
2307c2e9fc | ||
|
|
d12aff9776 | ||
|
|
fcd26da282 | ||
|
|
4a10b27611 | ||
|
|
201fe54b0c | ||
|
|
1618a3b02a | ||
|
|
3be97ccaa3 | ||
|
|
879e4977e4 | ||
|
|
613b71719f | ||
|
|
2870f6d038 | ||
|
|
046fb18980 | ||
|
|
d133d9eccb | ||
|
|
296473507f | ||
|
|
ff8821080a | ||
|
|
9acf41b0fe | ||
|
|
9c64f72f35 | ||
|
|
9385e70d2d | ||
|
|
9469e188c8 | ||
|
|
6e57ca6fbc | ||
|
|
d5e3ebaef3 | ||
|
|
a9eac8a832 | ||
|
|
1c7f5368cf | ||
|
|
960ff73c7f | ||
|
|
95777055d1 | ||
|
|
e1ce30c3ce | ||
|
|
89b442c751 | ||
|
|
6b41059cdf | ||
|
|
62cb42eee5 | ||
|
|
6bbb56db00 | ||
|
|
160598b9ef | ||
|
|
32b07a4e10 | ||
|
|
8890c57681 | ||
|
|
de188126fb | ||
|
|
97a1adcef1 | ||
|
|
ffbe95d6e5 | ||
|
|
d54f86ae58 | ||
|
|
92ace440b9 | ||
|
|
d5ee477d3b | ||
|
|
6e8152c423 | ||
|
|
8149356668 | ||
|
|
806e30d70f | ||
|
|
299ec8f8ea | ||
|
|
f6fbd18bd5 | ||
|
|
ecd30d3ccf | ||
|
|
228d89649a | ||
|
|
751360ecf1 | ||
|
|
d9ed216092 | ||
|
|
18a3ef9e5e | ||
|
|
33d75d9623 | ||
|
|
a0cc2c4c86 | ||
|
|
754bc4ef6d | ||
|
|
df55043500 | ||
|
|
f22524a615 | ||
|
|
1831390429 | ||
|
|
f4c7661cc6 | ||
|
|
0ab88919c9 | ||
|
|
9107d3c243 | ||
|
|
42e9131b4f | ||
|
|
e7b670c5de | ||
|
|
114fabd29a | ||
|
|
0946791434 | ||
|
|
06bcdba9c4 | ||
|
|
729a174eb6 | ||
|
|
1dbbcb73e7 | ||
|
|
74fa4b9b75 | ||
|
|
87df17309c | ||
|
|
815337299a | ||
|
|
fd32938cd8 | ||
|
|
8d7b4f81b4 | ||
|
|
f2cd75332c | ||
|
|
2cd7579e21 | ||
|
|
d9daae176e | ||
|
|
20814ec533 | ||
|
|
9d8ab16a38 | ||
|
|
49c2793bf5 | ||
|
|
b5cacbba9f | ||
|
|
20aee11cea | ||
|
|
2bc546eadf | ||
|
|
9e50e188a8 | ||
|
|
e8cf750e18 | ||
|
|
5ffc4c0158 | ||
|
|
21f56744d4 | ||
|
|
02aeb4f895 | ||
|
|
f9de16fbd2 | ||
|
|
abe002f30c | ||
|
|
e5ae6fb00d | ||
|
|
a0a8dd8897 | ||
|
|
e00f073726 | ||
|
|
1a9ee8e187 | ||
|
|
0c05a6c3ac | ||
|
|
213fce00e0 | ||
|
|
380739b209 | ||
|
|
36322f8ac0 | ||
|
|
57d1ec7733 | ||
|
|
648c6d4547 | ||
|
|
6ab5870b59 | ||
|
|
7dbe2bb774 | ||
|
|
163a039e0d | ||
|
|
9595e2ba7e | ||
|
|
d4d6ef314d | ||
|
|
322b21e0d0 | ||
|
|
a696e3a7a2 | ||
|
|
ebabcfc84f | ||
|
|
8336dc33e4 | ||
|
|
5f22bf225c | ||
|
|
8eee8ad9cf | ||
|
|
24743985e4 | ||
|
|
94fba197d1 | ||
|
|
3504a36c3e | ||
|
|
c8038d1c80 | ||
|
|
8ba8b48caf | ||
|
|
92d0c1f3b7 | ||
|
|
d4186bd34a | ||
|
|
008ba9e23f | ||
|
|
fd707ddf7e | ||
|
|
32de8a4d19 | ||
|
|
cf9998f3e4 | ||
|
|
f258e4940d | ||
|
|
a7b8e38bf3 | ||
|
|
89320b1ca4 | ||
|
|
b65129a8e1 | ||
|
|
b6a9993c97 | ||
|
|
9c044c5bd0 | ||
|
|
6b0783936f | ||
|
|
2a66b754c2 | ||
|
|
460443b3c8 | ||
|
|
cd99ab2d6e | ||
|
|
b2cb74cabf | ||
|
|
6d07302963 | ||
|
|
d831205f6a | ||
|
|
a9b9e6216b | ||
|
|
3ba090de7e | ||
|
|
c105208481 | ||
|
|
0c9e14eeff | ||
|
|
2a8a5cdca9 | ||
|
|
1f91acbd9d | ||
|
|
6f8278aa79 | ||
|
|
3e48a84cf1 | ||
|
|
31728a3a78 | ||
|
|
e56a2ed6ad | ||
|
|
35aa57657b | ||
|
|
423c8865bd | ||
|
|
55ecc5f7eb | ||
|
|
6aae7882df | ||
|
|
240fcec3ce | ||
|
|
170c1d4ee8 | ||
|
|
38f0a71ea3 | ||
|
|
62936dc6b5 | ||
|
|
fb9c784f4f | ||
|
|
89477ed2fa | ||
|
|
844679dcbe | ||
|
|
cd743332f4 | ||
|
|
47843e7e78 | ||
|
|
85957ecf56 | ||
|
|
4232b04571 | ||
|
|
34f717526a | ||
|
|
b0b94182a2 | ||
|
|
843e196f00 | ||
|
|
63661dfc6e | ||
|
|
f100dc91c2 | ||
|
|
fd9d63d605 | ||
|
|
5c21c35875 | ||
|
|
370d55fd74 | ||
|
|
0fcc26f778 | ||
|
|
8dd2ddcbf7 | ||
|
|
037857623d | ||
|
|
d7b19d577b | ||
|
|
c70048a3e2 | ||
|
|
a1884ca261 | ||
|
|
e452291314 | ||
|
|
6d51117a91 | ||
|
|
848a1cc1e5 | ||
|
|
9092dfdc7f | ||
|
|
d7fe0cc5c7 | ||
|
|
15ec37d4bc | ||
|
|
43cc701ac3 | ||
|
|
7cb8357f73 | ||
|
|
4b46bcf649 | ||
|
|
a954a6465e | ||
|
|
afb6041104 | ||
|
|
4b28fdbc4d | ||
|
|
b8a5e8505a | ||
|
|
3087d640a3 | ||
|
|
e87b89ab5b | ||
|
|
7aabc6a5ad | ||
|
|
5cc053694a | ||
|
|
653314448c | ||
|
|
4f14db10ea | ||
|
|
98e348ba5f | ||
|
|
a69b20c1a4 | ||
|
|
9275e5240f | ||
|
|
7dcc3b3edf | ||
|
|
6e872c11b6 | ||
|
|
e5b6001759 | ||
|
|
769f1b8658 | ||
|
|
5814b61356 | ||
|
|
8a6d7f67ed | ||
|
|
bcb016a938 | ||
|
|
065c6c02a8 | ||
|
|
f7386fcd72 | ||
|
|
df703ef997 | ||
|
|
9f6c421d91 | ||
|
|
91370ae955 | ||
|
|
ffc0be191e | ||
|
|
6e9f6da2a2 | ||
|
|
48f2949d69 | ||
|
|
baa3cba0fc | ||
|
|
eb54a92328 | ||
|
|
ce1e2441f4 | ||
|
|
c8cb7b7cab | ||
|
|
7baa130d8d | ||
|
|
332d97b57f | ||
|
|
9c0dbdd48e | ||
|
|
bec0052065 | ||
|
|
5010f32421 | ||
|
|
ded4672ccc | ||
|
|
03bb48cf28 | ||
|
|
e71eefe8fc | ||
|
|
c203781e1b | ||
|
|
7a2be16d77 | ||
|
|
77126e9e17 | ||
|
|
d1d5c61df5 | ||
|
|
09323c8bbc | ||
|
|
ac9f82544a | ||
|
|
2e4e602787 | ||
|
|
9d0ba5801b | ||
|
|
0cd7d85ec4 | ||
|
|
b0f674e511 | ||
|
|
2b411aad90 | ||
|
|
1c6483a499 | ||
|
|
6edf4498ce | ||
|
|
b160a39678 | ||
|
|
86b4de89bd | ||
|
|
a35d9a8d29 | ||
|
|
8012876d5e | ||
|
|
2e3e8c5b89 | ||
|
|
5284608942 | ||
|
|
ea2c7d8b27 | ||
|
|
b0db064d09 | ||
|
|
3ff1e38f6c | ||
|
|
b533b682d5 | ||
|
|
7b44baa417 | ||
|
|
f3d654a965 | ||
|
|
2e6aae0256 | ||
|
|
f59cf24a82 | ||
|
|
f87436d499 | ||
|
|
178d4756ef | ||
|
|
5152bd7124 | ||
|
|
b5015b6cc7 | ||
|
|
097900a327 | ||
|
|
1d2a6c38c7 | ||
|
|
cc87ceb0d5 | ||
|
|
a38f77683b | ||
|
|
d8da05cde2 | ||
|
|
554b5bfe7f | ||
|
|
86aa4c3f3d | ||
|
|
19b8721225 | ||
|
|
0cb1ebc41e | ||
|
|
c7c4883f49 | ||
|
|
d8b4d4639c | ||
|
|
ebe45e6f37 | ||
|
|
cb016f8439 | ||
|
|
92212d2652 | ||
|
|
950882be78 | ||
|
|
036855072e | ||
|
|
29bbf50900 | ||
|
|
ca59303dba | ||
|
|
e21f35039b | ||
|
|
f2b377fae8 | ||
|
|
24a36bf4bb | ||
|
|
3284450dc4 | ||
|
|
ea9d326819 | ||
|
|
12b78c5357 | ||
|
|
4cc679c1e5 | ||
|
|
c49ce55714 | ||
|
|
9d4b5416a5 | ||
|
|
e70cd33323 | ||
|
|
5a59ecbc2a | ||
|
|
82285df54b | ||
|
|
302af86363 | ||
|
|
e67c1789b8 | ||
|
|
015af19eaf | ||
|
|
156985ed52 | ||
|
|
71d1bd75c0 | ||
|
|
8e7c9c4bc4 | ||
|
|
7b7236fe30 | ||
|
|
55d997f43a | ||
|
|
1829b38339 | ||
|
|
e4c28e12cf | ||
|
|
066cf45f4a | ||
|
|
ac32b09a6b | ||
|
|
92296f4b4b | ||
|
|
3b4d2499eb | ||
|
|
f38e15790e | ||
|
|
b67c2bc2b2 | ||
|
|
393c9b759e | ||
|
|
54a7cf6785 | ||
|
|
2c5e8c4308 | ||
|
|
506b75c5e8 | ||
|
|
1cf7a6389c | ||
|
|
c204d7c297 | ||
|
|
5932f5f273 | ||
|
|
98977c87db | ||
|
|
ff457af2d4 | ||
|
|
0e86ab9044 | ||
|
|
3d39e842ec | ||
|
|
16c1aa2845 | ||
|
|
d0cf883558 | ||
|
|
64e4830aad | ||
|
|
0c47f2af75 | ||
|
|
14c5d8c95a | ||
|
|
6850499056 | ||
|
|
9288f784a1 | ||
|
|
dab75f6f97 | ||
|
|
af4b64070f | ||
|
|
29d8e58d69 | ||
|
|
4a017d9033 | ||
|
|
6f896d988f | ||
|
|
35a9d241fc | ||
|
|
9ba0a7db64 | ||
|
|
9968503872 | ||
|
|
34218c5f58 | ||
|
|
ebd41f1f20 | ||
|
|
62b1816297 | ||
|
|
2dfb864e4e | ||
|
|
2d1e1d4747 | ||
|
|
f785aa0ae2 | ||
|
|
cc476e212e | ||
|
|
bca9716fc6 | ||
|
|
fae6dbfebd | ||
|
|
a7a0800b46 | ||
|
|
305293d3e5 | ||
|
|
17d4eb7a5e | ||
|
|
f97e103b6d | ||
|
|
44eebde394 | ||
|
|
498c102414 | ||
|
|
79cd77454b | ||
|
|
dafca264b2 | ||
|
|
be970e9e3d | ||
|
|
e76837fa20 | ||
|
|
e1b3403dc8 | ||
|
|
79da17c5c8 | ||
|
|
e9623d542d | ||
|
|
bc999f4067 | ||
|
|
474e536ae8 | ||
|
|
79647c5bb4 | ||
|
|
410aace222 | ||
|
|
5409c39e35 | ||
|
|
5d4a24dd4f | ||
|
|
c97abe7ef5 | ||
|
|
edaea7bede | ||
|
|
909bce8ed9 | ||
|
|
4090c492e8 | ||
|
|
a24afb0e12 | ||
|
|
bc01f8b25f | ||
|
|
077c4141d6 | ||
|
|
e5f20314e9 | ||
|
|
8a61bcb6b5 | ||
|
|
61b301b380 | ||
|
|
be86f28be1 | ||
|
|
a443380869 | ||
|
|
3d1d431cda | ||
|
|
9559ece8af | ||
|
|
8f56a1096d | ||
|
|
0ec85f902a | ||
|
|
a47dde2166 | ||
|
|
abdd6bfbd2 | ||
|
|
d64104f472 | ||
|
|
1cd5ae2d57 | ||
|
|
e27bf1627d | ||
|
|
0689d64efd | ||
|
|
3ba47aec38 | ||
|
|
b90253981b | ||
|
|
513f678b6c | ||
|
|
478b9cf189 | ||
|
|
6675baff13 | ||
|
|
a6efeebd21 | ||
|
|
6e2bb25b6e | ||
|
|
a54edf71d1 | ||
|
|
8ff7eaf893 | ||
|
|
a8d3872002 | ||
|
|
dea03b7a46 | ||
|
|
f5723dcccf | ||
|
|
d772d1f162 | ||
|
|
46cfd16ae7 | ||
|
|
315243350b | ||
|
|
886d8a7293 | ||
|
|
54318f4001 | ||
|
|
b3aee8abab | ||
|
|
1bdbadc1b3 | ||
|
|
e0997b311b | ||
|
|
3c2ca312b9 | ||
|
|
315df1339a | ||
|
|
e03b3e5ec4 | ||
|
|
43923976c2 | ||
|
|
6b8ee2f3f7 | ||
|
|
bde19a76cc | ||
|
|
49ebf4b303 | ||
|
|
0017310dd1 | ||
|
|
8cdb8ed48d | ||
|
|
417bf7e1c9 | ||
|
|
b8e570bb3d | ||
|
|
69ff3c79b4 | ||
|
|
eff4da20f8 | ||
|
|
473688b109 | ||
|
|
7bfb6ed5d7 | ||
|
|
276080aeec | ||
|
|
41c880afc7 | ||
|
|
3d242c3a3a | ||
|
|
9325b07d68 | ||
|
|
ddeeb5d416 | ||
|
|
c8bc0a5c79 | ||
|
|
f58522d5a9 | ||
|
|
27a621531b | ||
|
|
0235433b7e | ||
|
|
6b5d1fe25b | ||
|
|
f811ab1b28 | ||
|
|
fc73f51855 | ||
|
|
dd181421a7 | ||
|
|
f6e2189739 | ||
|
|
d61f31d3ed | ||
|
|
4e83a6ad23 | ||
|
|
7fc39dc8d1 | ||
|
|
f10154a782 | ||
|
|
8761dc4e17 | ||
|
|
5a044b1c07 | ||
|
|
0100b76412 | ||
|
|
149f8967ad | ||
|
|
c8754292f4 | ||
|
|
e376fe921b | ||
|
|
61faea0298 | ||
|
|
8d8020ddb5 | ||
|
|
7d13b9eb99 | ||
|
|
6ed0a05b44 | ||
|
|
c4c479578a | ||
|
|
441caa91dd | ||
|
|
20154eb049 | ||
|
|
84ea710d42 | ||
|
|
8d524d618e | ||
|
|
9fa34ab1fe | ||
|
|
47db1cf1ac | ||
|
|
f2f9b70659 | ||
|
|
61c93ab08c | ||
|
|
d72f3fae33 | ||
|
|
3f14d15722 | ||
|
|
963c0b46a0 | ||
|
|
66b4977a67 | ||
|
|
126c2147e9 | ||
|
|
f7c42a4e6a | ||
|
|
b1ea1fd96f | ||
|
|
a5475bf839 | ||
|
|
be9e187cc6 | ||
|
|
d5098c6f66 | ||
|
|
41fc785330 | ||
|
|
4d83bf34f3 | ||
|
|
3a797e2583 | ||
|
|
7802030a53 | ||
|
|
e8e1e0ca23 | ||
|
|
973431be40 | ||
|
|
24fb5a8e29 | ||
|
|
37d161c290 | ||
|
|
ddefa5f9e6 | ||
|
|
955dd3d4d5 | ||
|
|
d125205564 | ||
|
|
7fa1b52497 | ||
|
|
a90d21899a | ||
|
|
569058f481 | ||
|
|
4ecda08f1f | ||
|
|
3b23059c09 | ||
|
|
a474ffc101 | ||
|
|
f7672b837a | ||
|
|
5235871fd8 | ||
|
|
cac9873e20 | ||
|
|
9094923de9 | ||
|
|
6454c96e6a | ||
|
|
7fbb9edc0f | ||
|
|
0a717f5c81 | ||
|
|
dab9777621 | ||
|
|
c8d1e9def1 | ||
|
|
272dd45a43 | ||
|
|
5abec96df7 | ||
|
|
e860f961a9 | ||
|
|
b9ecf61dcb | ||
|
|
437f81c4a0 | ||
|
|
26dad7dada | ||
|
|
b1e5d6f8f8 | ||
|
|
8c7b54d6e3 | ||
|
|
fea0d8963c | ||
|
|
7aca52c68c | ||
|
|
529d3faaf8 | ||
|
|
9f0f4657a2 | ||
|
|
90ff1b5896 | ||
|
|
feb82e34d6 | ||
|
|
4d7a34c177 | ||
|
|
5c3385ecd8 | ||
|
|
a1af3a509c | ||
|
|
2913a87cc4 | ||
|
|
69cc86c572 | ||
|
|
60144c907e | ||
|
|
dad4b974b7 | ||
|
|
1828cf6fc7 | ||
|
|
ad4d273241 | ||
|
|
0d03a94cde | ||
|
|
c4b876472f | ||
|
|
6af5adaac1 | ||
|
|
17a28f2e91 | ||
|
|
baaa7a5c13 | ||
|
|
cfeb2a833c | ||
|
|
e6fd58b3aa | ||
|
|
2ef905ef1e | ||
|
|
db80aa84dc | ||
|
|
f404cc16a1 | ||
|
|
8b4acf7023 | ||
|
|
7393c2ef91 | ||
|
|
4948ec2999 | ||
|
|
408a325732 | ||
|
|
5ca211b9f7 | ||
|
|
bc7596a8b5 | ||
|
|
6762ca8aa7 | ||
|
|
bb7d6ab429 | ||
|
|
986611ac36 | ||
|
|
94b4ad1de6 | ||
|
|
3e2f18bf3f | ||
|
|
48c06cc299 | ||
|
|
f10821ac49 | ||
|
|
cd5298dee6 | ||
|
|
a8c955609a | ||
|
|
c5acce0604 | ||
|
|
a6ccce7b76 | ||
|
|
aa72012d41 | ||
|
|
458831b885 | ||
|
|
f5e4789ccb | ||
|
|
1b712d2800 | ||
|
|
e274196441 | ||
|
|
c4c3c27cfe | ||
|
|
a2dd9d2c8c | ||
|
|
06e095e5fc | ||
|
|
b26d5bc1b1 | ||
|
|
607792e1b2 | ||
|
|
fb38135a61 | ||
|
|
a5d5b6e6c7 | ||
|
|
2fd2cdf68a | ||
|
|
11049ca3ca | ||
|
|
c29bea19ef | ||
|
|
8c8434ed64 | ||
|
|
9281bd043a | ||
|
|
6771f7c272 | ||
|
|
76b896a66d | ||
|
|
a12520763c | ||
|
|
819bb7caab | ||
|
|
152205a146 | ||
|
|
85dbcb5444 | ||
|
|
df09a746a0 | ||
|
|
5199fcf0a2 | ||
|
|
dd557ed00a | ||
|
|
addf4e2485 | ||
|
|
d9be472ccb | ||
|
|
32828a9af5 | ||
|
|
d206131df0 | ||
|
|
f1cb16648f | ||
|
|
1276f10b67 | ||
|
|
c3da262bd0 | ||
|
|
65eaf98d0b | ||
|
|
12429b90fe | ||
|
|
621042e639 | ||
|
|
526244be11 | ||
|
|
bc53d0b55e | ||
|
|
907d3c5a36 | ||
|
|
898f1e215e | ||
|
|
324ac83489 | ||
|
|
00a873dcc7 | ||
|
|
bc34345a56 | ||
|
|
659d27cae5 | ||
|
|
29072d6eae | ||
|
|
1fd59361b5 | ||
|
|
5896bb8fa3 | ||
|
|
ea1fc90cf5 | ||
|
|
463f48f04f | ||
|
|
cd58a30c7c | ||
|
|
c4260ae681 | ||
|
|
d40b4a33de | ||
|
|
87498679bd | ||
|
|
f4e254202b | ||
|
|
e91d225e7d | ||
|
|
b90d940aef | ||
|
|
b83a364b0e | ||
|
|
dbff196b08 | ||
|
|
5b7316fb2a | ||
|
|
2f4ea20fdd | ||
|
|
fa4dfe39ba | ||
|
|
89999e60bf | ||
|
|
4819fb12a3 | ||
|
|
27a4eeb206 | ||
|
|
bacf4d5780 | ||
|
|
35355b157c | ||
|
|
f92fed60f8 | ||
|
|
5e797b548c | ||
|
|
700e2f1b2b | ||
|
|
861656978b | ||
|
|
9c05bdac85 | ||
|
|
bd34c16c8f | ||
|
|
81fcb4452e | ||
|
|
4f1a5cd456 | ||
|
|
13109bb9b8 | ||
|
|
84f3b3720b | ||
|
|
858a66ccc8 | ||
|
|
abb05eace6 | ||
|
|
62bd96a778 | ||
|
|
8cb736adfa | ||
|
|
0758c05186 | ||
|
|
62bc6f0457 | ||
|
|
ea7e894139 | ||
|
|
21f0ac99e6 | ||
|
|
b251866a29 | ||
|
|
bf3db20a9d | ||
|
|
bd55147847 | ||
|
|
f4d64af39b | ||
|
|
b7bda34645 | ||
|
|
b13dea6df0 | ||
|
|
28a64c9318 | ||
|
|
74be618fff | ||
|
|
8bbe10bf50 | ||
|
|
d275911624 | ||
|
|
c26382301c | ||
|
|
ae2d3d7e61 | ||
|
|
58ae0908e3 | ||
|
|
e12bc07041 | ||
|
|
20416369ac | ||
|
|
2be91e9b2e | ||
|
|
e91caeaade | ||
|
|
dc1b8d9e80 | ||
|
|
bf0a814514 | ||
|
|
b14267d40f | ||
|
|
195a4115d8 | ||
|
|
e1da8eb841 | ||
|
|
bd694c60e1 | ||
|
|
14738f037f | ||
|
|
a437943516 | ||
|
|
900ee57de8 | ||
|
|
947f4e1c57 | ||
|
|
d9f17a65dd | ||
|
|
f71def19ae | ||
|
|
e452e85cae | ||
|
|
5059fe90b0 | ||
|
|
b90da731d6 | ||
|
|
d2012519ba | ||
|
|
1b7f26091c | ||
|
|
548e4f1845 | ||
|
|
625bed8fca | ||
|
|
db15367775 | ||
|
|
309d14a955 | ||
|
|
5ff16e1195 | ||
|
|
cf43aa9111 | ||
|
|
138c1e6024 | ||
|
|
2143699aab | ||
|
|
b1c2820299 | ||
|
|
382870a881 | ||
|
|
31921838cd | ||
|
|
a707587182 | ||
|
|
bc482af999 | ||
|
|
6818744dae | ||
|
|
607185ac61 | ||
|
|
81b7a412c3 | ||
|
|
09b9a8b441 | ||
|
|
85479cc2de | ||
|
|
3ad4eb2b59 | ||
|
|
878fe95ec3 | ||
|
|
624fd74f83 | ||
|
|
cd878522d9 | ||
|
|
3d23d1be69 | ||
|
|
5580f39df2 | ||
|
|
10fed43c27 | ||
|
|
1d50adf87a | ||
|
|
701e720ab8 | ||
|
|
e709ce7d56 | ||
|
|
32c89a5405 | ||
|
|
1735982a73 | ||
|
|
625e0aa1af | ||
|
|
00e1a3f8fd | ||
|
|
539256b08e | ||
|
|
ff791f5a39 | ||
|
|
de4d48b0fe | ||
|
|
b5c49f6d1c | ||
|
|
03cb7d6ffb | ||
|
|
304fc344a1 | ||
|
|
33c42638e9 | ||
|
|
9d940755e7 | ||
|
|
bc04232f87 | ||
|
|
e17ebec098 | ||
|
|
a7cba23526 | ||
|
|
7cd23036a7 | ||
|
|
44c5413abf | ||
|
|
50ab58e91f | ||
|
|
1fd0732390 | ||
|
|
ed1b9ee899 | ||
|
|
d3c04d6310 | ||
|
|
f66ffe305f | ||
|
|
2a9ff0083c | ||
|
|
c1cf7ea825 | ||
|
|
67f7268a55 | ||
|
|
a55ee7eb09 | ||
|
|
614a61b0b0 | ||
|
|
203f6d1944 | ||
|
|
42c68f21d1 | ||
|
|
7e8be1293e | ||
|
|
09c234ec26 | ||
|
|
65a26c3e73 | ||
|
|
98f35aefdc | ||
|
|
38a3714514 | ||
|
|
491700f925 | ||
|
|
4d033e7e83 | ||
|
|
efc3638065 | ||
|
|
b7685ab317 | ||
|
|
83c5f6a004 | ||
|
|
aa5a94cc3e | ||
|
|
a5b6331ab5 | ||
|
|
2164b28c64 | ||
|
|
0fb824b345 | ||
|
|
bd380f44cc | ||
|
|
29ee094d66 | ||
|
|
4a7ae50ec8 | ||
|
|
398439a937 | ||
|
|
a3bc3a7615 | ||
|
|
7989fbd613 | ||
|
|
c389c79be9 | ||
|
|
1fd2f921fd | ||
|
|
ed851849db | ||
|
|
cfb9f6f0a4 | ||
|
|
3d5a0da62e | ||
|
|
4e15369f9a | ||
|
|
5b3152d99d | ||
|
|
a6955f4edb | ||
|
|
280ef7d1bd | ||
|
|
8d2ea90a5b | ||
|
|
4bf7abd73d | ||
|
|
8f251e6756 | ||
|
|
8a546d2a7a | ||
|
|
1148a9746a | ||
|
|
4cd35c1f33 | ||
|
|
78fda33707 | ||
|
|
5c6a98f479 | ||
|
|
efbcb942c3 | ||
|
|
f3da1bc3b1 | ||
|
|
72a6186f08 | ||
|
|
8cde6d2e8f | ||
|
|
4f2c7fdc3c | ||
|
|
5a830504a4 | ||
|
|
086fb09038 | ||
|
|
5544a041ce | ||
|
|
6447333368 | ||
|
|
1d6a42f0eb | ||
|
|
de14b75517 | ||
|
|
0f302713da | ||
|
|
a66d064d4a | ||
|
|
4fefe2020f | ||
|
|
72fab07a14 | ||
|
|
adbf4f6b17 | ||
|
|
cfcf4ca915 | ||
|
|
c427fba87f | ||
|
|
ab14bcab03 | ||
|
|
78de3fb959 | ||
|
|
b9eda90ddd | ||
|
|
66b346c8fb | ||
|
|
8215b225d9 | ||
|
|
41da8c6352 | ||
|
|
04f4b05412 | ||
|
|
b7dad4df5e | ||
|
|
1a98ccbf5f | ||
|
|
8d16a3365e | ||
|
|
67bf48fafc | ||
|
|
9a3c9a8c19 | ||
|
|
6a192dae63 | ||
|
|
f5895216a8 | ||
|
|
09a33f8daa | ||
|
|
185db0e8d5 | ||
|
|
85efbde3f7 | ||
|
|
93d7aa3d07 | ||
|
|
e96096f786 | ||
|
|
0a850eeddd | ||
|
|
42658ffd61 | ||
|
|
24fc2842d2 | ||
|
|
ac2723abe3 | ||
|
|
0d0e219532 | ||
|
|
cf35807709 | ||
|
|
c2b53db96d | ||
|
|
8e6efc3a7d | ||
|
|
4b6f05b4d1 | ||
|
|
7aad5f93e4 | ||
|
|
9b6a7622d2 | ||
|
|
6c666075b5 | ||
|
|
6d26bf5c82 | ||
|
|
6d5da4c9ec | ||
|
|
51dde1f6a4 | ||
|
|
13c9259d23 | ||
|
|
a22c2d678b | ||
|
|
5c36f8df85 | ||
|
|
37781cb58e | ||
|
|
dcc598442b | ||
|
|
91877056fb | ||
|
|
868e9df434 | ||
|
|
c3642ba7ed | ||
|
|
56f128af66 | ||
|
|
c1e560b901 | ||
|
|
92bc1cdcdf | ||
|
|
9fde0ec447 | ||
|
|
297ef6195d | ||
|
|
913cd6c309 | ||
|
|
9873157076 | ||
|
|
675c1f3c0b | ||
|
|
fee7a34ddc | ||
|
|
a148d52aed | ||
|
|
5da8831aff | ||
|
|
e9ff0f4998 | ||
|
|
658bf98b4c | ||
|
|
452cfd32d7 | ||
|
|
3f1dc71cc2 | ||
|
|
256157cd42 | ||
|
|
81d9c682da | ||
|
|
843279ff1d | ||
|
|
8118546ac7 | ||
|
|
15c05c723e | ||
|
|
d0d40c0d2e | ||
|
|
f494972d04 | ||
|
|
1c4def7320 | ||
|
|
6e22b946bd | ||
|
|
0a54df3a12 | ||
|
|
20af70cd90 | ||
|
|
a2f721d4ef | ||
|
|
03a1a733f6 | ||
|
|
4a76088b43 | ||
|
|
5a1dab8073 | ||
|
|
86a97610bd | ||
|
|
87bfe3657a | ||
|
|
3802e31b90 | ||
|
|
4eff60e4b1 | ||
|
|
f103306e91 | ||
|
|
8b878784a4 | ||
|
|
44a0d19ac0 | ||
|
|
3023516796 | ||
|
|
6038a06c43 | ||
|
|
20735a4cdd | ||
|
|
df3b1a983e | ||
|
|
84e43d7d3f | ||
|
|
7e81a9e50b | ||
|
|
28acee8e33 | ||
|
|
80184f1e1d | ||
|
|
d893259e75 | ||
|
|
d3f37f5013 | ||
|
|
0e6a46abfc | ||
|
|
49e27387b7 | ||
|
|
c2495c27d3 | ||
|
|
f0a3acd735 | ||
|
|
29d2930de8 | ||
|
|
2d82071103 | ||
|
|
f4a3636371 | ||
|
|
d8f96441da | ||
|
|
cf5646d45a | ||
|
|
5c3d32cafd | ||
|
|
ea45db38e9 | ||
|
|
a978c4eb34 | ||
|
|
65302dbec7 | ||
|
|
3c82131863 | ||
|
|
e4975fc476 | ||
|
|
e1064b13c0 | ||
|
|
00873da7a6 | ||
|
|
a17f7d1cb2 | ||
|
|
9f850db126 | ||
|
|
e513ac628a | ||
|
|
3dc11186a1 | ||
|
|
2fbca98e7f | ||
|
|
7ad411fbaa | ||
|
|
4e4e77bc9a | ||
|
|
a7afdaa677 | ||
|
|
dd24b54a31 | ||
|
|
833e409bd8 | ||
|
|
c2a376fbc9 | ||
|
|
c21707b8b1 | ||
|
|
c04f4519a7 | ||
|
|
fd7db27b48 | ||
|
|
cab85f3de3 | ||
|
|
34893650eb | ||
|
|
bb58840c1c | ||
|
|
cbcbb969d5 | ||
|
|
3c21f8db51 | ||
|
|
6c3f8a7787 | ||
|
|
915a11f2b6 | ||
|
|
55ce1e8b93 | ||
|
|
ccce5475bf | ||
|
|
cb844a1913 | ||
|
|
6c4c2fa0e0 | ||
|
|
ba26e1f5d5 | ||
|
|
bbddd3f946 | ||
|
|
2634866b91 | ||
|
|
d13825daff | ||
|
|
e7233db9fa | ||
|
|
cec5942d6b | ||
|
|
aaef516c22 | ||
|
|
09ae07d003 | ||
|
|
a144c9f394 | ||
|
|
0e10a8c857 | ||
|
|
33387b7227 | ||
|
|
3b5a237f1e | ||
|
|
152e3ace99 | ||
|
|
64b6f18e66 | ||
|
|
be1003648a | ||
|
|
536800f9f5 | ||
|
|
20f858c305 | ||
|
|
07fdea7496 | ||
|
|
449d675e3d | ||
|
|
bdcb9ecffe | ||
|
|
850756cf7d | ||
|
|
b3f55c72f8 | ||
|
|
021848eb8e | ||
|
|
06ceed0e66 | ||
|
|
d599f000c1 | ||
|
|
cd9760d69b | ||
|
|
ada4cad25c | ||
|
|
4ba6f9567b | ||
|
|
d84867d6f3 | ||
|
|
05aaba4d89 | ||
|
|
33e5d3a444 | ||
|
|
7b6a0e9cad | ||
|
|
8e681359ba | ||
|
|
39e5f5bab3 | ||
|
|
4ff37a783f | ||
|
|
1c5916d3f2 | ||
|
|
d8425af684 | ||
|
|
8db3638ce4 | ||
|
|
d8cc60a026 | ||
|
|
9f49efef0a | ||
|
|
9d569c8bd5 | ||
|
|
58d65c2d27 | ||
|
|
9c921b331c | ||
|
|
b065d8c0d7 | ||
|
|
5148422e39 | ||
|
|
88131e0844 | ||
|
|
6c8c815ad8 | ||
|
|
06cee71e07 | ||
|
|
6106441e58 | ||
|
|
a949338a91 | ||
|
|
ad93511c98 | ||
|
|
014f026eb2 | ||
|
|
ca8ad800ca | ||
|
|
54335c74f6 | ||
|
|
fb2f19e666 | ||
|
|
7e9612fe9f | ||
|
|
acbe0e4a51 | ||
|
|
22e09a587c | ||
|
|
1b5d35a536 | ||
|
|
5d480fc6d6 | ||
|
|
f5b361c31b | ||
|
|
918a69e6f0 | ||
|
|
6d346fdc8d | ||
|
|
09506dbbd9 | ||
|
|
e11a671a1d | ||
|
|
c72ad3f402 | ||
|
|
48b240630e | ||
|
|
715732bb93 | ||
|
|
2f01a4bd78 | ||
|
|
62e34caa4c | ||
|
|
142dcd27e5 | ||
|
|
2f94e46f1f | ||
|
|
5c5999fbf3 | ||
|
|
26fbc45baf | ||
|
|
a2537fa108 | ||
|
|
8e76ba2020 | ||
|
|
0f5e2a1ea4 | ||
|
|
00ff4a1d8a | ||
|
|
98dacd07c2 | ||
|
|
701f5220fc | ||
|
|
2aa27c99b3 | ||
|
|
236f521e13 | ||
|
|
d0d6dfa5c0 | ||
|
|
5af528184d | ||
|
|
01c4fba092 | ||
|
|
20c9ed9f36 | ||
|
|
40f4c49ba9 | ||
|
|
a265237b2e | ||
|
|
a4eea6b8cd | ||
|
|
e7f5cadfcb | ||
|
|
21d3a3a141 | ||
|
|
96a162225d | ||
|
|
09c2f763f1 | ||
|
|
ce096e277d | ||
|
|
c0bb883aaa | ||
|
|
23eea82139 | ||
|
|
edd9881642 | ||
|
|
e46c6968ba | ||
|
|
1528847249 | ||
|
|
182aaf8fce | ||
|
|
d6dfa1dcbc | ||
|
|
6450d5861a | ||
|
|
9562b8ad3d | ||
|
|
507248dd95 | ||
|
|
19a67c07fe | ||
|
|
2ef130530d | ||
|
|
0c6f4383a7 | ||
|
|
97908204a3 | ||
|
|
5606916d99 | ||
|
|
3d4b682d63 | ||
|
|
96561c24be | ||
|
|
0cd1566145 | ||
|
|
b6aa9f9b12 | ||
|
|
b6d0a41718 | ||
|
|
0240b76cc3 | ||
|
|
3f96bcc32b | ||
|
|
9b8823ab3c | ||
|
|
8ba9446fcd | ||
|
|
04a6af4272 | ||
|
|
a1641f2ffa | ||
|
|
fe183c07f5 | ||
|
|
a620d45635 | ||
|
|
fa9660d5a1 | ||
|
|
8b39d30a6e | ||
|
|
090ffa4191 | ||
|
|
42194094a2 | ||
|
|
08058f9f2e | ||
|
|
3d76ba001f | ||
|
|
078a2877c7 | ||
|
|
9ae0bdbb43 | ||
|
|
492aa12cad | ||
|
|
a22ba56596 | ||
|
|
b6cadc93f2 | ||
|
|
e79e45a74e | ||
|
|
e661470bbb | ||
|
|
af30a80702 | ||
|
|
bab7ee4fcb | ||
|
|
6524ac3588 | ||
|
|
c432cd67fc | ||
|
|
5c071a2e07 | ||
|
|
cb10c53dee | ||
|
|
a5fa26461c | ||
|
|
dfba2a31a5 | ||
|
|
667f3de26b | ||
|
|
fd585beb07 | ||
|
|
a3aaa1ec4d | ||
|
|
5ddcdede74 | ||
|
|
c4cdcc8db7 | ||
|
|
7219ebdf3c | ||
|
|
cd548c6ed6 | ||
|
|
75140f5d52 | ||
|
|
774303a846 | ||
|
|
6b18b25039 | ||
|
|
bb2afbb03d | ||
|
|
50ddb0ba16 | ||
|
|
556a98b525 | ||
|
|
1f022a84ea | ||
|
|
110fa6d384 | ||
|
|
c971c14a83 | ||
|
|
4bec82a19e | ||
|
|
0c23050eaf | ||
|
|
e1c81a8884 | ||
|
|
19e4dabf01 | ||
|
|
a98ad13af4 | ||
|
|
24eb965adb | ||
|
|
852957c769 | ||
|
|
e1eff56d6a | ||
|
|
220ecabd8c | ||
|
|
27ea8d0bf5 | ||
|
|
8f02926d68 | ||
|
|
1769083a85 | ||
|
|
05c714af76 | ||
|
|
ee3c9bcdbd | ||
|
|
f39456ee47 | ||
|
|
911a532051 | ||
|
|
44910dbcd8 | ||
|
|
42cb8ec3cf | ||
|
|
957dd15d5b | ||
|
|
1e9435c999 | ||
|
|
dc1b0e3c48 | ||
|
|
2e731a1084 | ||
|
|
869cf8ba11 | ||
|
|
d394e8db21 | ||
|
|
a8b6267471 | ||
|
|
637682e452 | ||
|
|
38bd07a113 | ||
|
|
68b6152b42 | ||
|
|
a349f81e2d | ||
|
|
8c2e41cc99 | ||
|
|
6c0618f75a | ||
|
|
b1eed16422 | ||
|
|
432f27480e | ||
|
|
23addec9a9 | ||
|
|
e50cc9b210 | ||
|
|
58d865f293 | ||
|
|
b69fef2c39 | ||
|
|
f8fee56446 | ||
|
|
10903e7e38 | ||
|
|
645411e256 | ||
|
|
29510b26e0 | ||
|
|
e4c1cc572b | ||
|
|
7c85c11944 | ||
|
|
5318402be5 | ||
|
|
8323450958 | ||
|
|
68793b1f0f | ||
|
|
c6e3c8fab8 | ||
|
|
54c1d7c9d9 | ||
|
|
3a19ba4523 | ||
|
|
210ca9a86f | ||
|
|
ff9e0aedd6 | ||
|
|
cb9bef43a5 | ||
|
|
115ac6b999 | ||
|
|
4c500e1fb2 | ||
|
|
5715802999 | ||
|
|
a2690b7dac | ||
|
|
8b00872d36 | ||
|
|
c67c8a7482 | ||
|
|
ee370cbf43 | ||
|
|
78217e1cee | ||
|
|
86364da07e | ||
|
|
4ec878ba0d | ||
|
|
28a2b39a55 | ||
|
|
d94bffb198 | ||
|
|
92e1b1eb40 | ||
|
|
3bea39eb10 | ||
|
|
a34398eb92 | ||
|
|
2f6035cd1e | ||
|
|
e437cf749d | ||
|
|
5218b60681 | ||
|
|
8afe123084 | ||
|
|
c60328383d | ||
|
|
69bfe73165 | ||
|
|
3429ddeaa1 | ||
|
|
9242a2f83b | ||
|
|
e2b1fe3641 | ||
|
|
0eebd42d72 | ||
|
|
b0894e20ef | ||
|
|
0cc47dd47d | ||
|
|
fdbfd8b806 | ||
|
|
9f3ee8dff6 | ||
|
|
166012dcf0 | ||
|
|
bb754d8849 | ||
|
|
0eaaa2bacc | ||
|
|
2beb450df6 | ||
|
|
a1eab2a439 | ||
|
|
487cad7041 | ||
|
|
43f393a02d | ||
|
|
3c1f4c8ee1 | ||
|
|
81db880a7b | ||
|
|
277a71f6f6 | ||
|
|
0cfcb6917b | ||
|
|
681561229e | ||
|
|
43825c3426 | ||
|
|
f4fd6ed94e | ||
|
|
ef42680646 | ||
|
|
03ce24221e | ||
|
|
e9f9a9ef12 | ||
|
|
476b39c353 | ||
|
|
0eea2bd7bb | ||
|
|
f78ce5389e | ||
|
|
dd32b8f441 | ||
|
|
39a9c768c8 | ||
|
|
ff257175ac | ||
|
|
877ee775a3 | ||
|
|
19e151390e | ||
|
|
7da9038e79 | ||
|
|
1f8ef83657 | ||
|
|
2770e4e111 | ||
|
|
96dfbc71eb | ||
|
|
9076086d9b | ||
|
|
dc76ca7e37 | ||
|
|
7ee2b60762 | ||
|
|
e3a9395b4c | ||
|
|
83513977a4 | ||
|
|
42912141c5 | ||
|
|
8561ece4d7 | ||
|
|
028f2ab92c | ||
|
|
34c83d9495 | ||
|
|
e37f5b8df5 | ||
|
|
df342798b0 | ||
|
|
b91738721b | ||
|
|
123f4c26c3 | ||
|
|
1bbf75b5ab | ||
|
|
70e56303ab | ||
|
|
ec2e3428ec | ||
|
|
f8601dd663 | ||
|
|
df5faa0f21 | ||
|
|
8341992a38 | ||
|
|
293ed8aa8d | ||
|
|
6a8d54e983 | ||
|
|
a18155da49 | ||
|
|
2a1e850924 | ||
|
|
528adc1a04 | ||
|
|
9e7b1bf3cb | ||
|
|
a517de8168 | ||
|
|
a4ab7555e2 | ||
|
|
49fd25236e | ||
|
|
83a742621f | ||
|
|
63cb5aac20 | ||
|
|
00de2b011d | ||
|
|
bc923bb6b1 | ||
|
|
aa78060e41 | ||
|
|
9cae54bb55 | ||
|
|
89795ebd1f | ||
|
|
5fb6f34d8a | ||
|
|
3ecc1f883c | ||
|
|
edf19a0941 | ||
|
|
dfeaaaa17e | ||
|
|
bcefa61fe0 | ||
|
|
7f9142a41d | ||
|
|
f0ad498b93 | ||
|
|
a0aae8cdc1 | ||
|
|
a2d6b374da | ||
|
|
7c1716aa1e | ||
|
|
6df8bd62d3 | ||
|
|
d6e3bcc875 | ||
|
|
200473ba27 | ||
|
|
05fb0c35fa | ||
|
|
395f4375da | ||
|
|
bb348c4038 | ||
|
|
1a4be4dfa0 | ||
|
|
7c9e973082 |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1 +1,8 @@
|
|||||||
Gemfile.lock
|
/Gemfile.lock
|
||||||
|
.bundle/
|
||||||
|
benchmark/
|
||||||
|
lib/linguist/samples.json
|
||||||
|
/grammars
|
||||||
|
/node_modules
|
||||||
|
test/fixtures/ace_modes.json
|
||||||
|
/vendor/gems/
|
||||||
|
|||||||
647
.gitmodules
vendored
Normal file
647
.gitmodules
vendored
Normal file
@@ -0,0 +1,647 @@
|
|||||||
|
[submodule "vendor/grammars/go-tmbundle"]
|
||||||
|
path = vendor/grammars/go-tmbundle
|
||||||
|
url = https://github.com/AlanQuatermain/go-tmbundle
|
||||||
|
[submodule "vendor/grammars/PHP-Twig.tmbundle"]
|
||||||
|
path = vendor/grammars/PHP-Twig.tmbundle
|
||||||
|
url = https://github.com/Anomareh/PHP-Twig.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-cirru"]
|
||||||
|
path = vendor/grammars/sublime-cirru
|
||||||
|
url = https://github.com/Cirru/sublime-cirru
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/Sublime-SQF-Language"]
|
||||||
|
path = vendor/grammars/Sublime-SQF-Language
|
||||||
|
url = https://github.com/JonBons/Sublime-SQF-Language
|
||||||
|
[submodule "vendor/grammars/SCSS.tmbundle"]
|
||||||
|
path = vendor/grammars/SCSS.tmbundle
|
||||||
|
url = https://github.com/MarioRicalde/SCSS.tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||||
|
path = vendor/grammars/Sublime-REBOL
|
||||||
|
url = https://github.com/Oldes/Sublime-REBOL
|
||||||
|
[submodule "vendor/grammars/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/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
|
||||||
|
[submodule "vendor/grammars/NimLime"]
|
||||||
|
path = vendor/grammars/NimLime
|
||||||
|
url = https://github.com/Varriount/NimLime
|
||||||
|
[submodule "vendor/grammars/gradle.tmbundle"]
|
||||||
|
path = vendor/grammars/gradle.tmbundle
|
||||||
|
url = https://github.com/alkemist/gradle.tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-Loom"]
|
||||||
|
path = vendor/grammars/Sublime-Loom
|
||||||
|
url = https://github.com/ambethia/Sublime-Loom
|
||||||
|
[submodule "vendor/grammars/VBDotNetSyntax"]
|
||||||
|
path = vendor/grammars/VBDotNetSyntax
|
||||||
|
url = https://github.com/angryant0007/VBDotNetSyntax
|
||||||
|
[submodule "vendor/grammars/cool-tmbundle"]
|
||||||
|
path = vendor/grammars/cool-tmbundle
|
||||||
|
url = https://github.com/anunayk/cool-tmbundle
|
||||||
|
[submodule "vendor/grammars/Docker.tmbundle"]
|
||||||
|
path = vendor/grammars/Docker.tmbundle
|
||||||
|
url = https://github.com/asbjornenge/Docker.tmbundle
|
||||||
|
[submodule "vendor/grammars/jasmin-sublime"]
|
||||||
|
path = vendor/grammars/jasmin-sublime
|
||||||
|
url = https://github.com/atmarksharp/jasmin-sublime
|
||||||
|
[submodule "vendor/grammars/language-clojure"]
|
||||||
|
path = vendor/grammars/language-clojure
|
||||||
|
url = https://github.com/atom/language-clojure
|
||||||
|
[submodule "vendor/grammars/language-coffee-script"]
|
||||||
|
path = vendor/grammars/language-coffee-script
|
||||||
|
url = https://github.com/atom/language-coffee-script
|
||||||
|
[submodule "vendor/grammars/language-csharp"]
|
||||||
|
path = vendor/grammars/language-csharp
|
||||||
|
url = https://github.com/atom/language-csharp
|
||||||
|
[submodule "vendor/grammars/language-gfm"]
|
||||||
|
path = vendor/grammars/language-gfm
|
||||||
|
url = https://github.com/atom/language-gfm
|
||||||
|
[submodule "vendor/grammars/language-javascript"]
|
||||||
|
path = vendor/grammars/language-javascript
|
||||||
|
url = https://github.com/atom/language-javascript
|
||||||
|
[submodule "vendor/grammars/language-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-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
|
||||||
|
[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
|
||||||
|
[submodule "vendor/grammars/jade-tmbundle"]
|
||||||
|
path = vendor/grammars/jade-tmbundle
|
||||||
|
url = https://github.com/davidrios/jade-tmbundle
|
||||||
|
[submodule "vendor/grammars/elixir-tmbundle"]
|
||||||
|
path = vendor/grammars/elixir-tmbundle
|
||||||
|
url = https://github.com/elixir-lang/elixir-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-glsl"]
|
||||||
|
path = vendor/grammars/sublime-glsl
|
||||||
|
url = https://github.com/euler0/sublime-glsl
|
||||||
|
[submodule "vendor/grammars/fancy-tmbundle"]
|
||||||
|
path = vendor/grammars/fancy-tmbundle
|
||||||
|
url = https://github.com/fancy-lang/fancy-tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/pike-textmate"]
|
||||||
|
path = vendor/grammars/pike-textmate
|
||||||
|
url = https://github.com/hww3/pike-textmate
|
||||||
|
[submodule "vendor/grammars/ceylon-sublimetext"]
|
||||||
|
path = vendor/grammars/ceylon-sublimetext
|
||||||
|
url = https://github.com/jeancharles-roger/ceylon-sublimetext
|
||||||
|
[submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"]
|
||||||
|
path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL
|
||||||
|
url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL
|
||||||
|
[submodule "vendor/grammars/sublime-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
|
||||||
|
[submodule "vendor/grammars/RDoc.tmbundle"]
|
||||||
|
path = vendor/grammars/RDoc.tmbundle
|
||||||
|
url = https://github.com/joshaven/RDoc.tmbundle
|
||||||
|
[submodule "vendor/grammars/Textmate-Gosu-Bundle"]
|
||||||
|
path = vendor/grammars/Textmate-Gosu-Bundle
|
||||||
|
url = https://github.com/jpcamara/Textmate-Gosu-Bundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/opa.tmbundle"]
|
||||||
|
path = vendor/grammars/opa.tmbundle
|
||||||
|
url = https://github.com/mads379/opa.tmbundle
|
||||||
|
[submodule "vendor/grammars/scala.tmbundle"]
|
||||||
|
path = vendor/grammars/scala.tmbundle
|
||||||
|
url = https://github.com/mads379/scala.tmbundle
|
||||||
|
[submodule "vendor/grammars/mako-tmbundle"]
|
||||||
|
path = vendor/grammars/mako-tmbundle
|
||||||
|
url = https://github.com/marconi/mako-tmbundle
|
||||||
|
[submodule "vendor/grammars/gnuplot-tmbundle"]
|
||||||
|
path = vendor/grammars/gnuplot-tmbundle
|
||||||
|
url = https://github.com/mattfoster/gnuplot-tmbundle
|
||||||
|
[submodule "vendor/grammars/idl.tmbundle"]
|
||||||
|
path = vendor/grammars/idl.tmbundle
|
||||||
|
url = https://github.com/mgalloy/idl.tmbundle
|
||||||
|
[submodule "vendor/grammars/protobuf-tmbundle"]
|
||||||
|
path = vendor/grammars/protobuf-tmbundle
|
||||||
|
url = https://github.com/michaeledgar/protobuf-tmbundle
|
||||||
|
[submodule "vendor/grammars/Sublime-Coq"]
|
||||||
|
path = vendor/grammars/Sublime-Coq
|
||||||
|
url = https://github.com/mkolosick/Sublime-Coq
|
||||||
|
[submodule "vendor/grammars/Agda.tmbundle"]
|
||||||
|
path = vendor/grammars/Agda.tmbundle
|
||||||
|
url = https://github.com/mokus0/Agda.tmbundle
|
||||||
|
[submodule "vendor/grammars/Julia.tmbundle"]
|
||||||
|
path = vendor/grammars/Julia.tmbundle
|
||||||
|
url = https://github.com/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
|
||||||
|
[submodule "vendor/grammars/LiveScript.tmbundle"]
|
||||||
|
path = vendor/grammars/LiveScript.tmbundle
|
||||||
|
url = https://github.com/paulmillr/LiveScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-tea"]
|
||||||
|
path = vendor/grammars/sublime-tea
|
||||||
|
url = https://github.com/pferruggiaro/sublime-tea
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/mercury-tmlanguage"]
|
||||||
|
path = vendor/grammars/mercury-tmlanguage
|
||||||
|
url = https://github.com/sebgod/mercury-tmlanguage
|
||||||
|
[submodule "vendor/grammars/mathematica-tmbundle"]
|
||||||
|
path = vendor/grammars/mathematica-tmbundle
|
||||||
|
url = https://github.com/shadanan/mathematica-tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-robot-plugin"]
|
||||||
|
path = vendor/grammars/sublime-robot-plugin
|
||||||
|
url = https://github.com/shellderp/sublime-robot-plugin
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/Slash.tmbundle"]
|
||||||
|
path = vendor/grammars/Slash.tmbundle
|
||||||
|
url = https://github.com/slash-lang/Slash.tmbundle
|
||||||
|
[submodule "vendor/grammars/factor"]
|
||||||
|
path = vendor/grammars/factor
|
||||||
|
url = https://github.com/slavapestov/factor
|
||||||
|
[submodule "vendor/grammars/ruby-slim.tmbundle"]
|
||||||
|
path = vendor/grammars/ruby-slim.tmbundle
|
||||||
|
url = https://github.com/slim-template/ruby-slim.tmbundle
|
||||||
|
[submodule "vendor/grammars/SublimeXtend"]
|
||||||
|
path = vendor/grammars/SublimeXtend
|
||||||
|
url = https://github.com/staltz/SublimeXtend
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/ant.tmbundle"]
|
||||||
|
path = vendor/grammars/ant.tmbundle
|
||||||
|
url = https://github.com/textmate/ant.tmbundle
|
||||||
|
[submodule "vendor/grammars/antlr.tmbundle"]
|
||||||
|
path = vendor/grammars/antlr.tmbundle
|
||||||
|
url = https://github.com/textmate/antlr.tmbundle
|
||||||
|
[submodule "vendor/grammars/apache.tmbundle"]
|
||||||
|
path = vendor/grammars/apache.tmbundle
|
||||||
|
url = https://github.com/textmate/apache.tmbundle
|
||||||
|
[submodule "vendor/grammars/applescript.tmbundle"]
|
||||||
|
path = vendor/grammars/applescript.tmbundle
|
||||||
|
url = https://github.com/textmate/applescript.tmbundle
|
||||||
|
[submodule "vendor/grammars/asp.tmbundle"]
|
||||||
|
path = vendor/grammars/asp.tmbundle
|
||||||
|
url = https://github.com/textmate/asp.tmbundle
|
||||||
|
[submodule "vendor/grammars/bison.tmbundle"]
|
||||||
|
path = vendor/grammars/bison.tmbundle
|
||||||
|
url = https://github.com/textmate/bison.tmbundle
|
||||||
|
[submodule "vendor/grammars/capnproto.tmbundle"]
|
||||||
|
path = vendor/grammars/capnproto.tmbundle
|
||||||
|
url = https://github.com/textmate/capnproto.tmbundle
|
||||||
|
[submodule "vendor/grammars/cmake.tmbundle"]
|
||||||
|
path = vendor/grammars/cmake.tmbundle
|
||||||
|
url = https://github.com/textmate/cmake.tmbundle
|
||||||
|
[submodule "vendor/grammars/cpp-qt.tmbundle"]
|
||||||
|
path = vendor/grammars/cpp-qt.tmbundle
|
||||||
|
url = https://github.com/textmate/cpp-qt.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/diff.tmbundle"]
|
||||||
|
path = vendor/grammars/diff.tmbundle
|
||||||
|
url = https://github.com/textmate/diff.tmbundle
|
||||||
|
[submodule "vendor/grammars/dylan.tmbundle"]
|
||||||
|
path = vendor/grammars/dylan.tmbundle
|
||||||
|
url = https://github.com/textmate/dylan.tmbundle
|
||||||
|
[submodule "vendor/grammars/eiffel.tmbundle"]
|
||||||
|
path = vendor/grammars/eiffel.tmbundle
|
||||||
|
url = https://github.com/textmate/eiffel.tmbundle
|
||||||
|
[submodule "vendor/grammars/erlang.tmbundle"]
|
||||||
|
path = vendor/grammars/erlang.tmbundle
|
||||||
|
url = https://github.com/textmate/erlang.tmbundle
|
||||||
|
[submodule "vendor/grammars/fortran.tmbundle"]
|
||||||
|
path = vendor/grammars/fortran.tmbundle
|
||||||
|
url = https://github.com/textmate/fortran.tmbundle
|
||||||
|
[submodule "vendor/grammars/gettext.tmbundle"]
|
||||||
|
path = vendor/grammars/gettext.tmbundle
|
||||||
|
url = https://github.com/textmate/gettext.tmbundle
|
||||||
|
[submodule "vendor/grammars/graphviz.tmbundle"]
|
||||||
|
path = vendor/grammars/graphviz.tmbundle
|
||||||
|
url = https://github.com/textmate/graphviz.tmbundle
|
||||||
|
[submodule "vendor/grammars/groovy.tmbundle"]
|
||||||
|
path = vendor/grammars/groovy.tmbundle
|
||||||
|
url = https://github.com/textmate/groovy.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/ini.tmbundle"]
|
||||||
|
path = vendor/grammars/ini.tmbundle
|
||||||
|
url = https://github.com/textmate/ini.tmbundle
|
||||||
|
[submodule "vendor/grammars/desktop.tmbundle"]
|
||||||
|
path = vendor/grammars/desktop.tmbundle
|
||||||
|
url = https://github.com/Mailaender/desktop.tmbundle.git
|
||||||
|
[submodule "vendor/grammars/io.tmbundle"]
|
||||||
|
path = vendor/grammars/io.tmbundle
|
||||||
|
url = https://github.com/textmate/io.tmbundle
|
||||||
|
[submodule "vendor/grammars/java.tmbundle"]
|
||||||
|
path = vendor/grammars/java.tmbundle
|
||||||
|
url = https://github.com/textmate/java.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/json.tmbundle"]
|
||||||
|
path = vendor/grammars/json.tmbundle
|
||||||
|
url = https://github.com/textmate/json.tmbundle
|
||||||
|
[submodule "vendor/grammars/latex.tmbundle"]
|
||||||
|
path = vendor/grammars/latex.tmbundle
|
||||||
|
url = https://github.com/textmate/latex.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/lisp.tmbundle"]
|
||||||
|
path = vendor/grammars/lisp.tmbundle
|
||||||
|
url = https://github.com/textmate/lisp.tmbundle
|
||||||
|
[submodule "vendor/grammars/logtalk.tmbundle"]
|
||||||
|
path = vendor/grammars/logtalk.tmbundle
|
||||||
|
url = https://github.com/textmate/logtalk.tmbundle
|
||||||
|
[submodule "vendor/grammars/lua.tmbundle"]
|
||||||
|
path = vendor/grammars/lua.tmbundle
|
||||||
|
url = https://github.com/textmate/lua.tmbundle
|
||||||
|
[submodule "vendor/grammars/make.tmbundle"]
|
||||||
|
path = vendor/grammars/make.tmbundle
|
||||||
|
url = https://github.com/textmate/make.tmbundle
|
||||||
|
[submodule "vendor/grammars/matlab.tmbundle"]
|
||||||
|
path = vendor/grammars/matlab.tmbundle
|
||||||
|
url = https://github.com/textmate/matlab.tmbundle
|
||||||
|
[submodule "vendor/grammars/maven.tmbundle"]
|
||||||
|
path = vendor/grammars/maven.tmbundle
|
||||||
|
url = https://github.com/textmate/maven.tmbundle
|
||||||
|
[submodule "vendor/grammars/nemerle.tmbundle"]
|
||||||
|
path = vendor/grammars/nemerle.tmbundle
|
||||||
|
url = https://github.com/textmate/nemerle.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/ocaml.tmbundle"]
|
||||||
|
path = vendor/grammars/ocaml.tmbundle
|
||||||
|
url = https://github.com/textmate/ocaml.tmbundle
|
||||||
|
[submodule "vendor/grammars/pascal.tmbundle"]
|
||||||
|
path = vendor/grammars/pascal.tmbundle
|
||||||
|
url = https://github.com/textmate/pascal.tmbundle
|
||||||
|
[submodule "vendor/grammars/php-smarty.tmbundle"]
|
||||||
|
path = vendor/grammars/php-smarty.tmbundle
|
||||||
|
url = https://github.com/textmate/php-smarty.tmbundle
|
||||||
|
[submodule "vendor/grammars/php.tmbundle"]
|
||||||
|
path = vendor/grammars/php.tmbundle
|
||||||
|
url = https://github.com/textmate/php.tmbundle
|
||||||
|
[submodule "vendor/grammars/postscript.tmbundle"]
|
||||||
|
path = vendor/grammars/postscript.tmbundle
|
||||||
|
url = https://github.com/textmate/postscript.tmbundle
|
||||||
|
[submodule "vendor/grammars/processing.tmbundle"]
|
||||||
|
path = vendor/grammars/processing.tmbundle
|
||||||
|
url = https://github.com/textmate/processing.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/scilab.tmbundle"]
|
||||||
|
path = vendor/grammars/scilab.tmbundle
|
||||||
|
url = https://github.com/textmate/scilab.tmbundle
|
||||||
|
[submodule "vendor/grammars/sql.tmbundle"]
|
||||||
|
path = vendor/grammars/sql.tmbundle
|
||||||
|
url = https://github.com/textmate/sql.tmbundle
|
||||||
|
[submodule "vendor/grammars/standard-ml.tmbundle"]
|
||||||
|
path = vendor/grammars/standard-ml.tmbundle
|
||||||
|
url = https://github.com/textmate/standard-ml.tmbundle
|
||||||
|
[submodule "vendor/grammars/swift.tmbundle"]
|
||||||
|
path = vendor/grammars/swift.tmbundle
|
||||||
|
url = https://github.com/textmate/swift.tmbundle
|
||||||
|
[submodule "vendor/grammars/tcl.tmbundle"]
|
||||||
|
path = vendor/grammars/tcl.tmbundle
|
||||||
|
url = https://github.com/textmate/tcl.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/toml.tmbundle"]
|
||||||
|
path = vendor/grammars/toml.tmbundle
|
||||||
|
url = https://github.com/textmate/toml.tmbundle
|
||||||
|
[submodule "vendor/grammars/verilog.tmbundle"]
|
||||||
|
path = vendor/grammars/verilog.tmbundle
|
||||||
|
url = https://github.com/textmate/verilog.tmbundle
|
||||||
|
[submodule "vendor/grammars/xml.tmbundle"]
|
||||||
|
path = vendor/grammars/xml.tmbundle
|
||||||
|
url = https://github.com/textmate/xml.tmbundle
|
||||||
|
[submodule "vendor/grammars/smalltalk-tmbundle"]
|
||||||
|
path = vendor/grammars/smalltalk-tmbundle
|
||||||
|
url = https://github.com/tomas-stefano/smalltalk-tmbundle
|
||||||
|
[submodule "vendor/grammars/ioke-outdated"]
|
||||||
|
path = vendor/grammars/ioke-outdated
|
||||||
|
url = https://github.com/vic/ioke-outdated
|
||||||
|
[submodule "vendor/grammars/kotlin-sublime-package"]
|
||||||
|
path = vendor/grammars/kotlin-sublime-package
|
||||||
|
url = https://github.com/vkostyukov/kotlin-sublime-package
|
||||||
|
[submodule "vendor/grammars/c.tmbundle"]
|
||||||
|
path = vendor/grammars/c.tmbundle
|
||||||
|
url = https://github.com/textmate/c.tmbundle
|
||||||
|
[submodule "vendor/grammars/zephir-sublime"]
|
||||||
|
path = vendor/grammars/zephir-sublime
|
||||||
|
url = https://github.com/vmg/zephir-sublime
|
||||||
|
[submodule "vendor/grammars/llvm.tmbundle"]
|
||||||
|
path = vendor/grammars/llvm.tmbundle
|
||||||
|
url = https://github.com/whitequark/llvm.tmbundle
|
||||||
|
[submodule "vendor/grammars/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/sublime-mask"]
|
||||||
|
path = vendor/grammars/sublime-mask
|
||||||
|
url = https://github.com/tenbits/sublime-mask
|
||||||
|
[submodule "vendor/grammars/sublime_cobol"]
|
||||||
|
path = vendor/grammars/sublime_cobol
|
||||||
|
url = https://bitbucket.org/bitlang/sublime_cobol
|
||||||
|
[submodule "vendor/grammars/ruby.tmbundle"]
|
||||||
|
path = vendor/grammars/ruby.tmbundle
|
||||||
|
url = https://github.com/aroben/ruby.tmbundle
|
||||||
|
branch = pl
|
||||||
|
[submodule "vendor/grammars/IDL-Syntax"]
|
||||||
|
path = vendor/grammars/IDL-Syntax
|
||||||
|
url = https://github.com/andik/IDL-Syntax
|
||||||
|
[submodule "vendor/grammars/sas.tmbundle"]
|
||||||
|
path = vendor/grammars/sas.tmbundle
|
||||||
|
url = https://github.com/rpardee/sas.tmbundle
|
||||||
|
[submodule "vendor/grammars/atom-salt"]
|
||||||
|
path = vendor/grammars/atom-salt
|
||||||
|
url = https://github.com/saltstack/atom-salt
|
||||||
|
[submodule "vendor/grammars/Scalate.tmbundle"]
|
||||||
|
path = vendor/grammars/Scalate.tmbundle
|
||||||
|
url = https://github.com/scalate/Scalate.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/Sublime-HTTP"]
|
||||||
|
path = vendor/grammars/Sublime-HTTP
|
||||||
|
url = https://github.com/httpspec/sublime-highlighting
|
||||||
|
[submodule "vendor/grammars/sass-textmate-bundle"]
|
||||||
|
path = vendor/grammars/sass-textmate-bundle
|
||||||
|
url = https://github.com/nathos/sass-textmate-bundle
|
||||||
|
[submodule "vendor/grammars/carto-atom"]
|
||||||
|
path = vendor/grammars/carto-atom
|
||||||
|
url = https://github.com/yohanboniface/carto-atom
|
||||||
|
[submodule "vendor/grammars/Sublime-Nit"]
|
||||||
|
path = vendor/grammars/Sublime-Nit
|
||||||
|
url = https://github.com/R4PaSs/Sublime-Nit
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/turtle.tmbundle"]
|
||||||
|
path = vendor/grammars/turtle.tmbundle
|
||||||
|
url = https://github.com/peta/turtle.tmbundle
|
||||||
|
[submodule "vendor/grammars/liquid.tmbundle"]
|
||||||
|
path = vendor/grammars/liquid.tmbundle
|
||||||
|
url = https://github.com/bastilian/validcode-textmate-bundles
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/JSyntax"]
|
||||||
|
path = vendor/grammars/JSyntax
|
||||||
|
url = https://github.com/bcj/JSyntax
|
||||||
|
[submodule "vendor/grammars/TXL"]
|
||||||
|
path = vendor/grammars/TXL
|
||||||
|
url = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax
|
||||||
|
[submodule "vendor/grammars/G-Code"]
|
||||||
|
path = vendor/grammars/G-Code
|
||||||
|
url = https://github.com/robotmaster/sublime-text-syntax-highlighting
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/AutoHotkey"]
|
||||||
|
path = vendor/grammars/AutoHotkey
|
||||||
|
url = https://github.com/ahkscript/SublimeAutoHotkey
|
||||||
|
[submodule "vendor/grammars/ec.tmbundle"]
|
||||||
|
path = vendor/grammars/ec.tmbundle
|
||||||
|
url = https://github.com/ecere/ec.tmbundle
|
||||||
|
[submodule "vendor/grammars/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
|
||||||
|
[submodule "vendor/grammars/SublimePapyrus"]
|
||||||
|
path = vendor/grammars/SublimePapyrus
|
||||||
|
url = https://github.com/Kapiainen/SublimePapyrus
|
||||||
|
[submodule "vendor/grammars/sublime-spintools"]
|
||||||
|
path = vendor/grammars/sublime-spintools
|
||||||
|
url = https://github.com/bitbased/sublime-spintools
|
||||||
|
[submodule "vendor/grammars/PogoScript.tmbundle"]
|
||||||
|
path = vendor/grammars/PogoScript.tmbundle
|
||||||
|
url = https://github.com/featurist/PogoScript.tmbundle
|
||||||
|
[submodule "vendor/grammars/sublime-opal"]
|
||||||
|
path = vendor/grammars/sublime-opal
|
||||||
|
url = https://github.com/artifactz/sublime-opal
|
||||||
|
[submodule "vendor/grammars/mediawiki.tmbundle"]
|
||||||
|
path = vendor/grammars/mediawiki.tmbundle
|
||||||
|
url = https://github.com/textmate/mediawiki.tmbundle
|
||||||
|
[submodule "vendor/grammars/oracle.tmbundle"]
|
||||||
|
path = vendor/grammars/oracle.tmbundle
|
||||||
|
url = https://github.com/mulander/oracle.tmbundle.git
|
||||||
|
[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/sublime-text-pig-latin"]
|
||||||
|
path = vendor/grammars/sublime-text-pig-latin
|
||||||
|
url = https://github.com/goblindegook/sublime-text-pig-latin
|
||||||
|
[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/openscad.tmbundle"]
|
||||||
|
path = vendor/grammars/openscad.tmbundle
|
||||||
|
url = https://github.com/tbuser/openscad.tmbundle
|
||||||
|
[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
|
||||||
13
.travis.yml
13
.travis.yml
@@ -1,12 +1,11 @@
|
|||||||
before_install:
|
before_install: script/travis/before_install
|
||||||
- sudo apt-get install libicu-dev -y
|
|
||||||
# Short-term fix addressing https://github.com/bundler/bundler/issues/2784
|
|
||||||
- gem update --system 2.1.11
|
|
||||||
rvm:
|
rvm:
|
||||||
- 1.8.7
|
|
||||||
- 1.9.2
|
|
||||||
- 1.9.3
|
- 1.9.3
|
||||||
- 2.0.0
|
- 2.0.0
|
||||||
- ree
|
- 2.1
|
||||||
|
- 2.2
|
||||||
notifications:
|
notifications:
|
||||||
disabled: true
|
disabled: true
|
||||||
|
git:
|
||||||
|
submodules: false
|
||||||
|
cache: bundler
|
||||||
|
|||||||
81
CONTRIBUTING.md
Normal file
81
CONTRIBUTING.md
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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).
|
||||||
|
|
||||||
|
Once the bug has been fixed upstream, please let us know and we'll pick it up for GitHub.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
For development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
||||||
|
|
||||||
|
git clone https://github.com/github/linguist.git
|
||||||
|
cd linguist/
|
||||||
|
script/bootstrap
|
||||||
|
|
||||||
|
To run the tests:
|
||||||
|
|
||||||
|
bundle exec rake test
|
||||||
|
|
||||||
|
Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away.
|
||||||
|
|
||||||
|
Here's our current build status: [](http://travis-ci.org/github/linguist)
|
||||||
|
|
||||||
|
## Releasing
|
||||||
|
|
||||||
|
If you are the current maintainer of this gem:
|
||||||
|
|
||||||
|
0. Create a branch for the release: `git checkout -b cut-release-vxx.xx.xx`
|
||||||
|
0. Make sure your local dependencies are up to date: `script/bootstrap`
|
||||||
|
0. If grammar submodules have not been updated recently, update them: `git submodule update --remote && git commit -a`
|
||||||
|
0. Ensure that samples are updated: `bundle exec rake samples`
|
||||||
|
0. Ensure that tests are green: `bundle exec rake test`
|
||||||
|
0. Bump gem version in `lib/linguist/version.rb`, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985).
|
||||||
|
0. Make a PR to github/linguist, [like this](https://github.com/github/linguist/pull/1238).
|
||||||
|
0. Build a local gem: `bundle exec rake build_gem`
|
||||||
|
0. Test the gem:
|
||||||
|
0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem
|
||||||
|
0. Install the new gem locally
|
||||||
|
0. Test behavior locally, branch deploy, whatever needs to happen
|
||||||
|
0. Merge github/linguist PR
|
||||||
|
0. Tag and push: `git tag vx.xx.xx; git push --tags`
|
||||||
|
0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem`
|
||||||
|
|
||||||
|
[grammars]: /grammars.yml
|
||||||
|
[languages]: /lib/linguist/languages.yml
|
||||||
|
[samples]: /samples
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
9
Gemfile
9
Gemfile
@@ -1,7 +1,4 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
gemspec
|
gemspec :name => "github-linguist"
|
||||||
|
gemspec :name => "github-linguist-grammars"
|
||||||
if RUBY_VERSION < "1.9.3"
|
gem 'byebug' if RUBY_VERSION >= '2.0'
|
||||||
# escape_utils 1.0.0 requires 1.9.3 and above
|
|
||||||
gem "escape_utils", "0.3.2"
|
|
||||||
end
|
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2011-2014 GitHub, Inc.
|
Copyright (c) 2011-2015 GitHub, Inc.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|||||||
174
README.md
174
README.md
@@ -1,116 +1,112 @@
|
|||||||
# Linguist
|
# Linguist
|
||||||
|
|
||||||
We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.
|
[issues]: https://github.com/github/linguist/issues
|
||||||
|
[new-issue]: https://github.com/github/linguist/issues/new
|
||||||
|
|
||||||
## Features
|
This library is used on GitHub.com to detect blob languages, ignore binary or vendored files, suppress generated files in diffs, and generate language breakdown graphs.
|
||||||
|
|
||||||
### Language detection
|
See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md) before filing an issue or creating a pull request.
|
||||||
|
|
||||||
Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and lexer must be defined there.
|
## Troubleshooting
|
||||||
|
|
||||||
Most languages are detected by their file extension. This is the fastest and most common situation.
|
### My repository is detected as the wrong language
|
||||||
|
|
||||||
For disambiguating between files with common extensions, we first apply
|

|
||||||
some common-sense heuristics to pick out obvious languages. After that, we use a
|
|
||||||
[statistical
|
|
||||||
classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb).
|
|
||||||
This process can help us tell the difference between, for example, `.h` files which could be either C, C++, or Obj-C.
|
|
||||||
|
|
||||||
```ruby
|
The Language stats bar is built by aggregating the languages of each file in that repository. If it is reporting a language that you don't expect:
|
||||||
|
|
||||||
Linguist::FileBlob.new("lib/linguist.rb").language.name #=> "Ruby"
|
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
|
||||||
|
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](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.
|
||||||
|
|
||||||
Linguist::FileBlob.new("bin/linguist").language.name #=> "Ruby"
|
## Overrides
|
||||||
|
|
||||||
|
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
|
||||||
|
|
||||||
|
### Using gitattributes
|
||||||
|
|
||||||
|
Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics, but will not be used to syntax highlight files. To manually set syntax highlighting, use [Vim or Emacs modelines](#using-emacs-and-vim-modelines).
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
*.rb linguist-language=Java
|
||||||
```
|
```
|
||||||
|
|
||||||
See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/lib/linguist/language.rb) and [lib/linguist/languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml).
|
Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Vendored files are also hidden by default in diffs on github.com.
|
||||||
|
|
||||||
### Syntax Highlighting
|
Use the `linguist-vendored` attribute to vendor or un-vendor paths.
|
||||||
|
|
||||||
The actual syntax highlighting is handled by our Pygments wrapper, [pygments.rb](https://github.com/tmm1/pygments.rb). It also provides a [Lexer abstraction](https://github.com/tmm1/pygments.rb/blob/master/lib/pygments/lexer.rb) that determines which highlighter should be used on a file.
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
### Stats
|
special-vendored-path/* linguist-vendored
|
||||||
|
jquery.js linguist-vendored=false
|
||||||
The Language stats bar that you see on every repository is built by aggregating the languages of each file in that repository. The top language in the graph determines the project's primary language. Collectively, these stats make up the [Top Languages](https://github.com/languages) page.
|
|
||||||
|
|
||||||
The repository stats API, accessed through `#languages`, can be used on a directory:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
project = Linguist::Repository.from_directory(".")
|
|
||||||
project.language.name #=> "Ruby"
|
|
||||||
project.languages #=> { "Ruby" => 0.98, "Shell" => 0.02 }
|
|
||||||
```
|
```
|
||||||
|
|
||||||
These stats are also printed out by the `linguist` binary. You can use the
|
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.
|
||||||
|
|
||||||
|
Use the `linguist-documentation` attribute to mark or unmark paths as documentation.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .gitattributes
|
||||||
|
project-docs/* linguist-documentation
|
||||||
|
docs/formatter.rb linguist-documentation=false
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Emacs and Vim modelines
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
```
|
||||||
|
Vim
|
||||||
|
vim: set filetype=prolog:
|
||||||
|
vim: set ft=cpp:
|
||||||
|
|
||||||
|
Emacs
|
||||||
|
-*- mode: php;-*-
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Install the gem:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gem install github-linguist
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use it in your application:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require 'rugged'
|
||||||
|
require 'linguist'
|
||||||
|
|
||||||
|
repo = Rugged::Repository.new('.')
|
||||||
|
project = Linguist::Repository.new(repo, repo.head.target_id)
|
||||||
|
project.language #=> "Ruby"
|
||||||
|
project.languages #=> { "Ruby" => 119387 }
|
||||||
|
```
|
||||||
|
|
||||||
|
These stats are also printed out by the `linguist` executable. You can use the
|
||||||
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
`--breakdown` flag, and the binary will also output the breakdown of files by language.
|
||||||
|
|
||||||
You can try running `linguist` on the `lib/` directory in this repository itself:
|
You can try running `linguist` on the root directory in this repository itself:
|
||||||
|
|
||||||
$ bundle exec linguist lib/ --breakdown
|
|
||||||
|
|
||||||
100.00% Ruby
|
|
||||||
|
|
||||||
Ruby:
|
|
||||||
linguist/blob_helper.rb
|
|
||||||
linguist/classifier.rb
|
|
||||||
linguist/file_blob.rb
|
|
||||||
linguist/generated.rb
|
|
||||||
linguist/heuristics.rb
|
|
||||||
linguist/language.rb
|
|
||||||
linguist/md5.rb
|
|
||||||
linguist/repository.rb
|
|
||||||
linguist/samples.rb
|
|
||||||
linguist/tokenizer.rb
|
|
||||||
linguist.rb
|
|
||||||
|
|
||||||
#### Ignore vendored files
|
|
||||||
|
|
||||||
Checking other code into your git repo is a common practice. But this often inflates your project's language stats and may even cause your project to be labeled as another language. We are able to identify some of these files and directories and exclude them.
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Linguist::FileBlob.new("vendor/plugins/foo.rb").vendored? # => true
|
|
||||||
```
|
```
|
||||||
|
$ bundle exec linguist --breakdown
|
||||||
|
|
||||||
See [Linguist::BlobHelper#vendored?](https://github.com/github/linguist/blob/master/lib/linguist/blob_helper.rb) and [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml).
|
100.00% Ruby
|
||||||
|
|
||||||
#### Generated file detection
|
Ruby:
|
||||||
|
Gemfile
|
||||||
Not all plain text files are true source files. Generated files like minified js and compiled CoffeeScript can be detected and excluded from language stats. As an extra bonus, these files are suppressed in diffs.
|
Rakefile
|
||||||
|
bin/linguist
|
||||||
```ruby
|
github-linguist.gemspec
|
||||||
Linguist::FileBlob.new("underscore.min.js").generated? # => true
|
lib/linguist.rb
|
||||||
|
…
|
||||||
```
|
```
|
||||||
|
|
||||||
See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist).
|
|
||||||
|
|
||||||
But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies.
|
|
||||||
|
|
||||||
git clone https://github.com/github/linguist.git
|
|
||||||
cd linguist/
|
|
||||||
bundle install
|
|
||||||
|
|
||||||
To run the tests:
|
|
||||||
|
|
||||||
bundle exec rake test
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
The majority of contributions won't need to touch any Ruby code at all. The [master language list](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) is just a YAML configuration file.
|
Please check out our [contributing guidelines](CONTRIBUTING.md).
|
||||||
|
|
||||||
We try to only add languages once they have some usage on GitHub, so please note in-the-wild usage examples in your pull request.
|
##
|
||||||
|
|
||||||
Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions.
|
|
||||||
|
|
||||||
To update the `samples.json` after adding new files to [`samples/`](https://github.com/github/linguist/tree/master/samples):
|
|
||||||
|
|
||||||
bundle exec rake samples
|
|
||||||
|
|
||||||
### Testing
|
|
||||||
|
|
||||||
Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let our build bot [Travis](http://travis-ci.org/#!/github/linguist) run the tests for you. Just open a pull request and the bot will start cranking away.
|
|
||||||
|
|
||||||
Here's our current build status, which is hopefully green: [](http://travis-ci.org/github/linguist)
|
|
||||||
|
|||||||
122
Rakefile
122
Rakefile
@@ -1,27 +1,118 @@
|
|||||||
require 'json'
|
require 'bundler/setup'
|
||||||
require 'rake/clean'
|
require 'rake/clean'
|
||||||
require 'rake/testtask'
|
require 'rake/testtask'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
require 'yajl'
|
||||||
|
require 'open-uri'
|
||||||
|
|
||||||
task :default => :test
|
task :default => :test
|
||||||
|
|
||||||
Rake::TestTask.new
|
Rake::TestTask.new
|
||||||
|
|
||||||
task :samples do
|
# Extend test task to check for samples and fetch latest Ace modes
|
||||||
require 'linguist/samples'
|
task :test => [:check_samples, :fetch_ace_modes]
|
||||||
require 'yajl'
|
|
||||||
data = Linguist::Samples.data
|
desc "Check that we have samples.json generated"
|
||||||
json = Yajl::Encoder.encode(data, :pretty => true)
|
task :check_samples do
|
||||||
File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
|
unless File.exist?('lib/linguist/samples.json')
|
||||||
|
Rake::Task[:samples].invoke
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
task :build_gem do
|
desc "Fetch the latest Ace modes from its GitHub repository"
|
||||||
|
task :fetch_ace_modes do
|
||||||
|
ACE_FIXTURE_PATH = File.join('test', 'fixtures', 'ace_modes.json')
|
||||||
|
|
||||||
|
File.delete(ACE_FIXTURE_PATH) if File.exist?(ACE_FIXTURE_PATH)
|
||||||
|
|
||||||
|
begin
|
||||||
|
ace_github_modes = open("https://api.github.com/repos/ajaxorg/ace/contents/lib/ace/mode").read
|
||||||
|
File.write(ACE_FIXTURE_PATH, ace_github_modes)
|
||||||
|
rescue OpenURI::HTTPError, SocketError
|
||||||
|
# no internet? no problem.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
task :samples do
|
||||||
|
require 'linguist/samples'
|
||||||
|
json = Yajl.dump(Linguist::Samples.data, :pretty => true)
|
||||||
|
File.write 'lib/linguist/samples.json', json
|
||||||
|
end
|
||||||
|
|
||||||
|
task :build_gem => :samples do
|
||||||
languages = YAML.load_file("lib/linguist/languages.yml")
|
languages = YAML.load_file("lib/linguist/languages.yml")
|
||||||
File.write("lib/linguist/languages.json", JSON.dump(languages))
|
File.write("lib/linguist/languages.json", Yajl.dump(languages))
|
||||||
`gem build github-linguist.gemspec`
|
`gem build github-linguist.gemspec`
|
||||||
File.delete("lib/linguist/languages.json")
|
File.delete("lib/linguist/languages.json")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
task :build_grammars_gem do
|
||||||
|
rm_rf "grammars"
|
||||||
|
sh "script/convert-grammars"
|
||||||
|
sh "gem", "build", "github-linguist-grammars.gemspec"
|
||||||
|
end
|
||||||
|
|
||||||
|
namespace :benchmark do
|
||||||
|
benchmark_path = "benchmark/results"
|
||||||
|
|
||||||
|
# $ bundle exec rake benchmark:generate CORPUS=path/to/samples
|
||||||
|
desc "Generate results for"
|
||||||
|
task :generate do
|
||||||
|
ref = `git rev-parse HEAD`.strip[0,8]
|
||||||
|
|
||||||
|
corpus = File.expand_path(ENV["CORPUS"] || "samples")
|
||||||
|
|
||||||
|
require 'linguist/language'
|
||||||
|
|
||||||
|
results = Hash.new
|
||||||
|
Dir.glob("#{corpus}/**/*").each do |file|
|
||||||
|
next unless File.file?(file)
|
||||||
|
filename = file.gsub("#{corpus}/", "")
|
||||||
|
results[filename] = Linguist::FileBlob.new(file).language
|
||||||
|
end
|
||||||
|
|
||||||
|
# Ensure results directory exists
|
||||||
|
FileUtils.mkdir_p("benchmark/results")
|
||||||
|
|
||||||
|
# Write results
|
||||||
|
if `git status`.include?('working directory clean')
|
||||||
|
result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}.json"
|
||||||
|
else
|
||||||
|
result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.write(result_filename, results.to_json)
|
||||||
|
puts "wrote #{result_filename}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json
|
||||||
|
desc "Compare results"
|
||||||
|
task :compare do
|
||||||
|
reference_file = ENV["REFERENCE"]
|
||||||
|
candidate_file = ENV["CANDIDATE"]
|
||||||
|
|
||||||
|
reference = Yajl.load(File.read(reference_file))
|
||||||
|
reference_counts = Hash.new(0)
|
||||||
|
reference.each { |filename, language| reference_counts[language] += 1 }
|
||||||
|
|
||||||
|
candidate = Yajl.load(File.read(candidate_file))
|
||||||
|
candidate_counts = Hash.new(0)
|
||||||
|
candidate.each { |filename, language| candidate_counts[language] += 1 }
|
||||||
|
|
||||||
|
changes = diff(reference_counts, candidate_counts)
|
||||||
|
|
||||||
|
if changes.any?
|
||||||
|
changes.each do |language, (before, after)|
|
||||||
|
before_percent = 100 * before / reference.size.to_f
|
||||||
|
after_percent = 100 * after / candidate.size.to_f
|
||||||
|
puts "%s changed from %.1f%% to %.1f%%" % [language || 'unknown', before_percent, after_percent]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
puts "No changes"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
namespace :classifier do
|
namespace :classifier do
|
||||||
LIMIT = 1_000
|
LIMIT = 1_000
|
||||||
|
|
||||||
@@ -37,7 +128,7 @@ namespace :classifier do
|
|||||||
next if file_language.nil? || file_language == 'Text'
|
next if file_language.nil? || file_language == 'Text'
|
||||||
begin
|
begin
|
||||||
data = open(file_url).read
|
data = open(file_url).read
|
||||||
guessed_language, score = Linguist::Classifier.classify(Linguist::Samples::DATA, data).first
|
guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first
|
||||||
|
|
||||||
total += 1
|
total += 1
|
||||||
guessed_language == file_language ? correct += 1 : incorrect += 1
|
guessed_language == file_language ? correct += 1 : incorrect += 1
|
||||||
@@ -54,14 +145,12 @@ namespace :classifier do
|
|||||||
|
|
||||||
def each_public_gist
|
def each_public_gist
|
||||||
require 'open-uri'
|
require 'open-uri'
|
||||||
require 'json'
|
|
||||||
|
|
||||||
url = "https://api.github.com/gists/public"
|
url = "https://api.github.com/gists/public"
|
||||||
|
|
||||||
loop do
|
loop do
|
||||||
resp = open(url)
|
resp = open(url)
|
||||||
url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1]
|
url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1]
|
||||||
gists = JSON.parse(resp.read)
|
gists = Yajl.load(resp.read)
|
||||||
|
|
||||||
for gist in gists
|
for gist in gists
|
||||||
for filename, attrs in gist['files']
|
for filename, attrs in gist['files']
|
||||||
@@ -71,3 +160,10 @@ namespace :classifier do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def diff(a, b)
|
||||||
|
(a.keys | b.keys).each_with_object({}) do |key, diff|
|
||||||
|
diff[key] = [a[key], b[key]] unless a[key] == b[key]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
11
bin/linguist
11
bin/linguist
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
# linguist — detect language type for a file, or, given a directory, determine language breakdown
|
||||||
# usage: linguist <path> [<--breakdown>]
|
# usage: linguist <path> [<--breakdown>]
|
||||||
|
#
|
||||||
require 'linguist/file_blob'
|
require 'linguist'
|
||||||
require 'linguist/repository'
|
require 'rugged'
|
||||||
|
|
||||||
path = ARGV[0] || Dir.pwd
|
path = ARGV[0] || Dir.pwd
|
||||||
|
|
||||||
@@ -18,7 +18,8 @@ ARGV.shift
|
|||||||
breakdown = true if ARGV[0] == "--breakdown"
|
breakdown = true if ARGV[0] == "--breakdown"
|
||||||
|
|
||||||
if File.directory?(path)
|
if File.directory?(path)
|
||||||
repo = Linguist::Repository.from_directory(path)
|
rugged = Rugged::Repository.new(path)
|
||||||
|
repo = Linguist::Repository.new(rugged, rugged.head.target_id)
|
||||||
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
|
||||||
percentage = ((size / repo.size.to_f) * 100)
|
percentage = ((size / repo.size.to_f) * 100)
|
||||||
percentage = sprintf '%.2f' % percentage
|
percentage = sprintf '%.2f' % percentage
|
||||||
@@ -28,7 +29,7 @@ if File.directory?(path)
|
|||||||
puts
|
puts
|
||||||
file_breakdown = repo.breakdown_by_file
|
file_breakdown = repo.breakdown_by_file
|
||||||
file_breakdown.each do |lang, files|
|
file_breakdown.each do |lang, files|
|
||||||
puts "#{lang}:"
|
puts "#{lang}:"
|
||||||
files.each do |file|
|
files.each do |file|
|
||||||
puts file
|
puts file
|
||||||
end
|
end
|
||||||
|
|||||||
14
github-linguist-grammars.gemspec
Normal file
14
github-linguist-grammars.gemspec
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
require File.expand_path('../lib/linguist/version', __FILE__)
|
||||||
|
|
||||||
|
Gem::Specification.new do |s|
|
||||||
|
s.name = 'github-linguist-grammars'
|
||||||
|
s.version = Linguist::VERSION
|
||||||
|
s.summary = "Language grammars for use with github-linguist"
|
||||||
|
|
||||||
|
s.authors = "GitHub"
|
||||||
|
s.homepage = "https://github.com/github/linguist"
|
||||||
|
|
||||||
|
s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*']
|
||||||
|
|
||||||
|
s.add_development_dependency 'plist', '~>3.1'
|
||||||
|
end
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
|
require File.expand_path('../lib/linguist/version', __FILE__)
|
||||||
|
|
||||||
Gem::Specification.new do |s|
|
Gem::Specification.new do |s|
|
||||||
s.name = 'github-linguist'
|
s.name = 'github-linguist'
|
||||||
s.version = '2.10.10'
|
s.version = Linguist::VERSION
|
||||||
s.summary = "GitHub Language detection"
|
s.summary = "GitHub Language detection"
|
||||||
s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'
|
s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'
|
||||||
|
|
||||||
@@ -8,16 +10,17 @@ Gem::Specification.new do |s|
|
|||||||
s.homepage = "https://github.com/github/linguist"
|
s.homepage = "https://github.com/github/linguist"
|
||||||
s.license = "MIT"
|
s.license = "MIT"
|
||||||
|
|
||||||
s.files = Dir['lib/**/*']
|
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb']
|
||||||
s.executables << 'linguist'
|
s.executables << 'linguist'
|
||||||
|
|
||||||
s.add_dependency 'charlock_holmes', '~> 0.6.6'
|
s.add_dependency 'charlock_holmes', '~> 0.7.3'
|
||||||
s.add_dependency 'escape_utils', '>= 0.3.1'
|
s.add_dependency 'escape_utils', '~> 1.0.1'
|
||||||
s.add_dependency 'mime-types', '~> 1.19'
|
s.add_dependency 'mime-types', '>= 1.19'
|
||||||
s.add_dependency 'pygments.rb', '~> 0.5.4'
|
s.add_dependency 'rugged', '~> 0.22.0b4'
|
||||||
|
|
||||||
s.add_development_dependency 'json'
|
s.add_development_dependency 'minitest', '>= 5.0'
|
||||||
s.add_development_dependency 'mocha'
|
s.add_development_dependency 'mocha'
|
||||||
|
s.add_development_dependency 'pry'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
s.add_development_dependency 'yajl-ruby'
|
s.add_development_dependency 'yajl-ruby'
|
||||||
end
|
end
|
||||||
|
|||||||
541
grammars.yml
Normal file
541
grammars.yml
Normal file
@@ -0,0 +1,541 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
|
vendor/grammars/Agda.tmbundle:
|
||||||
|
- source.agda
|
||||||
|
vendor/grammars/Alloy.tmbundle:
|
||||||
|
- source.alloy
|
||||||
|
vendor/grammars/AutoHotkey/:
|
||||||
|
- source.ahk
|
||||||
|
vendor/grammars/BrightScript.tmbundle/:
|
||||||
|
- source.brightauthorproject
|
||||||
|
- source.brightscript
|
||||||
|
vendor/grammars/CLIPS-sublime:
|
||||||
|
- source.clips
|
||||||
|
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:
|
||||||
|
- source.elm
|
||||||
|
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/:
|
||||||
|
- source.j
|
||||||
|
vendor/grammars/Julia.tmbundle:
|
||||||
|
- source.julia
|
||||||
|
vendor/grammars/Lean.tmbundle:
|
||||||
|
- source.lean
|
||||||
|
vendor/grammars/LiveScript.tmbundle:
|
||||||
|
- source.livescript
|
||||||
|
vendor/grammars/Modelica/:
|
||||||
|
- source.modelica
|
||||||
|
vendor/grammars/NSIS:
|
||||||
|
- source.nsis
|
||||||
|
vendor/grammars/NimLime:
|
||||||
|
- source.nim
|
||||||
|
- source.nim_filter
|
||||||
|
- source.nimcfg
|
||||||
|
vendor/grammars/PHP-Twig.tmbundle:
|
||||||
|
- text.html.twig
|
||||||
|
vendor/grammars/PogoScript.tmbundle/:
|
||||||
|
- source.pogoscript
|
||||||
|
vendor/grammars/RDoc.tmbundle:
|
||||||
|
- text.rdoc
|
||||||
|
vendor/grammars/Racket:
|
||||||
|
- source.racket
|
||||||
|
vendor/grammars/SCSS.tmbundle:
|
||||||
|
- source.scss
|
||||||
|
vendor/grammars/Scalate.tmbundle:
|
||||||
|
- source.scaml
|
||||||
|
- text.html.ssp
|
||||||
|
vendor/grammars/Slash.tmbundle:
|
||||||
|
- text.html.slash
|
||||||
|
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-Nit:
|
||||||
|
- source.nit
|
||||||
|
vendor/grammars/Sublime-QML:
|
||||||
|
- source.qml
|
||||||
|
vendor/grammars/Sublime-REBOL:
|
||||||
|
- source.rebol
|
||||||
|
vendor/grammars/Sublime-SQF-Language:
|
||||||
|
- source.sqf
|
||||||
|
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
||||||
|
- source.abl
|
||||||
|
vendor/grammars/Sublime-VimL:
|
||||||
|
- source.viml
|
||||||
|
vendor/grammars/SublimeBrainfuck:
|
||||||
|
- source.bf
|
||||||
|
vendor/grammars/SublimePapyrus/:
|
||||||
|
- source.compiled-papyrus
|
||||||
|
- source.papyrus
|
||||||
|
- source.papyrus-assembly
|
||||||
|
vendor/grammars/SublimeXtend:
|
||||||
|
- source.xtend
|
||||||
|
vendor/grammars/TXL/:
|
||||||
|
- source.txl
|
||||||
|
vendor/grammars/Textmate-Gosu-Bundle:
|
||||||
|
- source.gosu.2
|
||||||
|
vendor/grammars/VBDotNetSyntax:
|
||||||
|
- source.vbnet
|
||||||
|
vendor/grammars/Vala-TMBundle:
|
||||||
|
- source.vala
|
||||||
|
vendor/grammars/abap.tmbundle:
|
||||||
|
- source.abap
|
||||||
|
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:
|
||||||
|
- source.antlr
|
||||||
|
vendor/grammars/apache.tmbundle:
|
||||||
|
- source.apache-config
|
||||||
|
- source.apache-config.mod_perl
|
||||||
|
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:
|
||||||
|
- objdump.x86asm
|
||||||
|
- source.x86asm
|
||||||
|
vendor/grammars/atom-salt:
|
||||||
|
- source.python.salt
|
||||||
|
- source.yaml.salt
|
||||||
|
vendor/grammars/ats.sublime:
|
||||||
|
- 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:
|
||||||
|
- source.boo
|
||||||
|
vendor/grammars/bro-sublime:
|
||||||
|
- source.bro
|
||||||
|
vendor/grammars/c.tmbundle:
|
||||||
|
- source.c
|
||||||
|
- source.c++
|
||||||
|
- source.c.platform
|
||||||
|
vendor/grammars/capnproto.tmbundle:
|
||||||
|
- source.capnp
|
||||||
|
vendor/grammars/carto-atom:
|
||||||
|
- source.css.mss
|
||||||
|
vendor/grammars/ceylon-sublimetext:
|
||||||
|
- module.ceylon
|
||||||
|
- source.ceylon
|
||||||
|
vendor/grammars/chapel-tmbundle:
|
||||||
|
- source.chapel
|
||||||
|
vendor/grammars/cmake.tmbundle:
|
||||||
|
- source.cache.cmake
|
||||||
|
- source.cmake
|
||||||
|
vendor/grammars/cool-tmbundle:
|
||||||
|
- source.cool
|
||||||
|
vendor/grammars/cpp-qt.tmbundle:
|
||||||
|
- source.c++.qt
|
||||||
|
- source.qmake
|
||||||
|
vendor/grammars/css.tmbundle:
|
||||||
|
- source.css
|
||||||
|
vendor/grammars/cucumber-tmbundle:
|
||||||
|
- source.ruby.rspec.cucumber.steps
|
||||||
|
- text.gherkin.feature
|
||||||
|
vendor/grammars/d.tmbundle:
|
||||||
|
- source.d
|
||||||
|
vendor/grammars/dart-sublime-bundle:
|
||||||
|
- source.dart
|
||||||
|
- source.pubspec
|
||||||
|
- text.dart-doccomments
|
||||||
|
vendor/grammars/desktop.tmbundle:
|
||||||
|
- source.desktop
|
||||||
|
vendor/grammars/diff.tmbundle:
|
||||||
|
- source.diff
|
||||||
|
vendor/grammars/dylan.tmbundle:
|
||||||
|
- source.dylan
|
||||||
|
- source.lid
|
||||||
|
- source.makegen
|
||||||
|
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
||||||
|
- source.dosbatch
|
||||||
|
vendor/grammars/ec.tmbundle/:
|
||||||
|
- source.c.ec
|
||||||
|
vendor/grammars/eiffel.tmbundle:
|
||||||
|
- source.eiffel
|
||||||
|
vendor/grammars/elixir-tmbundle:
|
||||||
|
- source.elixir
|
||||||
|
- text.elixir
|
||||||
|
- text.html.elixir
|
||||||
|
vendor/grammars/erlang.tmbundle:
|
||||||
|
- source.erlang
|
||||||
|
- text.html.erlang.yaws
|
||||||
|
vendor/grammars/factor:
|
||||||
|
- source.factor
|
||||||
|
- text.html.factor
|
||||||
|
vendor/grammars/fancy-tmbundle:
|
||||||
|
- source.fancy
|
||||||
|
vendor/grammars/fish-tmbundle:
|
||||||
|
- source.fish
|
||||||
|
vendor/grammars/fortran.tmbundle:
|
||||||
|
- source.fortran
|
||||||
|
- source.fortran.modern
|
||||||
|
vendor/grammars/fsharpbinding:
|
||||||
|
- source.fsharp
|
||||||
|
vendor/grammars/gap-tmbundle/:
|
||||||
|
- source.gap
|
||||||
|
vendor/grammars/gettext.tmbundle:
|
||||||
|
- source.po
|
||||||
|
vendor/grammars/gnuplot-tmbundle:
|
||||||
|
- source.gnuplot
|
||||||
|
vendor/grammars/go-tmbundle:
|
||||||
|
- source.go
|
||||||
|
vendor/grammars/grace-tmbundle/:
|
||||||
|
- source.grace
|
||||||
|
vendor/grammars/gradle.tmbundle:
|
||||||
|
- source.groovy.gradle
|
||||||
|
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
|
||||||
|
- source.hss.1
|
||||||
|
- source.hxml
|
||||||
|
- source.nmml
|
||||||
|
vendor/grammars/html.tmbundle:
|
||||||
|
- text.html.basic
|
||||||
|
vendor/grammars/idl.tmbundle:
|
||||||
|
- source.idl
|
||||||
|
- source.idl-dlm
|
||||||
|
- text.idl-idldoc
|
||||||
|
vendor/grammars/ini.tmbundle:
|
||||||
|
- source.ini
|
||||||
|
vendor/grammars/io.tmbundle:
|
||||||
|
- source.io
|
||||||
|
vendor/grammars/ioke-outdated:
|
||||||
|
- source.ioke
|
||||||
|
vendor/grammars/jade-tmbundle:
|
||||||
|
- source.jade
|
||||||
|
- source.pyjade
|
||||||
|
vendor/grammars/jasmin-sublime:
|
||||||
|
- source.jasmin
|
||||||
|
vendor/grammars/java.tmbundle:
|
||||||
|
- source.java
|
||||||
|
- 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/json.tmbundle:
|
||||||
|
- source.json
|
||||||
|
vendor/grammars/kotlin-sublime-package:
|
||||||
|
- source.Kotlin
|
||||||
|
vendor/grammars/language-clojure:
|
||||||
|
- source.clojure
|
||||||
|
vendor/grammars/language-coffee-script:
|
||||||
|
- source.coffee
|
||||||
|
- source.litcoffee
|
||||||
|
vendor/grammars/language-csharp:
|
||||||
|
- source.cs
|
||||||
|
- source.csx
|
||||||
|
- source.nant-build
|
||||||
|
vendor/grammars/language-gfm:
|
||||||
|
- source.gfm
|
||||||
|
vendor/grammars/language-hy:
|
||||||
|
- source.hy
|
||||||
|
vendor/grammars/language-javascript:
|
||||||
|
- source.js
|
||||||
|
- source.js.regexp
|
||||||
|
vendor/grammars/language-python:
|
||||||
|
- source.python
|
||||||
|
- source.regexp.python
|
||||||
|
- text.python.console
|
||||||
|
- text.python.traceback
|
||||||
|
vendor/grammars/language-shellscript:
|
||||||
|
- source.shell
|
||||||
|
- text.shell-session
|
||||||
|
vendor/grammars/language-yaml:
|
||||||
|
- source.yaml
|
||||||
|
vendor/grammars/latex.tmbundle:
|
||||||
|
- text.bibtex
|
||||||
|
- text.log.latex
|
||||||
|
- text.tex
|
||||||
|
- 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:
|
||||||
|
- text.html.liquid
|
||||||
|
vendor/grammars/lisp.tmbundle:
|
||||||
|
- source.lisp
|
||||||
|
vendor/grammars/llvm.tmbundle:
|
||||||
|
- source.llvm
|
||||||
|
vendor/grammars/logtalk.tmbundle:
|
||||||
|
- source.logtalk
|
||||||
|
vendor/grammars/lua.tmbundle:
|
||||||
|
- source.lua
|
||||||
|
vendor/grammars/make.tmbundle:
|
||||||
|
- source.makefile
|
||||||
|
vendor/grammars/mako-tmbundle:
|
||||||
|
- text.html.mako
|
||||||
|
vendor/grammars/mathematica-tmbundle:
|
||||||
|
- source.mathematica
|
||||||
|
vendor/grammars/matlab.tmbundle:
|
||||||
|
- source.matlab
|
||||||
|
- source.octave
|
||||||
|
vendor/grammars/maven.tmbundle:
|
||||||
|
- text.xml.pom
|
||||||
|
vendor/grammars/mediawiki.tmbundle/:
|
||||||
|
- text.html.mediawiki
|
||||||
|
vendor/grammars/mercury-tmlanguage:
|
||||||
|
- source.mercury
|
||||||
|
vendor/grammars/monkey.tmbundle:
|
||||||
|
- source.monkey
|
||||||
|
vendor/grammars/moonscript-tmbundle:
|
||||||
|
- source.moonscript
|
||||||
|
vendor/grammars/nemerle.tmbundle:
|
||||||
|
- source.nemerle
|
||||||
|
vendor/grammars/nesC.tmbundle:
|
||||||
|
- source.nesc
|
||||||
|
vendor/grammars/ninja.tmbundle:
|
||||||
|
- source.ninja
|
||||||
|
vendor/grammars/objective-c.tmbundle:
|
||||||
|
- source.objc
|
||||||
|
- source.objc++
|
||||||
|
- source.objc.platform
|
||||||
|
- source.strings
|
||||||
|
vendor/grammars/ocaml.tmbundle:
|
||||||
|
- source.camlp4.ocaml
|
||||||
|
- source.ocaml
|
||||||
|
- source.ocamllex
|
||||||
|
- source.ocamlyacc
|
||||||
|
vendor/grammars/ooc.tmbundle:
|
||||||
|
- source.ooc
|
||||||
|
vendor/grammars/opa.tmbundle:
|
||||||
|
- source.opa
|
||||||
|
vendor/grammars/openscad.tmbundle/:
|
||||||
|
- source.scad
|
||||||
|
vendor/grammars/oracle.tmbundle:
|
||||||
|
- source.plsql.oracle
|
||||||
|
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
|
||||||
|
- source.oz
|
||||||
|
vendor/grammars/pascal.tmbundle:
|
||||||
|
- source.pascal
|
||||||
|
vendor/grammars/perl.tmbundle/:
|
||||||
|
- source.perl
|
||||||
|
- source.perl.6
|
||||||
|
vendor/grammars/php-smarty.tmbundle:
|
||||||
|
- source.smarty
|
||||||
|
vendor/grammars/php.tmbundle:
|
||||||
|
- text.html.php
|
||||||
|
vendor/grammars/pike-textmate:
|
||||||
|
- source.pike
|
||||||
|
vendor/grammars/postscript.tmbundle:
|
||||||
|
- source.postscript
|
||||||
|
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/ruby-slim.tmbundle:
|
||||||
|
- text.slim
|
||||||
|
vendor/grammars/ruby.tmbundle:
|
||||||
|
- source.ruby
|
||||||
|
- text.html.erb
|
||||||
|
vendor/grammars/sas.tmbundle:
|
||||||
|
- source.SASLog
|
||||||
|
- source.sas
|
||||||
|
vendor/grammars/sass-textmate-bundle:
|
||||||
|
- source.sass
|
||||||
|
vendor/grammars/scala.tmbundle:
|
||||||
|
- source.sbt
|
||||||
|
- source.scala
|
||||||
|
vendor/grammars/scheme.tmbundle:
|
||||||
|
- source.scheme
|
||||||
|
vendor/grammars/scilab.tmbundle:
|
||||||
|
- source.scilab
|
||||||
|
vendor/grammars/smalltalk-tmbundle:
|
||||||
|
- source.smalltalk
|
||||||
|
vendor/grammars/sql.tmbundle:
|
||||||
|
- source.sql
|
||||||
|
vendor/grammars/standard-ml.tmbundle:
|
||||||
|
- source.cm
|
||||||
|
- source.ml
|
||||||
|
vendor/grammars/sublime-MuPAD:
|
||||||
|
- source.mupad
|
||||||
|
vendor/grammars/sublime-apl/:
|
||||||
|
- source.apl
|
||||||
|
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-glsl:
|
||||||
|
- source.essl
|
||||||
|
- source.glsl
|
||||||
|
vendor/grammars/sublime-golo/:
|
||||||
|
- source.golo
|
||||||
|
vendor/grammars/sublime-idris:
|
||||||
|
- source.idris
|
||||||
|
vendor/grammars/sublime-mask:
|
||||||
|
- source.mask
|
||||||
|
vendor/grammars/sublime-nginx:
|
||||||
|
- source.nginx
|
||||||
|
vendor/grammars/sublime-nix:
|
||||||
|
- source.nix
|
||||||
|
vendor/grammars/sublime-opal/:
|
||||||
|
- source.opal
|
||||||
|
- source.opalsysdefs
|
||||||
|
vendor/grammars/sublime-robot-plugin:
|
||||||
|
- text.robot
|
||||||
|
vendor/grammars/sublime-rust:
|
||||||
|
- source.rust
|
||||||
|
vendor/grammars/sublime-sourcepawn:
|
||||||
|
- source.sp
|
||||||
|
vendor/grammars/sublime-spintools/:
|
||||||
|
- source.regexp.spin
|
||||||
|
- source.spin
|
||||||
|
vendor/grammars/sublime-tea:
|
||||||
|
- source.tea
|
||||||
|
vendor/grammars/sublime-text-ox/:
|
||||||
|
- source.ox
|
||||||
|
vendor/grammars/sublime-text-pig-latin/:
|
||||||
|
- source.pig_latin
|
||||||
|
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/sublimetext-cuda-cpp:
|
||||||
|
- source.cuda-c++
|
||||||
|
vendor/grammars/swift.tmbundle:
|
||||||
|
- source.swift
|
||||||
|
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:
|
||||||
|
- source.toml
|
||||||
|
vendor/grammars/turtle.tmbundle:
|
||||||
|
- source.sparql
|
||||||
|
- source.turtle
|
||||||
|
vendor/grammars/verilog.tmbundle:
|
||||||
|
- source.verilog
|
||||||
|
vendor/grammars/x86-assembly-textmate-bundle:
|
||||||
|
- source.asm.x86
|
||||||
|
vendor/grammars/xc.tmbundle/:
|
||||||
|
- source.xc
|
||||||
|
vendor/grammars/xml.tmbundle:
|
||||||
|
- text.xml
|
||||||
|
- text.xml.xsl
|
||||||
|
vendor/grammars/zephir-sublime:
|
||||||
|
- source.php.zephir
|
||||||
@@ -4,3 +4,17 @@ require 'linguist/heuristics'
|
|||||||
require 'linguist/language'
|
require 'linguist/language'
|
||||||
require 'linguist/repository'
|
require 'linguist/repository'
|
||||||
require 'linguist/samples'
|
require 'linguist/samples'
|
||||||
|
require 'linguist/shebang'
|
||||||
|
require 'linguist/version'
|
||||||
|
|
||||||
|
class << Linguist
|
||||||
|
attr_accessor :instrumenter
|
||||||
|
|
||||||
|
def instrument(*args, &bk)
|
||||||
|
if instrumenter
|
||||||
|
instrumenter.instrument(*args, &bk)
|
||||||
|
else
|
||||||
|
yield if block_given?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
require 'linguist/generated'
|
require 'linguist/generated'
|
||||||
require 'linguist/language'
|
|
||||||
|
|
||||||
require 'charlock_holmes'
|
require 'charlock_holmes'
|
||||||
require 'escape_utils'
|
require 'escape_utils'
|
||||||
require 'mime/types'
|
require 'mime/types'
|
||||||
require 'pygments'
|
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
@@ -102,7 +99,7 @@ module Linguist
|
|||||||
elsif name.nil?
|
elsif name.nil?
|
||||||
"attachment"
|
"attachment"
|
||||||
else
|
else
|
||||||
"attachment; filename=#{EscapeUtils.escape_url(File.basename(name))}"
|
"attachment; filename=#{EscapeUtils.escape_url(name)}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -112,6 +109,12 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ruby_encoding
|
||||||
|
if hash = detect_encoding
|
||||||
|
hash[:ruby_encoding]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Try to guess the encoding
|
# Try to guess the encoding
|
||||||
#
|
#
|
||||||
# Returns: a Hash, with :encoding, :confidence, :type
|
# Returns: a Hash, with :encoding, :confidence, :type
|
||||||
@@ -143,6 +146,13 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Is the blob empty?
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def empty?
|
||||||
|
data.nil? || data == ""
|
||||||
|
end
|
||||||
|
|
||||||
# Public: Is the blob text?
|
# Public: Is the blob text?
|
||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
@@ -189,10 +199,6 @@ module Linguist
|
|||||||
|
|
||||||
# Public: Is the blob safe to colorize?
|
# Public: Is the blob safe to colorize?
|
||||||
#
|
#
|
||||||
# We use Pygments for syntax highlighting blobs. Pygments
|
|
||||||
# can be too slow for very large blobs or for certain
|
|
||||||
# corner-case blobs.
|
|
||||||
#
|
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def safe_to_colorize?
|
def safe_to_colorize?
|
||||||
!large? && text? && !high_ratio_of_long_lines?
|
!large? && text? && !high_ratio_of_long_lines?
|
||||||
@@ -200,9 +206,6 @@ module Linguist
|
|||||||
|
|
||||||
# Internal: Does the blob have a ratio of long lines?
|
# Internal: Does the blob have a ratio of long lines?
|
||||||
#
|
#
|
||||||
# These types of files are usually going to make Pygments.rb
|
|
||||||
# angry if we try to colorize them.
|
|
||||||
#
|
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def high_ratio_of_long_lines?
|
def high_ratio_of_long_lines?
|
||||||
return false if loc == 0
|
return false if loc == 0
|
||||||
@@ -230,7 +233,22 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def vendored?
|
def vendored?
|
||||||
name =~ VendoredRegexp ? true : false
|
path =~ VendoredRegexp ? true : false
|
||||||
|
end
|
||||||
|
|
||||||
|
documentation_paths = YAML.load_file(File.expand_path("../documentation.yml", __FILE__))
|
||||||
|
DocumentationRegexp = Regexp.new(documentation_paths.join('|'))
|
||||||
|
|
||||||
|
# Public: Is the blob in a documentation directory?
|
||||||
|
#
|
||||||
|
# Documentation files are ignored by language statistics.
|
||||||
|
#
|
||||||
|
# See "documentation.yml" for a list of documentation conventions that match
|
||||||
|
# this pattern.
|
||||||
|
#
|
||||||
|
# Return true or false
|
||||||
|
def documentation?
|
||||||
|
path =~ DocumentationRegexp ? true : false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get each line of data
|
# Public: Get each line of data
|
||||||
@@ -241,7 +259,31 @@ module Linguist
|
|||||||
def lines
|
def lines
|
||||||
@lines ||=
|
@lines ||=
|
||||||
if viewable? && data
|
if viewable? && data
|
||||||
data.split(/\r\n|\r|\n/, -1)
|
# `data` is usually encoded as ASCII-8BIT even when the content has
|
||||||
|
# been detected as a different encoding. However, we are not allowed
|
||||||
|
# to change the encoding of `data` because we've made the implicit
|
||||||
|
# guarantee that each entry in `lines` is encoded the same way as
|
||||||
|
# `data`.
|
||||||
|
#
|
||||||
|
# Instead, we re-encode each possible newline sequence as the
|
||||||
|
# detected encoding, then force them back to the encoding of `data`
|
||||||
|
# (usually a binary encoding like ASCII-8BIT). This means that the
|
||||||
|
# byte sequence will match how newlines are likely encoded in the
|
||||||
|
# file, but we don't have to change the encoding of `data` as far as
|
||||||
|
# Ruby is concerned. This allows us to correctly parse out each line
|
||||||
|
# without changing the encoding of `data`, and
|
||||||
|
# also--importantly--without having to duplicate many (potentially
|
||||||
|
# large) strings.
|
||||||
|
begin
|
||||||
|
encoded_newlines = ["\r\n", "\r", "\n"].
|
||||||
|
map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) }
|
||||||
|
|
||||||
|
data.split(Regexp.union(encoded_newlines), -1)
|
||||||
|
rescue Encoding::ConverterNotFoundError
|
||||||
|
# The data is not splittable in the detected encoding. Assume it's
|
||||||
|
# one big line.
|
||||||
|
[data]
|
||||||
|
end
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
@@ -274,7 +316,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def generated?
|
def generated?
|
||||||
@_generated ||= Generated.generated?(name, lambda { data })
|
@_generated ||= Generated.generated?(path, lambda { data })
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Detects the Language of the blob.
|
# Public: Detects the Language of the blob.
|
||||||
@@ -283,34 +325,22 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a Language or nil if none is detected
|
# Returns a Language or nil if none is detected
|
||||||
def language
|
def language
|
||||||
return @language if defined? @language
|
@language ||= Language.detect(self)
|
||||||
|
|
||||||
if defined?(@data) && @data.is_a?(String)
|
|
||||||
data = @data
|
|
||||||
else
|
|
||||||
data = lambda { (binary_mime_type? || binary?) ? "" : self.data }
|
|
||||||
end
|
|
||||||
|
|
||||||
@language = Language.detect(name.to_s, data, mode)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Get the lexer of the blob.
|
# Internal: Get the TextMate compatible scope for the blob
|
||||||
#
|
def tm_scope
|
||||||
# Returns a Lexer.
|
language && language.tm_scope
|
||||||
def lexer
|
|
||||||
language ? language.lexer : Pygments::Lexer.find_by_name('Text only')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of blob
|
DETECTABLE_TYPES = [:programming, :markup].freeze
|
||||||
#
|
|
||||||
# options - A Hash of options (defaults to {})
|
# Internal: Should this blob be included in repository language statistics?
|
||||||
#
|
def include_in_language_stats?
|
||||||
# Returns html String
|
!vendored? &&
|
||||||
def colorize(options = {})
|
!documentation? &&
|
||||||
return unless safe_to_colorize?
|
!generated? &&
|
||||||
options[:options] ||= {}
|
language && DETECTABLE_TYPES.include?(language.type)
|
||||||
options[:options][:encoding] ||= encoding
|
|
||||||
lexer.highlight(data, options)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,6 +3,25 @@ require 'linguist/tokenizer'
|
|||||||
module Linguist
|
module Linguist
|
||||||
# Language bayesian classifier.
|
# Language bayesian classifier.
|
||||||
class Classifier
|
class Classifier
|
||||||
|
# Public: Use the classifier to detect language of the blob.
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
# possible_languages - Array of Language objects
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Classifier.call(FileBlob.new("path/to/file"), [
|
||||||
|
# Language["Ruby"], Language["Python"]
|
||||||
|
# ])
|
||||||
|
#
|
||||||
|
# Returns an Array of Language objects, most probable first.
|
||||||
|
def self.call(blob, possible_languages)
|
||||||
|
language_names = possible_languages.map(&:name)
|
||||||
|
classify(Samples.cache, blob.data, language_names).map do |name, _|
|
||||||
|
Language[name] # Return the actual Language objects
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Public: Train classifier that data is a certain language.
|
# Public: Train classifier that data is a certain language.
|
||||||
#
|
#
|
||||||
# db - Hash classifier database object
|
# db - Hash classifier database object
|
||||||
|
|||||||
23
lib/linguist/documentation.yml
Normal file
23
lib/linguist/documentation.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Documentation files and directories are excluded from language
|
||||||
|
# statistics.
|
||||||
|
#
|
||||||
|
# Lines in this file are Regexps that are matched against the file
|
||||||
|
# pathname.
|
||||||
|
#
|
||||||
|
# Please add additional test coverage to
|
||||||
|
# `test/test_blob.rb#test_documentation` if you make any changes.
|
||||||
|
|
||||||
|
## Documentation directories ##
|
||||||
|
|
||||||
|
- ^docs?/
|
||||||
|
- (^|/)[Dd]ocumentation/
|
||||||
|
- (^|/)javadoc/
|
||||||
|
- ^man/
|
||||||
|
|
||||||
|
## Documentation files ##
|
||||||
|
|
||||||
|
- (^|/)CONTRIBUTING(\.|$)
|
||||||
|
- (^|/)COPYING(\.|$)
|
||||||
|
- (^|/)INSTALL(\.|$)
|
||||||
|
- (^|/)LICEN[CS]E(\.|$)
|
||||||
|
- (^|/)README(\.|$)
|
||||||
@@ -3,7 +3,7 @@ require 'linguist/blob_helper'
|
|||||||
module Linguist
|
module Linguist
|
||||||
# A FileBlob is a wrapper around a File object to make it quack
|
# A FileBlob is a wrapper around a File object to make it quack
|
||||||
# like a Grit::Blob. It provides the basic interface: `name`,
|
# like a Grit::Blob. It provides the basic interface: `name`,
|
||||||
# `data`, and `size`.
|
# `data`, `path` and `size`.
|
||||||
class FileBlob
|
class FileBlob
|
||||||
include BlobHelper
|
include BlobHelper
|
||||||
|
|
||||||
@@ -14,43 +14,71 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a FileBlob.
|
# Returns a FileBlob.
|
||||||
def initialize(path, base_path = nil)
|
def initialize(path, base_path = nil)
|
||||||
@path = path
|
@fullpath = path
|
||||||
@name = base_path ? path.sub("#{base_path}/", '') : path
|
@path = base_path ? path.sub("#{base_path}/", '') : path
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Filename
|
# Public: Filename
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb").name
|
# FileBlob.new("/path/to/linguist/lib/linguist.rb").path
|
||||||
# # => "/path/to/linguist/lib/linguist.rb"
|
# # => "/path/to/linguist/lib/linguist.rb"
|
||||||
#
|
#
|
||||||
# FileBlob.new("/path/to/linguist/lib/linguist.rb",
|
# FileBlob.new("/path/to/linguist/lib/linguist.rb",
|
||||||
# "/path/to/linguist").name
|
# "/path/to/linguist").path
|
||||||
# # => "lib/linguist.rb"
|
# # => "lib/linguist.rb"
|
||||||
#
|
#
|
||||||
# Returns a String
|
# Returns a String
|
||||||
attr_reader :name
|
attr_reader :path
|
||||||
|
|
||||||
# Public: Read file permissions
|
# Public: Read file permissions
|
||||||
#
|
#
|
||||||
# Returns a String like '100644'
|
# Returns a String like '100644'
|
||||||
def mode
|
def mode
|
||||||
File.stat(@path).mode.to_s(8)
|
File.stat(@fullpath).mode.to_s(8)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: File name
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
def name
|
||||||
|
File.basename(@fullpath)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Read file contents.
|
# Public: Read file contents.
|
||||||
#
|
#
|
||||||
# Returns a String.
|
# Returns a String.
|
||||||
def data
|
def data
|
||||||
File.read(@path)
|
File.read(@fullpath)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get byte size
|
# Public: Get byte size
|
||||||
#
|
#
|
||||||
# Returns an Integer.
|
# Returns an Integer.
|
||||||
def size
|
def size
|
||||||
File.size(@path)
|
File.size(@fullpath)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get file extension.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def extension
|
||||||
|
extensions.last || ""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Return an array of the file extensions
|
||||||
|
#
|
||||||
|
# >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
|
||||||
|
# => [".html.erb", ".erb"]
|
||||||
|
#
|
||||||
|
# Returns an Array
|
||||||
|
def extensions
|
||||||
|
basename, *segments = name.downcase.split(".")
|
||||||
|
|
||||||
|
segments.map.with_index do |segment, index|
|
||||||
|
"." + segments[index..-1].join(".")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -51,28 +51,32 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Return true or false
|
# Return true or false
|
||||||
def generated?
|
def generated?
|
||||||
name == 'Gemfile.lock' ||
|
xcode_file? ||
|
||||||
minified_files? ||
|
generated_net_designer_file? ||
|
||||||
compiled_coffeescript? ||
|
composer_lock? ||
|
||||||
xcode_project_file? ||
|
node_modules? ||
|
||||||
generated_parser? ||
|
godeps? ||
|
||||||
generated_net_docfile? ||
|
generated_by_zephir? ||
|
||||||
generated_net_designer_file? ||
|
minified_files? ||
|
||||||
generated_postscript? ||
|
compiled_coffeescript? ||
|
||||||
generated_protocol_buffer? ||
|
generated_parser? ||
|
||||||
generated_jni_header? ||
|
generated_net_docfile? ||
|
||||||
composer_lock? ||
|
generated_postscript? ||
|
||||||
node_modules?
|
compiled_cython_file? ||
|
||||||
|
generated_protocol_buffer_go? ||
|
||||||
|
generated_protocol_buffer? ||
|
||||||
|
generated_jni_header? ||
|
||||||
|
vcr_cassette?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Is the blob an XCode project file?
|
# Internal: Is the blob an Xcode file?
|
||||||
#
|
#
|
||||||
# Generated if the file extension is an XCode project
|
# Generated if the file extension is an Xcode
|
||||||
# file extension.
|
# file extension.
|
||||||
#
|
#
|
||||||
# Returns true of false.
|
# Returns true of false.
|
||||||
def xcode_project_file?
|
def xcode_file?
|
||||||
['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname)
|
['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Is the blob minified files?
|
# Internal: Is the blob minified files?
|
||||||
@@ -200,6 +204,13 @@ module Linguist
|
|||||||
creator.include?("ImageMagick")
|
creator.include?("ImageMagick")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generated_protocol_buffer_go?
|
||||||
|
return false unless extname == '.go'
|
||||||
|
return false unless lines.count > 1
|
||||||
|
|
||||||
|
return lines[0].include?("Code generated by protoc-gen-go")
|
||||||
|
end
|
||||||
|
|
||||||
# Internal: Is the blob a C++, Java or Python source file generated by the
|
# Internal: Is the blob a C++, Java or Python source file generated by the
|
||||||
# Protocol Buffer compiler?
|
# Protocol Buffer compiler?
|
||||||
#
|
#
|
||||||
@@ -222,20 +233,56 @@ module Linguist
|
|||||||
lines[1].include?("#include <jni.h>")
|
lines[1].include?("#include <jni.h>")
|
||||||
end
|
end
|
||||||
|
|
||||||
# node_modules/ can contain large amounts of files, in general not meant
|
# Internal: Is the blob part of node_modules/, which are not meant for humans in pull requests.
|
||||||
# for humans in pull requests.
|
|
||||||
#
|
#
|
||||||
# Returns true or false.
|
# Returns true or false.
|
||||||
def node_modules?
|
def node_modules?
|
||||||
!!name.match(/node_modules\//)
|
!!name.match(/node_modules\//)
|
||||||
end
|
end
|
||||||
|
|
||||||
# the php composer tool generates a lock file to represent a specific dependency state.
|
# Internal: Is the blob part of Godeps/,
|
||||||
# In general not meant for humans in pull requests.
|
# which are not meant for humans in pull requests.
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def godeps?
|
||||||
|
!!name.match(/Godeps\//)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated php composer lock file?
|
||||||
#
|
#
|
||||||
# Returns true or false.
|
# Returns true or false.
|
||||||
def composer_lock?
|
def composer_lock?
|
||||||
!!name.match(/composer.lock/)
|
!!name.match(/composer\.lock/)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Is the blob a generated by Zephir
|
||||||
|
#
|
||||||
|
# Returns true or false.
|
||||||
|
def generated_by_zephir?
|
||||||
|
!!name.match(/.\.zep\.(?:c|h|php)$/)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Is the blob a VCR Cassette file?
|
||||||
|
#
|
||||||
|
# Returns true or false
|
||||||
|
def vcr_cassette?
|
||||||
|
return false unless extname == '.yml'
|
||||||
|
return false unless lines.count > 2
|
||||||
|
# VCR Cassettes have "recorded_with: VCR" in the second last line.
|
||||||
|
return lines[-2].include?("recorded_with: VCR")
|
||||||
|
end
|
||||||
|
|
||||||
|
# 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
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
13
lib/linguist/grammars.rb
Normal file
13
lib/linguist/grammars.rb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Note: This file is included in the github-linguist-grammars gem, not the
|
||||||
|
# github-linguist gem.
|
||||||
|
|
||||||
|
module Linguist
|
||||||
|
module Grammars
|
||||||
|
# Get the path to the directory containing the language grammar JSON files.
|
||||||
|
#
|
||||||
|
# Returns a String.
|
||||||
|
def self.path
|
||||||
|
File.expand_path("../../../grammars", __FILE__)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,60 +1,265 @@
|
|||||||
module Linguist
|
module Linguist
|
||||||
# A collection of simple heuristics that can be used to better analyze languages.
|
# A collection of simple heuristics that can be used to better analyze languages.
|
||||||
class Heuristics
|
class Heuristics
|
||||||
ACTIVE = false
|
# Public: Use heuristics to detect language of the blob.
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
# possible_languages - Array of Language objects
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Heuristics.call(FileBlob.new("path/to/file"), [
|
||||||
|
# Language["Ruby"], Language["Python"]
|
||||||
|
# ])
|
||||||
|
#
|
||||||
|
# Returns an Array of languages, or empty if none matched or were inconclusive.
|
||||||
|
def self.call(blob, languages)
|
||||||
|
data = blob.data
|
||||||
|
|
||||||
# Public: Given an array of String language names,
|
@heuristics.each do |heuristic|
|
||||||
# apply heuristics against the given data and return an array
|
return Array(heuristic.call(data)) if heuristic.matches?(languages)
|
||||||
# of matching languages, or nil.
|
end
|
||||||
|
|
||||||
|
[] # No heuristics matched
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Define a new heuristic.
|
||||||
#
|
#
|
||||||
# data - Array of tokens or String data to analyze.
|
# languages - String names of languages to disambiguate.
|
||||||
# languages - Array of language name Strings to restrict to.
|
# heuristic - Block which takes data as an argument and returns a Language or nil.
|
||||||
#
|
#
|
||||||
# Returns an array of Languages or []
|
# Examples
|
||||||
def self.find_by_heuristics(data, languages)
|
#
|
||||||
if active?
|
# disambiguate "Perl", "Prolog" do |data|
|
||||||
if languages.all? { |l| ["Objective-C", "C++"].include?(l) }
|
# if data.include?("use strict")
|
||||||
disambiguate_c(data, languages)
|
# Language["Perl"]
|
||||||
end
|
# elsif /^[^#]+:-/.match(data)
|
||||||
if languages.all? { |l| ["Perl", "Prolog"].include?(l) }
|
# Language["Prolog"]
|
||||||
disambiguate_pl(data, languages)
|
# end
|
||||||
end
|
# end
|
||||||
if languages.all? { |l| ["TypeScript", "XML"].include?(l) }
|
#
|
||||||
disambiguate_ts(data, languages)
|
def self.disambiguate(*languages, &heuristic)
|
||||||
end
|
@heuristics << new(languages, &heuristic)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Array of defined heuristics
|
||||||
|
@heuristics = []
|
||||||
|
|
||||||
|
# Internal
|
||||||
|
def initialize(languages, &heuristic)
|
||||||
|
@languages = languages
|
||||||
|
@heuristic = heuristic
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Check if this heuristic matches the candidate languages.
|
||||||
|
def matches?(candidates)
|
||||||
|
candidates.any? && candidates.all? { |l| @languages.include?(l.name) }
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: Perform the heuristic
|
||||||
|
def call(data)
|
||||||
|
@heuristic.call(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Common heuristics
|
||||||
|
ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/
|
||||||
|
|
||||||
|
disambiguate "BitBake", "BlitzBasic" do |data|
|
||||||
|
if /^\s*; /.match(data) || data.include?("End Function")
|
||||||
|
Language["BlitzBasic"]
|
||||||
|
elsif /^\s*(# |include|require)\b/.match(data)
|
||||||
|
Language["BitBake"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# .h extensions are ambigious between C, C++, and Objective-C.
|
disambiguate "C#", "Smalltalk" do |data|
|
||||||
# We want to shortcut look for Objective-C _and_ now C++ too!
|
if /![\w\s]+methodsFor: /.match(data)
|
||||||
#
|
Language["Smalltalk"]
|
||||||
# Returns an array of Languages or []
|
elsif /^\s*namespace\s*[\w\.]+\s*{/.match(data) || /^\s*\/\//.match(data)
|
||||||
def self.disambiguate_c(data, languages)
|
Language["C#"]
|
||||||
matches = []
|
end
|
||||||
matches << Language["Objective-C"] if data.include?("@interface")
|
|
||||||
matches << Language["C++"] if data.include?("#include <cstdint>")
|
|
||||||
matches
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.disambiguate_pl(data, languages)
|
disambiguate "Objective-C", "C++", "C" do |data|
|
||||||
matches = []
|
if ObjectiveCRegex.match(data)
|
||||||
matches << Language["Prolog"] if data.include?(":-")
|
Language["Objective-C"]
|
||||||
matches << Language["Perl"] if data.include?("use strict")
|
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) ||
|
||||||
matches
|
/^\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
|
end
|
||||||
|
|
||||||
def self.disambiguate_ts(data, languages)
|
disambiguate "Perl", "Perl6", "Prolog" do |data|
|
||||||
matches = []
|
if data.include?("use v6")
|
||||||
if (data.include?("</translation>"))
|
Language["Perl6"]
|
||||||
matches << Language["XML"]
|
elsif data.match(/use strict|use\s+v?5\./)
|
||||||
|
Language["Perl"]
|
||||||
|
elsif /^[^#]+:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "ECL", "Prolog" do |data|
|
||||||
|
if /^[^#]+:-/.match(data)
|
||||||
|
Language["Prolog"]
|
||||||
|
elsif data.include?(":=")
|
||||||
|
Language["ECL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "IDL", "Prolog", "INI", "QMake" 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 "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
|
else
|
||||||
matches << Language["TypeScript"]
|
Language["Scilab"]
|
||||||
end
|
end
|
||||||
matches
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.active?
|
disambiguate "Common Lisp", "OpenCL", "Cool" do |data|
|
||||||
!!ACTIVE
|
if data.include?("(defun ")
|
||||||
|
Language["Common Lisp"]
|
||||||
|
elsif /^class/x.match(data)
|
||||||
|
Language["Cool"]
|
||||||
|
elsif /\/\* |\/\/ |^\}/.match(data)
|
||||||
|
Language["OpenCL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "Hack", "PHP" do |data|
|
||||||
|
if data.include?("<?hh")
|
||||||
|
Language["Hack"]
|
||||||
|
elsif /<?[^h]/.match(data)
|
||||||
|
Language["PHP"]
|
||||||
|
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"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "AsciiDoc", "AGS Script", "Public Key" do |data|
|
||||||
|
if /^[=-]+(\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"]
|
||||||
|
elsif /^-----BEGIN/.match(data)
|
||||||
|
Language["Public Key"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "FORTRAN", "Forth" do |data|
|
||||||
|
if /^: /.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^([c*][^a-z]| (subroutine|program)\s|\s*!)/i.match(data)
|
||||||
|
Language["FORTRAN"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "F#", "Forth", "GLSL" do |data|
|
||||||
|
if /^(: |new-device)/.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^\s*(#light|import|let|module|namespace|open|type)/.match(data)
|
||||||
|
Language["F#"]
|
||||||
|
elsif /^\s*(#include|#pragma|precision|uniform|varying|void)/.match(data)
|
||||||
|
Language["GLSL"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "M", "MUF", "Mathematica", "Matlab", "Mercury", "Objective-C" 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 /^\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|
|
||||||
|
if /^(: |also |new-device|previous )/.match(data)
|
||||||
|
Language["Forth"]
|
||||||
|
elsif /^\s*(import|module|package|data|type) /.match(data)
|
||||||
|
Language["Frege"]
|
||||||
|
else
|
||||||
|
Language["Text"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
disambiguate "PLSQL", "SQLPL", "PLpgSQL", "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 /pragma|\$\$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 "D", "DTrace", "Makefile" do |data|
|
||||||
|
if /^module /.match(data)
|
||||||
|
Language["D"]
|
||||||
|
elsif /^((dtrace:::)?BEGIN|provider |#pragma (D (option|attributes)|ident)\s)/.match(data)
|
||||||
|
Language["DTrace"]
|
||||||
|
elsif /(\/.*:( .* \\)$| : \\$|^ : |: \\$)/.match(data)
|
||||||
|
Language["Makefile"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
require 'escape_utils'
|
require 'escape_utils'
|
||||||
require 'pygments'
|
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
begin
|
begin
|
||||||
require 'json'
|
require 'yajl'
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
end
|
end
|
||||||
|
|
||||||
require 'linguist/classifier'
|
require 'linguist/classifier'
|
||||||
require 'linguist/heuristics'
|
require 'linguist/heuristics'
|
||||||
require 'linguist/samples'
|
require 'linguist/samples'
|
||||||
|
require 'linguist/file_blob'
|
||||||
|
require 'linguist/blob_helper'
|
||||||
|
require 'linguist/strategy/filename'
|
||||||
|
require 'linguist/strategy/modeline'
|
||||||
|
require 'linguist/shebang'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# Language names that are recognizable by GitHub. Defined languages
|
# Language names that are recognizable by GitHub. Defined languages
|
||||||
@@ -24,18 +28,10 @@ module Linguist
|
|||||||
@extension_index = Hash.new { |h,k| h[k] = [] }
|
@extension_index = Hash.new { |h,k| h[k] = [] }
|
||||||
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
||||||
@filename_index = Hash.new { |h,k| h[k] = [] }
|
@filename_index = Hash.new { |h,k| h[k] = [] }
|
||||||
@primary_extension_index = {}
|
|
||||||
|
|
||||||
# Valid Languages types
|
# Valid Languages types
|
||||||
TYPES = [:data, :markup, :programming, :prose]
|
TYPES = [:data, :markup, :programming, :prose]
|
||||||
|
|
||||||
# Names of non-programming languages that we will still detect
|
|
||||||
#
|
|
||||||
# Returns an array
|
|
||||||
def self.detectable_markup
|
|
||||||
["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Detect languages by a specific type
|
# Detect languages by a specific type
|
||||||
#
|
#
|
||||||
# type - A symbol that exists within TYPES
|
# type - A symbol that exists within TYPES
|
||||||
@@ -61,7 +57,7 @@ module Linguist
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Language name index
|
# Language name index
|
||||||
@index[language.name] = @name_index[language.name] = language
|
@index[language.name.downcase] = @name_index[language.name.downcase] = language
|
||||||
|
|
||||||
language.aliases.each do |name|
|
language.aliases.each do |name|
|
||||||
# All Language aliases should be unique. Raise if there is a duplicate.
|
# All Language aliases should be unique. Raise if there is a duplicate.
|
||||||
@@ -69,7 +65,7 @@ module Linguist
|
|||||||
raise ArgumentError, "Duplicate alias: #{name}"
|
raise ArgumentError, "Duplicate alias: #{name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@index[name] = @alias_index[name] = language
|
@index[name.downcase] = @alias_index[name.downcase] = language
|
||||||
end
|
end
|
||||||
|
|
||||||
language.extensions.each do |extension|
|
language.extensions.each do |extension|
|
||||||
@@ -77,15 +73,9 @@ module Linguist
|
|||||||
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
raise ArgumentError, "Extension is missing a '.': #{extension.inspect}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@extension_index[extension] << language
|
@extension_index[extension.downcase] << language
|
||||||
end
|
end
|
||||||
|
|
||||||
if @primary_extension_index.key?(language.primary_extension)
|
|
||||||
raise ArgumentError, "Duplicate primary extension: #{language.primary_extension}"
|
|
||||||
end
|
|
||||||
|
|
||||||
@primary_extension_index[language.primary_extension] = language
|
|
||||||
|
|
||||||
language.interpreters.each do |interpreter|
|
language.interpreters.each do |interpreter|
|
||||||
@interpreter_index[interpreter] << language
|
@interpreter_index[interpreter] << language
|
||||||
end
|
end
|
||||||
@@ -97,50 +87,48 @@ module Linguist
|
|||||||
language
|
language
|
||||||
end
|
end
|
||||||
|
|
||||||
|
STRATEGIES = [
|
||||||
|
Linguist::Strategy::Modeline,
|
||||||
|
Linguist::Shebang,
|
||||||
|
Linguist::Strategy::Filename,
|
||||||
|
Linguist::Heuristics,
|
||||||
|
Linguist::Classifier
|
||||||
|
]
|
||||||
|
|
||||||
# Public: Detects the Language of the blob.
|
# Public: Detects the Language of the blob.
|
||||||
#
|
#
|
||||||
# name - String filename
|
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||||
# data - String blob data. A block also maybe passed in for lazy
|
# see Linguist::LazyBlob and Linguist::FileBlob for examples
|
||||||
# loading. This behavior is deprecated and you should always
|
|
||||||
# pass in a String.
|
|
||||||
# mode - Optional String mode (defaults to nil)
|
|
||||||
#
|
#
|
||||||
# Returns Language or nil.
|
# Returns Language or nil.
|
||||||
def self.detect(name, data, mode = nil)
|
def self.detect(blob)
|
||||||
# A bit of an elegant hack. If the file is executable but extensionless,
|
# Bail early if the blob is binary or empty.
|
||||||
# append a "magic" extension so it can be classified with other
|
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
||||||
# languages that have shebang scripts.
|
|
||||||
if File.extname(name).empty? && mode && (mode.to_i(8) & 05) == 05
|
|
||||||
name += ".script!"
|
|
||||||
end
|
|
||||||
|
|
||||||
# First try to find languages that match based on filename.
|
Linguist.instrument("linguist.detection", :blob => blob) do
|
||||||
possible_languages = find_by_filename(name)
|
# Call each strategy until one candidate is returned.
|
||||||
|
languages = []
|
||||||
|
returning_strategy = nil
|
||||||
|
|
||||||
# If there is more than one possible language with that extension (or no
|
STRATEGIES.each do |strategy|
|
||||||
# extension at all, in the case of extensionless scripts), we need to continue
|
returning_strategy = strategy
|
||||||
# our detection work
|
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
|
||||||
if possible_languages.length > 1
|
strategy.call(blob, languages)
|
||||||
data = data.call() if data.respond_to?(:call)
|
end
|
||||||
possible_language_names = possible_languages.map(&:name)
|
if candidates.size == 1
|
||||||
|
languages = candidates
|
||||||
# Don't bother with emptiness
|
break
|
||||||
if data.nil? || data == ""
|
elsif candidates.size > 1
|
||||||
nil
|
# More than one candidate was found, pass them to the next strategy.
|
||||||
# Check if there's a shebang line and use that as authoritative
|
languages = candidates
|
||||||
elsif (result = find_by_shebang(data)) && !result.empty?
|
else
|
||||||
result.first
|
# No candidates, try the next strategy
|
||||||
# No shebang. Still more work to do. Try to find it with our heuristics.
|
end
|
||||||
elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
|
|
||||||
determined.first
|
|
||||||
# Lastly, fall back to the probablistic classifier.
|
|
||||||
elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first
|
|
||||||
# Return the actual Language object based of the string language name (i.e., first element of `#classify`)
|
|
||||||
Language[classified[0]]
|
|
||||||
end
|
end
|
||||||
else
|
|
||||||
# Simplest and most common case, we can just return the one match based on extension
|
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
|
||||||
possible_languages.first
|
|
||||||
|
languages.first
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -162,7 +150,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_name(name)
|
def self.find_by_name(name)
|
||||||
@name_index[name]
|
name && @name_index[name.downcase]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Language by one of its aliases.
|
# Public: Look up Language by one of its aliases.
|
||||||
@@ -174,9 +162,9 @@ module Linguist
|
|||||||
# Language.find_by_alias('cpp')
|
# Language.find_by_alias('cpp')
|
||||||
# # => #<Language name="C++">
|
# # => #<Language name="C++">
|
||||||
#
|
#
|
||||||
# Returns the Lexer or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.find_by_alias(name)
|
def self.find_by_alias(name)
|
||||||
@alias_index[name]
|
name && @alias_index[name.downcase]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by filename.
|
# Public: Look up Languages by filename.
|
||||||
@@ -190,28 +178,55 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns all matching Languages or [] if none were found.
|
# Returns all matching Languages or [] if none were found.
|
||||||
def self.find_by_filename(filename)
|
def self.find_by_filename(filename)
|
||||||
basename, extname = File.basename(filename), File.extname(filename)
|
basename = File.basename(filename)
|
||||||
langs = [@primary_extension_index[extname]] +
|
|
||||||
@filename_index[basename] +
|
# find the first extension with language definitions
|
||||||
@extension_index[extname]
|
extname = FileBlob.new(filename).extensions.detect do |e|
|
||||||
langs.compact.uniq
|
!@extension_index[e].empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
(@filename_index[basename] + @extension_index[extname]).compact.uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Languages by shebang line.
|
# Public: Look up Languages by file extension.
|
||||||
#
|
#
|
||||||
# data - Array of tokens or String data to analyze.
|
# extname - The extension String.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# Language.find_by_shebang("#!/bin/bash\ndate;")
|
# Language.find_by_extension('.rb')
|
||||||
|
# # => [#<Language name="Ruby">]
|
||||||
|
#
|
||||||
|
# Language.find_by_extension('rb')
|
||||||
|
# # => [#<Language name="Ruby">]
|
||||||
|
#
|
||||||
|
# Returns all matching Languages or [] if none were found.
|
||||||
|
def self.find_by_extension(extname)
|
||||||
|
extname = ".#{extname}" unless extname.start_with?(".")
|
||||||
|
@extension_index[extname.downcase]
|
||||||
|
end
|
||||||
|
|
||||||
|
# DEPRECATED
|
||||||
|
def self.find_by_shebang(data)
|
||||||
|
@interpreter_index[Shebang.interpreter(data)]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Look up Languages by interpreter.
|
||||||
|
#
|
||||||
|
# interpreter - String of interpreter name
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Language.find_by_interpreter("bash")
|
||||||
# # => [#<Language name="Bash">]
|
# # => [#<Language name="Bash">]
|
||||||
#
|
#
|
||||||
# Returns the matching Language
|
# Returns the matching Language
|
||||||
def self.find_by_shebang(data)
|
def self.find_by_interpreter(interpreter)
|
||||||
@interpreter_index[Linguist.interpreter_from_shebang(data)]
|
@interpreter_index[interpreter]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Look up Language by its name or lexer.
|
|
||||||
|
# Public: Look up Language by its name.
|
||||||
#
|
#
|
||||||
# name - The String name of the Language
|
# name - The String name of the Language
|
||||||
#
|
#
|
||||||
@@ -225,7 +240,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns the Language or nil if none was found.
|
# Returns the Language or nil if none was found.
|
||||||
def self.[](name)
|
def self.[](name)
|
||||||
@index[name]
|
name && @index[name.downcase]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: A List of popular languages
|
# Public: A List of popular languages
|
||||||
@@ -235,7 +250,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is configured in "popular.yml".
|
# This list is configured in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.popular
|
def self.popular
|
||||||
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
@popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -247,7 +262,7 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# This list is created from all the languages not listed in "popular.yml".
|
# This list is created from all the languages not listed in "popular.yml".
|
||||||
#
|
#
|
||||||
# Returns an Array of Lexers.
|
# Returns an Array of Languages.
|
||||||
def self.unpopular
|
def self.unpopular
|
||||||
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
@unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
@@ -261,8 +276,12 @@ module Linguist
|
|||||||
|
|
||||||
# Public: A List of languages compatible with Ace.
|
# 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.
|
# Returns an Array of Languages.
|
||||||
def self.ace_modes
|
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 }
|
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -284,9 +303,16 @@ module Linguist
|
|||||||
# Set aliases
|
# Set aliases
|
||||||
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
@aliases = [default_alias_name] + (attributes[:aliases] || [])
|
||||||
|
|
||||||
# Lookup Lexer object
|
# Load the TextMate scope name or try to guess one
|
||||||
@lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) ||
|
@tm_scope = attributes[:tm_scope] || begin
|
||||||
raise(ArgumentError, "#{@name} is missing lexer")
|
context = case @type
|
||||||
|
when :data, :markup, :prose
|
||||||
|
'text'
|
||||||
|
when :programming, nil
|
||||||
|
'source'
|
||||||
|
end
|
||||||
|
"#{context}.#{@name.downcase}"
|
||||||
|
end
|
||||||
|
|
||||||
@ace_mode = attributes[:ace_mode]
|
@ace_mode = attributes[:ace_mode]
|
||||||
@wrap = attributes[:wrap] || false
|
@wrap = attributes[:wrap] || false
|
||||||
@@ -299,15 +325,6 @@ module Linguist
|
|||||||
@interpreters = attributes[:interpreters] || []
|
@interpreters = attributes[:interpreters] || []
|
||||||
@filenames = attributes[:filenames] || []
|
@filenames = attributes[:filenames] || []
|
||||||
|
|
||||||
unless @primary_extension = attributes[:primary_extension]
|
|
||||||
raise ArgumentError, "#{@name} is missing primary extension"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Prepend primary extension unless its already included
|
|
||||||
if primary_extension && !extensions.include?(primary_extension)
|
|
||||||
@extensions = [primary_extension] + extensions
|
|
||||||
end
|
|
||||||
|
|
||||||
# Set popular, and searchable flags
|
# Set popular, and searchable flags
|
||||||
@popular = attributes.key?(:popular) ? attributes[:popular] : false
|
@popular = attributes.key?(:popular) ? attributes[:popular] : false
|
||||||
@searchable = attributes.key?(:searchable) ? attributes[:searchable] : true
|
@searchable = attributes.key?(:searchable) ? attributes[:searchable] : true
|
||||||
@@ -365,10 +382,10 @@ module Linguist
|
|||||||
# Returns the name String
|
# Returns the name String
|
||||||
attr_reader :search_term
|
attr_reader :search_term
|
||||||
|
|
||||||
# Public: Get Lexer
|
# Public: Get the name of a TextMate-compatible scope
|
||||||
#
|
#
|
||||||
# Returns the Lexer
|
# Returns the scope
|
||||||
attr_reader :lexer
|
attr_reader :tm_scope
|
||||||
|
|
||||||
# Public: Get Ace mode
|
# Public: Get Ace mode
|
||||||
#
|
#
|
||||||
@@ -395,20 +412,6 @@ module Linguist
|
|||||||
# Returns the extensions Array
|
# Returns the extensions Array
|
||||||
attr_reader :extensions
|
attr_reader :extensions
|
||||||
|
|
||||||
# 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 attribute is only used by app/helpers/gists_helper.rb for
|
|
||||||
# creating the language dropdown. It really should be using `name`
|
|
||||||
# instead. Would like to drop primary extension.
|
|
||||||
#
|
|
||||||
# Returns the extension String.
|
|
||||||
attr_reader :primary_extension
|
|
||||||
|
|
||||||
# Public: Get interpreters
|
# Public: Get interpreters
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
@@ -427,6 +430,22 @@ module Linguist
|
|||||||
# Returns the extensions Array
|
# Returns the extensions Array
|
||||||
attr_reader :filenames
|
attr_reader :filenames
|
||||||
|
|
||||||
|
# Deprecated: Get primary extension
|
||||||
|
#
|
||||||
|
# Defaults to the first extension but can be overridden
|
||||||
|
# in the languages.yml.
|
||||||
|
#
|
||||||
|
# The primary extension can not be nil. Tests should verify this.
|
||||||
|
#
|
||||||
|
# This method is only used by app/helpers/gists_helper.rb for creating
|
||||||
|
# the language dropdown. It really should be using `name` instead.
|
||||||
|
# Would like to drop primary extension.
|
||||||
|
#
|
||||||
|
# Returns the extension String.
|
||||||
|
def primary_extension
|
||||||
|
extensions.first
|
||||||
|
end
|
||||||
|
|
||||||
# Public: Get URL escaped name.
|
# Public: Get URL escaped name.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
@@ -478,16 +497,6 @@ module Linguist
|
|||||||
@searchable
|
@searchable
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Highlight syntax of text
|
|
||||||
#
|
|
||||||
# text - String of code to be highlighted
|
|
||||||
# options - A Hash of options (defaults to {})
|
|
||||||
#
|
|
||||||
# Returns html String
|
|
||||||
def colorize(text, options = {})
|
|
||||||
lexer.highlight(text, options = {})
|
|
||||||
end
|
|
||||||
|
|
||||||
# Public: Return name as String representation
|
# Public: Return name as String representation
|
||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
@@ -510,16 +519,16 @@ module Linguist
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
extensions = Samples::DATA['extnames']
|
extensions = Samples.cache['extnames']
|
||||||
interpreters = Samples::DATA['interpreters']
|
interpreters = Samples.cache['interpreters']
|
||||||
filenames = Samples::DATA['filenames']
|
filenames = Samples.cache['filenames']
|
||||||
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
|
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
|
||||||
|
|
||||||
languages_yml = File.expand_path("../languages.yml", __FILE__)
|
languages_yml = File.expand_path("../languages.yml", __FILE__)
|
||||||
languages_json = File.expand_path("../languages.json", __FILE__)
|
languages_json = File.expand_path("../languages.json", __FILE__)
|
||||||
|
|
||||||
if File.exist?(languages_json) && defined?(JSON)
|
if File.exist?(languages_json) && defined?(Yajl)
|
||||||
languages = JSON.load(File.read(languages_json))
|
languages = Yajl.load(File.read(languages_json))
|
||||||
else
|
else
|
||||||
languages = YAML.load_file(languages_yml)
|
languages = YAML.load_file(languages_yml)
|
||||||
end
|
end
|
||||||
@@ -531,7 +540,8 @@ module Linguist
|
|||||||
|
|
||||||
if extnames = extensions[name]
|
if extnames = extensions[name]
|
||||||
extnames.each do |extname|
|
extnames.each do |extname|
|
||||||
if !options['extensions'].include?(extname)
|
if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase }
|
||||||
|
warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" unless extname == '.script!'
|
||||||
options['extensions'] << extname
|
options['extensions'] << extname
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -562,15 +572,14 @@ module Linguist
|
|||||||
:color => options['color'],
|
:color => options['color'],
|
||||||
:type => options['type'],
|
:type => options['type'],
|
||||||
:aliases => options['aliases'],
|
:aliases => options['aliases'],
|
||||||
:lexer => options['lexer'],
|
:tm_scope => options['tm_scope'],
|
||||||
:ace_mode => options['ace_mode'],
|
:ace_mode => options['ace_mode'],
|
||||||
:wrap => options['wrap'],
|
:wrap => options['wrap'],
|
||||||
:group_name => options['group'],
|
:group_name => options['group'],
|
||||||
:searchable => options.key?('searchable') ? options['searchable'] : true,
|
:searchable => options.fetch('searchable', true),
|
||||||
:search_term => options['search_term'],
|
:search_term => options['search_term'],
|
||||||
:extensions => options['extensions'].sort,
|
:extensions => Array(options['extensions']),
|
||||||
:interpreters => options['interpreters'].sort,
|
:interpreters => options['interpreters'].sort,
|
||||||
:primary_extension => options['primary_extension'],
|
|
||||||
:filenames => options['filenames'],
|
:filenames => options['filenames'],
|
||||||
:popular => popular.include?(name)
|
:popular => popular.include?(name)
|
||||||
)
|
)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
81
lib/linguist/lazy_blob.rb
Normal file
81
lib/linguist/lazy_blob.rb
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
require 'linguist/blob_helper'
|
||||||
|
require 'linguist/language'
|
||||||
|
require 'rugged'
|
||||||
|
|
||||||
|
module Linguist
|
||||||
|
class LazyBlob
|
||||||
|
GIT_ATTR = ['linguist-documentation', 'linguist-language', 'linguist-vendored']
|
||||||
|
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
|
||||||
|
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
|
||||||
|
|
||||||
|
include BlobHelper
|
||||||
|
|
||||||
|
MAX_SIZE = 128 * 1024
|
||||||
|
|
||||||
|
attr_reader :repository
|
||||||
|
attr_reader :oid
|
||||||
|
attr_reader :path
|
||||||
|
attr_reader :mode
|
||||||
|
|
||||||
|
alias :name :path
|
||||||
|
|
||||||
|
def initialize(repo, oid, path, mode = nil)
|
||||||
|
@repository = repo
|
||||||
|
@oid = oid
|
||||||
|
@path = path
|
||||||
|
@mode = mode
|
||||||
|
end
|
||||||
|
|
||||||
|
def git_attributes
|
||||||
|
@git_attributes ||= repository.fetch_attributes(
|
||||||
|
name, GIT_ATTR, GIT_ATTR_FLAGS)
|
||||||
|
end
|
||||||
|
|
||||||
|
def vendored?
|
||||||
|
if attr = git_attributes['linguist-vendored']
|
||||||
|
return boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
return super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def documentation?
|
||||||
|
if attr = git_attributes['linguist-documentation']
|
||||||
|
boolean_attribute(attr)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def language
|
||||||
|
return @language if defined?(@language)
|
||||||
|
|
||||||
|
@language = if lang = git_attributes['linguist-language']
|
||||||
|
Language.find_by_alias(lang)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def data
|
||||||
|
load_blob!
|
||||||
|
@data
|
||||||
|
end
|
||||||
|
|
||||||
|
def size
|
||||||
|
load_blob!
|
||||||
|
@size
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
# Returns true if the attribute is present and not the string "false".
|
||||||
|
def boolean_attribute(attr)
|
||||||
|
attr != "false"
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_blob!
|
||||||
|
@data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -3,27 +3,27 @@
|
|||||||
# This file should only be edited by GitHub staff
|
# This file should only be edited by GitHub staff
|
||||||
|
|
||||||
- ActionScript
|
- ActionScript
|
||||||
- Bash
|
|
||||||
- C
|
- C
|
||||||
- C#
|
- C#
|
||||||
- C++
|
- C++
|
||||||
- CSS
|
- CSS
|
||||||
- Clojure
|
- Clojure
|
||||||
- CoffeeScript
|
- CoffeeScript
|
||||||
- Common Lisp
|
- Go
|
||||||
- Diff
|
|
||||||
- Emacs Lisp
|
|
||||||
- Erlang
|
|
||||||
- HTML
|
- HTML
|
||||||
- Haskell
|
- Haskell
|
||||||
- Java
|
- Java
|
||||||
- JavaScript
|
- JavaScript
|
||||||
- Lua
|
- Lua
|
||||||
|
- Matlab
|
||||||
- Objective-C
|
- Objective-C
|
||||||
- PHP
|
- PHP
|
||||||
- Perl
|
- Perl
|
||||||
- Python
|
- Python
|
||||||
|
- R
|
||||||
- Ruby
|
- Ruby
|
||||||
- SQL
|
|
||||||
- Scala
|
- Scala
|
||||||
- Scheme
|
- Shell
|
||||||
|
- Swift
|
||||||
|
- TeX
|
||||||
|
- VimL
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
require 'linguist/file_blob'
|
require 'linguist/lazy_blob'
|
||||||
|
require 'rugged'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# A Repository is an abstraction of a Grit::Repo or a basic file
|
# A Repository is an abstraction of a Grit::Repo or a basic file
|
||||||
@@ -7,100 +8,160 @@ module Linguist
|
|||||||
# Its primary purpose is for gathering language statistics across
|
# Its primary purpose is for gathering language statistics across
|
||||||
# the entire project.
|
# the entire project.
|
||||||
class Repository
|
class Repository
|
||||||
# Public: Initialize a new Repository from a File directory
|
attr_reader :repository
|
||||||
#
|
|
||||||
# base_path - A path String
|
# Public: Create a new Repository based on the stats of
|
||||||
#
|
# an existing one
|
||||||
# Returns a Repository
|
def self.incremental(repo, commit_oid, old_commit_oid, old_stats)
|
||||||
def self.from_directory(base_path)
|
repo = self.new(repo, commit_oid)
|
||||||
new Dir["#{base_path}/**/*"].
|
repo.load_existing_stats(old_commit_oid, old_stats)
|
||||||
select { |f| File.file?(f) }.
|
repo
|
||||||
map { |path| FileBlob.new(path, base_path) }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Initialize a new Repository
|
# Public: Initialize a new Repository to be analyzed for language
|
||||||
|
# data
|
||||||
#
|
#
|
||||||
# enum - Enumerator that responds to `each` and
|
# repo - a Rugged::Repository object
|
||||||
# yields Blob objects
|
# commit_oid - the sha1 of the commit that will be analyzed;
|
||||||
|
# this is usually the master branch
|
||||||
#
|
#
|
||||||
# Returns a Repository
|
# Returns a Repository
|
||||||
def initialize(enum)
|
def initialize(repo, commit_oid)
|
||||||
@enum = enum
|
@repository = repo
|
||||||
@computed_stats = false
|
@commit_oid = commit_oid
|
||||||
@language = @size = nil
|
|
||||||
@sizes = Hash.new { 0 }
|
raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)
|
||||||
@file_breakdown = Hash.new { |h,k| h[k] = Array.new }
|
end
|
||||||
|
|
||||||
|
# Public: Load the results of a previous analysis on this repository
|
||||||
|
# to speed up the new scan.
|
||||||
|
#
|
||||||
|
# The new analysis will be performed incrementally as to only take
|
||||||
|
# into account the file changes since the last time the repository
|
||||||
|
# was scanned
|
||||||
|
#
|
||||||
|
# old_commit_oid - the sha1 of the commit that was previously analyzed
|
||||||
|
# old_stats - the result of the previous analysis, obtained by calling
|
||||||
|
# Repository#cache on the old repository
|
||||||
|
#
|
||||||
|
# Returns nothing
|
||||||
|
def load_existing_stats(old_commit_oid, old_stats)
|
||||||
|
@old_commit_oid = old_commit_oid
|
||||||
|
@old_stats = old_stats
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Returns a breakdown of language stats.
|
# Public: Returns a breakdown of language stats.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
#
|
#
|
||||||
# # => { Language['Ruby'] => 46319,
|
# # => { 'Ruby' => 46319,
|
||||||
# Language['JavaScript'] => 258 }
|
# 'JavaScript' => 258 }
|
||||||
#
|
#
|
||||||
# Returns a Hash of Language keys and Integer size values.
|
# Returns a Hash of language names and Integer size values.
|
||||||
def languages
|
def languages
|
||||||
compute_stats
|
@sizes ||= begin
|
||||||
@sizes
|
sizes = Hash.new { 0 }
|
||||||
|
cache.each do |_, (language, size)|
|
||||||
|
sizes[language] += size
|
||||||
|
end
|
||||||
|
sizes
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get primary Language of repository.
|
# Public: Get primary Language of repository.
|
||||||
#
|
#
|
||||||
# Returns a Language
|
# Returns a language name
|
||||||
def language
|
def language
|
||||||
compute_stats
|
@language ||= begin
|
||||||
@language
|
primary = languages.max_by { |(_, size)| size }
|
||||||
|
primary && primary[0]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Get the total size of the repository.
|
# Public: Get the total size of the repository.
|
||||||
#
|
#
|
||||||
# Returns a byte size Integer
|
# Returns a byte size Integer
|
||||||
def size
|
def size
|
||||||
compute_stats
|
@size ||= languages.inject(0) { |s,(_,v)| s + v }
|
||||||
@size
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Return the language breakdown of this repository by file
|
# Public: Return the language breakdown of this repository by file
|
||||||
|
#
|
||||||
|
# Returns a map of language names => [filenames...]
|
||||||
def breakdown_by_file
|
def breakdown_by_file
|
||||||
compute_stats
|
@file_breakdown ||= begin
|
||||||
@file_breakdown
|
breakdown = Hash.new { |h,k| h[k] = Array.new }
|
||||||
|
cache.each do |filename, (language, _)|
|
||||||
|
breakdown[language] << filename
|
||||||
|
end
|
||||||
|
breakdown
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Compute language breakdown for each blob in the Repository.
|
# Public: Return the cached results of the analysis
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# This is a per-file breakdown that can be passed to other instances
|
||||||
def compute_stats
|
# of Linguist::Repository to perform incremental scans
|
||||||
return if @computed_stats
|
#
|
||||||
|
# Returns a map of filename => [language, size]
|
||||||
|
def cache
|
||||||
|
@cache ||= begin
|
||||||
|
if @old_commit_oid == @commit_oid
|
||||||
|
@old_stats
|
||||||
|
else
|
||||||
|
compute_stats(@old_commit_oid, @old_stats)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@enum.each do |blob|
|
def read_index
|
||||||
# Skip files that are likely binary
|
attr_index = Rugged::Index.new
|
||||||
next if blob.likely_binary?
|
attr_index.read_tree(current_tree)
|
||||||
|
repository.index = attr_index
|
||||||
|
end
|
||||||
|
|
||||||
# Skip vendored or generated blobs
|
def current_tree
|
||||||
next if blob.vendored? || blob.generated? || blob.language.nil?
|
@tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree
|
||||||
|
end
|
||||||
|
|
||||||
# Only include programming languages and acceptable markup languages
|
protected
|
||||||
if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name)
|
|
||||||
|
|
||||||
# Build up the per-file breakdown stats
|
def compute_stats(old_commit_oid, cache = nil)
|
||||||
@file_breakdown[blob.language.group.name] << blob.name
|
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
|
||||||
|
|
||||||
@sizes[blob.language.group] += blob.size
|
read_index
|
||||||
|
|
||||||
|
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
|
||||||
|
|
||||||
|
# Clear file map and fetch full diff if any .gitattributes files are changed
|
||||||
|
if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" }
|
||||||
|
diff = Rugged::Tree.diff(repository, old_tree = nil, current_tree)
|
||||||
|
file_map = {}
|
||||||
|
else
|
||||||
|
file_map = cache ? cache.dup : {}
|
||||||
|
end
|
||||||
|
|
||||||
|
diff.each_delta do |delta|
|
||||||
|
old = delta.old_file[:path]
|
||||||
|
new = delta.new_file[:path]
|
||||||
|
|
||||||
|
file_map.delete(old)
|
||||||
|
next if delta.binary
|
||||||
|
|
||||||
|
if [:added, :modified].include? delta.status
|
||||||
|
# Skip submodules
|
||||||
|
mode = delta.new_file[:mode]
|
||||||
|
next if (mode & 040000) != 0
|
||||||
|
|
||||||
|
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
|
||||||
|
|
||||||
|
next unless blob.include_in_language_stats?
|
||||||
|
file_map[new] = [blob.language.group.name, blob.size]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Compute total size
|
file_map
|
||||||
@size = @sizes.inject(0) { |s,(_,v)| s + v }
|
|
||||||
|
|
||||||
# Get primary language
|
|
||||||
if primary = @sizes.max_by { |(_, size)| size }
|
|
||||||
@language = primary[0]
|
|
||||||
end
|
|
||||||
|
|
||||||
@computed_stats = true
|
|
||||||
|
|
||||||
nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,12 @@
|
|||||||
begin
|
begin
|
||||||
require 'json'
|
require 'yajl'
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
end
|
end
|
||||||
|
|
||||||
require 'linguist/md5'
|
require 'linguist/md5'
|
||||||
require 'linguist/classifier'
|
require 'linguist/classifier'
|
||||||
|
require 'linguist/shebang'
|
||||||
|
|
||||||
module Linguist
|
module Linguist
|
||||||
# Model for accessing classifier training data.
|
# Model for accessing classifier training data.
|
||||||
@@ -17,9 +18,11 @@ module Linguist
|
|||||||
PATH = File.expand_path('../samples.json', __FILE__)
|
PATH = File.expand_path('../samples.json', __FILE__)
|
||||||
|
|
||||||
# Hash of serialized samples object
|
# Hash of serialized samples object
|
||||||
if File.exist?(PATH)
|
def self.cache
|
||||||
serializer = defined?(JSON) ? JSON : YAML
|
@cache ||= begin
|
||||||
DATA = serializer.load(File.read(PATH))
|
serializer = defined?(Yajl) ? Yajl : YAML
|
||||||
|
serializer.load(File.read(PATH))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Iterate over each sample.
|
# Public: Iterate over each sample.
|
||||||
@@ -28,13 +31,9 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def self.each(&block)
|
def self.each(&block)
|
||||||
Dir.entries(ROOT).each do |category|
|
Dir.entries(ROOT).sort!.each do |category|
|
||||||
next if category == '.' || category == '..'
|
next if category == '.' || category == '..'
|
||||||
|
|
||||||
# Skip text and binary for now
|
|
||||||
# Possibly reconsider this later
|
|
||||||
next if category == 'Text' || category == 'Binary'
|
|
||||||
|
|
||||||
dirname = File.join(ROOT, category)
|
dirname = File.join(ROOT, category)
|
||||||
Dir.entries(dirname).each do |filename|
|
Dir.entries(dirname).each do |filename|
|
||||||
next if filename == '.' || filename == '..'
|
next if filename == '.' || filename == '..'
|
||||||
@@ -50,14 +49,16 @@ module Linguist
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
path = File.join(dirname, filename)
|
||||||
|
|
||||||
if File.extname(filename) == ""
|
if File.extname(filename) == ""
|
||||||
raise "#{File.join(dirname, filename)} is missing an extension, maybe it belongs in filenames/ subdir"
|
raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir"
|
||||||
end
|
end
|
||||||
|
|
||||||
yield({
|
yield({
|
||||||
:path => File.join(dirname, filename),
|
:path => path,
|
||||||
:language => category,
|
:language => category,
|
||||||
:interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil,
|
:interpreter => Shebang.interpreter(File.read(path)),
|
||||||
:extname => File.extname(filename)
|
:extname => File.extname(filename)
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -110,40 +111,4 @@ module Linguist
|
|||||||
db
|
db
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Used to retrieve the interpreter from the shebang line of a file's
|
|
||||||
# data.
|
|
||||||
def self.interpreter_from_shebang(data)
|
|
||||||
lines = data.lines.to_a
|
|
||||||
|
|
||||||
if lines.any? && (match = lines[0].match(/(.+)\n?/)) && (bang = match[0]) =~ /^#!/
|
|
||||||
bang.sub!(/^#! /, '#!')
|
|
||||||
tokens = bang.split(' ')
|
|
||||||
pieces = tokens.first.split('/')
|
|
||||||
|
|
||||||
if pieces.size > 1
|
|
||||||
script = pieces.last
|
|
||||||
else
|
|
||||||
script = pieces.first.sub('#!', '')
|
|
||||||
end
|
|
||||||
|
|
||||||
script = script == 'env' ? tokens[1] : script
|
|
||||||
|
|
||||||
# "python2.6" -> "python"
|
|
||||||
if script =~ /((?:\d+\.?)+)/
|
|
||||||
script.sub! $1, ''
|
|
||||||
end
|
|
||||||
|
|
||||||
# Check for multiline shebang hacks that call `exec`
|
|
||||||
if script == 'sh' &&
|
|
||||||
lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
|
||||||
script = $1
|
|
||||||
end
|
|
||||||
|
|
||||||
script
|
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
53
lib/linguist/shebang.rb
Normal file
53
lib/linguist/shebang.rb
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
module Linguist
|
||||||
|
class Shebang
|
||||||
|
# Public: Use shebang to detect language of the blob.
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Shebang.call(FileBlob.new("path/to/file"))
|
||||||
|
#
|
||||||
|
# Returns an Array with one Language if the blob has a shebang with a valid
|
||||||
|
# interpreter, or empty if there is no shebang.
|
||||||
|
def self.call(blob, _ = nil)
|
||||||
|
Language.find_by_interpreter interpreter(blob.data)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Get the interpreter from the shebang
|
||||||
|
#
|
||||||
|
# Returns a String or nil
|
||||||
|
def self.interpreter(data)
|
||||||
|
shebang = data.lines.first
|
||||||
|
|
||||||
|
# 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(' ')
|
||||||
|
|
||||||
|
# There was nothing after the #!
|
||||||
|
return if tokens.empty?
|
||||||
|
|
||||||
|
# Get the name of the interpreter
|
||||||
|
script = File.basename(tokens.first)
|
||||||
|
|
||||||
|
# Get next argument if interpreter was /usr/bin/env
|
||||||
|
script = tokens[1] if script == 'env'
|
||||||
|
|
||||||
|
# Interpreter was /usr/bin/env with no arguments
|
||||||
|
return unless script
|
||||||
|
|
||||||
|
# "python2.6" -> "python2"
|
||||||
|
script.sub! /(\.\d+)$/, ''
|
||||||
|
|
||||||
|
# Check for multiline shebang hacks that call `exec`
|
||||||
|
if script == 'sh' &&
|
||||||
|
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||||
|
script = $1
|
||||||
|
end
|
||||||
|
|
||||||
|
File.basename(script)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
20
lib/linguist/strategy/filename.rb
Normal file
20
lib/linguist/strategy/filename.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
module Linguist
|
||||||
|
module Strategy
|
||||||
|
# Detects language based on filename and/or extension
|
||||||
|
class Filename
|
||||||
|
def self.call(blob, _)
|
||||||
|
name = blob.name.to_s
|
||||||
|
|
||||||
|
# A bit of an elegant hack. If the file is executable but extensionless,
|
||||||
|
# append a "magic" extension so it can be classified with other
|
||||||
|
# languages that have shebang scripts.
|
||||||
|
extensions = FileBlob.new(name).extensions
|
||||||
|
if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
|
||||||
|
name += ".script!"
|
||||||
|
end
|
||||||
|
|
||||||
|
Language.find_by_filename(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
30
lib/linguist/strategy/modeline.rb
Normal file
30
lib/linguist/strategy/modeline.rb
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
module Linguist
|
||||||
|
module Strategy
|
||||||
|
class Modeline
|
||||||
|
EmacsModeline = /-\*-\s*mode:\s*(\w+);?\s*-\*-/i
|
||||||
|
VimModeline = /\/\*\s*vim:\s*set\s*(?:ft|filetype)=(\w+):\s*\*\//i
|
||||||
|
|
||||||
|
# Public: Detects language based on Vim and Emacs modelines
|
||||||
|
#
|
||||||
|
# blob - An object that quacks like a blob.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# Modeline.call(FileBlob.new("path/to/file"))
|
||||||
|
#
|
||||||
|
# Returns an Array with one Language if the blob has a Vim or Emacs modeline
|
||||||
|
# that matches a Language name or alias. Returns an empty array if no match.
|
||||||
|
def self.call(blob, _ = nil)
|
||||||
|
Array(Language.find_by_alias(modeline(blob.data)))
|
||||||
|
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[1] if match
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -33,7 +33,8 @@ module Linguist
|
|||||||
['<!--', '-->'], # XML
|
['<!--', '-->'], # XML
|
||||||
['{-', '-}'], # Haskell
|
['{-', '-}'], # Haskell
|
||||||
['(*', '*)'], # Coq
|
['(*', '*)'], # Coq
|
||||||
['"""', '"""'] # Python
|
['"""', '"""'], # Python
|
||||||
|
["'''", "'''"] # Python
|
||||||
]
|
]
|
||||||
|
|
||||||
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
START_SINGLE_LINE_COMMENT = Regexp.compile(SINGLE_LINE_COMMENTS.map { |c|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
## Vendor Conventions ##
|
## Vendor Conventions ##
|
||||||
|
|
||||||
# Caches
|
# Caches
|
||||||
- cache/
|
- (^|/)cache/
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
- ^[Dd]ependencies/
|
- ^[Dd]ependencies/
|
||||||
@@ -32,26 +32,57 @@
|
|||||||
|
|
||||||
# Erlang bundles
|
# Erlang bundles
|
||||||
- ^rebar$
|
- ^rebar$
|
||||||
|
- erlang.mk
|
||||||
|
|
||||||
# Bootstrap minified css and js
|
# Go dependencies
|
||||||
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
|
- Godeps/_workspace/
|
||||||
|
|
||||||
|
# Minified JavaScript and CSS
|
||||||
|
- (\.|-)min\.(js|css)$
|
||||||
|
|
||||||
|
# Stylesheets imported from packages
|
||||||
|
- ([^\s]*)import\.(css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Bootstrap css and js
|
||||||
|
- (^|/)bootstrap([^.]*)\.(js|css|less|scss|styl)$
|
||||||
|
- (^|/)custom\.bootstrap([^\s]*)(js|css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Font Awesome
|
||||||
|
- (^|/)font-awesome\.(css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Foundation css
|
||||||
|
- (^|/)foundation\.(css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Normalize.css
|
||||||
|
- (^|/)normalize\.(css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Bourbon css
|
||||||
|
- (^|/)[Bb]ourbon/.*\.(css|less|scss|styl)$
|
||||||
|
|
||||||
|
# Animate.css
|
||||||
|
- (^|/)animate\.(css|less|scss|styl)$
|
||||||
|
|
||||||
# Vendored dependencies
|
# Vendored dependencies
|
||||||
- thirdparty/
|
- third[-_]?party/
|
||||||
|
- 3rd[-_]?party/
|
||||||
- vendors?/
|
- vendors?/
|
||||||
|
- extern(al)?/
|
||||||
|
|
||||||
# Debian packaging
|
# Debian packaging
|
||||||
- ^debian/
|
- ^debian/
|
||||||
|
|
||||||
|
# Haxelib projects often contain a neko bytecode file named run.n
|
||||||
|
- run.n$
|
||||||
|
|
||||||
## Commonly Bundled JavaScript frameworks ##
|
## Commonly Bundled JavaScript frameworks ##
|
||||||
|
|
||||||
# jQuery
|
# jQuery
|
||||||
- (^|/)jquery([^.]*)(\.min)?\.js$
|
- (^|/)jquery([^.]*)\.js$
|
||||||
- (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$
|
- (^|/)jquery\-\d\.\d+(\.\d+)?\.js$
|
||||||
|
|
||||||
# jQuery UI
|
# jQuery UI
|
||||||
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$
|
- (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$
|
||||||
- (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$
|
- (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$
|
||||||
|
|
||||||
# Prototype
|
# Prototype
|
||||||
- (^|/)prototype(.*)\.js$
|
- (^|/)prototype(.*)\.js$
|
||||||
@@ -59,6 +90,9 @@
|
|||||||
- (^|/)controls\.js$
|
- (^|/)controls\.js$
|
||||||
- (^|/)dragdrop\.js$
|
- (^|/)dragdrop\.js$
|
||||||
|
|
||||||
|
# Typescript definition files
|
||||||
|
- (.*?)\.d\.ts$
|
||||||
|
|
||||||
# MooTools
|
# MooTools
|
||||||
- (^|/)mootools([^.]*)\d+\.\d+.\d+([^.]*)\.js$
|
- (^|/)mootools([^.]*)\d+\.\d+.\d+([^.]*)\.js$
|
||||||
|
|
||||||
@@ -80,13 +114,32 @@
|
|||||||
# MathJax
|
# MathJax
|
||||||
- (^|/)MathJax/
|
- (^|/)MathJax/
|
||||||
|
|
||||||
|
# Chart.js
|
||||||
|
- (^|/)Chart\.js$
|
||||||
|
|
||||||
|
# Codemirror
|
||||||
|
- (^|/)[Cc]ode[Mm]irror/(lib|mode|theme|addon|keymap)
|
||||||
|
|
||||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||||
- (^|/)shBrush([^.]*)\.js$
|
- (^|/)shBrush([^.]*)\.js$
|
||||||
- (^|/)shCore\.js$
|
- (^|/)shCore\.js$
|
||||||
- (^|/)shLegacy\.js$
|
- (^|/)shLegacy\.js$
|
||||||
|
|
||||||
# AngularJS
|
# AngularJS
|
||||||
- (^|/)angular([^.]*)(\.min)?\.js$
|
- (^|/)angular([^.]*)\.js$
|
||||||
|
|
||||||
|
# D3.js
|
||||||
|
- (^|\/)d3(\.v\d+)?([^.]*)\.js$
|
||||||
|
|
||||||
|
# React
|
||||||
|
- (^|/)react(-[^.]*)?\.js$
|
||||||
|
|
||||||
|
# Modernizr
|
||||||
|
- (^|/)modernizr\-\d\.\d+(\.\d+)?\.js$
|
||||||
|
- (^|/)modernizr\.custom\.\d+\.js$
|
||||||
|
|
||||||
|
# Knockout
|
||||||
|
- (^|/)knockout-(\d+\.){3}(debug\.)?js$
|
||||||
|
|
||||||
## Python ##
|
## Python ##
|
||||||
|
|
||||||
@@ -104,23 +157,34 @@
|
|||||||
|
|
||||||
## Obj-C ##
|
## Obj-C ##
|
||||||
|
|
||||||
|
# Cocoapods
|
||||||
|
- ^Pods/
|
||||||
|
|
||||||
# Sparkle
|
# Sparkle
|
||||||
- (^|/)Sparkle/
|
- (^|/)Sparkle/
|
||||||
|
|
||||||
|
## Groovy ##
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
- (^|/)gradlew$
|
||||||
|
- (^|/)gradlew\.bat$
|
||||||
|
- (^|/)gradle/wrapper/
|
||||||
|
|
||||||
## .NET ##
|
## .NET ##
|
||||||
|
|
||||||
# Visual Studio IntelliSense
|
# Visual Studio IntelliSense
|
||||||
- -vsdoc\.js$
|
- -vsdoc\.js$
|
||||||
|
- \.intellisense\.js$
|
||||||
|
|
||||||
# jQuery validation plugin (MS bundles this with asp.net mvc)
|
# jQuery validation plugin (MS bundles this with asp.net mvc)
|
||||||
- (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$
|
- (^|/)jquery([^.]*)\.validate(\.unobtrusive)?\.js$
|
||||||
- (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$
|
- (^|/)jquery([^.]*)\.unobtrusive\-ajax\.js$
|
||||||
|
|
||||||
# Microsoft Ajax
|
# Microsoft Ajax
|
||||||
- (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$
|
- (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$
|
||||||
|
|
||||||
# NuGet
|
# NuGet
|
||||||
- ^[Pp]ackages/
|
- ^[Pp]ackages\/.+\.\d+\/
|
||||||
|
|
||||||
# ExtJS
|
# ExtJS
|
||||||
- (^|/)extjs/.*?\.js$
|
- (^|/)extjs/.*?\.js$
|
||||||
@@ -140,6 +204,9 @@
|
|||||||
- (^|/)extjs/src/
|
- (^|/)extjs/src/
|
||||||
- (^|/)extjs/welcome/
|
- (^|/)extjs/welcome/
|
||||||
|
|
||||||
|
# Html5shiv
|
||||||
|
- (^|/)html5shiv\.js$
|
||||||
|
|
||||||
# Samples folders
|
# Samples folders
|
||||||
- ^[Ss]amples/
|
- ^[Ss]amples/
|
||||||
|
|
||||||
@@ -157,11 +224,33 @@
|
|||||||
- ^[Tt]est/fixtures/
|
- ^[Tt]est/fixtures/
|
||||||
|
|
||||||
# PhoneGap/Cordova
|
# PhoneGap/Cordova
|
||||||
- (^|/)cordova([^.]*)(\.min)?\.js$
|
- (^|/)cordova([^.]*)\.js$
|
||||||
- (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$
|
- (^|/)cordova\-\d\.\d(\.\d)?\.js$
|
||||||
|
|
||||||
|
# Foundation js
|
||||||
|
- foundation(\..*)?\.js$
|
||||||
|
|
||||||
# Vagrant
|
# Vagrant
|
||||||
- ^Vagrantfile$
|
- ^Vagrantfile$
|
||||||
|
|
||||||
# .DS_Store's
|
# .DS_Store's
|
||||||
- .[Dd][Ss]_[Ss]tore$
|
- .[Dd][Ss]_[Ss]tore$
|
||||||
|
|
||||||
|
# R packages
|
||||||
|
- ^vignettes/
|
||||||
|
- ^inst/extdata/
|
||||||
|
|
||||||
|
# Octicons
|
||||||
|
- octicons.css
|
||||||
|
- sprockets-octicons.scss
|
||||||
|
|
||||||
|
# Typesafe Activator
|
||||||
|
- (^|/)activator$
|
||||||
|
- (^|/)activator\.bat$
|
||||||
|
|
||||||
|
# ProGuard
|
||||||
|
- proguard.pro
|
||||||
|
- proguard-rules.pro
|
||||||
|
|
||||||
|
# Android Google APIs
|
||||||
|
- (^|/)\.google_apis/
|
||||||
|
|||||||
3
lib/linguist/version.rb
Normal file
3
lib/linguist/version.rb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module Linguist
|
||||||
|
VERSION = "4.5.1"
|
||||||
|
end
|
||||||
6
package.json
Normal file
6
package.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"repository": "https://github.com/github/linguist",
|
||||||
|
"dependencies": {
|
||||||
|
"season": "~>5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
521
samples/AGS Script/GlobalScript.asc
Normal file
521
samples/AGS Script/GlobalScript.asc
Normal file
@@ -0,0 +1,521 @@
|
|||||||
|
// main global script file
|
||||||
|
|
||||||
|
// A function that initializes a bunch of stuff.
|
||||||
|
function initialize_control_panel() {
|
||||||
|
// Centre the control panel
|
||||||
|
gPanel.Centre();
|
||||||
|
// Centre the Restart dialog as well
|
||||||
|
gRestartYN.Centre();
|
||||||
|
if (!IsSpeechVoxAvailable()) {
|
||||||
|
// If there is no speech-vox file, and therefore no speech,
|
||||||
|
// disable all the controls related with speech.
|
||||||
|
lblVoice.Visible = false;
|
||||||
|
btnVoice.Visible = false;
|
||||||
|
sldVoice.Visible = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// If there *is*, then set it to voice and text. It's best to use
|
||||||
|
// both whenever possible, for the player's sake.
|
||||||
|
SetVoiceMode(eSpeechVoiceAndText);
|
||||||
|
// And reflect this in the control panel.
|
||||||
|
btnVoice.Text = "Voice and Text";
|
||||||
|
}
|
||||||
|
if (!System.SupportsGammaControl) {
|
||||||
|
// If we can't change the gamma settings, disable the relevant options.
|
||||||
|
sldGamma.Visible = false;
|
||||||
|
lblGamma.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//And now, set all the defaults
|
||||||
|
System.Volume = 100;
|
||||||
|
sldAudio.Value = System.Volume;
|
||||||
|
SetGameSpeed(40);
|
||||||
|
sldSpeed.Value = 40;
|
||||||
|
if (IsSpeechVoxAvailable()) {
|
||||||
|
SetVoiceMode(eSpeechVoiceAndText);
|
||||||
|
btnVoice.Text = "Voice and Text";
|
||||||
|
sldVoice.Value = 255;
|
||||||
|
SetSpeechVolume(255);
|
||||||
|
}
|
||||||
|
if (System.SupportsGammaControl) {
|
||||||
|
System.Gamma = 100;
|
||||||
|
sldGamma.Value = 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the game starts, before the first room is loaded
|
||||||
|
function game_start() {
|
||||||
|
// Put the code all in a function and then just call the function.
|
||||||
|
// It saves cluttering up places like game_start.
|
||||||
|
initialize_control_panel();
|
||||||
|
// Use the KeyboardMovement module to, per default, replicate the standard
|
||||||
|
// keyboard movement of most Sierra games. See KeyboardMovement.txt for more info
|
||||||
|
KeyboardMovement.SetMode(eKeyboardMovement_Tapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
function repeatedly_execute() {
|
||||||
|
|
||||||
|
// Put here anything you want to happen every game cycle, even when
|
||||||
|
// the game is paused. This will not run when the game is blocked
|
||||||
|
// inside a command like a blocking Walk()
|
||||||
|
|
||||||
|
if (IsGamePaused() == 1) return;
|
||||||
|
|
||||||
|
// Put here anything you want to happen every game cycle, but not
|
||||||
|
// when the game is paused.
|
||||||
|
}
|
||||||
|
|
||||||
|
function repeatedly_execute_always() {
|
||||||
|
|
||||||
|
// Put anything you want to happen every game cycle, even
|
||||||
|
// when the game is blocked inside a command like a
|
||||||
|
// blocking Walk().
|
||||||
|
// You cannot run blocking commands from this function.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_inventory_window ()
|
||||||
|
{
|
||||||
|
gInventory.Visible = true;
|
||||||
|
// switch to the Use cursor (to select items with)
|
||||||
|
mouse.Mode = eModeInteract;
|
||||||
|
// But, override the appearance to look like the arrow
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_save_game_dialog()
|
||||||
|
{
|
||||||
|
gSaveGame.Visible = true;
|
||||||
|
// Get the list of save games
|
||||||
|
lstSaveGamesList.FillSaveGameList();
|
||||||
|
if (lstSaveGamesList.ItemCount > 0)
|
||||||
|
{
|
||||||
|
// If there is at least one, set the default text
|
||||||
|
// to be the first game's name
|
||||||
|
txtNewSaveName.Text = lstSaveGamesList.Items[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No save games yet, default empty text.
|
||||||
|
txtNewSaveName.Text = "";
|
||||||
|
}
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
gIconbar.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_restore_game_dialog()
|
||||||
|
{
|
||||||
|
gRestoreGame.Visible = true;
|
||||||
|
lstRestoreGamesList.FillSaveGameList();
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
gIconbar.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function close_save_game_dialog()
|
||||||
|
{
|
||||||
|
gSaveGame.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function close_restore_game_dialog()
|
||||||
|
{
|
||||||
|
gRestoreGame.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when a key is pressed. keycode holds the key's ASCII code
|
||||||
|
function on_key_press(eKeyCode keycode) {
|
||||||
|
// The following is called before "if game is paused keycode=0", so
|
||||||
|
// it'll happen even when the game is paused.
|
||||||
|
|
||||||
|
if ((keycode == eKeyEscape) && gRestartYN.Visible) {
|
||||||
|
//Use ESC to cancel restart.
|
||||||
|
gRestartYN.Visible = false;
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
// If the panel's not ON, then the player must have gotten here by tapping F9,
|
||||||
|
// therefore his cursor needs restoring. If the panel IS on, then it doesn't,
|
||||||
|
// because it's already a pointer. Get used to thinking like this!!
|
||||||
|
if (!gPanel.Visible) mouse.UseDefaultGraphic();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((keycode == eKeyEscape) && gPanel.Visible) {
|
||||||
|
// Use ESC to turn the panel off.
|
||||||
|
gPanel.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((keycode == eKeyEscape) && (gSaveGame.Visible))
|
||||||
|
{
|
||||||
|
// Use ESC to close the save game dialog
|
||||||
|
close_save_game_dialog();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((keycode == eKeyEscape) && (gRestoreGame.Visible))
|
||||||
|
{
|
||||||
|
// Use ESC to close the restore game dialog
|
||||||
|
close_restore_game_dialog();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycode == eKeyReturn) {
|
||||||
|
// ENTER, in this case merely confirms restart
|
||||||
|
if (gRestartYN.Visible) RestartGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsGamePaused() || (IsInterfaceEnabled() == 0))
|
||||||
|
{
|
||||||
|
// If the game is paused with a modal GUI on the
|
||||||
|
// screen, or the player interface is disabled in
|
||||||
|
// a cut scene, ignore any keypresses.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FUNCTION KEYS AND SYSTEM SHORTCUTS
|
||||||
|
if (keycode == eKeyEscape) {
|
||||||
|
// ESC
|
||||||
|
gPanel.Visible = true;
|
||||||
|
gIconbar.Visible = false;
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
if (keycode == eKeyCtrlQ) QuitGame(1); // Ctrl-Q
|
||||||
|
if (keycode == eKeyF5) show_save_game_dialog(); // F5
|
||||||
|
if (keycode == eKeyF7) show_restore_game_dialog(); // F7
|
||||||
|
if (keycode == eKeyF9) {
|
||||||
|
// F9, asks the player to confirm restarting (so much better to always confirm first)
|
||||||
|
gRestartYN.Visible = true;
|
||||||
|
gIconbar.Visible = false;
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp"); // F12
|
||||||
|
if (keycode == eKeyTab) show_inventory_window(); // Tab, show inventory
|
||||||
|
|
||||||
|
// GAME COMMAND SHORTCUTS
|
||||||
|
if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes.
|
||||||
|
if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes.
|
||||||
|
if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting,
|
||||||
|
if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done.
|
||||||
|
if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate.
|
||||||
|
|
||||||
|
// For extra cursor modes, such as pick up, feel free to add as you will.
|
||||||
|
// Uncomment the line below if you use the "Pick Up" mode.
|
||||||
|
//if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;
|
||||||
|
|
||||||
|
// DEBUG FUNCTIONS
|
||||||
|
if (keycode == eKeyCtrlS) Debug(0,0); // Ctrl-S, give all inventory
|
||||||
|
if (keycode == eKeyCtrlV) Debug(1,0); // Ctrl-V, version
|
||||||
|
if (keycode == eKeyCtrlA) Debug(2,0); // Ctrl-A, show walkable areas
|
||||||
|
if (keycode == eKeyCtrlX) Debug(3,0); // Ctrl-X, teleport to room
|
||||||
|
if (keycode == eKeyCtrlW && game.debug_mode)
|
||||||
|
player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function on_mouse_click(MouseButton button) {
|
||||||
|
// called when a mouse button is clicked. button is either LEFT or RIGHT
|
||||||
|
if (IsGamePaused() == 1) {
|
||||||
|
// Game is paused, so do nothing (ie. don't allow mouse click)
|
||||||
|
}
|
||||||
|
else if (button == eMouseLeft) {
|
||||||
|
ProcessClick(mouse.x, mouse.y, mouse.Mode );
|
||||||
|
}
|
||||||
|
else if (button == eMouseRight || button == eMouseWheelSouth){
|
||||||
|
// right-click our mouse-wheel down, so cycle cursor
|
||||||
|
mouse.SelectNextMode();
|
||||||
|
}
|
||||||
|
else if (button == eMouseMiddle) {
|
||||||
|
// Middle-button-click, default make character walk to clicked area (a little shortcut)
|
||||||
|
// Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to
|
||||||
|
// leave our options open - what if you have a special script triggered
|
||||||
|
// on "walking" mode?
|
||||||
|
ProcessClick(mouse.x, mouse.y, eModeWalkto);
|
||||||
|
}
|
||||||
|
else if (button == eMouseWheelNorth) {
|
||||||
|
// Mouse-wheel up, cycle cursors
|
||||||
|
// If mode isn't WALK, set the previous mode (notice usage of numbers instead
|
||||||
|
// of eNums, when it suits us)...
|
||||||
|
if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// ...but if it is WALK mode...
|
||||||
|
if (player.ActiveInventory!=null)
|
||||||
|
{
|
||||||
|
//...and the player has a selected inventory item, set mouse mode to UseInv.
|
||||||
|
mouse.Mode=eModeUseinv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If they don't, however, just set it to mode TALK (change this line if you add more cursor modes)
|
||||||
|
mouse.Mode=eModeTalkto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function interface_click(int interface, int button) {
|
||||||
|
// This function is obsolete, from 2.62 and earlier versions.
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnInvUp_Click(GUIControl *control, MouseButton button) {
|
||||||
|
invCustomInv.ScrollUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnInvDown_Click(GUIControl *control, MouseButton button) {
|
||||||
|
invCustomInv.ScrollDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnInvOK_Click(GUIControl *control, MouseButton button) {
|
||||||
|
// They pressed the OK button, close the GUI
|
||||||
|
gInventory.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnInvSelect_Click(GUIControl *control, MouseButton button) {
|
||||||
|
|
||||||
|
// They pressed SELECT, so switch to the Get cursor
|
||||||
|
mouse.Mode = eModeInteract;
|
||||||
|
// But, override the appearance to look like the arrow
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconInv_Click(GUIControl *control, MouseButton button) {
|
||||||
|
|
||||||
|
show_inventory_window();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconCurInv_Click(GUIControl *control, MouseButton button) {
|
||||||
|
|
||||||
|
if (player.ActiveInventory != null)
|
||||||
|
mouse.Mode = eModeUseinv;
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconSave_Click(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
show_save_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconLoad_Click(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
show_restore_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconExit_Click(GUIControl *control, MouseButton button) {
|
||||||
|
|
||||||
|
QuitGame(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnIconAbout_Click(GUIControl *control, MouseButton button) {
|
||||||
|
|
||||||
|
gPanel.Visible=true;
|
||||||
|
gIconbar.Visible=false;
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function cEgo_Look()
|
||||||
|
{
|
||||||
|
Display("Damn, I'm looking good!");
|
||||||
|
}
|
||||||
|
|
||||||
|
function cEgo_Interact()
|
||||||
|
{
|
||||||
|
Display("You rub your hands up and down your clothes.");
|
||||||
|
}
|
||||||
|
|
||||||
|
function cEgo_Talk()
|
||||||
|
{
|
||||||
|
Display("Talking to yourself is a sign of madness!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//START OF CONTROL PANEL FUNCTIONS
|
||||||
|
function btnSave_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gPanel.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
Wait(1);
|
||||||
|
btnIconSave_Click(btnIconSave, eMouseLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
function gControl_OnClick(GUI *theGui, MouseButton button)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnAbout_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
Display("Adventure Game Studio run-time engine default game.");
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnQuit_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gPanel.Visible = false;
|
||||||
|
Wait(1);
|
||||||
|
QuitGame(1);
|
||||||
|
gPanel.Visible = true;
|
||||||
|
gIconbar.Visible = false;
|
||||||
|
mouse.UseModeGraphic(eModePointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnLoad_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gPanel.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
Wait(1);
|
||||||
|
btnIconLoad_Click(btnIconLoad, eMouseLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnResume_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gPanel.Visible = false;
|
||||||
|
mouse.UseDefaultGraphic();
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sldAudio_OnChange(GUIControl *control)
|
||||||
|
{
|
||||||
|
System.Volume = sldAudio.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sldVoice_OnChange(GUIControl *control)
|
||||||
|
{
|
||||||
|
// Sets voice volume. Note that we don't check for the existence of speech.vox -
|
||||||
|
// we did that in game_start, so if it's not there the slider won't even be available.
|
||||||
|
SetSpeechVolume(sldVoice.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnVoice_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
// Note that we don't check for the existence of speech.vox - we did that in game_start,
|
||||||
|
// so if it's not there the button won't even be available.
|
||||||
|
if (btnVoice.Text == "Voice and Text") {
|
||||||
|
SetVoiceMode(eSpeechVoiceOnly);
|
||||||
|
btnVoice.Text = "Voice only";
|
||||||
|
}
|
||||||
|
else if (btnVoice.Text == "Voice only") {
|
||||||
|
SetVoiceMode(eSpeechTextOnly);
|
||||||
|
btnVoice.Text = "Text only";
|
||||||
|
}
|
||||||
|
else if (btnVoice.Text == "Text only") {
|
||||||
|
SetVoiceMode(eSpeechVoiceAndText);
|
||||||
|
btnVoice.Text = "Voice and Text";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sldGamma_OnChange(GUIControl *control)
|
||||||
|
{
|
||||||
|
// Set the gamma. Note there's no need to check for anything else, as we ensured,
|
||||||
|
// in game_start, that the slider won't even appear if it's not possible to do this.
|
||||||
|
System.Gamma = sldGamma.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnDefault_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
// Reset everything to default. You'll have to edit these as well as the sliders
|
||||||
|
// if you'd rather have different default parameters.
|
||||||
|
System.Volume = 100;
|
||||||
|
sldAudio.Value = System.Volume;
|
||||||
|
sldSpeed.Value = 40;
|
||||||
|
SetGameSpeed(40);
|
||||||
|
if (IsSpeechVoxAvailable()) {
|
||||||
|
SetVoiceMode(eSpeechVoiceAndText);
|
||||||
|
btnVoice.Text = "Voice and Text";
|
||||||
|
sldVoice.Value = 255;
|
||||||
|
SetSpeechVolume(255);
|
||||||
|
}
|
||||||
|
if (System.SupportsGammaControl) {
|
||||||
|
System.Gamma = 100;
|
||||||
|
sldGamma.Value = 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//END OF CONTROL PANEL FUNCTIONS
|
||||||
|
|
||||||
|
function dialog_request(int param)
|
||||||
|
{
|
||||||
|
// This is used by the dialog text parser if you need to process
|
||||||
|
// text that the player types in to the parser.
|
||||||
|
// It is not used by default.
|
||||||
|
}
|
||||||
|
|
||||||
|
function sldSpeed_OnChange(GUIControl *control)
|
||||||
|
{
|
||||||
|
SetGameSpeed(sldSpeed.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnRestart_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gRestartYN.Visible=true;
|
||||||
|
gIconbar.Visible=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnRestartYes_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
RestartGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnRestartNo_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
gRestartYN.Visible = false;
|
||||||
|
gIconbar.Visible = true;
|
||||||
|
// If the panel's not ON, then the player must have gotten here by tapping F9,
|
||||||
|
// therefore his cursor needs restoring. If the panel IS on, then it doesn't,
|
||||||
|
// because it's already a pointer. Get used to thinking like this!!
|
||||||
|
if (!gPanel.Visible) mouse.UseDefaultGraphic();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnCancelSave_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
close_save_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnSaveGame_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1;
|
||||||
|
int i = 0;
|
||||||
|
while (i < lstSaveGamesList.ItemCount)
|
||||||
|
{
|
||||||
|
if (lstSaveGamesList.Items[i] == txtNewSaveName.Text)
|
||||||
|
{
|
||||||
|
gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text);
|
||||||
|
close_save_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnCancelRestore_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
close_restore_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnRestoreGame_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
if (lstRestoreGamesList.SelectedIndex >= 0)
|
||||||
|
{
|
||||||
|
RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]);
|
||||||
|
}
|
||||||
|
close_restore_game_dialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
function lstSaveGamesList_OnSelectionCh(GUIControl *control)
|
||||||
|
{
|
||||||
|
txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
function txtNewSaveName_OnActivate(GUIControl *control)
|
||||||
|
{
|
||||||
|
// Pressing return in the text box simulates clicking the Save button
|
||||||
|
btnSaveGame_OnClick(control, eMouseLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
function btnDeleteSave_OnClick(GUIControl *control, MouseButton button)
|
||||||
|
{
|
||||||
|
if (lstSaveGamesList.SelectedIndex >= 0)
|
||||||
|
{
|
||||||
|
DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]);
|
||||||
|
lstSaveGamesList.FillSaveGameList();
|
||||||
|
}
|
||||||
|
}
|
||||||
4
samples/AGS Script/GlobalScript.ash
Normal file
4
samples/AGS Script/GlobalScript.ash
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// Main header script - this will be included into every script in
|
||||||
|
// the game (local and global). Do not place functions here; rather,
|
||||||
|
// place import definitions and #define names here to be used by all
|
||||||
|
// scripts.
|
||||||
216
samples/AGS Script/KeyboardMovement_102.asc
Normal file
216
samples/AGS Script/KeyboardMovement_102.asc
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
// Main script for module 'KeyboardMovement'
|
||||||
|
|
||||||
|
//****************************************************************************************************
|
||||||
|
// DEFINITIONS
|
||||||
|
//****************************************************************************************************
|
||||||
|
|
||||||
|
#define DISTANCE 10000// distance player walks in Tapping mode before he stops
|
||||||
|
|
||||||
|
enum KeyboardMovement_Directions {
|
||||||
|
eKeyboardMovement_Stop,
|
||||||
|
eKeyboardMovement_DownLeft,
|
||||||
|
eKeyboardMovement_Down,
|
||||||
|
eKeyboardMovement_DownRight,
|
||||||
|
eKeyboardMovement_Left,
|
||||||
|
eKeyboardMovement_Right,
|
||||||
|
eKeyboardMovement_UpLeft,
|
||||||
|
eKeyboardMovement_Up,
|
||||||
|
eKeyboardMovement_UpRight
|
||||||
|
};
|
||||||
|
|
||||||
|
//****************************************************************************************************
|
||||||
|
// VARIABLES
|
||||||
|
//****************************************************************************************************
|
||||||
|
|
||||||
|
// keycodes as variables for future key customization functions (static variables?):
|
||||||
|
int KeyboardMovement_KeyDown = 380; // down arrow
|
||||||
|
int KeyboardMovement_KeyLeft = 375; // left arrow
|
||||||
|
int KeyboardMovement_KeyRight = 377; // right arrow
|
||||||
|
int KeyboardMovement_KeyUp = 372; // up arrow
|
||||||
|
int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad)
|
||||||
|
int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad)
|
||||||
|
int KeyboardMovement_KeyDownLeft = 379; // End (numpad)
|
||||||
|
int KeyboardMovement_KeyUpLeft = 371; // Home (numpad)
|
||||||
|
int KeyboardMovement_KeyStop = 376; // 5 (numpad)
|
||||||
|
|
||||||
|
KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default)
|
||||||
|
|
||||||
|
KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character
|
||||||
|
|
||||||
|
//****************************************************************************************************
|
||||||
|
// USER FUNCTIONS
|
||||||
|
//****************************************************************************************************
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) {
|
||||||
|
KeyboardMovement_Mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
// key customization functions here
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
//****************************************************************************************************
|
||||||
|
// EVENT HANDLER FUNCTIONS
|
||||||
|
//****************************************************************************************************
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
function repeatedly_execute() {
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// Pressing mode
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;
|
||||||
|
// if game is paused, module or mode disabled, interface disabled or player character hidden, quit function
|
||||||
|
|
||||||
|
KeyboardMovement_Directions newdirection; // declare variable storing new direction
|
||||||
|
|
||||||
|
// get new direction:
|
||||||
|
if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right
|
||||||
|
else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad)
|
||||||
|
else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad)
|
||||||
|
else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad)
|
||||||
|
else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow
|
||||||
|
else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow
|
||||||
|
else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow
|
||||||
|
else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow
|
||||||
|
else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character
|
||||||
|
|
||||||
|
if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down
|
||||||
|
|
||||||
|
if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction
|
||||||
|
|
||||||
|
if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character
|
||||||
|
else { // if new direction is NOT the Stop command
|
||||||
|
|
||||||
|
int dx, dy; // declare variables storing new walk coordinates
|
||||||
|
if (newdirection == eKeyboardMovement_DownRight) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_UpRight) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_DownLeft) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_UpLeft) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Down) {
|
||||||
|
dx = 0;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Left) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Right) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Up) {
|
||||||
|
dx = 0;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates
|
||||||
|
}
|
||||||
|
KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
function on_key_press(int keycode) {
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// Tapping mode
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;
|
||||||
|
// if game is paused, module or mode disabled, interface disabled or player character hidden, quit function
|
||||||
|
|
||||||
|
KeyboardMovement_Directions newdirection; // declare variable storing new direction
|
||||||
|
|
||||||
|
// get new direction:
|
||||||
|
if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right
|
||||||
|
else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight;
|
||||||
|
else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft;
|
||||||
|
else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft;
|
||||||
|
else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down;
|
||||||
|
else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left;
|
||||||
|
else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right;
|
||||||
|
else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up;
|
||||||
|
else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character
|
||||||
|
|
||||||
|
if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction
|
||||||
|
|
||||||
|
if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character
|
||||||
|
else { // if new direction is NOT the Stop command
|
||||||
|
|
||||||
|
int dx, dy; // declare variables storing new walk coordinates
|
||||||
|
if (newdirection == eKeyboardMovement_DownRight) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_UpRight) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_DownLeft) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_UpLeft) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Down) {
|
||||||
|
dx = 0;
|
||||||
|
dy = DISTANCE;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Left) {
|
||||||
|
dx = -DISTANCE;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Right) {
|
||||||
|
dx = DISTANCE;
|
||||||
|
dy = 0;
|
||||||
|
}
|
||||||
|
else if (newdirection == eKeyboardMovement_Up) {
|
||||||
|
dx = 0;
|
||||||
|
dy = -DISTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates
|
||||||
|
}
|
||||||
|
KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction
|
||||||
|
|
||||||
|
}
|
||||||
|
else { // if new direction is same as current direction
|
||||||
|
player.StopMoving(); // stop player character
|
||||||
|
KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
function on_event(EventType event, int data) {
|
||||||
|
|
||||||
|
if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
13
samples/AGS Script/KeyboardMovement_102.ash
Normal file
13
samples/AGS Script/KeyboardMovement_102.ash
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Script header for module 'KeyboardMovement'
|
||||||
|
|
||||||
|
#define KeyboardMovement_VERSION 101
|
||||||
|
|
||||||
|
enum KeyboardMovement_Modes {
|
||||||
|
eKeyboardMovement_None,
|
||||||
|
eKeyboardMovement_Tapping,
|
||||||
|
eKeyboardMovement_Pressing
|
||||||
|
};
|
||||||
|
|
||||||
|
struct KeyboardMovement {
|
||||||
|
import static function SetMode(KeyboardMovement_Modes mode);
|
||||||
|
};
|
||||||
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;
|
||||||
18
samples/APL/DeepakChopra.apl
Normal file
18
samples/APL/DeepakChopra.apl
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
⍝ You can try this at http://tryapl.org/
|
||||||
|
⍝ I can not explain how much I suddenly love this crypto-language
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Starts ← 'Experiential truth ' 'The physical world ' 'Non-judgment ' 'Quantum physics '
|
||||||
|
Middles ← 'nurtures an ' 'projects onto ' 'imparts reality to ' 'constructs with '
|
||||||
|
Qualifiers ← 'abundance of ' 'the barrier of ' 'self-righteous ' 'potential '
|
||||||
|
Finishes ← 'marvel.' 'choices.' 'creativity.' 'actions.'
|
||||||
|
|
||||||
|
rf ← {(?⍴⍵)⊃⍵}
|
||||||
|
erf ← {rf ¨ ⍵}
|
||||||
|
|
||||||
|
deepak ← {erf Starts Middles Qualifiers Finishes}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
deepak ⍬
|
||||||
367
samples/APL/UT.dyalog
Normal file
367
samples/APL/UT.dyalog
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
:NameSpace UT
|
||||||
|
|
||||||
|
sac ← 0
|
||||||
|
expect_orig ← expect ← ⎕NS⍬
|
||||||
|
exception ← ⍬
|
||||||
|
nexpect_orig ← nexpect ← ⎕NS⍬
|
||||||
|
|
||||||
|
∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace
|
||||||
|
|
||||||
|
load_display_if_not_already_loaded
|
||||||
|
load_salt_scripts_into_current_namespace_if_configured
|
||||||
|
|
||||||
|
FromSpace←1⊃⎕RSI
|
||||||
|
|
||||||
|
PRE_test←{}
|
||||||
|
POST_test←{}
|
||||||
|
COVER_step←{}
|
||||||
|
:If 0≠⎕NC'Conf'
|
||||||
|
:If Conf has'cover_target'
|
||||||
|
PRE_test←{{}⎕PROFILE'start'}
|
||||||
|
POST_test←{{}⎕PROFILE'stop'}
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:If is_function Argument
|
||||||
|
TEST_step←single_function_test_function
|
||||||
|
COVER_file←Argument,'_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_list_of_functions Argument
|
||||||
|
TEST_step←list_of_functions_test_function
|
||||||
|
COVER_file←'list_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_file Argument
|
||||||
|
TEST_step←file_test_function
|
||||||
|
COVER_file←(get_file_name Argument),'_coverage.html'
|
||||||
|
|
||||||
|
:ElseIf is_dir Argument
|
||||||
|
test_files←test_files_in_dir Argument
|
||||||
|
TEST_step←test_dir_function
|
||||||
|
Argument←test_files
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:If 0≠⎕NC'Conf'
|
||||||
|
:If Conf has'cover_target'
|
||||||
|
COVER_step←{Conf,←⊂('cover_file'COVER_file)
|
||||||
|
generate_coverage_page Conf}
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
PRE_test ⍬
|
||||||
|
Z←FromSpace TEST_step Argument
|
||||||
|
POST_test ⍬
|
||||||
|
COVER_step ⍬
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ load_display_if_not_already_loaded
|
||||||
|
:If 0=⎕NC'#.DISPLAY'
|
||||||
|
'DISPLAY'#.⎕CY'display'
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ load_salt_scripts_into_current_namespace_if_configured
|
||||||
|
:If 0≠⎕NC'#.UT.appdir'
|
||||||
|
:If ⍬≢#.UT.appdir
|
||||||
|
⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#'
|
||||||
|
⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#'
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace single_function_test_function TestName
|
||||||
|
Z←run_ut FromSpace TestName
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace list_of_functions_test_function ListOfNames;t
|
||||||
|
t←⎕TS
|
||||||
|
Z←run_ut¨{FromSpace ⍵}¨ListOfNames
|
||||||
|
t←⎕TS-t
|
||||||
|
('Test execution report')print_passed_crashed_failed Z t
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t
|
||||||
|
FileNS←⎕SE.SALT.Load FilePath,' -target=#'
|
||||||
|
Functions←↓FileNS.⎕NL 3
|
||||||
|
TestFunctions←(is_test¨Functions)/Functions
|
||||||
|
:If (0/⍬,⊂0/'')≡TestFunctions
|
||||||
|
⎕←'No test functions found'
|
||||||
|
Z←⍬
|
||||||
|
:Else
|
||||||
|
t←⎕TS
|
||||||
|
Z←run_ut¨{FileNS ⍵}¨TestFunctions
|
||||||
|
t←⎕TS-t
|
||||||
|
(FilePath,' tests')print_passed_crashed_failed Z t
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←FromSpace test_dir_function Test_files
|
||||||
|
:If Test_files≡⍬/⍬,⊂''
|
||||||
|
⎕←'No test files found'
|
||||||
|
Z←⍬
|
||||||
|
:Else
|
||||||
|
Z←#.UT.run¨Test_files
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←get_file_name Argument;separator
|
||||||
|
separator←⊃⌽(Argument∊'/\')/⍳⍴Argument
|
||||||
|
Z←¯7↓separator↓Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML
|
||||||
|
ProfileData←⎕PROFILE'data'
|
||||||
|
ToCover←retrieve_coverables¨(⊃'cover_target'in Conf)
|
||||||
|
:If (⍴ToCover)≡(⍴⊂1)
|
||||||
|
ToCover←⊃ToCover
|
||||||
|
:EndIf
|
||||||
|
Representations←get_representation¨ToCover
|
||||||
|
CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations
|
||||||
|
HTML←generate_html CoverResults
|
||||||
|
Conf write_html_to_page HTML
|
||||||
|
⎕PROFILE'clear'
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←retrieve_coverables Something;nc;functions
|
||||||
|
nc←⎕NC Something
|
||||||
|
:If nc=3
|
||||||
|
Z←Something
|
||||||
|
:ElseIf nc=9
|
||||||
|
functions←strip¨↓⍎Something,'.⎕NL 3'
|
||||||
|
Z←{(Something,'.',⍵)}¨functions
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←strip input
|
||||||
|
Z←(input≠' ')/input
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←get_representation Function;nc;rep
|
||||||
|
nc←⎕NC⊂Function
|
||||||
|
:If nc=3.1
|
||||||
|
rep←↓⎕CR Function
|
||||||
|
rep[1]←⊂'∇',⊃rep[1]
|
||||||
|
rep,←⊂'∇'
|
||||||
|
rep←↑rep
|
||||||
|
:Else
|
||||||
|
rep←⎕CR Function
|
||||||
|
:EndIf
|
||||||
|
Z←rep
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines
|
||||||
|
Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1]
|
||||||
|
lines←ProfileData[Indices;2]
|
||||||
|
nc←⎕NC⊂name
|
||||||
|
:If 3.1=nc
|
||||||
|
functionlines←¯2+⍴↓representation
|
||||||
|
:Else
|
||||||
|
functionlines←⊃⍴↓representation
|
||||||
|
:EndIf
|
||||||
|
covered_lines←(⍬∘≢¨lines)/lines
|
||||||
|
Z←(nc lines functionlines covered_lines representation)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page
|
||||||
|
Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults
|
||||||
|
Total←⊃⊃+/{3⊃⍵}¨CoverResults
|
||||||
|
Percentage←100×Covered÷Total
|
||||||
|
CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')'
|
||||||
|
ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults
|
||||||
|
Timestamp←generate_timestamp_text
|
||||||
|
Page←⍬
|
||||||
|
Page,←⊂⍬,'<html>'
|
||||||
|
Page,←⊂⍬,'<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>'
|
||||||
|
Page,←⊂⍬,'<style>pre cov {line-height:80%;}'
|
||||||
|
Page,←⊂⍬,'pre cov {color: green;}'
|
||||||
|
Page,←⊂⍬,'pre uncov {line-height:80%;}'
|
||||||
|
Page,←⊂⍬,'pre uncov {color:red;}</style>'
|
||||||
|
Page,←⊂⍬,CoverageText
|
||||||
|
Page,←⊂⍬,'<pre>'
|
||||||
|
Page,←ColorizedCode
|
||||||
|
Page,←⊂⍬,'</pre>'
|
||||||
|
Page,←Timestamp
|
||||||
|
Page,←⊂⍬,'</html>'
|
||||||
|
Z←Page
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code
|
||||||
|
:If 3.1=⊃CoverResult
|
||||||
|
Colors←(2+3⊃CoverResult)⍴⊂'<uncov>'
|
||||||
|
Colors[1]←⊂''
|
||||||
|
Colors[⍴Colors]←⊂''
|
||||||
|
Ends←(2+3⊃CoverResult)⍴⊂'</uncov>'
|
||||||
|
Ends[1]←⊂''
|
||||||
|
Ends[⍴Ends]←⊂''
|
||||||
|
:Else
|
||||||
|
Colors←(3⊃CoverResult)⍴⊂'<uncov>'
|
||||||
|
Ends←(3⊃CoverResult)⍴⊂'</uncov>'
|
||||||
|
:EndIf
|
||||||
|
Colors[1+4⊃CoverResult]←⊂'<cov>'
|
||||||
|
Ends[1+4⊃CoverResult]←⊂'</cov>'
|
||||||
|
Code←↓5⊃CoverResult
|
||||||
|
Z←Colors,[1.5]Code
|
||||||
|
Z←{⍺,(⎕UCS 13),⍵}/Z,Ends
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS
|
||||||
|
TS←⎕TS
|
||||||
|
YYMMDD←⊃{⍺,'-',⍵}/3↑TS
|
||||||
|
HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS
|
||||||
|
Z←'Page generated: ',YYMMDD,'|',HHMMSS
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Conf write_html_to_page Page;tie;filename
|
||||||
|
filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf)
|
||||||
|
:Trap 22
|
||||||
|
tie←filename ⎕NTIE 0
|
||||||
|
filename ⎕NERASE tie
|
||||||
|
filename ⎕NCREATE tie
|
||||||
|
:Else
|
||||||
|
tie←filename ⎕NCREATE 0
|
||||||
|
:EndTrap
|
||||||
|
Simple_array←⍕⊃,/Page
|
||||||
|
(⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_function Argument
|
||||||
|
Z←'_TEST'≡¯5↑Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_list_of_functions Argument
|
||||||
|
Z←2=≡Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_file Argument
|
||||||
|
Z←'.dyalog'≡¯7↑Argument
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_dir Argument;attr
|
||||||
|
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
|
||||||
|
Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no'
|
||||||
|
:Else
|
||||||
|
'gfa'⎕NA'I kernel32|GetFileAttributes* <0t'
|
||||||
|
:If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists
|
||||||
|
Z←⊃2 16⊤attr ⍝ Return bit 4
|
||||||
|
:EndIf
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
|
||||||
|
∇ Z←test_files_in_dir Argument
|
||||||
|
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
|
||||||
|
Z←⎕SH'find ',Argument,' -name \*_tests.dyalog'
|
||||||
|
:Else
|
||||||
|
#.⎕CY'files'
|
||||||
|
Z←#.Files.Dir Argument,'\*_tests.dyalog'
|
||||||
|
Z←(Argument,'\')∘,¨Z
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message
|
||||||
|
(returned crashed time)←execute_function ut_data
|
||||||
|
(pass crash fail)←determine_pass_crash_or_fail returned crashed
|
||||||
|
message←determine_message pass fail crashed(2⊃ut_data)returned time
|
||||||
|
print_message_to_screen message
|
||||||
|
Z←(pass crash fail)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←execute_function ut_data;function;t
|
||||||
|
reset_UT_globals
|
||||||
|
function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2]
|
||||||
|
:Trap sac
|
||||||
|
:If 3.2≡⎕NC⊂function
|
||||||
|
t←⎕TS
|
||||||
|
Z←(⍎function,' ⍬')0
|
||||||
|
t←⎕TS-t
|
||||||
|
:Else
|
||||||
|
t←⎕TS
|
||||||
|
Z←(⍎function)0
|
||||||
|
t←⎕TS-t
|
||||||
|
:EndIf
|
||||||
|
|
||||||
|
:Else
|
||||||
|
Z←(↑⎕DM)1
|
||||||
|
:If exception≢⍬
|
||||||
|
expect←exception
|
||||||
|
Z[2]←0
|
||||||
|
t←⎕TS-t
|
||||||
|
:EndIf
|
||||||
|
:EndTrap
|
||||||
|
Z,←⊂t
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ reset_UT_globals
|
||||||
|
expect_orig ← expect← ⎕NS⍬
|
||||||
|
exception←⍬
|
||||||
|
nexpect_orig ← nexpect← ⎕NS⍬
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←is_test FunctionName;wsIndex
|
||||||
|
wsIndex←FunctionName⍳' '
|
||||||
|
FunctionName←(wsIndex-1)↑FunctionName
|
||||||
|
Z←'_TEST'≡¯5↑FunctionName
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Heading print_passed_crashed_failed(ArrayRes time)
|
||||||
|
⎕←'-----------------------------------------'
|
||||||
|
⎕←Heading
|
||||||
|
⎕←' ⍋ Passed: ',+/{1⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ⍒ Failed: ',+/{3⊃⍵}¨ArrayRes
|
||||||
|
⎕←' ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms'
|
||||||
|
∇
|
||||||
|
|
||||||
|
determine_pass_crash_or_fail←{
|
||||||
|
r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0)
|
||||||
|
expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z
|
||||||
|
}
|
||||||
|
|
||||||
|
∇ Z←determine_message(pass fail crashed name returned time)
|
||||||
|
:If crashed
|
||||||
|
Z←'CRASHED: 'failure_message name returned
|
||||||
|
:ElseIf pass
|
||||||
|
Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms'
|
||||||
|
:Else
|
||||||
|
Z←'FAILED: 'failure_message name returned
|
||||||
|
:EndIf
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ print_message_to_screen message
|
||||||
|
⎕←message
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←term_to_text Term;Text;Rows
|
||||||
|
Text←#.DISPLAY Term
|
||||||
|
Rows←1⊃⍴Text
|
||||||
|
Z←(Rows 4⍴''),Text
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm
|
||||||
|
hdr←Cause,name
|
||||||
|
exp←'Expected'
|
||||||
|
expterm←term_to_text #.UT.expect
|
||||||
|
got←'Got'
|
||||||
|
gotterm←term_to_text returned
|
||||||
|
Z←align_and_join_message_parts hdr exp expterm got gotterm
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W
|
||||||
|
(hdr exp expterm got gotterm)←Parts
|
||||||
|
(R1 C1)←⍴expterm
|
||||||
|
(R2 C2)←⍴gotterm
|
||||||
|
W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got)
|
||||||
|
Z←(W↑hdr),[0.5](W↑exp)
|
||||||
|
Z←Z⍪(R1 W↑expterm)
|
||||||
|
Z←Z⍪(W↑got)
|
||||||
|
Z←Z⍪(R2 W↑gotterm)
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←confparam in config
|
||||||
|
Z←1↓⊃({confparam≡⊃⍵}¨config)/config
|
||||||
|
∇
|
||||||
|
|
||||||
|
∇ Z←config has confparam
|
||||||
|
Z←∨/{confparam≡⊃⍵}¨config
|
||||||
|
∇
|
||||||
|
|
||||||
|
:EndNameSpace
|
||||||
110
samples/ATS/CoYonedaLemma.dats
Normal file
110
samples/ATS/CoYonedaLemma.dats
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2014-01
|
||||||
|
// CoYoneda Lemma:
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#include
|
||||||
|
"share/atspre_staload.hats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
"libats/ML/SATS/basis.sats"
|
||||||
|
staload
|
||||||
|
"libats/ML/SATS/list0.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload _ = "libats/ML/DATS/list0.dats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
sortdef ftype = type -> type
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
infixr (->) ->>
|
||||||
|
typedef ->> (a:type, b:type) = a -<cloref1> b
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
functor(F:ftype) =
|
||||||
|
{a,b:type} (a ->> b) ->> F(a) ->> F(b)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
list0 (a:type) = list0 (a)
|
||||||
|
extern
|
||||||
|
val functor_list0 : functor (list0)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
functor_list0{a,b}
|
||||||
|
(f) = lam xs => list0_map<a><b> (xs, f)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
datatype
|
||||||
|
CoYoneda
|
||||||
|
(F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a))
|
||||||
|
// end of [CoYoneda]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun CoYoneda_phi
|
||||||
|
: {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r))
|
||||||
|
extern
|
||||||
|
fun CoYoneda_psi
|
||||||
|
: {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r))
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
CoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx)
|
||||||
|
implement
|
||||||
|
CoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
datatype int0 = I of (int)
|
||||||
|
datatype bool = True | False // boxed boolean
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun bool2string
|
||||||
|
(x:bool): string =
|
||||||
|
(
|
||||||
|
case+ x of True() => "True" | False() => "False"
|
||||||
|
)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
fprint_val<bool> (out, x) = fprint (out, bool2string(x))
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun int2bool (i: int0): bool =
|
||||||
|
let val+I(i) = i in if i > 0 then True else False end
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
val myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0))
|
||||||
|
val myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0)
|
||||||
|
val myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
val ((*void*)) = fprintln! (stdout_ref, "myboolist0 = ", myboolist0)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement main0 () = ()
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [CoYonedaLemma.dats] *)
|
||||||
178
samples/ATS/DiningPhil2.dats
Normal file
178
samples/ATS/DiningPhil2.dats
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-11
|
||||||
|
//
|
||||||
|
// Implementing a variant of
|
||||||
|
// the problem of Dining Philosophers
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#include
|
||||||
|
"share/atspre_define.hats"
|
||||||
|
#include
|
||||||
|
"share/atspre_staload.hats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "libc/SATS/stdlib.sats"
|
||||||
|
staload "libc/SATS/unistd.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload _ = "libats/DATS/deqarray.dats"
|
||||||
|
staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "./DiningPhil2.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement phil_left (n) = n
|
||||||
|
implement phil_right (n) = (n+1) \nmod NPHIL
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun randsleep (n: intGte(1)): void
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
randsleep (n) =
|
||||||
|
ignoret (sleep($UN.cast{uInt}(rand() mod n + 1)))
|
||||||
|
// end of [randsleep]
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
phil_think (n) =
|
||||||
|
{
|
||||||
|
val () = println! ("phil_think(", n, ") starts")
|
||||||
|
val () = randsleep (6)
|
||||||
|
val () = println! ("phil_think(", n, ") finishes")
|
||||||
|
}
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
phil_dine (n, lf, rf) =
|
||||||
|
{
|
||||||
|
val () = println! ("phil_dine(", n, ") starts")
|
||||||
|
val () = randsleep (3)
|
||||||
|
val () = println! ("phil_dine(", n, ") finishes")
|
||||||
|
}
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
phil_loop (n) = let
|
||||||
|
//
|
||||||
|
val () = phil_think (n)
|
||||||
|
//
|
||||||
|
val nl = phil_left (n)
|
||||||
|
val nr = phil_right (n)
|
||||||
|
//
|
||||||
|
val ch_lfork = fork_changet (nl)
|
||||||
|
val ch_rfork = fork_changet (nr)
|
||||||
|
//
|
||||||
|
val lf = channel_takeout (ch_lfork)
|
||||||
|
val () = println! ("phil_loop(", n, ") picks left fork")
|
||||||
|
//
|
||||||
|
val () = randsleep (2) // HX: try to actively induce deadlock
|
||||||
|
//
|
||||||
|
val rf = channel_takeout (ch_rfork)
|
||||||
|
val () = println! ("phil_loop(", n, ") picks right fork")
|
||||||
|
//
|
||||||
|
val () = phil_dine (n, lf, rf)
|
||||||
|
//
|
||||||
|
val ch_forktray = forktray_changet ()
|
||||||
|
val () = channel_insert (ch_forktray, lf)
|
||||||
|
val () = channel_insert (ch_forktray, rf)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
phil_loop (n)
|
||||||
|
end // end of [phil_loop]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
cleaner_wash (f) =
|
||||||
|
{
|
||||||
|
val f = fork_get_num (f)
|
||||||
|
val () = println! ("cleaner_wash(", f, ") starts")
|
||||||
|
val () = randsleep (1)
|
||||||
|
val () = println! ("cleaner_wash(", f, ") finishes")
|
||||||
|
}
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
cleaner_return (f) =
|
||||||
|
{
|
||||||
|
val n = fork_get_num (f)
|
||||||
|
val ch = fork_changet (n)
|
||||||
|
val () = channel_insert (ch, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
cleaner_loop () = let
|
||||||
|
//
|
||||||
|
val ch = forktray_changet ()
|
||||||
|
val f0 = channel_takeout (ch)
|
||||||
|
//
|
||||||
|
val () = cleaner_wash (f0)
|
||||||
|
val () = cleaner_return (f0)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
cleaner_loop ()
|
||||||
|
end // end of [cleaner_loop]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
dynload "DiningPhil2.sats"
|
||||||
|
dynload "DiningPhil2_fork.dats"
|
||||||
|
dynload "DiningPhil2_thread.dats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
//
|
||||||
|
staload
|
||||||
|
"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats"
|
||||||
|
//
|
||||||
|
in (* in of [local] *)
|
||||||
|
//
|
||||||
|
val () = mythread_create_cloptr (llam () => phil_loop (0))
|
||||||
|
val () = mythread_create_cloptr (llam () => phil_loop (1))
|
||||||
|
val () = mythread_create_cloptr (llam () => phil_loop (2))
|
||||||
|
val () = mythread_create_cloptr (llam () => phil_loop (3))
|
||||||
|
val () = mythread_create_cloptr (llam () => phil_loop (4))
|
||||||
|
//
|
||||||
|
val () = mythread_create_cloptr (llam () => cleaner_loop ())
|
||||||
|
//
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
main0 () =
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = println! ("DiningPhil2: starting")
|
||||||
|
val ((*void*)) = while (true) ignoret (sleep(1))
|
||||||
|
//
|
||||||
|
} (* end of [main0] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [DiningPhil2.dats] *)
|
||||||
71
samples/ATS/DiningPhil2.sats
Normal file
71
samples/ATS/DiningPhil2.sats
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-11
|
||||||
|
//
|
||||||
|
// Implementing a variant of
|
||||||
|
// the problem of Dining Philosophers
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#include
|
||||||
|
"share/atspre_define.hats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
%{#
|
||||||
|
#define NPHIL 5
|
||||||
|
%} // end of [%{#]
|
||||||
|
#define NPHIL 5
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef nphil = natLt(NPHIL)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun phil_left (n: nphil): nphil
|
||||||
|
fun phil_right (n: nphil): nphil
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun phil_loop (n: nphil): void
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun cleaner_loop ((*void*)): void
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
absvtype fork_vtype = ptr
|
||||||
|
vtypedef fork = fork_vtype
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun fork_get_num (!fork): nphil
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun phil_dine
|
||||||
|
(n: nphil, lf: !fork, rf: !fork): void
|
||||||
|
// end of [phil_dine]
|
||||||
|
|
||||||
|
fun phil_think (n: nphil): void
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun cleaner_wash (f: !fork): void
|
||||||
|
fun cleaner_return (f: fork): void
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun fork_changet (n: nphil): channel(fork)
|
||||||
|
//
|
||||||
|
fun forktray_changet ((*void*)): channel(fork)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [DiningPhil2.sats] *)
|
||||||
89
samples/ATS/DiningPhil2_fork.dats
Normal file
89
samples/ATS/DiningPhil2_fork.dats
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-11
|
||||||
|
//
|
||||||
|
// Implementing a variant of
|
||||||
|
// the problem of Dining Philosophers
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#include
|
||||||
|
"share/atspre_define.hats"
|
||||||
|
#include
|
||||||
|
"share/atspre_staload.hats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload _ = "libats/DATS/deqarray.dats"
|
||||||
|
staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "./DiningPhil2.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
datavtype fork = FORK of (nphil)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
assume fork_vtype = fork
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
fork_get_num (f) = let val FORK(n) = f in n end
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
|
||||||
|
val
|
||||||
|
the_forkarray = let
|
||||||
|
//
|
||||||
|
typedef t = channel(fork)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
array_tabulate$fopr<t>
|
||||||
|
(n) = ch where
|
||||||
|
{
|
||||||
|
val n = $UN.cast{nphil}(n)
|
||||||
|
val ch = channel_create_exn<fork> (i2sz(2))
|
||||||
|
val () = channel_insert (ch, FORK (n))
|
||||||
|
}
|
||||||
|
//
|
||||||
|
in
|
||||||
|
arrayref_tabulate<t> (i2sz(NPHIL))
|
||||||
|
end // end of [val]
|
||||||
|
|
||||||
|
in (* in of [local] *)
|
||||||
|
|
||||||
|
implement fork_changet (n) = the_forkarray[n]
|
||||||
|
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
|
||||||
|
val the_forktray =
|
||||||
|
channel_create_exn<fork> (i2sz(NPHIL+1))
|
||||||
|
|
||||||
|
in (* in of [local] *)
|
||||||
|
|
||||||
|
implement forktray_changet () = the_forktray
|
||||||
|
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [DiningPhil2_fork.dats] *)
|
||||||
43
samples/ATS/DiningPhil2_thread.dats
Normal file
43
samples/ATS/DiningPhil2_thread.dats
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-11
|
||||||
|
//
|
||||||
|
// Implementing a variant of
|
||||||
|
// the problem of Dining Philosophers
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#include "share/atspre_define.hats"
|
||||||
|
#include "share/atspre_staload.hats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
//
|
||||||
|
#include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats"
|
||||||
|
//
|
||||||
|
in (* in of [local] *)
|
||||||
|
//
|
||||||
|
// HX: it is intentionally left to be empty
|
||||||
|
//
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
//
|
||||||
|
#include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats"
|
||||||
|
//
|
||||||
|
in (* in of [local] *)
|
||||||
|
//
|
||||||
|
// HX: it is intentionally left to be empty
|
||||||
|
//
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [DiningPhil2_thread.dats] *)
|
||||||
178
samples/ATS/YonedaLemma.dats
Normal file
178
samples/ATS/YonedaLemma.dats
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2014-01
|
||||||
|
// Yoneda Lemma:
|
||||||
|
// The hardest "trivial" theorem :)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
#include
|
||||||
|
"share/atspre_staload.hats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
"libats/ML/SATS/basis.sats"
|
||||||
|
staload
|
||||||
|
"libats/ML/SATS/list0.sats"
|
||||||
|
staload
|
||||||
|
"libats/ML/SATS/option0.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload _ = "libats/ML/DATS/list0.dats"
|
||||||
|
staload _ = "libats/ML/DATS/option0.dats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
sortdef ftype = type -> type
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
infixr (->) ->>
|
||||||
|
typedef ->> (a:type, b:type) = a -<cloref1> b
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
functor(F:ftype) =
|
||||||
|
{a,b:type} (a ->> b) ->> F(a) ->> F(b)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
list0 (a:type) = list0 (a)
|
||||||
|
extern
|
||||||
|
val functor_list0 : functor (list0)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
functor_list0{a,b}
|
||||||
|
(f) = lam xs => list0_map<a><b> (xs, f)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
option0 (a:type) = option0 (a)
|
||||||
|
extern
|
||||||
|
val functor_option0 : functor (option0)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
functor_option0{a,b}
|
||||||
|
(f) = lam opt => option0_map<a><b> (opt, f)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
extern
|
||||||
|
val functor_homres
|
||||||
|
: {c:type} functor (lam(r:type) => c ->> r)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
functor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun Yoneda_phi : {F:ftype}functor(F) ->
|
||||||
|
{a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r))
|
||||||
|
extern
|
||||||
|
fun Yoneda_psi : {F:ftype}functor(F) ->
|
||||||
|
{a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Yoneda_phi
|
||||||
|
(ftor) = lam(fx) => lam (m) => ftor(m)(fx)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Yoneda_psi (ftor) = lam(mf) => mf(lam x => x)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(*
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2014-01-05:
|
||||||
|
// Another version based on Natural Transformation
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
typedef
|
||||||
|
natrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
fun Yoneda_phi_nat : {F:ftype}functor(F) ->
|
||||||
|
{a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F)
|
||||||
|
extern
|
||||||
|
fun Yoneda_psi_nat : {F:ftype}functor(F) ->
|
||||||
|
{a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Yoneda_phi_nat
|
||||||
|
(ftor) = lam(fx) => lam (m) => ftor(m)(fx)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Yoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
datatype bool = True | False // boxed boolean
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun bool2string
|
||||||
|
(x:bool): string =
|
||||||
|
(
|
||||||
|
case+ x of True() => "True" | False() => "False"
|
||||||
|
)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
fprint_val<bool> (out, x) = fprint (out, bool2string(x))
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
val myboolist0 =
|
||||||
|
$list_t{bool}(True, False, True, False, False)
|
||||||
|
val myboolist0 = g0ofg1_list (myboolist0)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
extern
|
||||||
|
val Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r)
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
Yoneda_bool_list0 =
|
||||||
|
Yoneda_phi(functor_list0){bool}(myboolist0)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
val myboolist1 =
|
||||||
|
Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
val () = fprintln! (stdout_ref, "myboolist0 = ", myboolist0)
|
||||||
|
val () = fprintln! (stdout_ref, "myboolist1 = ", myboolist1)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement main0 () = ()
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [YonedaLemma.dats] *)
|
||||||
187
samples/ATS/linset.hats
Normal file
187
samples/ATS/linset.hats
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
(***********************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Applied Type System *)
|
||||||
|
(* *)
|
||||||
|
(***********************************************************************)
|
||||||
|
|
||||||
|
(*
|
||||||
|
** ATS/Postiats - Unleashing the Potential of Types!
|
||||||
|
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
|
||||||
|
** All rights reserved
|
||||||
|
**
|
||||||
|
** ATS is free software; you can redistribute it and/or modify it under
|
||||||
|
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
|
||||||
|
** Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
** later version.
|
||||||
|
**
|
||||||
|
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
** for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU General Public License
|
||||||
|
** along with ATS; see the file COPYING. If not, please write to the
|
||||||
|
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
** 02110-1301, USA.
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* Author: Hongwei Xi *)
|
||||||
|
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
|
||||||
|
(* Start time: December, 2012 *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX: shared by linset_listord (* ordered list *)
|
||||||
|
// HX: shared by linset_avltree (* AVL-tree-based *)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-02:
|
||||||
|
// for sets of nonlinear elements
|
||||||
|
//
|
||||||
|
absvtype set_vtype (a:t@ype+) = ptr
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
vtypedef set (a:t0p) = set_vtype (a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
compare_elt_elt (x1: a, x2: a):<> int
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{} linset_nil{a:t0p} ():<> set(a)
|
||||||
|
fun{} linset_make_nil{a:t0p} ():<> set(a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p} linset_sing (x: a):<!wrt> set(a)
|
||||||
|
fun{a:t0p} linset_make_sing (x: a):<!wrt> set(a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_make_list (xs: List(INV(a))):<!wrt> set(a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{}
|
||||||
|
linset_is_nil {a:t0p} (xs: !set(INV(a))):<> bool
|
||||||
|
fun{}
|
||||||
|
linset_isnot_nil {a:t0p} (xs: !set(INV(a))):<> bool
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p} linset_size (!set(INV(a))): size_t
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_is_member (xs: !set(INV(a)), x0: a):<> bool
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_isnot_member (xs: !set(INV(a)), x0: a):<> bool
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_copy (!set(INV(a))):<!wrt> set(a)
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_free (xs: set(INV(a))):<!wrt> void
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_insert
|
||||||
|
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeout
|
||||||
|
(
|
||||||
|
&set(INV(a)) >> _, a, res: &(a?) >> opt(a, b)
|
||||||
|
) :<!wrt> #[b:bool] bool(b) // endfun
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeout_opt (&set(INV(a)) >> _, a):<!wrt> Option_vt(a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_remove
|
||||||
|
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX: choosing an element in an unspecified manner
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_choose
|
||||||
|
(
|
||||||
|
xs: !set(INV(a)), x: &a? >> opt (a, b)
|
||||||
|
) :<!wrt> #[b:bool] bool(b)
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_choose_opt (xs: !set(INV(a))):<!wrt> Option_vt(a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeoutmax
|
||||||
|
(
|
||||||
|
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
|
||||||
|
) :<!wrt> #[b:bool] bool (b)
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeoutmax_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeoutmin
|
||||||
|
(
|
||||||
|
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
|
||||||
|
) :<!wrt> #[b:bool] bool (b)
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeoutmin_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
fprint_linset$sep (FILEref): void // ", "
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
fprint_linset (out: FILEref, xs: !set(INV(a))): void
|
||||||
|
//
|
||||||
|
overload fprint with fprint_linset
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{
|
||||||
|
a:t0p}{env:vt0p
|
||||||
|
} linset_foreach$fwork
|
||||||
|
(x: a, env: &(env) >> _): void
|
||||||
|
//
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_foreach (set: !set(INV(a))): void
|
||||||
|
fun{
|
||||||
|
a:t0p}{env:vt0p
|
||||||
|
} linset_foreach_env
|
||||||
|
(set: !set(INV(a)), env: &(env) >> _): void
|
||||||
|
// end of [linset_foreach_env]
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_listize (xs: set(INV(a))): List0_vt (a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_listize1 (xs: !set(INV(a))): List0_vt (a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [linset.hats] *)
|
||||||
504
samples/ATS/linset_listord.dats
Normal file
504
samples/ATS/linset_listord.dats
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
(***********************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Applied Type System *)
|
||||||
|
(* *)
|
||||||
|
(***********************************************************************)
|
||||||
|
|
||||||
|
(*
|
||||||
|
** ATS/Postiats - Unleashing the Potential of Types!
|
||||||
|
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
|
||||||
|
** All rights reserved
|
||||||
|
**
|
||||||
|
** ATS is free software; you can redistribute it and/or modify it under
|
||||||
|
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
|
||||||
|
** Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
** later version.
|
||||||
|
**
|
||||||
|
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
** for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU General Public License
|
||||||
|
** along with ATS; see the file COPYING. If not, please write to the
|
||||||
|
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
** 02110-1301, USA.
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* Author: Hongwei Xi *)
|
||||||
|
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
|
||||||
|
(* Start time: February, 2013 *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX-2013-08:
|
||||||
|
// a set is represented as a sorted list in descending order;
|
||||||
|
// note that descending order is chosen to faciliate set comparison
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload "libats/SATS/linset_listord.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#include "./SHARE/linset.hats" // code reuse
|
||||||
|
#include "./SHARE/linset_node.hats" // code reuse
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
assume
|
||||||
|
set_vtype (elt:t@ype) = List0_vt (elt)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
linset_nil () = list_vt_nil ()
|
||||||
|
implement{}
|
||||||
|
linset_make_nil () = list_vt_nil ()
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
linset_sing
|
||||||
|
(x) = list_vt_cons{a}(x, list_vt_nil)
|
||||||
|
// end of [linset_sing]
|
||||||
|
implement{a}
|
||||||
|
linset_make_sing
|
||||||
|
(x) = list_vt_cons{a}(x, list_vt_nil)
|
||||||
|
// end of [linset_make_sing]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
linset_is_nil (xs) = list_vt_is_nil (xs)
|
||||||
|
implement{}
|
||||||
|
linset_isnot_nil (xs) = list_vt_is_cons (xs)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_size (xs) =
|
||||||
|
let val n = list_vt_length(xs) in i2sz(n) end
|
||||||
|
// end of [linset_size]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_is_member
|
||||||
|
(xs, x0) = let
|
||||||
|
//
|
||||||
|
fun aux
|
||||||
|
{n:nat} .<n>.
|
||||||
|
(
|
||||||
|
xs: !list_vt (a, n)
|
||||||
|
) :<> bool = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs of
|
||||||
|
| list_vt_cons (x, xs) => let
|
||||||
|
val sgn = compare_elt_elt<a> (x0, x) in
|
||||||
|
if sgn > 0 then false else (if sgn < 0 then aux (xs) else true)
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| list_vt_nil ((*void*)) => false
|
||||||
|
//
|
||||||
|
end // end of [aux]
|
||||||
|
//
|
||||||
|
in
|
||||||
|
aux (xs)
|
||||||
|
end // end of [linset_is_member]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_copy (xs) = list_vt_copy<a> (xs)
|
||||||
|
implement{a}
|
||||||
|
linset_free (xs) = list_vt_free<a> (xs)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_insert
|
||||||
|
(xs, x0) = let
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
mynode_cons
|
||||||
|
{n:nat} .<>.
|
||||||
|
(
|
||||||
|
nx: mynode1 (a), xs: list_vt (a, n)
|
||||||
|
) : list_vt (a, n+1) = let
|
||||||
|
//
|
||||||
|
val xs1 =
|
||||||
|
$UN.castvwtp0{List1_vt(a)}(nx)
|
||||||
|
val+@list_vt_cons (_, xs2) = xs1
|
||||||
|
prval () = $UN.cast2void (xs2); val () = (xs2 := xs)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
fold@ (xs1); xs1
|
||||||
|
end // end of [mynode_cons]
|
||||||
|
//
|
||||||
|
fun ins
|
||||||
|
{n:nat} .<n>. // tail-recursive
|
||||||
|
(
|
||||||
|
xs: &list_vt (a, n) >> list_vt (a, n1)
|
||||||
|
) : #[n1:nat | n <= n1; n1 <= n+1] bool =
|
||||||
|
(
|
||||||
|
case+ xs of
|
||||||
|
| @list_vt_cons
|
||||||
|
(x, xs1) => let
|
||||||
|
val sgn =
|
||||||
|
compare_elt_elt<a> (x0, x)
|
||||||
|
// end of [val]
|
||||||
|
in
|
||||||
|
if sgn > 0 then let
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
val nx = mynode_make_elt<a> (x0)
|
||||||
|
val ((*void*)) = xs := mynode_cons (nx, xs)
|
||||||
|
in
|
||||||
|
false
|
||||||
|
end else if sgn < 0 then let
|
||||||
|
val ans = ins (xs1)
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
ans
|
||||||
|
end else let // [x0] is found
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
true (* [x0] in [xs] *)
|
||||||
|
end (* end of [if] *)
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| list_vt_nil () => let
|
||||||
|
val nx = mynode_make_elt<a> (x0)
|
||||||
|
val ((*void*)) = xs := mynode_cons (nx, xs)
|
||||||
|
in
|
||||||
|
false
|
||||||
|
end // end of [list_vt_nil]
|
||||||
|
) (* end of [ins] *)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$effmask_all (ins (xs))
|
||||||
|
end // end of [linset_insert]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(*
|
||||||
|
//
|
||||||
|
HX-2013-08:
|
||||||
|
[linset_remove] moved up
|
||||||
|
//
|
||||||
|
implement{a}
|
||||||
|
linset_remove
|
||||||
|
(xs, x0) = let
|
||||||
|
//
|
||||||
|
fun rem
|
||||||
|
{n:nat} .<n>. // tail-recursive
|
||||||
|
(
|
||||||
|
xs: &list_vt (a, n) >> list_vt (a, n1)
|
||||||
|
) : #[n1:nat | n1 <= n; n <= n1+1] bool =
|
||||||
|
(
|
||||||
|
case+ xs of
|
||||||
|
| @list_vt_cons
|
||||||
|
(x, xs1) => let
|
||||||
|
val sgn =
|
||||||
|
compare_elt_elt<a> (x0, x)
|
||||||
|
// end of [val]
|
||||||
|
in
|
||||||
|
if sgn > 0 then let
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
false
|
||||||
|
end else if sgn < 0 then let
|
||||||
|
val ans = rem (xs1)
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
ans
|
||||||
|
end else let // x0 = x
|
||||||
|
val xs1_ = xs1
|
||||||
|
val ((*void*)) = free@{a}{0}(xs)
|
||||||
|
val () = xs := xs1_
|
||||||
|
in
|
||||||
|
true // [x0] in [xs]
|
||||||
|
end (* end of [if] *)
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| list_vt_nil () => false
|
||||||
|
) (* end of [rem] *)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$effmask_all (rem (xs))
|
||||||
|
end // end of [linset_remove]
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
(*
|
||||||
|
** By Brandon Barker
|
||||||
|
*)
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
linset_choose
|
||||||
|
(xs, x0) = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs of
|
||||||
|
| list_vt_cons
|
||||||
|
(x, xs1) => let
|
||||||
|
val () = x0 := x
|
||||||
|
prval () = opt_some{a}(x0)
|
||||||
|
in
|
||||||
|
true
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| list_vt_nil () => let
|
||||||
|
prval () = opt_none{a}(x0)
|
||||||
|
in
|
||||||
|
false
|
||||||
|
end // end of [list_vt_nil]
|
||||||
|
//
|
||||||
|
end // end of [linset_choose]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}{env}
|
||||||
|
linset_foreach_env (xs, env) = let
|
||||||
|
//
|
||||||
|
implement
|
||||||
|
list_vt_foreach$fwork<a><env>
|
||||||
|
(x, env) = linset_foreach$fwork<a><env> (x, env)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
list_vt_foreach_env<a><env> (xs, env)
|
||||||
|
end // end of [linset_foreach_env]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_listize (xs) = xs
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{a}
|
||||||
|
linset_listize1 (xs) = list_vt_copy (xs)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// HX: functions for processing mynodes
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} mynode_null{a} () =
|
||||||
|
$UN.castvwtp0{mynode(a,null)}(the_null_ptr)
|
||||||
|
// end of [mynode_null]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
mynode_make_elt
|
||||||
|
(x) = let
|
||||||
|
//
|
||||||
|
val nx = list_vt_cons{a}{0}(x, _ )
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.castvwtp0{mynode1(a)}(nx)
|
||||||
|
end // end of [mynode_make_elt]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} mynode_free
|
||||||
|
{a}(nx) = () where {
|
||||||
|
val nx =
|
||||||
|
$UN.castvwtp0{List1_vt(a)}(nx)
|
||||||
|
//
|
||||||
|
val+~list_vt_cons (_, nx2) = nx
|
||||||
|
//
|
||||||
|
prval ((*void*)) = $UN.cast2void (nx2)
|
||||||
|
//
|
||||||
|
} (* end of [mynode_free] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
mynode_get_elt
|
||||||
|
(nx) = (x) where {
|
||||||
|
//
|
||||||
|
val nx1 =
|
||||||
|
$UN.castvwtp1{List1_vt(a)}(nx)
|
||||||
|
//
|
||||||
|
val+list_vt_cons (x, _) = nx1
|
||||||
|
//
|
||||||
|
prval ((*void*)) = $UN.cast2void (nx1)
|
||||||
|
//
|
||||||
|
} (* end of [mynode_get_elt] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
mynode_set_elt
|
||||||
|
{l} (nx, x0) =
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val nx1 =
|
||||||
|
$UN.castvwtp1{List1_vt(a)}(nx)
|
||||||
|
//
|
||||||
|
val+@list_vt_cons (x, _) = nx1
|
||||||
|
//
|
||||||
|
val () = x := x0
|
||||||
|
//
|
||||||
|
prval () = fold@ (nx1)
|
||||||
|
prval () = $UN.cast2void (nx1)
|
||||||
|
//
|
||||||
|
prval () = __assert (nx) where
|
||||||
|
{
|
||||||
|
extern praxi __assert (nx: !mynode(a?, l) >> mynode (a, l)): void
|
||||||
|
} (* end of [prval] *)
|
||||||
|
//
|
||||||
|
} (* end of [mynode_set_elt] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
mynode_getfree_elt
|
||||||
|
(nx) = (x) where {
|
||||||
|
//
|
||||||
|
val nx =
|
||||||
|
$UN.castvwtp0{List1_vt(a)}(nx)
|
||||||
|
//
|
||||||
|
val+~list_vt_cons (x, nx2) = nx
|
||||||
|
//
|
||||||
|
prval ((*void*)) = $UN.cast2void (nx2)
|
||||||
|
//
|
||||||
|
} (* end of [mynode_getfree_elt] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(*
|
||||||
|
fun{a:t0p}
|
||||||
|
linset_takeout_ngc
|
||||||
|
(set: &set(INV(a)) >> _, x0: a):<!wrt> mynode0 (a)
|
||||||
|
// end of [linset_takeout_ngc]
|
||||||
|
*)
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
linset_takeout_ngc
|
||||||
|
(set, x0) = let
|
||||||
|
//
|
||||||
|
fun takeout
|
||||||
|
(
|
||||||
|
xs: &List0_vt (a) >> _
|
||||||
|
) : mynode0(a) = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs of
|
||||||
|
| @list_vt_cons
|
||||||
|
(x, xs1) => let
|
||||||
|
prval pf_x = view@x
|
||||||
|
prval pf_xs1 = view@xs1
|
||||||
|
val sgn =
|
||||||
|
compare_elt_elt<a> (x0, x)
|
||||||
|
// end of [val]
|
||||||
|
in
|
||||||
|
if sgn > 0 then let
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
mynode_null{a}((*void*))
|
||||||
|
end else if sgn < 0 then let
|
||||||
|
val res = takeout (xs1)
|
||||||
|
prval ((*void*)) = fold@ (xs)
|
||||||
|
in
|
||||||
|
res
|
||||||
|
end else let // x0 = x
|
||||||
|
val xs1_ = xs1
|
||||||
|
val res = $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs))
|
||||||
|
val () = xs := xs1_
|
||||||
|
in
|
||||||
|
res // [x0] in [xs]
|
||||||
|
end (* end of [if] *)
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| list_vt_nil () => mynode_null{a}((*void*))
|
||||||
|
//
|
||||||
|
end (* end of [takeout] *)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$effmask_all (takeout (set))
|
||||||
|
end // end of [linset_takeout_ngc]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
linset_takeoutmax_ngc
|
||||||
|
(xs) = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs of
|
||||||
|
| @list_vt_cons
|
||||||
|
(x, xs1) => let
|
||||||
|
prval pf_x = view@x
|
||||||
|
prval pf_xs1 = view@xs1
|
||||||
|
val xs_ = xs
|
||||||
|
val () = xs := xs1
|
||||||
|
in
|
||||||
|
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
|
||||||
|
end // end of [list_vt_cons]
|
||||||
|
| @list_vt_nil () => let
|
||||||
|
prval () = fold@ (xs)
|
||||||
|
in
|
||||||
|
mynode_null{a}((*void*))
|
||||||
|
end // end of [list_vt_nil]
|
||||||
|
//
|
||||||
|
end // end of [linset_takeoutmax_ngc]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement
|
||||||
|
{a}(*tmp*)
|
||||||
|
linset_takeoutmin_ngc
|
||||||
|
(xs) = let
|
||||||
|
//
|
||||||
|
fun unsnoc
|
||||||
|
{n:pos} .<n>.
|
||||||
|
(
|
||||||
|
xs: &list_vt (a, n) >> list_vt (a, n-1)
|
||||||
|
) :<!wrt> mynode1 (a) = let
|
||||||
|
//
|
||||||
|
val+@list_vt_cons (x, xs1) = xs
|
||||||
|
//
|
||||||
|
prval pf_x = view@x and pf_xs1 = view@xs1
|
||||||
|
//
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs1 of
|
||||||
|
| list_vt_cons _ =>
|
||||||
|
let val res = unsnoc(xs1) in fold@xs; res end
|
||||||
|
// end of [list_vt_cons]
|
||||||
|
| list_vt_nil () => let
|
||||||
|
val xs_ = xs
|
||||||
|
val () = xs := list_vt_nil{a}()
|
||||||
|
in
|
||||||
|
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
|
||||||
|
end // end of [list_vt_nil]
|
||||||
|
//
|
||||||
|
end // end of [unsnoc]
|
||||||
|
//
|
||||||
|
in
|
||||||
|
//
|
||||||
|
case+ xs of
|
||||||
|
| list_vt_cons _ => unsnoc (xs)
|
||||||
|
| list_vt_nil () => mynode_null{a}((*void*))
|
||||||
|
//
|
||||||
|
end // end of [linset_takeoutmin_ngc]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [linset_listord.dats] *)
|
||||||
51
samples/ATS/linset_listord.sats
Normal file
51
samples/ATS/linset_listord.sats
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
(***********************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* Applied Type System *)
|
||||||
|
(* *)
|
||||||
|
(***********************************************************************)
|
||||||
|
|
||||||
|
(*
|
||||||
|
** ATS/Postiats - Unleashing the Potential of Types!
|
||||||
|
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
|
||||||
|
** All rights reserved
|
||||||
|
**
|
||||||
|
** ATS is free software; you can redistribute it and/or modify it under
|
||||||
|
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
|
||||||
|
** Free Software Foundation; either version 3, or (at your option) any
|
||||||
|
** later version.
|
||||||
|
**
|
||||||
|
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
** for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU General Public License
|
||||||
|
** along with ATS; see the file COPYING. If not, please write to the
|
||||||
|
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
** 02110-1301, USA.
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// Author: Hongwei Xi
|
||||||
|
// Authoremail: hwxiATcsDOTbuDOTedu
|
||||||
|
// Time: October, 2010
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#define ATS_PACKNAME "ATSLIB.libats.linset_listord"
|
||||||
|
#define ATS_STALOADFLAG 0 // no static loading at run-time
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#include "./SHARE/linset.hats"
|
||||||
|
#include "./SHARE/linset_node.hats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
castfn
|
||||||
|
linset2list {a:t0p} (xs: set (INV(a))):<> List0_vt (a)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [linset_listord.sats] *)
|
||||||
59
samples/Alloy/file_system.als
Normal file
59
samples/Alloy/file_system.als
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
module examples/systems/file_system
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Model of a generic file system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract sig Object {}
|
||||||
|
|
||||||
|
sig Name {}
|
||||||
|
|
||||||
|
sig File extends Object {} { some d: Dir | this in d.entries.contents }
|
||||||
|
|
||||||
|
sig Dir extends Object {
|
||||||
|
entries: set DirEntry,
|
||||||
|
parent: lone Dir
|
||||||
|
} {
|
||||||
|
parent = this.~@contents.~@entries
|
||||||
|
all e1, e2 : entries | e1.name = e2.name => e1 = e2
|
||||||
|
this !in this.^@parent
|
||||||
|
this != Root => Root in this.^@parent
|
||||||
|
}
|
||||||
|
|
||||||
|
one sig Root extends Dir {} { no parent }
|
||||||
|
|
||||||
|
lone sig Cur extends Dir {}
|
||||||
|
|
||||||
|
sig DirEntry {
|
||||||
|
name: Name,
|
||||||
|
contents: Object
|
||||||
|
} {
|
||||||
|
one this.~entries
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all directories besides root have one parent
|
||||||
|
*/
|
||||||
|
pred OneParent_buggyVersion {
|
||||||
|
all d: Dir - Root | one d.parent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all directories besides root have one parent
|
||||||
|
*/
|
||||||
|
pred OneParent_correctVersion {
|
||||||
|
all d: Dir - Root | (one d.parent && one contents.d)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only files may be linked (that is, have more than one entry)
|
||||||
|
* That is, all directories are the contents of at most one directory entry
|
||||||
|
*/
|
||||||
|
pred NoDirAliases {
|
||||||
|
all o: Dir | lone o.~contents
|
||||||
|
}
|
||||||
|
|
||||||
|
check { OneParent_buggyVersion => NoDirAliases } for 5 expect 1
|
||||||
|
|
||||||
|
check { OneParent_correctVersion => NoDirAliases } for 5 expect 0
|
||||||
83
samples/Alloy/marksweepgc.als
Normal file
83
samples/Alloy/marksweepgc.als
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
module examples/systems/marksweepgc
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Model of mark and sweep garbage collection.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// a node in the heap
|
||||||
|
sig Node {}
|
||||||
|
|
||||||
|
sig HeapState {
|
||||||
|
left, right : Node -> lone Node,
|
||||||
|
marked : set Node,
|
||||||
|
freeList : lone Node
|
||||||
|
}
|
||||||
|
|
||||||
|
pred clearMarks[hs, hs' : HeapState] {
|
||||||
|
// clear marked set
|
||||||
|
no hs'.marked
|
||||||
|
// left and right fields are unchanged
|
||||||
|
hs'.left = hs.left
|
||||||
|
hs'.right = hs.right
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* simulate the recursion of the mark() function using transitive closure
|
||||||
|
*/
|
||||||
|
fun reachable[hs: HeapState, n: Node] : set Node {
|
||||||
|
n + n.^(hs.left + hs.right)
|
||||||
|
}
|
||||||
|
|
||||||
|
pred mark[hs: HeapState, from : Node, hs': HeapState] {
|
||||||
|
hs'.marked = hs.reachable[from]
|
||||||
|
hs'.left = hs.left
|
||||||
|
hs'.right = hs.right
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* complete hack to simulate behavior of code to set freeList
|
||||||
|
*/
|
||||||
|
pred setFreeList[hs, hs': HeapState] {
|
||||||
|
// especially hackish
|
||||||
|
hs'.freeList.*(hs'.left) in (Node - hs.marked)
|
||||||
|
all n: Node |
|
||||||
|
(n !in hs.marked) => {
|
||||||
|
no hs'.right[n]
|
||||||
|
hs'.left[n] in (hs'.freeList.*(hs'.left))
|
||||||
|
n in hs'.freeList.*(hs'.left)
|
||||||
|
} else {
|
||||||
|
hs'.left[n] = hs.left[n]
|
||||||
|
hs'.right[n] = hs.right[n]
|
||||||
|
}
|
||||||
|
hs'.marked = hs.marked
|
||||||
|
}
|
||||||
|
|
||||||
|
pred GC[hs: HeapState, root : Node, hs': HeapState] {
|
||||||
|
some hs1, hs2: HeapState |
|
||||||
|
hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs']
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Soundness1 {
|
||||||
|
all h, h' : HeapState, root : Node |
|
||||||
|
h.GC[root, h'] =>
|
||||||
|
(all live : h.reachable[root] | {
|
||||||
|
h'.left[live] = h.left[live]
|
||||||
|
h'.right[live] = h.right[live]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Soundness2 {
|
||||||
|
all h, h' : HeapState, root : Node |
|
||||||
|
h.GC[root, h'] =>
|
||||||
|
no h'.reachable[root] & h'.reachable[h'.freeList]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Completeness {
|
||||||
|
all h, h' : HeapState, root : Node |
|
||||||
|
h.GC[root, h'] =>
|
||||||
|
(Node - h'.reachable[root]) in h'.reachable[h'.freeList]
|
||||||
|
}
|
||||||
|
|
||||||
|
check Soundness1 for 3 expect 0
|
||||||
|
check Soundness2 for 3 expect 0
|
||||||
|
check Completeness for 3 expect 0
|
||||||
217
samples/Alloy/views.als
Normal file
217
samples/Alloy/views.als
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
module examples/systems/views
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Model of views in object-oriented programming.
|
||||||
|
*
|
||||||
|
* Two object references, called the view and the backing,
|
||||||
|
* are related by a view mechanism when changes to the
|
||||||
|
* backing are automatically propagated to the view. Note
|
||||||
|
* that the state of a view need not be a projection of the
|
||||||
|
* state of the backing; the keySet method of Map, for
|
||||||
|
* example, produces two view relationships, and for the
|
||||||
|
* one in which the map is modified by changes to the key
|
||||||
|
* set, the value of the new map cannot be determined from
|
||||||
|
* the key set. Note that in the iterator view mechanism,
|
||||||
|
* the iterator is by this definition the backing object,
|
||||||
|
* since changes are propagated from iterator to collection
|
||||||
|
* and not vice versa. Oddly, a reference may be a view of
|
||||||
|
* more than one backing: there can be two iterators on the
|
||||||
|
* same collection, eg. A reference cannot be a view under
|
||||||
|
* more than one view type.
|
||||||
|
*
|
||||||
|
* A reference is made dirty when it is a backing for a view
|
||||||
|
* with which it is no longer related by the view invariant.
|
||||||
|
* This usually happens when a view is modified, either
|
||||||
|
* directly or via another backing. For example, changing a
|
||||||
|
* collection directly when it has an iterator invalidates
|
||||||
|
* it, as does changing the collection through one iterator
|
||||||
|
* when there are others.
|
||||||
|
*
|
||||||
|
* More work is needed if we want to model more closely the
|
||||||
|
* failure of an iterator when its collection is invalidated.
|
||||||
|
*
|
||||||
|
* As a terminological convention, when there are two
|
||||||
|
* complementary view relationships, we will give them types
|
||||||
|
* t and t'. For example, KeySetView propagates from map to
|
||||||
|
* set, and KeySetView' propagates from set to map.
|
||||||
|
*
|
||||||
|
* author: Daniel Jackson
|
||||||
|
*/
|
||||||
|
|
||||||
|
open util/ordering[State] as so
|
||||||
|
open util/relation as rel
|
||||||
|
|
||||||
|
sig Ref {}
|
||||||
|
sig Object {}
|
||||||
|
|
||||||
|
-- t->b->v in views when v is view of type t of backing b
|
||||||
|
-- dirty contains refs that have been invalidated
|
||||||
|
sig State {
|
||||||
|
refs: set Ref,
|
||||||
|
obj: refs -> one Object,
|
||||||
|
views: ViewType -> refs -> refs,
|
||||||
|
dirty: set refs
|
||||||
|
-- , anyviews: Ref -> Ref -- for visualization
|
||||||
|
}
|
||||||
|
-- {anyviews = ViewType.views}
|
||||||
|
|
||||||
|
sig Map extends Object {
|
||||||
|
keys: set Ref,
|
||||||
|
map: keys -> one Ref
|
||||||
|
}{all s: State | keys + Ref.map in s.refs}
|
||||||
|
sig MapRef extends Ref {}
|
||||||
|
fact {State.obj[MapRef] in Map}
|
||||||
|
|
||||||
|
sig Iterator extends Object {
|
||||||
|
left, done: set Ref,
|
||||||
|
lastRef: lone done
|
||||||
|
}{all s: State | done + left + lastRef in s.refs}
|
||||||
|
sig IteratorRef extends Ref {}
|
||||||
|
fact {State.obj[IteratorRef] in Iterator}
|
||||||
|
|
||||||
|
sig Set extends Object {
|
||||||
|
elts: set Ref
|
||||||
|
}{all s: State | elts in s.refs}
|
||||||
|
sig SetRef extends Ref {}
|
||||||
|
fact {State.obj[SetRef] in Set}
|
||||||
|
|
||||||
|
abstract sig ViewType {}
|
||||||
|
one sig KeySetView, KeySetView', IteratorView extends ViewType {}
|
||||||
|
fact ViewTypes {
|
||||||
|
State.views[KeySetView] in MapRef -> SetRef
|
||||||
|
State.views[KeySetView'] in SetRef -> MapRef
|
||||||
|
State.views[IteratorView] in IteratorRef -> SetRef
|
||||||
|
all s: State | s.views[KeySetView] = ~(s.views[KeySetView'])
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mods is refs modified directly or by view mechanism
|
||||||
|
* doesn't handle possibility of modifying an object and its view at once?
|
||||||
|
* should we limit frame conds to non-dirty refs?
|
||||||
|
*/
|
||||||
|
pred modifies [pre, post: State, rs: set Ref] {
|
||||||
|
let vr = pre.views[ViewType], mods = rs.*vr {
|
||||||
|
all r: pre.refs - mods | pre.obj[r] = post.obj[r]
|
||||||
|
all b: mods, v: pre.refs, t: ViewType |
|
||||||
|
b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]
|
||||||
|
post.dirty = pre.dirty +
|
||||||
|
{b: pre.refs | some v: Ref, t: ViewType |
|
||||||
|
b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pred allocates [pre, post: State, rs: set Ref] {
|
||||||
|
no rs & pre.refs
|
||||||
|
post.refs = pre.refs + rs
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* models frame condition that limits change to view object from v to v' when backing object changes to b'
|
||||||
|
*/
|
||||||
|
pred viewFrame [t: ViewType, v, v', b': Object] {
|
||||||
|
t in KeySetView => v'.elts = dom [b'.map]
|
||||||
|
t in KeySetView' => b'.elts = dom [v'.map]
|
||||||
|
t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map)
|
||||||
|
t in IteratorView => v'.elts = b'.left + b'.done
|
||||||
|
}
|
||||||
|
|
||||||
|
pred MapRef.keySet [pre, post: State, setRefs: SetRef] {
|
||||||
|
post.obj[setRefs].elts = dom [pre.obj[this].map]
|
||||||
|
modifies [pre, post, none]
|
||||||
|
allocates [pre, post, setRefs]
|
||||||
|
post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this
|
||||||
|
}
|
||||||
|
|
||||||
|
pred MapRef.put [pre, post: State, k, v: Ref] {
|
||||||
|
post.obj[this].map = pre.obj[this].map ++ k->v
|
||||||
|
modifies [pre, post, this]
|
||||||
|
allocates [pre, post, none]
|
||||||
|
post.views = pre.views
|
||||||
|
}
|
||||||
|
|
||||||
|
pred SetRef.iterator [pre, post: State, iterRef: IteratorRef] {
|
||||||
|
let i = post.obj[iterRef] {
|
||||||
|
i.left = pre.obj[this].elts
|
||||||
|
no i.done + i.lastRef
|
||||||
|
}
|
||||||
|
modifies [pre,post,none]
|
||||||
|
allocates [pre, post, iterRef]
|
||||||
|
post.views = pre.views + IteratorView->iterRef->this
|
||||||
|
}
|
||||||
|
|
||||||
|
pred IteratorRef.remove [pre, post: State] {
|
||||||
|
let i = pre.obj[this], i' = post.obj[this] {
|
||||||
|
i'.left = i.left
|
||||||
|
i'.done = i.done - i.lastRef
|
||||||
|
no i'.lastRef
|
||||||
|
}
|
||||||
|
modifies [pre,post,this]
|
||||||
|
allocates [pre, post, none]
|
||||||
|
pre.views = post.views
|
||||||
|
}
|
||||||
|
|
||||||
|
pred IteratorRef.next [pre, post: State, ref: Ref] {
|
||||||
|
let i = pre.obj[this], i' = post.obj[this] {
|
||||||
|
ref in i.left
|
||||||
|
i'.left = i.left - ref
|
||||||
|
i'.done = i.done + ref
|
||||||
|
i'.lastRef = ref
|
||||||
|
}
|
||||||
|
modifies [pre, post, this]
|
||||||
|
allocates [pre, post, none]
|
||||||
|
pre.views = post.views
|
||||||
|
}
|
||||||
|
|
||||||
|
pred IteratorRef.hasNext [s: State] {
|
||||||
|
some s.obj[this].left
|
||||||
|
}
|
||||||
|
|
||||||
|
assert zippishOK {
|
||||||
|
all
|
||||||
|
ks, vs: SetRef,
|
||||||
|
m: MapRef,
|
||||||
|
ki, vi: IteratorRef,
|
||||||
|
k, v: Ref |
|
||||||
|
let s0=so/first,
|
||||||
|
s1=so/next[s0],
|
||||||
|
s2=so/next[s1],
|
||||||
|
s3=so/next[s2],
|
||||||
|
s4=so/next[s3],
|
||||||
|
s5=so/next[s4],
|
||||||
|
s6=so/next[s5],
|
||||||
|
s7=so/next[s6] |
|
||||||
|
({
|
||||||
|
precondition [s0, ks, vs, m]
|
||||||
|
no s0.dirty
|
||||||
|
ks.iterator [s0, s1, ki]
|
||||||
|
vs.iterator [s1, s2, vi]
|
||||||
|
ki.hasNext [s2]
|
||||||
|
vi.hasNext [s2]
|
||||||
|
ki.this/next [s2, s3, k]
|
||||||
|
vi.this/next [s3, s4, v]
|
||||||
|
m.put [s4, s5, k, v]
|
||||||
|
ki.remove [s5, s6]
|
||||||
|
vi.remove [s6, s7]
|
||||||
|
} => no State.dirty)
|
||||||
|
}
|
||||||
|
|
||||||
|
pred precondition [pre: State, ks, vs, m: Ref] {
|
||||||
|
// all these conditions and other errors discovered in scope of 6 but 8,3
|
||||||
|
// in initial state, must have view invariants hold
|
||||||
|
(all t: ViewType, b, v: pre.refs |
|
||||||
|
b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]])
|
||||||
|
// sets are not aliases
|
||||||
|
-- ks != vs
|
||||||
|
// sets are not views of map
|
||||||
|
-- no (ks+vs)->m & ViewType.pre.views
|
||||||
|
// no iterator currently on either set
|
||||||
|
-- no Ref->(ks+vs) & ViewType.pre.views
|
||||||
|
}
|
||||||
|
|
||||||
|
check zippishOK for 6 but 8 State, 3 ViewType expect 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* experiment with controlling heap size
|
||||||
|
*/
|
||||||
|
fact {all s: State | #s.obj < 5}
|
||||||
110
samples/Ant Build System/filenames/ant.xml
Normal file
110
samples/Ant Build System/filenames/ant.xml
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<project name="WebBuild">
|
||||||
|
|
||||||
|
<!-- generate timestamps -->
|
||||||
|
<tstamp />
|
||||||
|
|
||||||
|
<!-- Debugging Macro -->
|
||||||
|
<import file="echopath.xml" />
|
||||||
|
|
||||||
|
<!-- JS build files macro -->
|
||||||
|
<import file="rhinoscript.xml" />
|
||||||
|
|
||||||
|
<!-- Component Build Files -->
|
||||||
|
<import file="setup.xml" />
|
||||||
|
<import file="clean.xml" />
|
||||||
|
<import file="copy.xml" />
|
||||||
|
<import file="file.transform.xml" />
|
||||||
|
<import file="external.tools.xml" />
|
||||||
|
<import file="rename.xml" />
|
||||||
|
<import file="js.xml" />
|
||||||
|
<import file="css.xml" />
|
||||||
|
<import file="img.xml" />
|
||||||
|
<import file="png8.xml" />
|
||||||
|
<import file="yui.xml" />
|
||||||
|
<import file="cdn.xml" />
|
||||||
|
<import file="datauri.xml" />
|
||||||
|
<import file="devlive.xml" />
|
||||||
|
|
||||||
|
<!-- This dirname is the only complete path we know for sure, everything builds off of it -->
|
||||||
|
<dirname property="dir.build" file="${ant.file.WebBuild}" />
|
||||||
|
|
||||||
|
<!-- get name for newly built folder -->
|
||||||
|
<basename property="app.name" file="${basedir}" />
|
||||||
|
|
||||||
|
<!-- read global properties file -->
|
||||||
|
<property file="${dir.build}\build.properties" />
|
||||||
|
|
||||||
|
<!-- Build Directories -->
|
||||||
|
<property name="dir.build.js" location="${dir.build}/js" />
|
||||||
|
|
||||||
|
<!-- App Directories -->
|
||||||
|
<property name="dir.app" location="${dir.result}/${app.name}" />
|
||||||
|
<property name="dir.app.temp" location="${dir.temp}/${app.name}" />
|
||||||
|
<property name="dir.app.files" location="${dir.app.temp}/${dir.files}" />
|
||||||
|
|
||||||
|
<!-- Files -->
|
||||||
|
<property name="mapping.js" location="${dir.app.temp}/${mapping.file.js}" />
|
||||||
|
<property name="mapping.css" location="${dir.app.temp}/${mapping.file.css}" />
|
||||||
|
<property name="mapping.img" location="${dir.app.temp}/${mapping.file.img}" />
|
||||||
|
<property name="mapping.swf" location="${dir.app.temp}/${mapping.file.swf}" />
|
||||||
|
<property name="mapping.fonts" location="${dir.app.temp}/${mapping.file.fonts}" />
|
||||||
|
|
||||||
|
<!-- Tool Directories -->
|
||||||
|
<property name="dir.bin" location="${dir.build}/Bin" />
|
||||||
|
<property name="dir.jar" location="${dir.bin}/jar" />
|
||||||
|
|
||||||
|
<!-- Tool Files -->
|
||||||
|
<property name="tools.compressor" location="${dir.jar}/${tools.file.compressor}" />
|
||||||
|
<property name="tools.cssembed" location="${dir.jar}/${tools.file.cssembed}" />
|
||||||
|
<property name="tools.filetransform" location="${dir.jar}/${tools.file.filetransform}" />
|
||||||
|
<property name="tools.optipng" location="${dir.bin}/${tools.file.optipng}" />
|
||||||
|
<property name="tools.jpegtran" location="${dir.bin}/${tools.file.jpegtran}" />
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BUILD TARGETS -->
|
||||||
|
|
||||||
|
<!-- low level utility build targets -->
|
||||||
|
|
||||||
|
<!-- Build the tools -->
|
||||||
|
<target name="-setup.build.tools"
|
||||||
|
depends="-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- set up filesystem properties -->
|
||||||
|
<target
|
||||||
|
name="-setup"
|
||||||
|
depends="-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- utility-ish targets -->
|
||||||
|
<target name="copy" depends="clean, tools, -copy" />
|
||||||
|
<target name="tools" depends="-setup.build.tools" />
|
||||||
|
<target name="finalize" depends="copy, -finalize" />
|
||||||
|
<target name="-prepare" depends="copy, -setup" />
|
||||||
|
|
||||||
|
<!-- individual component build targets (empty descriptions are to make sure they show in "ant -p") -->
|
||||||
|
<target name="devlive" depends="-prepare, -devlive" description="" />
|
||||||
|
<target name="js" depends="-prepare, -js" description="" />
|
||||||
|
<target name="css" depends="-prepare, -css" description="" />
|
||||||
|
<target name="rename" depends="-prepare, -rename" description="" />
|
||||||
|
<target name="yui" depends="-prepare, rename, -yui" description="" />
|
||||||
|
<target name="cdn" depends="-prepare, -cdn" description="" />
|
||||||
|
|
||||||
|
<!-- high level build targets (Excluding of images is on purpose here, it's slow) -->
|
||||||
|
<target name="core"
|
||||||
|
depends="devlive, js, css, cdn, rename, yui, -js.inline"
|
||||||
|
description="Core build work"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<target name="prod"
|
||||||
|
depends="core, finalize"
|
||||||
|
description="Full Production Build"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- debug target -->
|
||||||
|
<target name="debug" depends="-setup">
|
||||||
|
<echoproperties/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
||||||
1
samples/Ant Build System/filenames/build.xml
Symbolic link
1
samples/Ant Build System/filenames/build.xml
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
ant.xml
|
||||||
41
samples/AspectJ/CacheAspect.aj
Normal file
41
samples/AspectJ/CacheAspect.aj
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
package com.blogspot.miguelinlas3.aspectj.cache;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
|
||||||
|
import com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This simple aspect simulates the behaviour of a very simple cache
|
||||||
|
*
|
||||||
|
* @author migue
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public aspect CacheAspect {
|
||||||
|
|
||||||
|
public pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable);
|
||||||
|
|
||||||
|
Object around(Cachable cachable): cache(cachable){
|
||||||
|
|
||||||
|
String evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint);
|
||||||
|
|
||||||
|
if(cache.containsKey(evaluatedKey)){
|
||||||
|
System.out.println("Cache hit for key " + evaluatedKey);
|
||||||
|
return this.cache.get(evaluatedKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Cache miss for key " + evaluatedKey);
|
||||||
|
Object value = proceed(cachable);
|
||||||
|
cache.put(evaluatedKey, value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String evaluateKey(String key, JoinPoint joinPoint) {
|
||||||
|
// TODO add some smart staff to allow simple scripting in @Cachable annotation
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<String, Object> cache = new WeakHashMap<String, Object>();
|
||||||
|
}
|
||||||
50
samples/AspectJ/OptimizeRecursionCache.aj
Normal file
50
samples/AspectJ/OptimizeRecursionCache.aj
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package aspects.caching;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache aspect for optimize recursive functions.
|
||||||
|
*
|
||||||
|
* @author Migueli
|
||||||
|
* @date 05/11/2013
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract aspect OptimizeRecursionCache {
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private Map _cache;
|
||||||
|
|
||||||
|
public OptimizeRecursionCache() {
|
||||||
|
_cache = getCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
abstract public Map getCache();
|
||||||
|
|
||||||
|
abstract public pointcut operation(Object o);
|
||||||
|
|
||||||
|
pointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object));
|
||||||
|
|
||||||
|
before(Object o) : topLevelOperation(o) {
|
||||||
|
System.out.println("Seeking value for " + o);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object around(Object o) : operation(o) {
|
||||||
|
Object cachedValue = _cache.get(o);
|
||||||
|
if (cachedValue != null) {
|
||||||
|
System.out.println("Found cached value for " + o + ": " + cachedValue);
|
||||||
|
return cachedValue;
|
||||||
|
}
|
||||||
|
return proceed(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
after(Object o) returning(Object result) : topLevelOperation(o) {
|
||||||
|
_cache.put(o, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
after(Object o) returning(Object result) : topLevelOperation(o) {
|
||||||
|
System.out.println("cache size: " + _cache.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
66
samples/Assembly/External Interrupt.a51
Normal file
66
samples/Assembly/External Interrupt.a51
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
ORG 0000h
|
||||||
|
SJMP START
|
||||||
|
ORG 0003h
|
||||||
|
LCALL INT0_ISR
|
||||||
|
RETI
|
||||||
|
ORG 000Bh
|
||||||
|
LCALL T0_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0013h
|
||||||
|
LCALL INT1_ISR
|
||||||
|
RETI
|
||||||
|
ORG 001Bh
|
||||||
|
LCALL T1_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0023h
|
||||||
|
LCALL UART_ISR
|
||||||
|
RETI
|
||||||
|
ORG 0030h
|
||||||
|
START:
|
||||||
|
MOV A,#11111110b
|
||||||
|
SETB IT0 ; Set External Interrupt 0 to be falling edge triggered
|
||||||
|
SETB EX0 ; Enable External Interrut 0
|
||||||
|
SETB EA ; Enable Interrupt
|
||||||
|
LEFT:
|
||||||
|
CJNE A,#01111111b,LOOP1
|
||||||
|
JMP RIGHT
|
||||||
|
LOOP1:
|
||||||
|
MOV P1,A
|
||||||
|
RL A
|
||||||
|
LCALL DELAY
|
||||||
|
SJMP LEFT
|
||||||
|
RIGHT:
|
||||||
|
CJNE A,#11111110b,LOOP2
|
||||||
|
JMP LEFT
|
||||||
|
LOOP2:
|
||||||
|
MOV P1,A
|
||||||
|
RR A
|
||||||
|
LCALL DELAY
|
||||||
|
SJMP RIGHT
|
||||||
|
|
||||||
|
INT0_ISR:
|
||||||
|
MOV R1,#3
|
||||||
|
FLASH:
|
||||||
|
MOV P1,#00h
|
||||||
|
LCALL DELAY
|
||||||
|
MOV P1,#0FFh
|
||||||
|
LCALL DELAY
|
||||||
|
DJNZ R1,FLASH
|
||||||
|
RET
|
||||||
|
T0_ISR:
|
||||||
|
RET
|
||||||
|
INT1_ISR:
|
||||||
|
RET
|
||||||
|
T1_ISR:
|
||||||
|
RET
|
||||||
|
UART_ISR:
|
||||||
|
RET
|
||||||
|
|
||||||
|
DELAY: MOV R5,#20 ;R5*20 mS
|
||||||
|
D1: MOV R6,#40
|
||||||
|
D2: MOV R7,#249
|
||||||
|
DJNZ R7,$
|
||||||
|
DJNZ R6,D2
|
||||||
|
DJNZ R5,D1
|
||||||
|
RET
|
||||||
|
END
|
||||||
350
samples/Assembly/FASM.asm
Normal file
350
samples/Assembly/FASM.asm
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
|
||||||
|
; flat assembler interface for Win32
|
||||||
|
; Copyright (c) 1999-2014, Tomasz Grysztar.
|
||||||
|
; All rights reserved.
|
||||||
|
|
||||||
|
format PE console
|
||||||
|
|
||||||
|
section '.text' code readable executable
|
||||||
|
|
||||||
|
start:
|
||||||
|
|
||||||
|
mov [con_handle],STD_OUTPUT_HANDLE
|
||||||
|
mov esi,_logo
|
||||||
|
call display_string
|
||||||
|
|
||||||
|
call get_params
|
||||||
|
jc information
|
||||||
|
|
||||||
|
call init_memory
|
||||||
|
|
||||||
|
mov esi,_memory_prefix
|
||||||
|
call display_string
|
||||||
|
mov eax,[memory_end]
|
||||||
|
sub eax,[memory_start]
|
||||||
|
add eax,[additional_memory_end]
|
||||||
|
sub eax,[additional_memory]
|
||||||
|
shr eax,10
|
||||||
|
call display_number
|
||||||
|
mov esi,_memory_suffix
|
||||||
|
call display_string
|
||||||
|
|
||||||
|
call [GetTickCount]
|
||||||
|
mov [start_time],eax
|
||||||
|
|
||||||
|
call preprocessor
|
||||||
|
call parser
|
||||||
|
call assembler
|
||||||
|
call formatter
|
||||||
|
|
||||||
|
call display_user_messages
|
||||||
|
movzx eax,[current_pass]
|
||||||
|
inc eax
|
||||||
|
call display_number
|
||||||
|
mov esi,_passes_suffix
|
||||||
|
call display_string
|
||||||
|
call [GetTickCount]
|
||||||
|
sub eax,[start_time]
|
||||||
|
xor edx,edx
|
||||||
|
mov ebx,100
|
||||||
|
div ebx
|
||||||
|
or eax,eax
|
||||||
|
jz display_bytes_count
|
||||||
|
xor edx,edx
|
||||||
|
mov ebx,10
|
||||||
|
div ebx
|
||||||
|
push edx
|
||||||
|
call display_number
|
||||||
|
mov dl,'.'
|
||||||
|
call display_character
|
||||||
|
pop eax
|
||||||
|
call display_number
|
||||||
|
mov esi,_seconds_suffix
|
||||||
|
call display_string
|
||||||
|
display_bytes_count:
|
||||||
|
mov eax,[written_size]
|
||||||
|
call display_number
|
||||||
|
mov esi,_bytes_suffix
|
||||||
|
call display_string
|
||||||
|
xor al,al
|
||||||
|
jmp exit_program
|
||||||
|
|
||||||
|
information:
|
||||||
|
mov esi,_usage
|
||||||
|
call display_string
|
||||||
|
mov al,1
|
||||||
|
jmp exit_program
|
||||||
|
|
||||||
|
get_params:
|
||||||
|
mov [input_file],0
|
||||||
|
mov [output_file],0
|
||||||
|
mov [symbols_file],0
|
||||||
|
mov [memory_setting],0
|
||||||
|
mov [passes_limit],100
|
||||||
|
call [GetCommandLine]
|
||||||
|
mov esi,eax
|
||||||
|
mov edi,params
|
||||||
|
find_command_start:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je find_command_start
|
||||||
|
cmp al,22h
|
||||||
|
je skip_quoted_name
|
||||||
|
skip_name:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je find_param
|
||||||
|
or al,al
|
||||||
|
jz all_params
|
||||||
|
jmp skip_name
|
||||||
|
skip_quoted_name:
|
||||||
|
lodsb
|
||||||
|
cmp al,22h
|
||||||
|
je find_param
|
||||||
|
or al,al
|
||||||
|
jz all_params
|
||||||
|
jmp skip_quoted_name
|
||||||
|
find_param:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je find_param
|
||||||
|
cmp al,'-'
|
||||||
|
je option_param
|
||||||
|
cmp al,0Dh
|
||||||
|
je all_params
|
||||||
|
or al,al
|
||||||
|
jz all_params
|
||||||
|
cmp [input_file],0
|
||||||
|
jne get_output_file
|
||||||
|
mov [input_file],edi
|
||||||
|
jmp process_param
|
||||||
|
get_output_file:
|
||||||
|
cmp [output_file],0
|
||||||
|
jne bad_params
|
||||||
|
mov [output_file],edi
|
||||||
|
process_param:
|
||||||
|
cmp al,22h
|
||||||
|
je string_param
|
||||||
|
copy_param:
|
||||||
|
stosb
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je param_end
|
||||||
|
cmp al,0Dh
|
||||||
|
je param_end
|
||||||
|
or al,al
|
||||||
|
jz param_end
|
||||||
|
jmp copy_param
|
||||||
|
string_param:
|
||||||
|
lodsb
|
||||||
|
cmp al,22h
|
||||||
|
je string_param_end
|
||||||
|
cmp al,0Dh
|
||||||
|
je param_end
|
||||||
|
or al,al
|
||||||
|
jz param_end
|
||||||
|
stosb
|
||||||
|
jmp string_param
|
||||||
|
option_param:
|
||||||
|
lodsb
|
||||||
|
cmp al,'m'
|
||||||
|
je memory_option
|
||||||
|
cmp al,'M'
|
||||||
|
je memory_option
|
||||||
|
cmp al,'p'
|
||||||
|
je passes_option
|
||||||
|
cmp al,'P'
|
||||||
|
je passes_option
|
||||||
|
cmp al,'s'
|
||||||
|
je symbols_option
|
||||||
|
cmp al,'S'
|
||||||
|
je symbols_option
|
||||||
|
bad_params:
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
get_option_value:
|
||||||
|
xor eax,eax
|
||||||
|
mov edx,eax
|
||||||
|
get_option_digit:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je option_value_ok
|
||||||
|
cmp al,0Dh
|
||||||
|
je option_value_ok
|
||||||
|
or al,al
|
||||||
|
jz option_value_ok
|
||||||
|
sub al,30h
|
||||||
|
jc invalid_option_value
|
||||||
|
cmp al,9
|
||||||
|
ja invalid_option_value
|
||||||
|
imul edx,10
|
||||||
|
jo invalid_option_value
|
||||||
|
add edx,eax
|
||||||
|
jc invalid_option_value
|
||||||
|
jmp get_option_digit
|
||||||
|
option_value_ok:
|
||||||
|
dec esi
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
invalid_option_value:
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
memory_option:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je memory_option
|
||||||
|
cmp al,0Dh
|
||||||
|
je bad_params
|
||||||
|
or al,al
|
||||||
|
jz bad_params
|
||||||
|
dec esi
|
||||||
|
call get_option_value
|
||||||
|
or edx,edx
|
||||||
|
jz bad_params
|
||||||
|
cmp edx,1 shl (32-10)
|
||||||
|
jae bad_params
|
||||||
|
mov [memory_setting],edx
|
||||||
|
jmp find_param
|
||||||
|
passes_option:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
je passes_option
|
||||||
|
cmp al,0Dh
|
||||||
|
je bad_params
|
||||||
|
or al,al
|
||||||
|
jz bad_params
|
||||||
|
dec esi
|
||||||
|
call get_option_value
|
||||||
|
or edx,edx
|
||||||
|
jz bad_params
|
||||||
|
cmp edx,10000h
|
||||||
|
ja bad_params
|
||||||
|
mov [passes_limit],dx
|
||||||
|
jmp find_param
|
||||||
|
symbols_option:
|
||||||
|
mov [symbols_file],edi
|
||||||
|
find_symbols_file_name:
|
||||||
|
lodsb
|
||||||
|
cmp al,20h
|
||||||
|
jne process_param
|
||||||
|
jmp find_symbols_file_name
|
||||||
|
param_end:
|
||||||
|
dec esi
|
||||||
|
string_param_end:
|
||||||
|
xor al,al
|
||||||
|
stosb
|
||||||
|
jmp find_param
|
||||||
|
all_params:
|
||||||
|
cmp [input_file],0
|
||||||
|
je bad_params
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
|
||||||
|
include 'system.inc'
|
||||||
|
|
||||||
|
include '..\errors.inc'
|
||||||
|
include '..\symbdump.inc'
|
||||||
|
include '..\preproce.inc'
|
||||||
|
include '..\parser.inc'
|
||||||
|
include '..\exprpars.inc'
|
||||||
|
include '..\assemble.inc'
|
||||||
|
include '..\exprcalc.inc'
|
||||||
|
include '..\formats.inc'
|
||||||
|
include '..\x86_64.inc'
|
||||||
|
include '..\avx.inc'
|
||||||
|
|
||||||
|
include '..\tables.inc'
|
||||||
|
include '..\messages.inc'
|
||||||
|
|
||||||
|
section '.data' data readable writeable
|
||||||
|
|
||||||
|
include '..\version.inc'
|
||||||
|
|
||||||
|
_copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0
|
||||||
|
|
||||||
|
_logo db 'flat assembler version ',VERSION_STRING,0
|
||||||
|
_usage db 0Dh,0Ah
|
||||||
|
db 'usage: fasm <source> [output]',0Dh,0Ah
|
||||||
|
db 'optional settings:',0Dh,0Ah
|
||||||
|
db ' -m <limit> set the limit in kilobytes for the available memory',0Dh,0Ah
|
||||||
|
db ' -p <limit> set the maximum allowed number of passes',0Dh,0Ah
|
||||||
|
db ' -s <file> dump symbolic information for debugging',0Dh,0Ah
|
||||||
|
db 0
|
||||||
|
_memory_prefix db ' (',0
|
||||||
|
_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0
|
||||||
|
_passes_suffix db ' passes, ',0
|
||||||
|
_seconds_suffix db ' seconds, ',0
|
||||||
|
_bytes_suffix db ' bytes.',0Dh,0Ah,0
|
||||||
|
|
||||||
|
align 4
|
||||||
|
|
||||||
|
include '..\variable.inc'
|
||||||
|
|
||||||
|
con_handle dd ?
|
||||||
|
memory_setting dd ?
|
||||||
|
start_time dd ?
|
||||||
|
bytes_count dd ?
|
||||||
|
displayed_count dd ?
|
||||||
|
character db ?
|
||||||
|
last_displayed rb 2
|
||||||
|
|
||||||
|
params rb 1000h
|
||||||
|
options rb 1000h
|
||||||
|
buffer rb 4000h
|
||||||
|
|
||||||
|
stack 10000h
|
||||||
|
|
||||||
|
section '.idata' import data readable writeable
|
||||||
|
|
||||||
|
dd 0,0,0,rva kernel_name,rva kernel_table
|
||||||
|
dd 0,0,0,0,0
|
||||||
|
|
||||||
|
kernel_table:
|
||||||
|
ExitProcess dd rva _ExitProcess
|
||||||
|
CreateFile dd rva _CreateFileA
|
||||||
|
ReadFile dd rva _ReadFile
|
||||||
|
WriteFile dd rva _WriteFile
|
||||||
|
CloseHandle dd rva _CloseHandle
|
||||||
|
SetFilePointer dd rva _SetFilePointer
|
||||||
|
GetCommandLine dd rva _GetCommandLineA
|
||||||
|
GetEnvironmentVariable dd rva _GetEnvironmentVariable
|
||||||
|
GetStdHandle dd rva _GetStdHandle
|
||||||
|
VirtualAlloc dd rva _VirtualAlloc
|
||||||
|
VirtualFree dd rva _VirtualFree
|
||||||
|
GetTickCount dd rva _GetTickCount
|
||||||
|
GetSystemTime dd rva _GetSystemTime
|
||||||
|
GlobalMemoryStatus dd rva _GlobalMemoryStatus
|
||||||
|
dd 0
|
||||||
|
|
||||||
|
kernel_name db 'KERNEL32.DLL',0
|
||||||
|
|
||||||
|
_ExitProcess dw 0
|
||||||
|
db 'ExitProcess',0
|
||||||
|
_CreateFileA dw 0
|
||||||
|
db 'CreateFileA',0
|
||||||
|
_ReadFile dw 0
|
||||||
|
db 'ReadFile',0
|
||||||
|
_WriteFile dw 0
|
||||||
|
db 'WriteFile',0
|
||||||
|
_CloseHandle dw 0
|
||||||
|
db 'CloseHandle',0
|
||||||
|
_SetFilePointer dw 0
|
||||||
|
db 'SetFilePointer',0
|
||||||
|
_GetCommandLineA dw 0
|
||||||
|
db 'GetCommandLineA',0
|
||||||
|
_GetEnvironmentVariable dw 0
|
||||||
|
db 'GetEnvironmentVariableA',0
|
||||||
|
_GetStdHandle dw 0
|
||||||
|
db 'GetStdHandle',0
|
||||||
|
_VirtualAlloc dw 0
|
||||||
|
db 'VirtualAlloc',0
|
||||||
|
_VirtualFree dw 0
|
||||||
|
db 'VirtualFree',0
|
||||||
|
_GetTickCount dw 0
|
||||||
|
db 'GetTickCount',0
|
||||||
|
_GetSystemTime dw 0
|
||||||
|
db 'GetSystemTime',0
|
||||||
|
_GlobalMemoryStatus dw 0
|
||||||
|
db 'GlobalMemoryStatus',0
|
||||||
|
|
||||||
|
section '.reloc' fixups data readable discardable
|
||||||
2841
samples/Assembly/forth.nasm
Normal file
2841
samples/Assembly/forth.nasm
Normal file
File diff suppressed because it is too large
Load Diff
25
samples/BitBake/gstreamer-libav.bb
Normal file
25
samples/BitBake/gstreamer-libav.bb
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
include gstreamer1.0-libav.inc
|
||||||
|
|
||||||
|
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||||
|
file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \
|
||||||
|
file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \
|
||||||
|
file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \
|
||||||
|
file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02"
|
||||||
|
|
||||||
|
SRC_URI = " \
|
||||||
|
http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \
|
||||||
|
file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \
|
||||||
|
"
|
||||||
|
SRC_URI[md5sum] = "86540dee14d31daf976eb2713f2294f3"
|
||||||
|
SRC_URI[sha256sum] = "585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418"
|
||||||
|
|
||||||
|
LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \
|
||||||
|
--cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \
|
||||||
|
--ranlib='${RANLIB}' \
|
||||||
|
${GSTREAMER_1_0_DEBUG}"
|
||||||
|
|
||||||
|
S = "${WORKDIR}/gst-libav-${PV}"
|
||||||
|
|
||||||
13
samples/BitBake/qtbase-native.bb
Normal file
13
samples/BitBake/qtbase-native.bb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
require qt5-git.inc
|
||||||
|
require ${PN}.inc
|
||||||
|
|
||||||
|
do_install_append() {
|
||||||
|
# for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt)
|
||||||
|
# e.g. qt3d, qtwayland
|
||||||
|
ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_MODULE_BRANCH = "release"
|
||||||
|
# v5.2.1 + 168 commits
|
||||||
|
SRCREV = "08cbbde61778276ccdda73d89fd64d02c623779f"
|
||||||
|
|
||||||
25
samples/BlitzMax/sample.bmx
Normal file
25
samples/BlitzMax/sample.bmx
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
SuperStrict
|
||||||
|
|
||||||
|
Framework Brl.StandardIO
|
||||||
|
|
||||||
|
Type TMyType
|
||||||
|
Field property:int
|
||||||
|
|
||||||
|
Function A:int(param:int)
|
||||||
|
'do nothing
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Method B:int(param:int)
|
||||||
|
'do nothing
|
||||||
|
End Method
|
||||||
|
End Type
|
||||||
|
|
||||||
|
|
||||||
|
Global my:TMyType = new TMyType
|
||||||
|
?Win32
|
||||||
|
my.A()
|
||||||
|
my.B()
|
||||||
|
?Linux
|
||||||
|
my.B()
|
||||||
|
my.A()
|
||||||
|
?
|
||||||
13
samples/Brainfuck/fib100.bf
Normal file
13
samples/Brainfuck/fib100.bf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Calculate and output all fibonacci numbers under 100
|
||||||
|
|
||||||
|
+++++++++++
|
||||||
|
>+>>>>++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
|
||||||
|
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
|
||||||
|
<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
|
||||||
|
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
|
||||||
|
>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
|
||||||
|
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
|
||||||
|
++++++++++++++++++++++++++++++++++++++++++++.[-]<<
|
||||||
|
<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
|
||||||
|
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
|
||||||
4
samples/Brainfuck/hello.bf
Normal file
4
samples/Brainfuck/hello.bf
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// More complex version of hello world
|
||||||
|
|
||||||
|
>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>
|
||||||
|
>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++.
|
||||||
3
samples/Brainfuck/helloworld.bf
Normal file
3
samples/Brainfuck/helloworld.bf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
// Hello World
|
||||||
|
|
||||||
|
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
|
||||||
30
samples/Brainfuck/rot13.bf
Normal file
30
samples/Brainfuck/rot13.bf
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# ROT13 cipher
|
||||||
|
|
||||||
|
-,+[ Read first character and start outer character reading loop
|
||||||
|
-[ Skip forward if character is 0
|
||||||
|
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||||
|
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||||
|
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||||
|
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||||
|
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||||
|
<<<<<- Decrement dividend
|
||||||
|
] End division loop
|
||||||
|
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||||
|
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||||
|
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||||
|
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||||
|
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||||
|
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||||
|
<<<<<- Decrease dividend
|
||||||
|
] End division loop
|
||||||
|
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||||
|
>[ Skip forward if quotient was 0
|
||||||
|
-[ Decrement quotient and skip forward if quotient was 1
|
||||||
|
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||||
|
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||||
|
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||||
|
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||||
|
<[-] Clear remainder from first division if second division was skipped
|
||||||
|
<.[-] Output ROT13ed character from copy and clear it
|
||||||
|
<-,+ Read next character
|
||||||
|
] End character reading loop
|
||||||
26
samples/C#/AssemblyInfo.cs
Normal file
26
samples/C#/AssemblyInfo.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following attributes.
|
||||||
|
// Change them to the values specific to your project.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("Simple")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||||
|
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||||
|
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
// The following attributes are used to specify the signing key for the assembly,
|
||||||
|
// if desired. See the Mono documentation for more information about signing.
|
||||||
|
|
||||||
|
//[assembly: AssemblyDelaySign(false)]
|
||||||
|
//[assembly: AssemblyKeyFile("")]
|
||||||
20
samples/C#/BsonPropertyValue.cs
Normal file
20
samples/C#/BsonPropertyValue.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MongoDB.Serialization.Descriptors
|
||||||
|
{
|
||||||
|
internal class BsonPropertyValue
|
||||||
|
{
|
||||||
|
public bool IsDictionary { get; private set; }
|
||||||
|
|
||||||
|
public Type Type { get; private set; }
|
||||||
|
|
||||||
|
public object Value { get; private set; }
|
||||||
|
|
||||||
|
public BsonPropertyValue(Type type, object value, bool isDictionary)
|
||||||
|
{
|
||||||
|
Type = type;
|
||||||
|
Value = value;
|
||||||
|
IsDictionary = isDictionary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
153
samples/C#/MongoExpressionVisitor.cs
Normal file
153
samples/C#/MongoExpressionVisitor.cs
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace MongoDB.Linq.Expressions
|
||||||
|
{
|
||||||
|
internal class MongoExpressionVisitor : ExpressionVisitor
|
||||||
|
{
|
||||||
|
protected override Expression Visit(Expression exp)
|
||||||
|
{
|
||||||
|
if (exp == null)
|
||||||
|
return null;
|
||||||
|
switch ((MongoExpressionType)exp.NodeType)
|
||||||
|
{
|
||||||
|
case MongoExpressionType.Collection:
|
||||||
|
return VisitCollection((CollectionExpression)exp);
|
||||||
|
case MongoExpressionType.Field:
|
||||||
|
return VisitField((FieldExpression)exp);
|
||||||
|
case MongoExpressionType.Projection:
|
||||||
|
return VisitProjection((ProjectionExpression)exp);
|
||||||
|
case MongoExpressionType.Select:
|
||||||
|
return VisitSelect((SelectExpression)exp);
|
||||||
|
case MongoExpressionType.Aggregate:
|
||||||
|
return VisitAggregate((AggregateExpression)exp);
|
||||||
|
case MongoExpressionType.AggregateSubquery:
|
||||||
|
return VisitAggregateSubquery((AggregateSubqueryExpression)exp);
|
||||||
|
case MongoExpressionType.Scalar:
|
||||||
|
return VisitScalar((ScalarExpression)exp);
|
||||||
|
default:
|
||||||
|
return base.Visit(exp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitAggregate(AggregateExpression aggregate)
|
||||||
|
{
|
||||||
|
var exp = Visit(aggregate.Argument);
|
||||||
|
if (exp != aggregate.Argument)
|
||||||
|
return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct);
|
||||||
|
|
||||||
|
return aggregate;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery)
|
||||||
|
{
|
||||||
|
Expression e = Visit(aggregateSubquery.AggregateAsSubquery);
|
||||||
|
ScalarExpression subquery = (ScalarExpression)e;
|
||||||
|
if (subquery != aggregateSubquery.AggregateAsSubquery)
|
||||||
|
return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery);
|
||||||
|
return aggregateSubquery;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitCollection(CollectionExpression collection)
|
||||||
|
{
|
||||||
|
return collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitField(FieldExpression field)
|
||||||
|
{
|
||||||
|
var e = Visit(field.Expression);
|
||||||
|
if (field.Expression != e)
|
||||||
|
field = new FieldExpression(e, field.Alias, field.Name);
|
||||||
|
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitProjection(ProjectionExpression projection)
|
||||||
|
{
|
||||||
|
var source = (SelectExpression)Visit(projection.Source);
|
||||||
|
var projector = Visit(projection.Projector);
|
||||||
|
if (source != projection.Source || projector != projection.Projector)
|
||||||
|
return new ProjectionExpression(source, projector, projection.Aggregator);
|
||||||
|
return projection;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ReadOnlyCollection<OrderExpression> VisitOrderBy(ReadOnlyCollection<OrderExpression> orderBys)
|
||||||
|
{
|
||||||
|
if (orderBys != null)
|
||||||
|
{
|
||||||
|
List<OrderExpression> alternate = null;
|
||||||
|
for (int i = 0, n = orderBys.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
OrderExpression expr = orderBys[i];
|
||||||
|
Expression e = this.Visit(expr.Expression);
|
||||||
|
if (alternate == null && e != expr.Expression)
|
||||||
|
alternate = orderBys.Take(i).ToList();
|
||||||
|
if (alternate != null)
|
||||||
|
alternate.Add(new OrderExpression(expr.OrderType, e));
|
||||||
|
}
|
||||||
|
if (alternate != null)
|
||||||
|
return alternate.AsReadOnly();
|
||||||
|
}
|
||||||
|
return orderBys;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitScalar(ScalarExpression scalar)
|
||||||
|
{
|
||||||
|
SelectExpression select = (SelectExpression)Visit(scalar.Select);
|
||||||
|
if (select != scalar.Select)
|
||||||
|
return new ScalarExpression(scalar.Type, select);
|
||||||
|
return scalar;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSelect(SelectExpression select)
|
||||||
|
{
|
||||||
|
var from = VisitSource(select.From);
|
||||||
|
var where = Visit(select.Where);
|
||||||
|
var groupBy = Visit(select.GroupBy);
|
||||||
|
var orderBy = VisitOrderBy(select.OrderBy);
|
||||||
|
var skip = Visit(select.Skip);
|
||||||
|
var take = Visit(select.Take);
|
||||||
|
var fields = VisitFieldDeclarationList(select.Fields);
|
||||||
|
if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields)
|
||||||
|
return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take);
|
||||||
|
return select;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSource(Expression source)
|
||||||
|
{
|
||||||
|
return Visit(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Expression VisitSubquery(SubqueryExpression subquery)
|
||||||
|
{
|
||||||
|
switch ((MongoExpressionType)subquery.NodeType)
|
||||||
|
{
|
||||||
|
case MongoExpressionType.Scalar:
|
||||||
|
return VisitScalar((ScalarExpression)subquery);
|
||||||
|
}
|
||||||
|
return subquery;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual ReadOnlyCollection<FieldDeclaration> VisitFieldDeclarationList(ReadOnlyCollection<FieldDeclaration> fields)
|
||||||
|
{
|
||||||
|
if (fields == null)
|
||||||
|
return fields;
|
||||||
|
|
||||||
|
List<FieldDeclaration> alternate = null;
|
||||||
|
for (int i = 0, n = fields.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
var f = fields[i];
|
||||||
|
var e = Visit(f.Expression);
|
||||||
|
if (f.Expression != e && alternate == null)
|
||||||
|
alternate = fields.Take(i).ToList();
|
||||||
|
if (alternate != null)
|
||||||
|
alternate.Add(new FieldDeclaration(f.Name, e));
|
||||||
|
}
|
||||||
|
if (alternate != null)
|
||||||
|
return alternate.AsReadOnly();
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
86
samples/C++/16F88.h
Normal file
86
samples/C++/16F88.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of PIC
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* PIC is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PIC is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum PIC16F88Instruction
|
||||||
|
{
|
||||||
|
ADDWF,
|
||||||
|
ANDWF,
|
||||||
|
CLRF,
|
||||||
|
CLRW,
|
||||||
|
COMF,
|
||||||
|
DECF,
|
||||||
|
DECFSZ,
|
||||||
|
INCF,
|
||||||
|
INCFSZ,
|
||||||
|
IORWF,
|
||||||
|
MOVF,
|
||||||
|
MOVWF,
|
||||||
|
NOP,
|
||||||
|
RLF,
|
||||||
|
RRF,
|
||||||
|
SUBWF,
|
||||||
|
SWAPF,
|
||||||
|
XORWF,
|
||||||
|
BCF,
|
||||||
|
BSF,
|
||||||
|
BTFSC,
|
||||||
|
BTFSS,
|
||||||
|
ADDLW,
|
||||||
|
ANDLW,
|
||||||
|
CALL,
|
||||||
|
CLRWDT,
|
||||||
|
GOTO,
|
||||||
|
IORLW,
|
||||||
|
MOVLW,
|
||||||
|
RETFIE,
|
||||||
|
RETLW,
|
||||||
|
RETURN,
|
||||||
|
SLEEP,
|
||||||
|
SUBLW,
|
||||||
|
XORLW
|
||||||
|
};
|
||||||
|
|
||||||
|
class PIC16F88
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PIC16F88(ROM *ProgramMemory);
|
||||||
|
void Step();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t q;
|
||||||
|
bool nextIsNop, trapped;
|
||||||
|
Memory *memory;
|
||||||
|
ROM *program;
|
||||||
|
Stack<uint16_t, 8> *CallStack;
|
||||||
|
Register<uint16_t> *PC;
|
||||||
|
Register<> *WREG, *PCL, *STATUS, *PCLATCH;
|
||||||
|
PIC16F88Instruction inst;
|
||||||
|
uint16_t instrWord;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void DecodeInstruction();
|
||||||
|
void ProcessInstruction();
|
||||||
|
|
||||||
|
uint8_t GetBank();
|
||||||
|
uint8_t GetMemoryContents(uint8_t partialAddress);
|
||||||
|
void SetMemoryContents(uint8_t partialAddress, uint8_t newVal);
|
||||||
|
void CheckZero(uint8_t value);
|
||||||
|
void StoreValue(uint8_t value, bool updateZero);
|
||||||
|
uint8_t SetCarry(bool val);
|
||||||
|
uint16_t GetPCHFinalBits();
|
||||||
|
};
|
||||||
98
samples/C++/Entity.h
Normal file
98
samples/C++/Entity.h
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* @file Entity.h
|
||||||
|
* @page EntityPage Entity
|
||||||
|
* @brief represent an entity in the game
|
||||||
|
* @author vinz243
|
||||||
|
* @version 0.1.0
|
||||||
|
* This file represents an Entity in the game system
|
||||||
|
* This parent type is a static entity which is shown and loaded into the Physics engine but never updated
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ENTITY_H
|
||||||
|
#define ENTITY_H
|
||||||
|
|
||||||
|
#include "base.h"
|
||||||
|
/// @namespace Whitedrop
|
||||||
|
namespace Whitedrop {
|
||||||
|
/** @class Entity
|
||||||
|
* This parent type is a static entity which is shown and loaded into the Physics engine but never updated
|
||||||
|
*/
|
||||||
|
class Entity {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Create static entity
|
||||||
|
* @details creates a static entity instance according to the mesh and the id, the position
|
||||||
|
* This needs to be attached to a World after!
|
||||||
|
* The material name is not the file name but the material name!
|
||||||
|
* @ref WorldPage
|
||||||
|
* @param mesh the name of the mesh for the object, file must be in media/meshes
|
||||||
|
* @param id an unique identifier for the object, shortest as possible
|
||||||
|
* @param dimensions an Ogre::Vector3 which contains the dimensions in meter
|
||||||
|
* @param position the Vector3 which contains it position
|
||||||
|
* @param material the material name
|
||||||
|
*/
|
||||||
|
Entity(std::string mesh, std::string id, Ogre::Vector3 dimensions, Ogre::Vector3 position, std::string material);
|
||||||
|
/**
|
||||||
|
* @brief The copy constructor
|
||||||
|
* @details A copy constr
|
||||||
|
*
|
||||||
|
* @param ref the Entity to be copied from
|
||||||
|
*/
|
||||||
|
Entity(const Entity &ref);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The assignement operator
|
||||||
|
* @details
|
||||||
|
*
|
||||||
|
* @param ent the entity to be copied
|
||||||
|
*/
|
||||||
|
Entity& operator=(const Entity ent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief destrctor
|
||||||
|
* @details
|
||||||
|
*/
|
||||||
|
virtual ~Entity(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief a constance type of the entity
|
||||||
|
* @details depends of the class.
|
||||||
|
* May contain STATIC, DYNAMIC or ETHERAL
|
||||||
|
*/
|
||||||
|
const std::string type = "STATIC";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Attach the entity to specified sceneManager
|
||||||
|
* @details This creates the OgreEntity using sceneMgr,
|
||||||
|
* set material, create a Node with name as `<id>_n`,
|
||||||
|
* scale it to match dimensions and translate the node to pos
|
||||||
|
* @param sceneMgr the scene manager to use
|
||||||
|
*/
|
||||||
|
virtual void setup(Ogre::SceneManager* sceneMgr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief the update method
|
||||||
|
* @details this method should be called on each world update.
|
||||||
|
* Even though the method is necessary declared, the main impl of
|
||||||
|
* a static entity should be empty since it is not updated by physics
|
||||||
|
* However, a Dynamic entity should implement this function in order to:
|
||||||
|
* 1) Get from the physics engine the actor position in the physic world
|
||||||
|
* 2) Update the OgreEntity position and rotation from the previous actor
|
||||||
|
* @return whether it was successful or not, if falsey engine should stop
|
||||||
|
*/
|
||||||
|
virtual bool update(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string mMesh = "cube.mesh";
|
||||||
|
std::string mId;
|
||||||
|
std::string mMaterial;
|
||||||
|
Ogre::Vector3 mDimensions;
|
||||||
|
Ogre::Vector3 mPosition;
|
||||||
|
Ogre::Entity* mEntity;
|
||||||
|
Ogre::SceneNode* mNode;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
530
samples/C++/Math.inl
Normal file
530
samples/C++/Math.inl
Normal file
@@ -0,0 +1,530 @@
|
|||||||
|
/*
|
||||||
|
===========================================================================
|
||||||
|
The Open Game Libraries.
|
||||||
|
Copyright (C) 2007-2010 Lusito Software
|
||||||
|
|
||||||
|
Author: Santo Pfingsten (TTK-Bandit)
|
||||||
|
Purpose: Math namespace
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
===========================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OG_MATH_INL__
|
||||||
|
#define __OG_MATH_INL__
|
||||||
|
|
||||||
|
namespace og {
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
Math
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Abs
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::Abs( int i ) {
|
||||||
|
#if 1
|
||||||
|
if ( i & 0x80000000 )
|
||||||
|
return 0x80000000 - (i & MASK_SIGNED);
|
||||||
|
return i;
|
||||||
|
#else
|
||||||
|
int y = x >> 31;
|
||||||
|
return ( ( x ^ y ) - y );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Fabs
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Fabs( float f ) {
|
||||||
|
#if 1
|
||||||
|
uInt *pf = reinterpret_cast<uInt*>(&f);
|
||||||
|
*(pf) &= MASK_SIGNED;
|
||||||
|
return f;
|
||||||
|
#else
|
||||||
|
return fabsf( f );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Round
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Round( float f ) {
|
||||||
|
return floorf( f + 0.5f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Floor
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Floor( float f ) {
|
||||||
|
return floorf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Ceil
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Ceil( float f ) {
|
||||||
|
return ceilf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Ftoi
|
||||||
|
|
||||||
|
ok since this is SSE, why should the other ftoi be the faster one ?
|
||||||
|
and: we might need to add a check for SSE extensions..
|
||||||
|
because sse isn't *really* faster (I actually read that GCC does not handle
|
||||||
|
SSE extensions perfectly. I'll find the link and send it to you when you're online)
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::Ftoi( float f ) {
|
||||||
|
//! @todo needs testing
|
||||||
|
// note: sse function cvttss2si
|
||||||
|
#if OG_ASM_MSVC
|
||||||
|
int i;
|
||||||
|
#if defined(OG_FTOI_USE_SSE)
|
||||||
|
if( SysInfo::cpu.general.SSE ) {
|
||||||
|
__asm cvttss2si eax, f
|
||||||
|
__asm mov i, eax
|
||||||
|
return i;
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
__asm fld f
|
||||||
|
__asm fistp i
|
||||||
|
//__asm mov eax, i // do we need this ? O_o
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
#elif OG_ASM_GNU
|
||||||
|
int i;
|
||||||
|
#if defined(OG_FTOI_USE_SSE)
|
||||||
|
if( SysInfo::cpu.general.SSE ) {
|
||||||
|
__asm__ __volatile__( "cvttss2si %1 \n\t"
|
||||||
|
: "=m" (i)
|
||||||
|
: "m" (f)
|
||||||
|
);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
__asm__ __volatile__( "flds %1 \n\t"
|
||||||
|
"fistpl %0 \n\t"
|
||||||
|
: "=m" (i)
|
||||||
|
: "m" (f)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
#else
|
||||||
|
// we use c++ cast instead of c cast (not sure why id did that)
|
||||||
|
return static_cast<int>(f);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::FtoiFast
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::FtoiFast( float f ) {
|
||||||
|
#if OG_ASM_MSVC
|
||||||
|
int i;
|
||||||
|
__asm fld f
|
||||||
|
__asm fistp i
|
||||||
|
//__asm mov eax, i // do we need this ? O_o
|
||||||
|
return i;
|
||||||
|
#elif OG_ASM_GNU
|
||||||
|
int i;
|
||||||
|
__asm__ __volatile__( "flds %1 \n\t"
|
||||||
|
"fistpl %0 \n\t"
|
||||||
|
: "=m" (i)
|
||||||
|
: "m" (f)
|
||||||
|
);
|
||||||
|
return i;
|
||||||
|
#else
|
||||||
|
// we use c++ cast instead of c cast (not sure why id did that)
|
||||||
|
return static_cast<int>(f);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Ftol
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE long Math::Ftol( float f ) {
|
||||||
|
#if OG_ASM_MSVC
|
||||||
|
long i;
|
||||||
|
__asm fld f
|
||||||
|
__asm fistp i
|
||||||
|
//__asm mov eax, i // do we need this ? O_o
|
||||||
|
return i;
|
||||||
|
#elif OG_ASM_GNU
|
||||||
|
long i;
|
||||||
|
__asm__ __volatile__( "flds %1 \n\t"
|
||||||
|
"fistpl %0 \n\t"
|
||||||
|
: "=m" (i)
|
||||||
|
: "m" (f)
|
||||||
|
);
|
||||||
|
return i;
|
||||||
|
#else
|
||||||
|
// we use c++ cast instead of c cast (not sure why id did that)
|
||||||
|
return static_cast<long>(f);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Sign
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Sign( float f ) {
|
||||||
|
if ( f > 0.0f )
|
||||||
|
return 1.0f;
|
||||||
|
if ( f < 0.0f )
|
||||||
|
return -1.0f;
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Fmod
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Fmod( float numerator, float denominator ) {
|
||||||
|
return fmodf( numerator, denominator );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Modf
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Modf( float f, float& i ) {
|
||||||
|
return modff( f, &i );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::Modf( float f ) {
|
||||||
|
float i;
|
||||||
|
return modff( f, &i );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Sqrt
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Sqrt( float f ) {
|
||||||
|
return sqrtf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::InvSqrt
|
||||||
|
|
||||||
|
Cannot be 0.0f
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::InvSqrt( float f ) {
|
||||||
|
OG_ASSERT( f != 0.0f );
|
||||||
|
return 1.0f / sqrtf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::RSqrt
|
||||||
|
|
||||||
|
Can be 0.0f
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::RSqrt( float f ) {
|
||||||
|
float g = 0.5f * f;
|
||||||
|
int i = *reinterpret_cast<int *>(&f);
|
||||||
|
|
||||||
|
// do a guess
|
||||||
|
i = 0x5f375a86 - ( i>>1 );
|
||||||
|
f = *reinterpret_cast<float *>(&i);
|
||||||
|
|
||||||
|
// Newtons calculation
|
||||||
|
f = f * ( 1.5f - g * f * f );
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Log/Log2/Log10
|
||||||
|
|
||||||
|
Log of 0 is bad.
|
||||||
|
I've also heard you're not really
|
||||||
|
supposed to do log of negatives, yet
|
||||||
|
they work fine.
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Log( float f ) {
|
||||||
|
OG_ASSERT( f != 0.0f );
|
||||||
|
return logf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::Log2( float f ) {
|
||||||
|
OG_ASSERT( f != 0.0f );
|
||||||
|
return INV_LN_2 * logf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::Log10( float f ) {
|
||||||
|
OG_ASSERT( f != 0.0f );
|
||||||
|
return INV_LN_10 * logf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Pow
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Pow( float base, float exp ) {
|
||||||
|
return powf( base, exp );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Exp
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Exp( float f ) {
|
||||||
|
return expf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::IsPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE bool Math::IsPowerOfTwo( int x ) {
|
||||||
|
// This is the faster of the two known methods
|
||||||
|
// with the x > 0 check moved to the beginning
|
||||||
|
return x > 0 && ( x & ( x - 1 ) ) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::HigherPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::HigherPowerOfTwo( int x ) {
|
||||||
|
x--;
|
||||||
|
x |= x >> 1;
|
||||||
|
x |= x >> 2;
|
||||||
|
x |= x >> 4;
|
||||||
|
x |= x >> 8;
|
||||||
|
x |= x >> 16;
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::LowerPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::LowerPowerOfTwo( int x ) {
|
||||||
|
return HigherPowerOfTwo( x ) >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::FloorPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::FloorPowerOfTwo( int x ) {
|
||||||
|
return IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::CeilPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::CeilPowerOfTwo( int x ) {
|
||||||
|
return IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::ClosestPowerOfTwo
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::ClosestPowerOfTwo( int x ) {
|
||||||
|
if ( IsPowerOfTwo( x ) )
|
||||||
|
return x;
|
||||||
|
int high = HigherPowerOfTwo( x );
|
||||||
|
int low = high >> 1;
|
||||||
|
return ((high-x) < (x-low)) ? high : low;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Digits
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::Digits( int x ) {
|
||||||
|
int digits = 1;
|
||||||
|
int step = 10;
|
||||||
|
while (step <= x) {
|
||||||
|
digits++;
|
||||||
|
step *= 10;
|
||||||
|
}
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Sin/ASin
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Sin( float f ) {
|
||||||
|
return sinf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::ASin( float f ) {
|
||||||
|
if ( f <= -1.0f )
|
||||||
|
return -HALF_PI;
|
||||||
|
if ( f >= 1.0f )
|
||||||
|
return HALF_PI;
|
||||||
|
return asinf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Cos/ACos
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Cos( float f ) {
|
||||||
|
return cosf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::ACos( float f ) {
|
||||||
|
if ( f <= -1.0f )
|
||||||
|
return PI;
|
||||||
|
if ( f >= 1.0f )
|
||||||
|
return 0.0f;
|
||||||
|
return acosf( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Tan/ATan
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Tan( float f ) {
|
||||||
|
return tanf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::ATan( float f ) {
|
||||||
|
return atanf( f );
|
||||||
|
}
|
||||||
|
OG_INLINE float Math::ATan( float f1, float f2 ) {
|
||||||
|
return atan2f( f1, f2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::SinCos
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE void Math::SinCos( float f, float &s, float &c ) {
|
||||||
|
#if OG_ASM_MSVC
|
||||||
|
// sometimes assembler is just waaayy faster
|
||||||
|
_asm {
|
||||||
|
fld f
|
||||||
|
fsincos
|
||||||
|
mov ecx, c
|
||||||
|
mov edx, s
|
||||||
|
fstp dword ptr [ecx]
|
||||||
|
fstp dword ptr [edx]
|
||||||
|
}
|
||||||
|
#elif OG_ASM_GNU
|
||||||
|
asm ("fsincos" : "=t" (c), "=u" (s) : "0" (f));
|
||||||
|
#else
|
||||||
|
s = Sin(f);
|
||||||
|
c = Sqrt( 1.0f - s * s ); // faster than calling Cos(f)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Deg2Rad
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Deg2Rad( float f ) {
|
||||||
|
return f * DEG_TO_RAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Rad2Deg
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Rad2Deg( float f ) {
|
||||||
|
return f * RAD_TO_DEG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Square
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Square( float v ) {
|
||||||
|
return v * v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Cube
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE float Math::Cube( float v ) {
|
||||||
|
return v * v * v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Sec2Ms
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::Sec2Ms( int sec ) {
|
||||||
|
return sec * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
Math::Ms2Sec
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
OG_INLINE int Math::Ms2Sec( int ms ) {
|
||||||
|
return FtoiFast( ms * 0.001f );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
32
samples/C++/Memory16F88.h
Normal file
32
samples/C++/Memory16F88.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of PIC
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* PIC is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PIC is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Memory.h"
|
||||||
|
|
||||||
|
class Memory16F88 : public Memory
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t memory[512];
|
||||||
|
std::map<uint32_t, MemoryLocation *> memoryMap;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Memory16F88();
|
||||||
|
uint8_t Dereference(uint8_t bank, uint8_t partialAddress);
|
||||||
|
uint8_t *Reference(uint8_t bank, uint8_t partialAddress);
|
||||||
|
uint8_t *operator [](uint32_t ref);
|
||||||
|
};
|
||||||
76
samples/C++/ThreadedQueue.h
Normal file
76
samples/C++/ThreadedQueue.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of IRCBot
|
||||||
|
* Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* IRCBot is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* IRCBot is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __THREADED_QUEUE_H__
|
||||||
|
#define __THREADED_QUEUE_H__
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
class ThreadedQueue : public std::queue<T>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
pthread_mutex_t queueMutex;
|
||||||
|
pthread_cond_t queueCond;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ThreadedQueue()
|
||||||
|
{
|
||||||
|
pthread_mutexattr_t mutexAttrs;
|
||||||
|
pthread_condattr_t condAttrs;
|
||||||
|
|
||||||
|
pthread_mutexattr_init(&mutexAttrs);
|
||||||
|
pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK);
|
||||||
|
pthread_mutex_init(&queueMutex, &mutexAttrs);
|
||||||
|
pthread_mutexattr_destroy(&mutexAttrs);
|
||||||
|
|
||||||
|
pthread_condattr_init(&condAttrs);
|
||||||
|
pthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE);
|
||||||
|
pthread_cond_init(&queueCond, &condAttrs);
|
||||||
|
pthread_condattr_destroy(&condAttrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ThreadedQueue()
|
||||||
|
{
|
||||||
|
pthread_cond_destroy(&queueCond);
|
||||||
|
pthread_mutex_destroy(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void waitItems()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&queueMutex);
|
||||||
|
pthread_cond_wait(&queueCond, &queueMutex);
|
||||||
|
pthread_mutex_unlock(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void signalItems()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&queueMutex);
|
||||||
|
pthread_cond_broadcast(&queueCond);
|
||||||
|
pthread_mutex_unlock(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(T item)
|
||||||
|
{
|
||||||
|
std::queue<T>::push(item);
|
||||||
|
signalItems();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*__THREADED_QUEUE_H__*/
|
||||||
10
samples/C++/bar.hh
Normal file
10
samples/C++/bar.hh
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
class Bar
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void hello();
|
||||||
|
}
|
||||||
664
samples/C++/epoll_reactor.ipp
Normal file
664
samples/C++/epoll_reactor.ipp
Normal file
@@ -0,0 +1,664 @@
|
|||||||
|
//
|
||||||
|
// detail/impl/epoll_reactor.ipp
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
|
||||||
|
#define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
||||||
|
# pragma once
|
||||||
|
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
|
||||||
|
|
||||||
|
#include <boost/asio/detail/config.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_EPOLL)
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <boost/asio/detail/epoll_reactor.hpp>
|
||||||
|
#include <boost/asio/detail/throw_error.hpp>
|
||||||
|
#include <boost/asio/error.hpp>
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
# include <sys/timerfd.h>
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
|
||||||
|
#include <boost/asio/detail/push_options.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace asio {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
epoll_reactor::epoll_reactor(boost::asio::io_service& io_service)
|
||||||
|
: boost::asio::detail::service_base<epoll_reactor>(io_service),
|
||||||
|
io_service_(use_service<io_service_impl>(io_service)),
|
||||||
|
mutex_(),
|
||||||
|
interrupter_(),
|
||||||
|
epoll_fd_(do_epoll_create()),
|
||||||
|
timer_fd_(do_timerfd_create()),
|
||||||
|
shutdown_(false)
|
||||||
|
{
|
||||||
|
// Add the interrupter's descriptor to epoll.
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = EPOLLIN | EPOLLERR | EPOLLET;
|
||||||
|
ev.data.ptr = &interrupter_;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);
|
||||||
|
interrupter_.interrupt();
|
||||||
|
|
||||||
|
// Add the timer descriptor to epoll.
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
{
|
||||||
|
ev.events = EPOLLIN | EPOLLERR;
|
||||||
|
ev.data.ptr = &timer_fd_;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_reactor::~epoll_reactor()
|
||||||
|
{
|
||||||
|
if (epoll_fd_ != -1)
|
||||||
|
close(epoll_fd_);
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
close(timer_fd_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::shutdown_service()
|
||||||
|
{
|
||||||
|
mutex::scoped_lock lock(mutex_);
|
||||||
|
shutdown_ = true;
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
|
op_queue<operation> ops;
|
||||||
|
|
||||||
|
while (descriptor_state* state = registered_descriptors_.first())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < max_ops; ++i)
|
||||||
|
ops.push(state->op_queue_[i]);
|
||||||
|
state->shutdown_ = true;
|
||||||
|
registered_descriptors_.free(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer_queues_.get_all_timers(ops);
|
||||||
|
|
||||||
|
io_service_.abandon_operations(ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev)
|
||||||
|
{
|
||||||
|
if (fork_ev == boost::asio::io_service::fork_child)
|
||||||
|
{
|
||||||
|
if (epoll_fd_ != -1)
|
||||||
|
::close(epoll_fd_);
|
||||||
|
epoll_fd_ = -1;
|
||||||
|
epoll_fd_ = do_epoll_create();
|
||||||
|
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
::close(timer_fd_);
|
||||||
|
timer_fd_ = -1;
|
||||||
|
timer_fd_ = do_timerfd_create();
|
||||||
|
|
||||||
|
interrupter_.recreate();
|
||||||
|
|
||||||
|
// Add the interrupter's descriptor to epoll.
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = EPOLLIN | EPOLLERR | EPOLLET;
|
||||||
|
ev.data.ptr = &interrupter_;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);
|
||||||
|
interrupter_.interrupt();
|
||||||
|
|
||||||
|
// Add the timer descriptor to epoll.
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
{
|
||||||
|
ev.events = EPOLLIN | EPOLLERR;
|
||||||
|
ev.data.ptr = &timer_fd_;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_timeout();
|
||||||
|
|
||||||
|
// Re-register all descriptors with epoll.
|
||||||
|
mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
|
||||||
|
for (descriptor_state* state = registered_descriptors_.first();
|
||||||
|
state != 0; state = state->next_)
|
||||||
|
{
|
||||||
|
ev.events = state->registered_events_;
|
||||||
|
ev.data.ptr = state;
|
||||||
|
int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
boost::system::error_code ec(errno,
|
||||||
|
boost::asio::error::get_system_category());
|
||||||
|
boost::asio::detail::throw_error(ec, "epoll re-registration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::init_task()
|
||||||
|
{
|
||||||
|
io_service_.init_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
int epoll_reactor::register_descriptor(socket_type descriptor,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data)
|
||||||
|
{
|
||||||
|
descriptor_data = allocate_descriptor_state();
|
||||||
|
|
||||||
|
{
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
descriptor_data->reactor_ = this;
|
||||||
|
descriptor_data->descriptor_ = descriptor;
|
||||||
|
descriptor_data->shutdown_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;
|
||||||
|
descriptor_data->registered_events_ = ev.events;
|
||||||
|
ev.data.ptr = descriptor_data;
|
||||||
|
int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
|
||||||
|
if (result != 0)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int epoll_reactor::register_internal_descriptor(
|
||||||
|
int op_type, socket_type descriptor,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op)
|
||||||
|
{
|
||||||
|
descriptor_data = allocate_descriptor_state();
|
||||||
|
|
||||||
|
{
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
descriptor_data->reactor_ = this;
|
||||||
|
descriptor_data->descriptor_ = descriptor;
|
||||||
|
descriptor_data->shutdown_ = false;
|
||||||
|
descriptor_data->op_queue_[op_type].push(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;
|
||||||
|
descriptor_data->registered_events_ = ev.events;
|
||||||
|
ev.data.ptr = descriptor_data;
|
||||||
|
int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
|
||||||
|
if (result != 0)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::move_descriptor(socket_type,
|
||||||
|
epoll_reactor::per_descriptor_data& target_descriptor_data,
|
||||||
|
epoll_reactor::per_descriptor_data& source_descriptor_data)
|
||||||
|
{
|
||||||
|
target_descriptor_data = source_descriptor_data;
|
||||||
|
source_descriptor_data = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::start_op(int op_type, socket_type descriptor,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op,
|
||||||
|
bool is_continuation, bool allow_speculative)
|
||||||
|
{
|
||||||
|
if (!descriptor_data)
|
||||||
|
{
|
||||||
|
op->ec_ = boost::asio::error::bad_descriptor;
|
||||||
|
post_immediate_completion(op, is_continuation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
if (descriptor_data->shutdown_)
|
||||||
|
{
|
||||||
|
post_immediate_completion(op, is_continuation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (descriptor_data->op_queue_[op_type].empty())
|
||||||
|
{
|
||||||
|
if (allow_speculative
|
||||||
|
&& (op_type != read_op
|
||||||
|
|| descriptor_data->op_queue_[except_op].empty()))
|
||||||
|
{
|
||||||
|
if (op->perform())
|
||||||
|
{
|
||||||
|
descriptor_lock.unlock();
|
||||||
|
io_service_.post_immediate_completion(op, is_continuation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (op_type == write_op)
|
||||||
|
{
|
||||||
|
if ((descriptor_data->registered_events_ & EPOLLOUT) == 0)
|
||||||
|
{
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = descriptor_data->registered_events_ | EPOLLOUT;
|
||||||
|
ev.data.ptr = descriptor_data;
|
||||||
|
if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0)
|
||||||
|
{
|
||||||
|
descriptor_data->registered_events_ |= ev.events;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
op->ec_ = boost::system::error_code(errno,
|
||||||
|
boost::asio::error::get_system_category());
|
||||||
|
io_service_.post_immediate_completion(op, is_continuation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (op_type == write_op)
|
||||||
|
{
|
||||||
|
descriptor_data->registered_events_ |= EPOLLOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = descriptor_data->registered_events_;
|
||||||
|
ev.data.ptr = descriptor_data;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor_data->op_queue_[op_type].push(op);
|
||||||
|
io_service_.work_started();
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::cancel_ops(socket_type,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data)
|
||||||
|
{
|
||||||
|
if (!descriptor_data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
op_queue<operation> ops;
|
||||||
|
for (int i = 0; i < max_ops; ++i)
|
||||||
|
{
|
||||||
|
while (reactor_op* op = descriptor_data->op_queue_[i].front())
|
||||||
|
{
|
||||||
|
op->ec_ = boost::asio::error::operation_aborted;
|
||||||
|
descriptor_data->op_queue_[i].pop();
|
||||||
|
ops.push(op);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor_lock.unlock();
|
||||||
|
|
||||||
|
io_service_.post_deferred_completions(ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::deregister_descriptor(socket_type descriptor,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data, bool closing)
|
||||||
|
{
|
||||||
|
if (!descriptor_data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
if (!descriptor_data->shutdown_)
|
||||||
|
{
|
||||||
|
if (closing)
|
||||||
|
{
|
||||||
|
// The descriptor will be automatically removed from the epoll set when
|
||||||
|
// it is closed.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
op_queue<operation> ops;
|
||||||
|
for (int i = 0; i < max_ops; ++i)
|
||||||
|
{
|
||||||
|
while (reactor_op* op = descriptor_data->op_queue_[i].front())
|
||||||
|
{
|
||||||
|
op->ec_ = boost::asio::error::operation_aborted;
|
||||||
|
descriptor_data->op_queue_[i].pop();
|
||||||
|
ops.push(op);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
descriptor_data->descriptor_ = -1;
|
||||||
|
descriptor_data->shutdown_ = true;
|
||||||
|
|
||||||
|
descriptor_lock.unlock();
|
||||||
|
|
||||||
|
free_descriptor_state(descriptor_data);
|
||||||
|
descriptor_data = 0;
|
||||||
|
|
||||||
|
io_service_.post_deferred_completions(ops);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::deregister_internal_descriptor(socket_type descriptor,
|
||||||
|
epoll_reactor::per_descriptor_data& descriptor_data)
|
||||||
|
{
|
||||||
|
if (!descriptor_data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
|
||||||
|
|
||||||
|
if (!descriptor_data->shutdown_)
|
||||||
|
{
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);
|
||||||
|
|
||||||
|
op_queue<operation> ops;
|
||||||
|
for (int i = 0; i < max_ops; ++i)
|
||||||
|
ops.push(descriptor_data->op_queue_[i]);
|
||||||
|
|
||||||
|
descriptor_data->descriptor_ = -1;
|
||||||
|
descriptor_data->shutdown_ = true;
|
||||||
|
|
||||||
|
descriptor_lock.unlock();
|
||||||
|
|
||||||
|
free_descriptor_state(descriptor_data);
|
||||||
|
descriptor_data = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::run(bool block, op_queue<operation>& ops)
|
||||||
|
{
|
||||||
|
// This code relies on the fact that the task_io_service queues the reactor
|
||||||
|
// task behind all descriptor operations generated by this function. This
|
||||||
|
// means, that by the time we reach this point, any previously returned
|
||||||
|
// descriptor operations have already been dequeued. Therefore it is now safe
|
||||||
|
// for us to reuse and return them for the task_io_service to queue again.
|
||||||
|
|
||||||
|
// Calculate a timeout only if timerfd is not used.
|
||||||
|
int timeout;
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
timeout = block ? -1 : 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mutex::scoped_lock lock(mutex_);
|
||||||
|
timeout = block ? get_timeout() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Block on the epoll descriptor.
|
||||||
|
epoll_event events[128];
|
||||||
|
int num_events = epoll_wait(epoll_fd_, events, 128, timeout);
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
bool check_timers = (timer_fd_ == -1);
|
||||||
|
#else // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
bool check_timers = true;
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
|
||||||
|
// Dispatch the waiting events.
|
||||||
|
for (int i = 0; i < num_events; ++i)
|
||||||
|
{
|
||||||
|
void* ptr = events[i].data.ptr;
|
||||||
|
if (ptr == &interrupter_)
|
||||||
|
{
|
||||||
|
// No need to reset the interrupter since we're leaving the descriptor
|
||||||
|
// in a ready-to-read state and relying on edge-triggered notifications
|
||||||
|
// to make it so that we only get woken up when the descriptor's epoll
|
||||||
|
// registration is updated.
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
if (timer_fd_ == -1)
|
||||||
|
check_timers = true;
|
||||||
|
#else // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
check_timers = true;
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
}
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
else if (ptr == &timer_fd_)
|
||||||
|
{
|
||||||
|
check_timers = true;
|
||||||
|
}
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The descriptor operation doesn't count as work in and of itself, so we
|
||||||
|
// don't call work_started() here. This still allows the io_service to
|
||||||
|
// stop if the only remaining operations are descriptor operations.
|
||||||
|
descriptor_state* descriptor_data = static_cast<descriptor_state*>(ptr);
|
||||||
|
descriptor_data->set_ready_events(events[i].events);
|
||||||
|
ops.push(descriptor_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_timers)
|
||||||
|
{
|
||||||
|
mutex::scoped_lock common_lock(mutex_);
|
||||||
|
timer_queues_.get_ready_timers(ops);
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
{
|
||||||
|
itimerspec new_timeout;
|
||||||
|
itimerspec old_timeout;
|
||||||
|
int flags = get_timeout(new_timeout);
|
||||||
|
timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);
|
||||||
|
}
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::interrupt()
|
||||||
|
{
|
||||||
|
epoll_event ev = { 0, { 0 } };
|
||||||
|
ev.events = EPOLLIN | EPOLLERR | EPOLLET;
|
||||||
|
ev.data.ptr = &interrupter_;
|
||||||
|
epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int epoll_reactor::do_epoll_create()
|
||||||
|
{
|
||||||
|
#if defined(EPOLL_CLOEXEC)
|
||||||
|
int fd = epoll_create1(EPOLL_CLOEXEC);
|
||||||
|
#else // defined(EPOLL_CLOEXEC)
|
||||||
|
int fd = -1;
|
||||||
|
errno = EINVAL;
|
||||||
|
#endif // defined(EPOLL_CLOEXEC)
|
||||||
|
|
||||||
|
if (fd == -1 && (errno == EINVAL || errno == ENOSYS))
|
||||||
|
{
|
||||||
|
fd = epoll_create(epoll_size);
|
||||||
|
if (fd != -1)
|
||||||
|
::fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
boost::system::error_code ec(errno,
|
||||||
|
boost::asio::error::get_system_category());
|
||||||
|
boost::asio::detail::throw_error(ec, "epoll");
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int epoll_reactor::do_timerfd_create()
|
||||||
|
{
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
# if defined(TFD_CLOEXEC)
|
||||||
|
int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
|
||||||
|
# else // defined(TFD_CLOEXEC)
|
||||||
|
int fd = -1;
|
||||||
|
errno = EINVAL;
|
||||||
|
# endif // defined(TFD_CLOEXEC)
|
||||||
|
|
||||||
|
if (fd == -1 && errno == EINVAL)
|
||||||
|
{
|
||||||
|
fd = timerfd_create(CLOCK_MONOTONIC, 0);
|
||||||
|
if (fd != -1)
|
||||||
|
::fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
#else // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
return -1;
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state()
|
||||||
|
{
|
||||||
|
mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
|
||||||
|
return registered_descriptors_.alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s)
|
||||||
|
{
|
||||||
|
mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);
|
||||||
|
registered_descriptors_.free(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::do_add_timer_queue(timer_queue_base& queue)
|
||||||
|
{
|
||||||
|
mutex::scoped_lock lock(mutex_);
|
||||||
|
timer_queues_.insert(&queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue)
|
||||||
|
{
|
||||||
|
mutex::scoped_lock lock(mutex_);
|
||||||
|
timer_queues_.erase(&queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::update_timeout()
|
||||||
|
{
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
if (timer_fd_ != -1)
|
||||||
|
{
|
||||||
|
itimerspec new_timeout;
|
||||||
|
itimerspec old_timeout;
|
||||||
|
int flags = get_timeout(new_timeout);
|
||||||
|
timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
int epoll_reactor::get_timeout()
|
||||||
|
{
|
||||||
|
// By default we will wait no longer than 5 minutes. This will ensure that
|
||||||
|
// any changes to the system clock are detected after no longer than this.
|
||||||
|
return timer_queues_.wait_duration_msec(5 * 60 * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
int epoll_reactor::get_timeout(itimerspec& ts)
|
||||||
|
{
|
||||||
|
ts.it_interval.tv_sec = 0;
|
||||||
|
ts.it_interval.tv_nsec = 0;
|
||||||
|
|
||||||
|
long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000);
|
||||||
|
ts.it_value.tv_sec = usec / 1000000;
|
||||||
|
ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1;
|
||||||
|
|
||||||
|
return usec ? 0 : TFD_TIMER_ABSTIME;
|
||||||
|
}
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_TIMERFD)
|
||||||
|
|
||||||
|
struct epoll_reactor::perform_io_cleanup_on_block_exit
|
||||||
|
{
|
||||||
|
explicit perform_io_cleanup_on_block_exit(epoll_reactor* r)
|
||||||
|
: reactor_(r), first_op_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~perform_io_cleanup_on_block_exit()
|
||||||
|
{
|
||||||
|
if (first_op_)
|
||||||
|
{
|
||||||
|
// Post the remaining completed operations for invocation.
|
||||||
|
if (!ops_.empty())
|
||||||
|
reactor_->io_service_.post_deferred_completions(ops_);
|
||||||
|
|
||||||
|
// A user-initiated operation has completed, but there's no need to
|
||||||
|
// explicitly call work_finished() here. Instead, we'll take advantage of
|
||||||
|
// the fact that the task_io_service will call work_finished() once we
|
||||||
|
// return.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No user-initiated operations have completed, so we need to compensate
|
||||||
|
// for the work_finished() call that the task_io_service will make once
|
||||||
|
// this operation returns.
|
||||||
|
reactor_->io_service_.work_started();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
epoll_reactor* reactor_;
|
||||||
|
op_queue<operation> ops_;
|
||||||
|
operation* first_op_;
|
||||||
|
};
|
||||||
|
|
||||||
|
epoll_reactor::descriptor_state::descriptor_state()
|
||||||
|
: operation(&epoll_reactor::descriptor_state::do_complete)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
operation* epoll_reactor::descriptor_state::perform_io(uint32_t events)
|
||||||
|
{
|
||||||
|
mutex_.lock();
|
||||||
|
perform_io_cleanup_on_block_exit io_cleanup(reactor_);
|
||||||
|
mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock);
|
||||||
|
|
||||||
|
// Exception operations must be processed first to ensure that any
|
||||||
|
// out-of-band data is read before normal data.
|
||||||
|
static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI };
|
||||||
|
for (int j = max_ops - 1; j >= 0; --j)
|
||||||
|
{
|
||||||
|
if (events & (flag[j] | EPOLLERR | EPOLLHUP))
|
||||||
|
{
|
||||||
|
while (reactor_op* op = op_queue_[j].front())
|
||||||
|
{
|
||||||
|
if (op->perform())
|
||||||
|
{
|
||||||
|
op_queue_[j].pop();
|
||||||
|
io_cleanup.ops_.push(op);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The first operation will be returned for completion now. The others will
|
||||||
|
// be posted for later by the io_cleanup object's destructor.
|
||||||
|
io_cleanup.first_op_ = io_cleanup.ops_.front();
|
||||||
|
io_cleanup.ops_.pop();
|
||||||
|
return io_cleanup.first_op_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void epoll_reactor::descriptor_state::do_complete(
|
||||||
|
io_service_impl* owner, operation* base,
|
||||||
|
const boost::system::error_code& ec, std::size_t bytes_transferred)
|
||||||
|
{
|
||||||
|
if (owner)
|
||||||
|
{
|
||||||
|
descriptor_state* descriptor_data = static_cast<descriptor_state*>(base);
|
||||||
|
uint32_t events = static_cast<uint32_t>(bytes_transferred);
|
||||||
|
if (operation* op = descriptor_data->perform_io(events))
|
||||||
|
{
|
||||||
|
op->complete(*owner, ec, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace asio
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#include <boost/asio/detail/pop_options.hpp>
|
||||||
|
|
||||||
|
#endif // defined(BOOST_ASIO_HAS_EPOLL)
|
||||||
|
|
||||||
|
#endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP
|
||||||
116
samples/C++/qsciprinter.cp
Normal file
116
samples/C++/qsciprinter.cp
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
// This module defines interface to the QsciPrinter class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com>
|
||||||
|
//
|
||||||
|
// This file is part of QScintilla.
|
||||||
|
//
|
||||||
|
// This file may be used under the terms of the GNU General Public
|
||||||
|
// License versions 2.0 or 3.0 as published by the Free Software
|
||||||
|
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
|
||||||
|
// included in the packaging of this file. Alternatively you may (at
|
||||||
|
// your option) use any later version of the GNU General Public
|
||||||
|
// License if such license has been publicly approved by Riverbank
|
||||||
|
// Computing Limited (or its successors, if any) and the KDE Free Qt
|
||||||
|
// Foundation. In addition, as a special exception, Riverbank gives you
|
||||||
|
// certain additional rights. These rights are described in the Riverbank
|
||||||
|
// GPL Exception version 1.1, which can be found in the file
|
||||||
|
// GPL_EXCEPTION.txt in this package.
|
||||||
|
//
|
||||||
|
// If you are unsure which license is appropriate for your use, please
|
||||||
|
// contact the sales department at sales@riverbankcomputing.com.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef QSCIPRINTER_H
|
||||||
|
#define QSCIPRINTER_H
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
extern "C++" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <qprinter.h>
|
||||||
|
|
||||||
|
#include <Qsci/qsciglobal.h>
|
||||||
|
#include <Qsci/qsciscintilla.h>
|
||||||
|
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QRect;
|
||||||
|
class QPainter;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class QsciScintillaBase;
|
||||||
|
|
||||||
|
|
||||||
|
//! \brief The QsciPrinter class is a sub-class of the Qt QPrinter class that
|
||||||
|
//! is able to print the text of a Scintilla document.
|
||||||
|
//!
|
||||||
|
//! The class can be further sub-classed to alter to layout of the text, adding
|
||||||
|
//! headers and footers for example.
|
||||||
|
class QSCINTILLA_EXPORT QsciPrinter : public QPrinter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Constructs a printer paint device with mode \a mode.
|
||||||
|
QsciPrinter(PrinterMode mode = ScreenResolution);
|
||||||
|
|
||||||
|
//! Destroys the QsciPrinter instance.
|
||||||
|
virtual ~QsciPrinter();
|
||||||
|
|
||||||
|
//! Format a page, by adding headers and footers for example, before the
|
||||||
|
//! document text is drawn on it. \a painter is the painter to be used to
|
||||||
|
//! add customised text and graphics. \a drawing is true if the page is
|
||||||
|
//! actually being drawn rather than being sized. \a painter drawing
|
||||||
|
//! methods must only be called when \a drawing is true. \a area is the
|
||||||
|
//! area of the page that will be used to draw the text. This should be
|
||||||
|
//! modified if it is necessary to reserve space for any customised text or
|
||||||
|
//! graphics. By default the area is relative to the printable area of the
|
||||||
|
//! page. Use QPrinter::setFullPage() because calling printRange() if you
|
||||||
|
//! want to try and print over the whole page. \a pagenr is the number of
|
||||||
|
//! the page. The first page is numbered 1.
|
||||||
|
virtual void formatPage(QPainter &painter, bool drawing, QRect &area,
|
||||||
|
int pagenr);
|
||||||
|
|
||||||
|
//! Return the number of points to add to each font when printing.
|
||||||
|
//!
|
||||||
|
//! \sa setMagnification()
|
||||||
|
int magnification() const {return mag;}
|
||||||
|
|
||||||
|
//! Sets the number of points to add to each font when printing to \a
|
||||||
|
//! magnification.
|
||||||
|
//!
|
||||||
|
//! \sa magnification()
|
||||||
|
virtual void setMagnification(int magnification);
|
||||||
|
|
||||||
|
//! Print a range of lines from the Scintilla instance \a qsb. \a from is
|
||||||
|
//! the first line to print and a negative value signifies the first line
|
||||||
|
//! of text. \a to is the last line to print and a negative value
|
||||||
|
//! signifies the last line of text. true is returned if there was no
|
||||||
|
//! error.
|
||||||
|
virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1);
|
||||||
|
|
||||||
|
//! Return the line wrap mode used when printing. The default is
|
||||||
|
//! QsciScintilla::WrapWord.
|
||||||
|
//!
|
||||||
|
//! \sa setWrapMode()
|
||||||
|
QsciScintilla::WrapMode wrapMode() const {return wrap;}
|
||||||
|
|
||||||
|
//! Sets the line wrap mode used when printing to \a wmode.
|
||||||
|
//!
|
||||||
|
//! \sa wrapMode()
|
||||||
|
virtual void setWrapMode(QsciScintilla::WrapMode wmode);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mag;
|
||||||
|
QsciScintilla::WrapMode wrap;
|
||||||
|
|
||||||
|
QsciPrinter(const QsciPrinter &);
|
||||||
|
QsciPrinter &operator=(const QsciPrinter &);
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
145
samples/C/2D.C
Normal file
145
samples/C/2D.C
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
#include "2D.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void set_vgabasemem(void)
|
||||||
|
{
|
||||||
|
ULONG vgabase;
|
||||||
|
SELECTOR tmp;
|
||||||
|
asm mov [tmp], ds
|
||||||
|
dpmi_get_sel_base(&vgabase, tmp);
|
||||||
|
vgabasemem = (char *)(-vgabase + 0xa0000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_chdis(int mode) // change the display!
|
||||||
|
{
|
||||||
|
regs.b.ah = 0x00; // seet theh display moode
|
||||||
|
regs.b.al = mode; // change it to the mode like innit
|
||||||
|
regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh?
|
||||||
|
regs.h.ss = 0; // Like, totally set the stack segment
|
||||||
|
regs.h.sp = 0; // Set tha stack pointaaaaahhhhh!!!
|
||||||
|
dpmi_simulate_real_interrupt(0x10, ®s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_pix(int x, int y, enum COLORS col)
|
||||||
|
{
|
||||||
|
*VGAPIX(x, y) = col;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_line(int x0, int y0, int x1, int y1, enum COLORS col)
|
||||||
|
{
|
||||||
|
// Going for the optimized version of bresenham's line algo.
|
||||||
|
int stp = (abs(y0 - y1) > abs(x0 - x1));
|
||||||
|
int tmp, dx, dy, err, yi, i, j; // yi = y excrement
|
||||||
|
if (stp) {
|
||||||
|
// swappity swap
|
||||||
|
tmp = y0;
|
||||||
|
y0 = x0;
|
||||||
|
x0 = tmp;
|
||||||
|
|
||||||
|
tmp = y1;
|
||||||
|
y1 = x1;
|
||||||
|
x1 = tmp;
|
||||||
|
}
|
||||||
|
// AAAAND NOW WE MUST DO ZEES AGAIN :(
|
||||||
|
// I'm sure there was a func somewhere that does this? :P
|
||||||
|
if (x0 > x1) {
|
||||||
|
tmp = x0;
|
||||||
|
x0 = x1;
|
||||||
|
x1 = tmp;
|
||||||
|
|
||||||
|
tmp = y0;
|
||||||
|
y0 = y1;
|
||||||
|
y1 = tmp;
|
||||||
|
}
|
||||||
|
dx = (x1 - x0);
|
||||||
|
dy = (abs(y1 - y0));
|
||||||
|
err = (dx / 2);
|
||||||
|
|
||||||
|
if (y0 < y1)
|
||||||
|
yi = 1;
|
||||||
|
else
|
||||||
|
yi = -1;
|
||||||
|
j = y0;
|
||||||
|
for (i = x0; i < x1; i++)
|
||||||
|
{
|
||||||
|
if (stp)
|
||||||
|
*VGAPIX(j, i) = col;
|
||||||
|
else
|
||||||
|
*VGAPIX(i, j) = col;
|
||||||
|
|
||||||
|
err -= dy;
|
||||||
|
if (err < 0) {
|
||||||
|
j += yi;
|
||||||
|
err += dx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_rectl(int x, int y, int w, int h, enum COLORS col)
|
||||||
|
{
|
||||||
|
drw_line(x, y, x+w, y, col);
|
||||||
|
drw_line(x+w, y, x+w, y+h, col);
|
||||||
|
|
||||||
|
drw_line(x, y, x, y+h, col);
|
||||||
|
drw_line(x, y+h, x+w+1, y+h, col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_rectf(int x, int y, int w, int h, enum COLORS col)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for (j = y; j < x+h; j++) {
|
||||||
|
for (i = x; i < y+w; i++) {
|
||||||
|
*VGAPIX(i, j) = col;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_circl(int x, int y, int rad, enum COLORS col)
|
||||||
|
{
|
||||||
|
int mang, i; // max angle, haha
|
||||||
|
int px, py;
|
||||||
|
mang = 360; // Yeah yeah I'll switch to rad later
|
||||||
|
for (i = 0; i <= mang; i++)
|
||||||
|
{
|
||||||
|
px = cos(i)*rad + x; // + px; // causes some really cools effects! :D
|
||||||
|
py = sin(i)*rad + y; // + py;
|
||||||
|
*VGAPIX(px, py) = col;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_tex(int x, int y, int w, int h, enum COLORS tex[])
|
||||||
|
{ // i*w+j
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < w; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < h; j++)
|
||||||
|
{
|
||||||
|
*VGAPIX(x+i, y+j) = tex[j*w+i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void 2D_init(void)
|
||||||
|
{
|
||||||
|
set_vgabasemem();
|
||||||
|
drw_chdis(0x13);
|
||||||
|
}
|
||||||
|
|
||||||
|
void 2D_exit(void)
|
||||||
|
{
|
||||||
|
drw_chdis(3);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
set_vgabasemem();
|
||||||
|
drw_chdis(0x13);
|
||||||
|
|
||||||
|
while(!kbhit()) {
|
||||||
|
if ((getch()) == 0x1b) // escape
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
drw_chdis(3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
29
samples/C/2D.H
Normal file
29
samples/C/2D.H
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef __2DGFX
|
||||||
|
#define __2DGFX
|
||||||
|
// Includes
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <dpmi.h>
|
||||||
|
|
||||||
|
// Defines
|
||||||
|
#define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320)
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
char * vgabasemem;
|
||||||
|
DPMI_REGS regs;
|
||||||
|
|
||||||
|
// Drawing functions:
|
||||||
|
//void setvgabasemem(void);
|
||||||
|
void drw_chdis(int mode); // draw_func_change_display
|
||||||
|
void drw_pix(int x, int y, enum COLORS col);
|
||||||
|
void drw_line(int x0, int y0, int x1, int y1, enum COLORS col);
|
||||||
|
void drw_rectl(int x, int y, int w, int h, enum COLORS col);
|
||||||
|
void drw_rectf(int x, int y, int w, int h, enum COLORS col);
|
||||||
|
void drw_cirl(int x, int y, int rad, enum COLORS col);
|
||||||
|
void drw_tex(int x, int y, int w, int h, enum COLORS tex[]);
|
||||||
|
void 2D_init(void);
|
||||||
|
void 2D_exit(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
93
samples/C/ArrowLeft.h
Normal file
93
samples/C/ArrowLeft.h
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of GTK++ (libGTK++)
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* GTK++ is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GTK++ is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* GdkPixbuf RGBA C-Source image dump */
|
||||||
|
|
||||||
|
#ifdef __SUNPRO_C
|
||||||
|
#pragma align 4 (ArrowLeft)
|
||||||
|
#endif
|
||||||
|
#ifdef __GNUC__
|
||||||
|
static const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) =
|
||||||
|
#else
|
||||||
|
static const uint8_t ArrowLeft[] =
|
||||||
|
#endif
|
||||||
|
{ ""
|
||||||
|
/* Pixbuf magic (0x47646b50) */
|
||||||
|
"GdkP"
|
||||||
|
/* length: header (24) + pixel_data (1600) */
|
||||||
|
"\0\0\6X"
|
||||||
|
/* pixdata_type (0x1010002) */
|
||||||
|
"\1\1\0\2"
|
||||||
|
/* rowstride (80) */
|
||||||
|
"\0\0\0P"
|
||||||
|
/* width (20) */
|
||||||
|
"\0\0\0\24"
|
||||||
|
/* height (20) */
|
||||||
|
"\0\0\0\24"
|
||||||
|
/* pixel_data: */
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
|
||||||
|
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
|
||||||
|
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0"
|
||||||
|
"\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0"};
|
||||||
|
|
||||||
|
|
||||||
903
samples/C/GLKMatrix4.h
Normal file
903
samples/C/GLKMatrix4.h
Normal file
@@ -0,0 +1,903 @@
|
|||||||
|
//
|
||||||
|
// GLKMatrix4.h
|
||||||
|
// GLKit
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011, Apple Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __GLK_MATRIX_4_H
|
||||||
|
#define __GLK_MATRIX_4_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
#include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <GLKit/GLKMathTypes.h>
|
||||||
|
#include <GLKit/GLKVector3.h>
|
||||||
|
#include <GLKit/GLKVector4.h>
|
||||||
|
#include <GLKit/GLKQuaternion.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Prototypes
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
|
extern const GLKMatrix4 GLKMatrix4Identity;
|
||||||
|
|
||||||
|
/*
|
||||||
|
m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,
|
||||||
|
GLKVector4 row1,
|
||||||
|
GLKVector4 row2,
|
||||||
|
GLKVector4 row3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
column3's first three components should correspond to the translation values tx, ty, and tz.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,
|
||||||
|
GLKVector4 column1,
|
||||||
|
GLKVector4 column2,
|
||||||
|
GLKVector4 column3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
The quaternion will be normalized before conversion.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to gluPerspective.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to glFrustum.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to glOrtho.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to gluLookAt.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,
|
||||||
|
float centerX, float centerY, float centerZ,
|
||||||
|
float upX, float upY, float upZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns the upper left 3x3 portion of the 4x4 matrix.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix);
|
||||||
|
/*
|
||||||
|
Returns the upper left 2x2 portion of the 4x4 matrix.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix);
|
||||||
|
|
||||||
|
/*
|
||||||
|
GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively.
|
||||||
|
Valid row values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row);
|
||||||
|
/*
|
||||||
|
GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz.
|
||||||
|
Valid column values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column);
|
||||||
|
|
||||||
|
/*
|
||||||
|
GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component.
|
||||||
|
Valid row values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector);
|
||||||
|
/*
|
||||||
|
GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively.
|
||||||
|
Valid column values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix);
|
||||||
|
|
||||||
|
GLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible);
|
||||||
|
GLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, translationVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, scaleVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, axisVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Assumes 0 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component and divides the resulting vector by w before returning.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Assumes 0 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component and divides the resulting vector by w before returning.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight);
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount);
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Implementations
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { m00, m01, m02, m03,
|
||||||
|
m10, m11, m12, m13,
|
||||||
|
m20, m21, m22, m23,
|
||||||
|
m30, m31, m32, m33 };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { m00, m10, m20, m30,
|
||||||
|
m01, m11, m21, m31,
|
||||||
|
m02, m12, m22, m32,
|
||||||
|
m03, m13, m23, m33 };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16])
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { values[0], values[1], values[2], values[3],
|
||||||
|
values[4], values[5], values[6], values[7],
|
||||||
|
values[8], values[9], values[10], values[11],
|
||||||
|
values[12], values[13], values[14], values[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16])
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m = vld4q_f32(values);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { values[0], values[4], values[8], values[12],
|
||||||
|
values[1], values[5], values[9], values[13],
|
||||||
|
values[2], values[6], values[10], values[14],
|
||||||
|
values[3], values[7], values[11], values[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,
|
||||||
|
GLKVector4 row1,
|
||||||
|
GLKVector4 row2,
|
||||||
|
GLKVector4 row3)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0],
|
||||||
|
row0.v[1], row1.v[1], row2.v[1], row3.v[1],
|
||||||
|
row0.v[2], row1.v[2], row2.v[2], row3.v[2],
|
||||||
|
row0.v[3], row1.v[3], row2.v[3], row3.v[3] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,
|
||||||
|
GLKVector4 column1,
|
||||||
|
GLKVector4 column2,
|
||||||
|
GLKVector4 column3)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m;
|
||||||
|
m.val[0] = vld1q_f32(column0.v);
|
||||||
|
m.val[1] = vld1q_f32(column1.v);
|
||||||
|
m.val[2] = vld1q_f32(column2.v);
|
||||||
|
m.val[3] = vld1q_f32(column3.v);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3],
|
||||||
|
column1.v[0], column1.v[1], column1.v[2], column1.v[3],
|
||||||
|
column2.v[0], column2.v[1], column2.v[2], column2.v[3],
|
||||||
|
column3.v[0], column3.v[1], column3.v[2], column3.v[3] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion)
|
||||||
|
{
|
||||||
|
quaternion = GLKQuaternionNormalize(quaternion);
|
||||||
|
|
||||||
|
float x = quaternion.q[0];
|
||||||
|
float y = quaternion.q[1];
|
||||||
|
float z = quaternion.q[2];
|
||||||
|
float w = quaternion.q[3];
|
||||||
|
|
||||||
|
float _2x = x + x;
|
||||||
|
float _2y = y + y;
|
||||||
|
float _2z = z + z;
|
||||||
|
float _2w = w + w;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 1.0f - _2y * y - _2z * z,
|
||||||
|
_2x * y + _2w * z,
|
||||||
|
_2x * z - _2w * y,
|
||||||
|
0.0f,
|
||||||
|
_2x * y - _2w * z,
|
||||||
|
1.0f - _2x * x - _2z * z,
|
||||||
|
_2y * z + _2w * x,
|
||||||
|
0.0f,
|
||||||
|
_2x * z + _2w * y,
|
||||||
|
_2y * z - _2w * x,
|
||||||
|
1.0f - _2x * x - _2y * y,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = GLKMatrix4Identity;
|
||||||
|
m.m[12] = tx;
|
||||||
|
m.m[13] = ty;
|
||||||
|
m.m[14] = tz;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = GLKMatrix4Identity;
|
||||||
|
m.m[0] = sx;
|
||||||
|
m.m[5] = sy;
|
||||||
|
m.m[10] = sz;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z)
|
||||||
|
{
|
||||||
|
GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z));
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float cosp = 1.0f - cos;
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0],
|
||||||
|
cosp * v.v[0] * v.v[1] + v.v[2] * sin,
|
||||||
|
cosp * v.v[0] * v.v[2] - v.v[1] * sin,
|
||||||
|
0.0f,
|
||||||
|
cosp * v.v[0] * v.v[1] - v.v[2] * sin,
|
||||||
|
cos + cosp * v.v[1] * v.v[1],
|
||||||
|
cosp * v.v[1] * v.v[2] + v.v[0] * sin,
|
||||||
|
0.0f,
|
||||||
|
cosp * v.v[0] * v.v[2] + v.v[1] * sin,
|
||||||
|
cosp * v.v[1] * v.v[2] - v.v[0] * sin,
|
||||||
|
cos + cosp * v.v[2] * v.v[2],
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, cos, sin, 0.0f,
|
||||||
|
0.0f, -sin, cos, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
sin, 0.0f, cos, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos, sin, 0.0f, 0.0f,
|
||||||
|
-sin, cos, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float cotan = 1.0f / tanf(fovyRadians / 2.0f);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, cotan, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f,
|
||||||
|
0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float ral = right + left;
|
||||||
|
float rsl = right - left;
|
||||||
|
float tsb = top - bottom;
|
||||||
|
float tab = top + bottom;
|
||||||
|
float fan = farZ + nearZ;
|
||||||
|
float fsn = farZ - nearZ;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f,
|
||||||
|
ral / rsl, tab / tsb, -fan / fsn, -1.0f,
|
||||||
|
0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float ral = right + left;
|
||||||
|
float rsl = right - left;
|
||||||
|
float tab = top + bottom;
|
||||||
|
float tsb = top - bottom;
|
||||||
|
float fan = farZ + nearZ;
|
||||||
|
float fsn = farZ - nearZ;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 2.0f / tsb, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, -2.0f / fsn, 0.0f,
|
||||||
|
-ral / rsl, -tab / tsb, -fan / fsn, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,
|
||||||
|
float centerX, float centerY, float centerZ,
|
||||||
|
float upX, float upY, float upZ)
|
||||||
|
{
|
||||||
|
GLKVector3 ev = { eyeX, eyeY, eyeZ };
|
||||||
|
GLKVector3 cv = { centerX, centerY, centerZ };
|
||||||
|
GLKVector3 uv = { upX, upY, upZ };
|
||||||
|
GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
|
||||||
|
GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
|
||||||
|
GLKVector3 v = GLKVector3CrossProduct(n, u);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
|
||||||
|
u.v[1], v.v[1], n.v[1], 0.0f,
|
||||||
|
u.v[2], v.v[2], n.v[2], 0.0f,
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(u), ev),
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(v), ev),
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(n), ev),
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
GLKMatrix2 m = { matrix.m[0], matrix.m[1],
|
||||||
|
matrix.m[4], matrix.m[5] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row)
|
||||||
|
{
|
||||||
|
GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] };
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4_t v = vld1q_f32(&(matrix.m[column * 4]));
|
||||||
|
return *(GLKVector4 *)&v;
|
||||||
|
#else
|
||||||
|
GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] };
|
||||||
|
return v;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector)
|
||||||
|
{
|
||||||
|
matrix.m[row] = vector.v[0];
|
||||||
|
matrix.m[row + 4] = vector.v[1];
|
||||||
|
matrix.m[row + 8] = vector.v[2];
|
||||||
|
matrix.m[row + 12] = vector.v[3];
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float *dst = &(matrix.m[column * 4]);
|
||||||
|
vst1q_f32(dst, vld1q_f32(vector.v));
|
||||||
|
return matrix;
|
||||||
|
#else
|
||||||
|
matrix.m[column * 4 + 0] = vector.v[0];
|
||||||
|
matrix.m[column * 4 + 1] = vector.v[1];
|
||||||
|
matrix.m[column * 4 + 2] = vector.v[2];
|
||||||
|
matrix.m[column * 4 + 3] = vector.v[3];
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m = vld4q_f32(matrix.m);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12],
|
||||||
|
matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13],
|
||||||
|
matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14],
|
||||||
|
matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0));
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0));
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0));
|
||||||
|
m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3));
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] * matrixRight.m[0] + matrixLeft.m[4] * matrixRight.m[1] + matrixLeft.m[8] * matrixRight.m[2] + matrixLeft.m[12] * matrixRight.m[3];
|
||||||
|
m.m[4] = matrixLeft.m[0] * matrixRight.m[4] + matrixLeft.m[4] * matrixRight.m[5] + matrixLeft.m[8] * matrixRight.m[6] + matrixLeft.m[12] * matrixRight.m[7];
|
||||||
|
m.m[8] = matrixLeft.m[0] * matrixRight.m[8] + matrixLeft.m[4] * matrixRight.m[9] + matrixLeft.m[8] * matrixRight.m[10] + matrixLeft.m[12] * matrixRight.m[11];
|
||||||
|
m.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14] + matrixLeft.m[12] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[1] = matrixLeft.m[1] * matrixRight.m[0] + matrixLeft.m[5] * matrixRight.m[1] + matrixLeft.m[9] * matrixRight.m[2] + matrixLeft.m[13] * matrixRight.m[3];
|
||||||
|
m.m[5] = matrixLeft.m[1] * matrixRight.m[4] + matrixLeft.m[5] * matrixRight.m[5] + matrixLeft.m[9] * matrixRight.m[6] + matrixLeft.m[13] * matrixRight.m[7];
|
||||||
|
m.m[9] = matrixLeft.m[1] * matrixRight.m[8] + matrixLeft.m[5] * matrixRight.m[9] + matrixLeft.m[9] * matrixRight.m[10] + matrixLeft.m[13] * matrixRight.m[11];
|
||||||
|
m.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14] + matrixLeft.m[13] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[2] = matrixLeft.m[2] * matrixRight.m[0] + matrixLeft.m[6] * matrixRight.m[1] + matrixLeft.m[10] * matrixRight.m[2] + matrixLeft.m[14] * matrixRight.m[3];
|
||||||
|
m.m[6] = matrixLeft.m[2] * matrixRight.m[4] + matrixLeft.m[6] * matrixRight.m[5] + matrixLeft.m[10] * matrixRight.m[6] + matrixLeft.m[14] * matrixRight.m[7];
|
||||||
|
m.m[10] = matrixLeft.m[2] * matrixRight.m[8] + matrixLeft.m[6] * matrixRight.m[9] + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11];
|
||||||
|
m.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[3] = matrixLeft.m[3] * matrixRight.m[0] + matrixLeft.m[7] * matrixRight.m[1] + matrixLeft.m[11] * matrixRight.m[2] + matrixLeft.m[15] * matrixRight.m[3];
|
||||||
|
m.m[7] = matrixLeft.m[3] * matrixRight.m[4] + matrixLeft.m[7] * matrixRight.m[5] + matrixLeft.m[11] * matrixRight.m[6] + matrixLeft.m[15] * matrixRight.m[7];
|
||||||
|
m.m[11] = matrixLeft.m[3] * matrixRight.m[8] + matrixLeft.m[7] * matrixRight.m[9] + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11];
|
||||||
|
m.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);
|
||||||
|
m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);
|
||||||
|
m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);
|
||||||
|
m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] + matrixRight.m[0];
|
||||||
|
m.m[1] = matrixLeft.m[1] + matrixRight.m[1];
|
||||||
|
m.m[2] = matrixLeft.m[2] + matrixRight.m[2];
|
||||||
|
m.m[3] = matrixLeft.m[3] + matrixRight.m[3];
|
||||||
|
|
||||||
|
m.m[4] = matrixLeft.m[4] + matrixRight.m[4];
|
||||||
|
m.m[5] = matrixLeft.m[5] + matrixRight.m[5];
|
||||||
|
m.m[6] = matrixLeft.m[6] + matrixRight.m[6];
|
||||||
|
m.m[7] = matrixLeft.m[7] + matrixRight.m[7];
|
||||||
|
|
||||||
|
m.m[8] = matrixLeft.m[8] + matrixRight.m[8];
|
||||||
|
m.m[9] = matrixLeft.m[9] + matrixRight.m[9];
|
||||||
|
m.m[10] = matrixLeft.m[10] + matrixRight.m[10];
|
||||||
|
m.m[11] = matrixLeft.m[11] + matrixRight.m[11];
|
||||||
|
|
||||||
|
m.m[12] = matrixLeft.m[12] + matrixRight.m[12];
|
||||||
|
m.m[13] = matrixLeft.m[13] + matrixRight.m[13];
|
||||||
|
m.m[14] = matrixLeft.m[14] + matrixRight.m[14];
|
||||||
|
m.m[15] = matrixLeft.m[15] + matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);
|
||||||
|
m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);
|
||||||
|
m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);
|
||||||
|
m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] - matrixRight.m[0];
|
||||||
|
m.m[1] = matrixLeft.m[1] - matrixRight.m[1];
|
||||||
|
m.m[2] = matrixLeft.m[2] - matrixRight.m[2];
|
||||||
|
m.m[3] = matrixLeft.m[3] - matrixRight.m[3];
|
||||||
|
|
||||||
|
m.m[4] = matrixLeft.m[4] - matrixRight.m[4];
|
||||||
|
m.m[5] = matrixLeft.m[5] - matrixRight.m[5];
|
||||||
|
m.m[6] = matrixLeft.m[6] - matrixRight.m[6];
|
||||||
|
m.m[7] = matrixLeft.m[7] - matrixRight.m[7];
|
||||||
|
|
||||||
|
m.m[8] = matrixLeft.m[8] - matrixRight.m[8];
|
||||||
|
m.m[9] = matrixLeft.m[9] - matrixRight.m[9];
|
||||||
|
m.m[10] = matrixLeft.m[10] - matrixRight.m[10];
|
||||||
|
m.m[11] = matrixLeft.m[11] - matrixRight.m[11];
|
||||||
|
|
||||||
|
m.m[12] = matrixLeft.m[12] - matrixRight.m[12];
|
||||||
|
m.m[13] = matrixLeft.m[13] - matrixRight.m[13];
|
||||||
|
m.m[14] = matrixLeft.m[14] - matrixRight.m[14];
|
||||||
|
m.m[15] = matrixLeft.m[15] - matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12],
|
||||||
|
matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13],
|
||||||
|
matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],
|
||||||
|
matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],
|
||||||
|
matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],
|
||||||
|
matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],
|
||||||
|
matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx,
|
||||||
|
matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy,
|
||||||
|
matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz,
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],
|
||||||
|
matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],
|
||||||
|
matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],
|
||||||
|
matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],
|
||||||
|
matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f));
|
||||||
|
return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));
|
||||||
|
return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));
|
||||||
|
return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4_t v;
|
||||||
|
|
||||||
|
iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]);
|
||||||
|
iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]);
|
||||||
|
iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]);
|
||||||
|
iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]);
|
||||||
|
|
||||||
|
iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]);
|
||||||
|
iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]);
|
||||||
|
|
||||||
|
v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]);
|
||||||
|
|
||||||
|
return *(GLKVector4 *)&v;
|
||||||
|
#else
|
||||||
|
GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] };
|
||||||
|
return v;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __GLK_MATRIX_4_H */
|
||||||
99
samples/C/NWMan.h
Normal file
99
samples/C/NWMan.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#ifndef _NME_WMAN_H
|
||||||
|
#define _NME_WMAN_H
|
||||||
|
|
||||||
|
// Internal window manager API
|
||||||
|
|
||||||
|
#include "NCompat.h"
|
||||||
|
|
||||||
|
START_HEAD
|
||||||
|
|
||||||
|
#include "NPos.h"
|
||||||
|
#include "NUtil.h"
|
||||||
|
#include "NTypes.h"
|
||||||
|
|
||||||
|
NTS(NWMan_event);
|
||||||
|
|
||||||
|
NSTRUCT(NWMan, {
|
||||||
|
// Init stuff
|
||||||
|
bool (*init)();
|
||||||
|
bool (*destroy)();
|
||||||
|
|
||||||
|
// Window stuff
|
||||||
|
bool (*create_window)();
|
||||||
|
bool (*destroy_window)();
|
||||||
|
|
||||||
|
void (*swap_buffers)();
|
||||||
|
|
||||||
|
// Event stuff
|
||||||
|
bool (*next_event)(NWMan_event* event);
|
||||||
|
|
||||||
|
// Time stuff
|
||||||
|
uint (*get_millis)();
|
||||||
|
void (*sleep)(uint millis);
|
||||||
|
|
||||||
|
// Info
|
||||||
|
int rshift_key;
|
||||||
|
int lshift_key;
|
||||||
|
int left_key;
|
||||||
|
int right_key;
|
||||||
|
});
|
||||||
|
|
||||||
|
NENUM(NWMan_event_type, {
|
||||||
|
N_WMAN_MOUSE_MOVE = 0,
|
||||||
|
N_WMAN_MOUSE_BUTTON = 1,
|
||||||
|
N_WMAN_MOUSE_WHEEL = 2,
|
||||||
|
|
||||||
|
N_WMAN_KEYBOARD = 10,
|
||||||
|
|
||||||
|
N_WMAN_QUIT = 20,
|
||||||
|
N_WMAN_RESIZE = 21,
|
||||||
|
N_WMAN_FOCUS = 22
|
||||||
|
});
|
||||||
|
|
||||||
|
#define N_WMAN_MOUSE_LEFT 0
|
||||||
|
#define N_WMAN_MOUSE_RIGHT 1
|
||||||
|
#define N_WMAN_MOUSE_MIDDLE 2
|
||||||
|
|
||||||
|
NSTRUCT(NWMan_event, {
|
||||||
|
NWMan_event_type type;
|
||||||
|
|
||||||
|
union {
|
||||||
|
// Mouse
|
||||||
|
|
||||||
|
NPos2i mouse_pos;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
short id;
|
||||||
|
bool state;
|
||||||
|
} mouse_button;
|
||||||
|
|
||||||
|
signed char mouse_wheel; // 1 if up, -1 if down
|
||||||
|
|
||||||
|
// Keyboard
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int key;
|
||||||
|
bool state;
|
||||||
|
} keyboard;
|
||||||
|
|
||||||
|
// Window
|
||||||
|
|
||||||
|
bool window_quit; // Will always be true if WM_QUIT
|
||||||
|
|
||||||
|
NPos2i window_size;
|
||||||
|
|
||||||
|
bool window_focus;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
NWMan_event NWMan_event_new(NWMan_event_type type);
|
||||||
|
|
||||||
|
|
||||||
|
bool NWMan_init();
|
||||||
|
bool NWMan_destroy();
|
||||||
|
|
||||||
|
extern NWMan N_WMan;
|
||||||
|
|
||||||
|
END_HEAD
|
||||||
|
|
||||||
|
#endif
|
||||||
27
samples/C/Nightmare.h
Normal file
27
samples/C/Nightmare.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _NMEX_NIGHTMARE_H
|
||||||
|
#define _NMEX_NIGHTMARE_H
|
||||||
|
|
||||||
|
//#define NMEX
|
||||||
|
|
||||||
|
#include "../src/NCompat.h"
|
||||||
|
|
||||||
|
START_HEAD
|
||||||
|
|
||||||
|
#include "../src/NTypes.h"
|
||||||
|
#include "../src/NUtil.h"
|
||||||
|
#include "../src/NPorting.h"
|
||||||
|
#include "../src/NGlobals.h"
|
||||||
|
#include "../src/NLog.h"
|
||||||
|
#include "../src/NWMan.h"
|
||||||
|
#include "../src/NRsc.h"
|
||||||
|
#include "../src/NShader.h"
|
||||||
|
#include "../src/NSquare.h"
|
||||||
|
#include "../src/NImage.h"
|
||||||
|
#include "../src/NSprite.h"
|
||||||
|
#include "../src/NSpritesheet.h"
|
||||||
|
#include "../src/NEntity.h"
|
||||||
|
#include "../src/Game.h"
|
||||||
|
|
||||||
|
END_HEAD
|
||||||
|
|
||||||
|
#endif
|
||||||
47
samples/C/bitmap.h
Normal file
47
samples/C/bitmap.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2010 Christoph Sünderhauf
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "generic.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t numbits;
|
||||||
|
/* an array large enough for numbits to fit in. Might
|
||||||
|
* (if numbits%8!=0) have some spare bits at the end
|
||||||
|
*/
|
||||||
|
uint32_t* bits;
|
||||||
|
} bitmap_t;
|
||||||
|
|
||||||
|
|
||||||
|
// creates a new bitmap.
|
||||||
|
// CONTENT IS RANDOM! - use bitmap_clearall() to clear the bitmap.
|
||||||
|
bitmap_t bitmap_init(uint32_t numbits);
|
||||||
|
|
||||||
|
// returns 1 or 0
|
||||||
|
uint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum);
|
||||||
|
// sets a bit (to 1)
|
||||||
|
void bitmap_set(bitmap_t bitmap, uint32_t bitnum);
|
||||||
|
// clears a bit (to 0)
|
||||||
|
void bitmap_clear(bitmap_t bitmap, uint32_t bitnum);
|
||||||
|
|
||||||
|
// clears every bit to 0
|
||||||
|
void bitmap_clearAll(bitmap_t bitmap);
|
||||||
|
|
||||||
|
// finds the first bit set to 0 returns 0 if no cleared bit found (0 is also returned if the first bit is cleared)
|
||||||
|
uint32_t bitmap_findFirstClear(bitmap_t bitmap);
|
||||||
44
samples/C/color.h
Normal file
44
samples/C/color.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Fritz Grimpen
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t background;
|
||||||
|
uint32_t foreground;
|
||||||
|
} console_color_t;
|
||||||
|
|
||||||
|
#define CONSOLE_COLOR_BLACK 0x0
|
||||||
|
#define CONSOLE_COLOR_BLUE 0x1
|
||||||
|
#define CONSOLE_COLOR_GREEN 0x2
|
||||||
|
#define CONSOLE_COLOR_CYAN 0x3
|
||||||
|
#define CONSOLE_COLOR_RED 0x4
|
||||||
|
#define CONSOLE_COLOR_MAGENTA 0x5
|
||||||
|
#define CONSOLE_COLOR_BROWN 0x6
|
||||||
|
#define CONSOLE_COLOR_LGREY 0x7
|
||||||
|
#define CONSOLE_COLOR_DGREY 0x8
|
||||||
|
#define CONSOLE_COLOR_LBLUE 0x9
|
||||||
|
#define CONSOLE_COLOR_LGREEN 0xa
|
||||||
|
#define CONSOLE_COLOR_LCYAN 0xb
|
||||||
|
#define CONSOLE_COLOR_LRED 0xc
|
||||||
|
#define CONSOLE_COLOR_LMAGENTA 0xd
|
||||||
|
#define CONSOLE_COLOR_YELLOW 0xe
|
||||||
|
#define CONSOLE_COLOR_WHITE 0xf
|
||||||
|
|
||||||
52
samples/C/driver.h
Normal file
52
samples/C/driver.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Fritz Grimpen
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <console/info.h>
|
||||||
|
|
||||||
|
#define CONSOLE_DRV_CAP_CLEAR 0x01
|
||||||
|
#define CONSOLE_DRV_CAP_SCROLL 0x02
|
||||||
|
#define CONSOLE_DRV_CAP_SET_CURSOR 0x04
|
||||||
|
|
||||||
|
// Input modifier keys
|
||||||
|
typedef struct {
|
||||||
|
bool shift_left:1;
|
||||||
|
bool shift_right:1;
|
||||||
|
bool control_left:1;
|
||||||
|
bool control_right:1;
|
||||||
|
bool alt:1;
|
||||||
|
bool super:1;
|
||||||
|
} console_modifiers_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char character;
|
||||||
|
console_modifiers_t* modifiers;
|
||||||
|
} console_read_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int (*write)(console_info_t*, char);
|
||||||
|
console_read_t* (*read)(console_info_t*);
|
||||||
|
|
||||||
|
int capabilities;
|
||||||
|
|
||||||
|
int (*_clear)(console_info_t*);
|
||||||
|
int (*scroll)(console_info_t*, int32_t);
|
||||||
|
void (*setCursor)(console_info_t*, uint32_t, uint32_t);
|
||||||
|
} console_driver_t;
|
||||||
56
samples/C/dynarray.cats
Normal file
56
samples/C/dynarray.cats
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/* ******************************************************************* */
|
||||||
|
/* */
|
||||||
|
/* Applied Type System */
|
||||||
|
/* */
|
||||||
|
/* ******************************************************************* */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** ATS/Postiats - Unleashing the Potential of Types!
|
||||||
|
** Copyright (C) 2011-20?? 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: March, 2013 *)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#ifndef ATSHOME_LIBATS_DYNARRAY_CATS
|
||||||
|
#define ATSHOME_LIBATS_DYNARRAY_CATS
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#define atslib_dynarray_memcpy memcpy
|
||||||
|
#define atslib_dynarray_memmove memmove
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
#endif // ifndef ATSHOME_LIBATS_DYNARRAY_CATS
|
||||||
|
|
||||||
|
/* ****** ****** */
|
||||||
|
|
||||||
|
/* end of [dynarray.cats] */
|
||||||
70
samples/C/elf.h
Normal file
70
samples/C/elf.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Lukas Martini
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <tasks/scheduler.h>
|
||||||
|
|
||||||
|
#define ELF_TYPE_NONE 0
|
||||||
|
#define ELF_TYPE_REL 1
|
||||||
|
#define ELF_TYPE_EXEC 2
|
||||||
|
#define ELF_TYPE_DYN 3
|
||||||
|
#define ELF_TYPE_CORE 4
|
||||||
|
|
||||||
|
#define ELF_ARCH_NONE 0
|
||||||
|
#define ELF_ARCH_386 3
|
||||||
|
|
||||||
|
#define ELF_VERSION_CURRENT 1
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char magic[4];
|
||||||
|
/* Note: There _is_ other stuff in here, but we don't need it */
|
||||||
|
unsigned char pad[12];
|
||||||
|
} __attribute__((packed)) elf_ident_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t offset;
|
||||||
|
void* virtaddr;
|
||||||
|
void* physaddr;
|
||||||
|
uint32_t filesize;
|
||||||
|
uint32_t memsize;
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t alignment;
|
||||||
|
} __attribute__((packed)) elf_program_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
elf_ident_t ident;
|
||||||
|
uint16_t type; /* Object file type */
|
||||||
|
uint16_t machine; /* Architecture */
|
||||||
|
uint32_t version; /* Object file version */
|
||||||
|
void* entry; /* Entry point virtual address */
|
||||||
|
uint32_t phoff; /* Program header table file offset */
|
||||||
|
uint32_t shoff; /* Section header table file offset */
|
||||||
|
uint32_t flags; /* Processor-specific flags */
|
||||||
|
uint16_t ehsize; /* ELF header size in bytes */
|
||||||
|
uint16_t phentsize; /* Program header table entry size */
|
||||||
|
uint16_t phnum; /* Program header table entry count */
|
||||||
|
uint16_t shentsize; /* Section header table entry size */
|
||||||
|
uint16_t shnum; /* Section header table entry count */
|
||||||
|
uint16_t shstrndx; /* Section header string table index */
|
||||||
|
} __attribute__((packed)) elf_t;
|
||||||
|
|
||||||
|
task_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc);
|
||||||
|
task_t* elf_load_file(char* path, char** environ, char** argv, int argc);
|
||||||
28
samples/C/exception.zep.c
generated
Normal file
28
samples/C/exception.zep.c
generated
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "../../ext_config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <php.h>
|
||||||
|
#include "../../php_ext.h"
|
||||||
|
#include "../../ext.h"
|
||||||
|
|
||||||
|
#include <Zend/zend_operators.h>
|
||||||
|
#include <Zend/zend_exceptions.h>
|
||||||
|
#include <Zend/zend_interfaces.h>
|
||||||
|
|
||||||
|
#include "kernel/main.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test\Router\Exception
|
||||||
|
*
|
||||||
|
* Exceptions generated by the router
|
||||||
|
*/
|
||||||
|
ZEPHIR_INIT_CLASS(Test_Router_Exception) {
|
||||||
|
|
||||||
|
ZEPHIR_REGISTER_CLASS_EX(Test\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0);
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
|
||||||
|
}
|
||||||
4
samples/C/exception.zep.h
generated
Normal file
4
samples/C/exception.zep.h
generated
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
extern zend_class_entry *test_router_exception_ce;
|
||||||
|
|
||||||
|
ZEPHIR_INIT_CLASS(Test_Router_Exception);
|
||||||
2310
samples/C/filenames/script
Executable file
2310
samples/C/filenames/script
Executable file
File diff suppressed because it is too large
Load Diff
45
samples/C/filter.h
Normal file
45
samples/C/filter.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Fritz Grimpen
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <console/info.h>
|
||||||
|
#include <console/driver.h>
|
||||||
|
|
||||||
|
struct console_filter {
|
||||||
|
// General callback for all actions etc.
|
||||||
|
// Preferred prototype:
|
||||||
|
// char <name>(char c, console_info_t *info, console_driver_t *input, console_driver_t *output);
|
||||||
|
char (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*);
|
||||||
|
|
||||||
|
// Specific callbacks for read and write
|
||||||
|
// Preferred prototype:
|
||||||
|
// char <name>(char c, console_info_t *info, console_driver_t *input);
|
||||||
|
char (*read_callback)(char, console_info_t*, console_driver_t*);
|
||||||
|
|
||||||
|
// Preferred prototype:
|
||||||
|
// char <name>(char c, console_info_t *info, console_driver_t *output);
|
||||||
|
char (*write_callback)(char, console_info_t*, console_driver_t*);
|
||||||
|
|
||||||
|
// The next filter in the filter chain
|
||||||
|
struct console_filter* next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct console_filter console_filter_t;
|
||||||
|
|
||||||
44
samples/C/info.h
Normal file
44
samples/C/info.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Fritz Grimpen
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <console/color.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t cursor_x;
|
||||||
|
uint32_t cursor_y;
|
||||||
|
|
||||||
|
uint32_t rows;
|
||||||
|
uint32_t columns;
|
||||||
|
|
||||||
|
uint32_t tabstop;
|
||||||
|
|
||||||
|
console_color_t default_color;
|
||||||
|
console_color_t current_color;
|
||||||
|
|
||||||
|
uint8_t nonblocking;
|
||||||
|
uint8_t reverse_video;
|
||||||
|
uint8_t bold;
|
||||||
|
uint8_t blink;
|
||||||
|
uint8_t underline;
|
||||||
|
uint8_t newline_mode;
|
||||||
|
uint8_t auto_echo;
|
||||||
|
uint8_t handle_backspace;
|
||||||
|
} console_info_t;
|
||||||
47
samples/C/interface.h
Normal file
47
samples/C/interface.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Fritz Grimpen
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <console/info.h>
|
||||||
|
#include <console/filter.h>
|
||||||
|
#include <console/driver.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
console_info_t info;
|
||||||
|
|
||||||
|
console_filter_t* input_filter;
|
||||||
|
console_filter_t* output_filter;
|
||||||
|
|
||||||
|
console_driver_t* input_driver;
|
||||||
|
console_driver_t* output_driver;
|
||||||
|
} console_t;
|
||||||
|
|
||||||
|
console_t* default_console;
|
||||||
|
|
||||||
|
// Generate raw console, connected to the Display, Keyboard and the
|
||||||
|
// ECMA-48-Filter
|
||||||
|
void console_init();
|
||||||
|
|
||||||
|
size_t console_write(console_t* console, const char* buffer, int32_t length);
|
||||||
|
#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer))
|
||||||
|
size_t console_read(console_t* console, char* buffer, size_t length);
|
||||||
|
size_t console_scroll(console_t* console, int32_t pages);
|
||||||
|
|
||||||
|
void console_clear(console_t* console);
|
||||||
50
samples/C/ip4.h
Normal file
50
samples/C/ip4.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Lukas Martini
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <net/net.h>
|
||||||
|
|
||||||
|
#define IP4_TOS_ICMP 0
|
||||||
|
|
||||||
|
typedef uint32_t ip4_addr_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int hl:4; /* both fields are 4 bits */
|
||||||
|
unsigned int version:4;
|
||||||
|
uint8_t tos;
|
||||||
|
uint16_t len;
|
||||||
|
uint16_t id;
|
||||||
|
uint16_t off;
|
||||||
|
uint8_t ttl;
|
||||||
|
uint8_t p;
|
||||||
|
uint16_t checksum;
|
||||||
|
ip4_addr_t src;
|
||||||
|
ip4_addr_t dst;
|
||||||
|
} ip4_header_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t code;
|
||||||
|
uint16_t checksum;
|
||||||
|
uint16_t id;
|
||||||
|
uint16_t sequence;
|
||||||
|
} ip4_icmp_header_t;
|
||||||
|
|
||||||
|
void ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw);
|
||||||
110
samples/C/multiboot.h
Normal file
110
samples/C/multiboot.h
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2010, 2011 Lukas Martini
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
|
||||||
|
#define MULTIBOOT_KERNELMAGIC 0x2BADB002
|
||||||
|
|
||||||
|
#define MULTIBOOT_FLAG_MEM 0x001
|
||||||
|
#define MULTIBOOT_FLAG_DEVICE 0x002
|
||||||
|
#define MULTIBOOT_FLAG_CMDLINE 0x004
|
||||||
|
#define MULTIBOOT_FLAG_MODS 0x008
|
||||||
|
#define MULTIBOOT_FLAG_AOUT 0x010
|
||||||
|
#define MULTIBOOT_FLAG_ELF 0x020
|
||||||
|
#define MULTIBOOT_FLAG_MMAP 0x040
|
||||||
|
#define MULTIBOOT_FLAG_CONFIG 0x080
|
||||||
|
#define MULTIBOOT_FLAG_LOADER 0x100
|
||||||
|
#define MULTIBOOT_FLAG_APM 0x200
|
||||||
|
#define MULTIBOOT_FLAG_VBE 0x400
|
||||||
|
|
||||||
|
// The symbol table for a.out.
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t tabSize;
|
||||||
|
uint32_t strSize;
|
||||||
|
uint32_t addr;
|
||||||
|
uint32_t reserved;
|
||||||
|
} __attribute__((packed)) multiboot_aoutSymbolTable_t;
|
||||||
|
|
||||||
|
// The section header table for ELF.
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t num;
|
||||||
|
uint32_t size;
|
||||||
|
uint32_t addr;
|
||||||
|
uint32_t shndx;
|
||||||
|
} __attribute__((packed)) multiboot_elfSectionHeaderTable_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t size;
|
||||||
|
uint64_t addr;
|
||||||
|
uint64_t length;
|
||||||
|
uint32_t type;
|
||||||
|
} __attribute__((packed)) multiboot_memoryMap_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t start;
|
||||||
|
uint32_t end;
|
||||||
|
char* cmdLine;
|
||||||
|
uint32_t reserved;
|
||||||
|
} __attribute__((packed)) multiboot_module_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t memLower;
|
||||||
|
uint32_t memUpper;
|
||||||
|
uint32_t bootDevice;
|
||||||
|
char* cmdLine;
|
||||||
|
uint32_t modsCount;
|
||||||
|
multiboot_module_t* modsAddr;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
multiboot_aoutSymbolTable_t aoutSym;
|
||||||
|
multiboot_elfSectionHeaderTable_t elfSec;
|
||||||
|
} u;
|
||||||
|
|
||||||
|
uint32_t mmapLength;
|
||||||
|
uint32_t mmapAddr;
|
||||||
|
|
||||||
|
uint32_t drivesLength;
|
||||||
|
uint32_t drivesAddr;
|
||||||
|
|
||||||
|
// ROM configuration table
|
||||||
|
uint32_t configTable;
|
||||||
|
|
||||||
|
char* bootLoaderName;
|
||||||
|
uint32_t apmTable;
|
||||||
|
|
||||||
|
// Video
|
||||||
|
uint32_t vbeControlInfo;
|
||||||
|
uint32_t vbeModeInfo;
|
||||||
|
uint16_t vbeMode;
|
||||||
|
uint16_t vbeInterfaceSeg;
|
||||||
|
uint16_t vbeInterfaceOff;
|
||||||
|
uint16_t vbeInterfaceLen;
|
||||||
|
} __attribute__((packed)) multiboot_info_t;
|
||||||
|
|
||||||
|
multiboot_info_t* multiboot_info;
|
||||||
|
|
||||||
|
void arch_multiboot_printInfo();
|
||||||
89
samples/C/ntru_encrypt.h
Normal file
89
samples/C/ntru_encrypt.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 FH Bielefeld
|
||||||
|
*
|
||||||
|
* This file is part of a FH Bielefeld project.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file ntru_encrypt.h
|
||||||
|
* Header for the internal API of ntru_encrypt.c.
|
||||||
|
* @brief header for encrypt.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PQC_ENCRYPT_H
|
||||||
|
#define PQC_ENCRYPT_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "ntru_params.h"
|
||||||
|
#include "ntru_poly.h"
|
||||||
|
#include "ntru_string.h"
|
||||||
|
|
||||||
|
#include <fmpz_poly.h>
|
||||||
|
#include <fmpz.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* encrypt the msg, using the math:
|
||||||
|
* e = (h ∗ r) + m (mod q)
|
||||||
|
*
|
||||||
|
* e = the encrypted poly
|
||||||
|
*
|
||||||
|
* h = the public key
|
||||||
|
*
|
||||||
|
* r = the random poly
|
||||||
|
*
|
||||||
|
* m = the message poly
|
||||||
|
*
|
||||||
|
* q = large mod
|
||||||
|
*
|
||||||
|
* @param msg_tern the message to encrypt, in ternary format
|
||||||
|
* @param pub_key the public key
|
||||||
|
* @param rnd the random poly (should have relatively small
|
||||||
|
* coefficients, but not restricted to {-1, 0, 1})
|
||||||
|
* @param out the output poly which is in the range {0, q-1}
|
||||||
|
* (not ternary!) [out]
|
||||||
|
* @param params ntru_params the ntru context
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ntru_encrypt_poly(
|
||||||
|
const fmpz_poly_t msg_tern,
|
||||||
|
const fmpz_poly_t pub_key,
|
||||||
|
const fmpz_poly_t rnd,
|
||||||
|
fmpz_poly_t out,
|
||||||
|
const ntru_params *params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypt a message in the form of a null-terminated char array and
|
||||||
|
* return a string.
|
||||||
|
*
|
||||||
|
* @param msg the message
|
||||||
|
* @param pub_key the public key
|
||||||
|
* @param rnd the random poly (should have relatively small
|
||||||
|
* coefficients, but not restricted to {-1, 0, 1})
|
||||||
|
* @param params ntru_params the ntru context
|
||||||
|
* @return the newly allocated encrypted string
|
||||||
|
*/
|
||||||
|
string *
|
||||||
|
ntru_encrypt_string(
|
||||||
|
const string *msg,
|
||||||
|
const fmpz_poly_t pub_key,
|
||||||
|
const fmpz_poly_t rnd,
|
||||||
|
const ntru_params *params);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PQC_ENCRYPT_H */
|
||||||
43
samples/C/portio.h
Normal file
43
samples/C/portio.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Copyright © 2011 Lukas Martini
|
||||||
|
*
|
||||||
|
* This file is part of Xelix.
|
||||||
|
*
|
||||||
|
* Xelix is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Xelix 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 Xelix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <lib/generic.h>
|
||||||
|
#include <lib/stdint.h>
|
||||||
|
|
||||||
|
// Legacy
|
||||||
|
#define outb(args...) portio_out8(args)
|
||||||
|
#define outw(args...) portio_out16(args)
|
||||||
|
#define outl(args...) portio_out32(args)
|
||||||
|
#define outq(args...) portio_out64(args)
|
||||||
|
|
||||||
|
#define inb(args...) portio_in8(args)
|
||||||
|
#define inw(args...) portio_in16(args)
|
||||||
|
#define inl(args...) portio_in32(args)
|
||||||
|
#define inq(args...) portio_in64(args)
|
||||||
|
|
||||||
|
void portio_out8(uint16_t port, uint8_t value);
|
||||||
|
void portio_out16(uint16_t port, uint16_t value);
|
||||||
|
void portio_out32(uint16_t port, uint32_t value);
|
||||||
|
void portio_out64(uint16_t port, uint64_t value);
|
||||||
|
|
||||||
|
uint8_t portio_in8(uint16_t port);
|
||||||
|
uint16_t portio_in16(uint16_t port);
|
||||||
|
uint32_t portio_in32(uint16_t port);
|
||||||
|
uint64_t portio_in64(uint16_t port);
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user