mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
256 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c78dd2c66 | ||
|
|
3988f3e7a7 | ||
|
|
d9a4e831b4 | ||
|
|
45c27f26a2 | ||
|
|
0fbc29bf68 | ||
|
|
5569d2056d | ||
|
|
be262d0b4f | ||
|
|
33ce2d7264 | ||
|
|
c486f56204 | ||
|
|
9f3b7d0ba5 | ||
|
|
79f20e8057 | ||
|
|
cd30c7613c | ||
|
|
5aa53c0711 | ||
|
|
c17cdca896 | ||
|
|
ecdae83364 | ||
|
|
31aafa2c78 | ||
|
|
8a911b8ff3 | ||
|
|
9233f1d17f | ||
|
|
77eb36a982 | ||
|
|
4e6e58a099 | ||
|
|
c87976330f | ||
|
|
0e9109c3fc | ||
|
|
12f9295dd7 | ||
|
|
581723748b | ||
|
|
0980e304b1 | ||
|
|
d46a529b6a | ||
|
|
1d2ec4dbc3 | ||
|
|
829eea0139 | ||
|
|
78b2853d70 | ||
|
|
202f3c08cd | ||
|
|
b958779e3d | ||
|
|
00dc775daf | ||
|
|
009a4e67b6 | ||
|
|
faaa4470af | ||
|
|
2a320cb988 | ||
|
|
74931d1bd5 | ||
|
|
3ca93a84b9 | ||
|
|
aa27f18ea6 | ||
|
|
d3e2ea3f71 | ||
|
|
53aa1209ab | ||
|
|
b2a486fed2 | ||
|
|
4f1e5c34b1 | ||
|
|
85c9833081 | ||
|
|
33899b9d6b | ||
|
|
417239004a | ||
|
|
6a1423d28f | ||
|
|
96a23ce388 | ||
|
|
e8d7eed3aa | ||
|
|
9d419c4ab9 | ||
|
|
4eefc1f58e | ||
|
|
0b94b9cda7 | ||
|
|
c736038d94 | ||
|
|
ec562138f8 | ||
|
|
50013e8dd7 | ||
|
|
416c5d1185 | ||
|
|
8869912d31 | ||
|
|
43fa563b77 | ||
|
|
41c6aee8c3 | ||
|
|
8cf575c37d | ||
|
|
4e20928e04 | ||
|
|
3e37bd2680 | ||
|
|
a29f5b2d46 | ||
|
|
4efc6f8c95 | ||
|
|
359699c454 | ||
|
|
346aa99fcf | ||
|
|
d147778677 | ||
|
|
e520209e49 | ||
|
|
338cc16239 | ||
|
|
67ea35094b | ||
|
|
6f0393fcbd | ||
|
|
2923d50d7e | ||
|
|
4e26f609ef | ||
|
|
e86d6e8dd2 | ||
|
|
5fa02ad1fb | ||
|
|
5a06240f69 | ||
|
|
d6e0f74c80 | ||
|
|
a5c08bb203 | ||
|
|
c6dc29abb1 | ||
|
|
ffd984bb7e | ||
|
|
dc5473559b | ||
|
|
8e9c224952 | ||
|
|
d43f111723 | ||
|
|
de9ff713a4 | ||
|
|
98783560ec | ||
|
|
8f31fbbd55 | ||
|
|
e4cdbd2b2b | ||
|
|
ba52e48ceb | ||
|
|
a44ebe493b | ||
|
|
eb0e75e11e | ||
|
|
22c2cf4967 | ||
|
|
39e3688fb8 | ||
|
|
6b83e5fb7b | ||
|
|
dd2e5ffe07 | ||
|
|
f6b6c4e165 | ||
|
|
608ed60b5c | ||
|
|
2ce2945058 | ||
|
|
c8d376754e | ||
|
|
ecaef91fa1 | ||
|
|
d265b78e7e | ||
|
|
5a5bf7d5e5 | ||
|
|
e46781b903 | ||
|
|
9543a8c8e9 | ||
|
|
6ac1ac9232 | ||
|
|
1bbb919fef | ||
|
|
71dfed0e45 | ||
|
|
a2db058ce4 | ||
|
|
12695fee2f | ||
|
|
4a775dca37 | ||
|
|
d7c689fd6b | ||
|
|
20b8188384 | ||
|
|
26310d9515 | ||
|
|
e38cc75da5 | ||
|
|
8d55fc1bd5 | ||
|
|
7e63399196 | ||
|
|
520e5a5cfe | ||
|
|
5d85692c24 | ||
|
|
676861fff3 | ||
|
|
6589bd9dc7 | ||
|
|
e32a4f13ef | ||
|
|
4e4d851f71 | ||
|
|
a3628f86da | ||
|
|
fe70965906 | ||
|
|
c863435c84 | ||
|
|
eeec48198a | ||
|
|
82167063da | ||
|
|
3ae89b48ba | ||
|
|
cd9401c424 | ||
|
|
e7e8a7d835 | ||
|
|
7654032d2e | ||
|
|
05b536fc61 | ||
|
|
ebe85788ab | ||
|
|
524337d07b | ||
|
|
f8ce42e169 | ||
|
|
71032cd252 | ||
|
|
41593b3ea7 | ||
|
|
bed8add2f5 | ||
|
|
e424e8e88c | ||
|
|
07d4f218a3 | ||
|
|
67ed060d37 | ||
|
|
3abe081560 | ||
|
|
d3f3c0345c | ||
|
|
855f1a1f86 | ||
|
|
0406a5b326 | ||
|
|
0108ef4386 | ||
|
|
daefff86ff | ||
|
|
fdb962518f | ||
|
|
6564078061 | ||
|
|
39ea9be5f8 | ||
|
|
152b5ade5e | ||
|
|
c525e3fbef | ||
|
|
88c74fa9c2 | ||
|
|
6a54ee767f | ||
|
|
2ea1ff2736 | ||
|
|
a1901fceff | ||
|
|
b4035a3804 | ||
|
|
fc67fc525c | ||
|
|
f0659d3aa5 | ||
|
|
a7a123a8db | ||
|
|
0e5327a77a | ||
|
|
ecd4ae3bda | ||
|
|
7a8bd628e1 | ||
|
|
8e19aea39e | ||
|
|
6fcba83f3e | ||
|
|
d6d7d38eb8 | ||
|
|
c8094d3775 | ||
|
|
de478d2f2d | ||
|
|
991dcef18b | ||
|
|
f30e9270f1 | ||
|
|
1d7ba18b15 | ||
|
|
35a06d6cb8 | ||
|
|
4cf7feb275 | ||
|
|
30298a9ef8 | ||
|
|
cc5f1c57ca | ||
|
|
82af10e3fd | ||
|
|
63c8d2284c | ||
|
|
697380336c | ||
|
|
5fd8d71858 | ||
|
|
5bc88814e2 | ||
|
|
00efd6a463 | ||
|
|
81ca6e7766 | ||
|
|
cd288a8ee4 | ||
|
|
a8d84f3d55 | ||
|
|
600115afed | ||
|
|
e57273c839 | ||
|
|
65491d460e | ||
|
|
8dc4a1308f | ||
|
|
6841b4d259 | ||
|
|
a53423b6e0 | ||
|
|
02f3ba1840 | ||
|
|
e1216ea4ee | ||
|
|
a3227c2c27 | ||
|
|
9f1c950a1f | ||
|
|
c7a0d7b83d | ||
|
|
53c9b2b435 | ||
|
|
b4a77abd82 | ||
|
|
8a622823b0 | ||
|
|
3310d925b6 | ||
|
|
65201b322a | ||
|
|
b71bf19e37 | ||
|
|
1f43664a51 | ||
|
|
7cda13afcb | ||
|
|
e0d890240b | ||
|
|
abf7bee464 | ||
|
|
e73a4ecd0e | ||
|
|
70779c9986 | ||
|
|
1fc4c9fdc6 | ||
|
|
fdec52c89a | ||
|
|
6e40de47da | ||
|
|
28be72892e | ||
|
|
6df0e4591d | ||
|
|
879c63a25e | ||
|
|
ab2e640759 | ||
|
|
b61fe90d12 | ||
|
|
e6c849d92c | ||
|
|
5e4e38b39a | ||
|
|
22d4865c52 | ||
|
|
3247d46e81 | ||
|
|
dad3191238 | ||
|
|
35a13b3633 | ||
|
|
56fb48ea96 | ||
|
|
983ff20d3c | ||
|
|
2d51a5dba4 | ||
|
|
df98c86acd | ||
|
|
98118eb70b | ||
|
|
1ec84da277 | ||
|
|
3112e6deda | ||
|
|
be316c2943 | ||
|
|
68c45be47d | ||
|
|
4584963dd2 | ||
|
|
f382abc2f3 | ||
|
|
9d57e1e1b5 | ||
|
|
2a4150b104 | ||
|
|
09612ae42e | ||
|
|
49e9ee48d0 | ||
|
|
a8719f3e82 | ||
|
|
04e1cc6d0a | ||
|
|
dd7b125869 | ||
|
|
426818120c | ||
|
|
50bd2cc3c8 | ||
|
|
00647be113 | ||
|
|
e930ee1a8e | ||
|
|
48b64c2d31 | ||
|
|
f95365946c | ||
|
|
5ddccaac83 | ||
|
|
51d7c8f905 | ||
|
|
ed71855612 | ||
|
|
742faebd8b | ||
|
|
6763b73d9c | ||
|
|
b056df06f4 | ||
|
|
6bf223e641 | ||
|
|
fa817b6a1d | ||
|
|
adaf4011bc | ||
|
|
4a031107ac | ||
|
|
789607d9bc | ||
|
|
d46530989c | ||
|
|
3c5bcb434c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
||||
/Gemfile.lock
|
||||
.bundle/
|
||||
.idea
|
||||
benchmark/
|
||||
lib/linguist/samples.json
|
||||
/grammars
|
||||
|
||||
77
.gitmodules
vendored
77
.gitmodules
vendored
@@ -12,7 +12,7 @@
|
||||
url = https://github.com/Drako/SublimeBrainfuck
|
||||
[submodule "vendor/grammars/awk-sublime"]
|
||||
path = vendor/grammars/awk-sublime
|
||||
url = https://github.com/JohnNilsson/awk-sublime
|
||||
url = https://github.com/github-linguist/awk-sublime
|
||||
[submodule "vendor/grammars/Sublime-SQF-Language"]
|
||||
path = vendor/grammars/Sublime-SQF-Language
|
||||
url = https://github.com/JonBons/Sublime-SQF-Language
|
||||
@@ -22,15 +22,15 @@
|
||||
[submodule "vendor/grammars/Sublime-REBOL"]
|
||||
path = vendor/grammars/Sublime-REBOL
|
||||
url = https://github.com/Oldes/Sublime-REBOL
|
||||
[submodule "vendor/grammars/Sublime-VimL"]
|
||||
path = vendor/grammars/Sublime-VimL
|
||||
url = https://github.com/SalGnt/Sublime-VimL
|
||||
[submodule "vendor/grammars/language-viml"]
|
||||
path = vendor/grammars/language-viml
|
||||
url = https://github.com/Alhadis/language-viml
|
||||
[submodule "vendor/grammars/ColdFusion"]
|
||||
path = vendor/grammars/ColdFusion
|
||||
url = https://github.com/SublimeText/ColdFusion
|
||||
[submodule "vendor/grammars/NSIS"]
|
||||
path = vendor/grammars/NSIS
|
||||
url = https://github.com/SublimeText/NSIS
|
||||
url = https://github.com/github-linguist/NSIS
|
||||
[submodule "vendor/grammars/NimLime"]
|
||||
path = vendor/grammars/NimLime
|
||||
url = https://github.com/Varriount/NimLime
|
||||
@@ -202,9 +202,6 @@
|
||||
[submodule "vendor/grammars/sublime-robot-plugin"]
|
||||
path = vendor/grammars/sublime-robot-plugin
|
||||
url = https://github.com/shellderp/sublime-robot-plugin
|
||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||
path = vendor/grammars/actionscript3-tmbundle
|
||||
url = https://github.com/honzabrecka/actionscript3-tmbundle
|
||||
[submodule "vendor/grammars/Sublime-QML"]
|
||||
path = vendor/grammars/Sublime-QML
|
||||
url = https://github.com/skozlovf/Sublime-QML
|
||||
@@ -328,9 +325,6 @@
|
||||
[submodule "vendor/grammars/nemerle.tmbundle"]
|
||||
path = vendor/grammars/nemerle.tmbundle
|
||||
url = https://github.com/textmate/nemerle.tmbundle
|
||||
[submodule "vendor/grammars/ninja.tmbundle"]
|
||||
path = vendor/grammars/ninja.tmbundle
|
||||
url = https://github.com/textmate/ninja.tmbundle
|
||||
[submodule "vendor/grammars/objective-c.tmbundle"]
|
||||
path = vendor/grammars/objective-c.tmbundle
|
||||
url = https://github.com/textmate/objective-c.tmbundle
|
||||
@@ -358,9 +352,6 @@
|
||||
[submodule "vendor/grammars/r.tmbundle"]
|
||||
path = vendor/grammars/r.tmbundle
|
||||
url = https://github.com/textmate/r.tmbundle
|
||||
[submodule "vendor/grammars/ruby-haml.tmbundle"]
|
||||
path = vendor/grammars/ruby-haml.tmbundle
|
||||
url = https://github.com/textmate/ruby-haml.tmbundle
|
||||
[submodule "vendor/grammars/scheme.tmbundle"]
|
||||
path = vendor/grammars/scheme.tmbundle
|
||||
url = https://github.com/textmate/scheme.tmbundle
|
||||
@@ -412,9 +403,9 @@
|
||||
[submodule "vendor/grammars/oz-tmbundle"]
|
||||
path = vendor/grammars/oz-tmbundle
|
||||
url = https://github.com/eregon/oz-tmbundle
|
||||
[submodule "vendor/grammars/ebundles"]
|
||||
path = vendor/grammars/ebundles
|
||||
url = https://github.com/ericzou/ebundles
|
||||
[submodule "vendor/grammars/language-batchfile"]
|
||||
path = vendor/grammars/language-batchfile
|
||||
url = https://github.com/mmims/language-batchfile
|
||||
[submodule "vendor/grammars/sublime-mask"]
|
||||
path = vendor/grammars/sublime-mask
|
||||
url = https://github.com/tenbits/sublime-mask
|
||||
@@ -559,7 +550,7 @@
|
||||
url = https://github.com/ShaneWilton/sublime-smali
|
||||
[submodule "vendor/grammars/language-jsoniq"]
|
||||
path = vendor/grammars/language-jsoniq
|
||||
url = http://github.com/wcandillon/language-jsoniq
|
||||
url = https://github.com/wcandillon/language-jsoniq
|
||||
[submodule "vendor/grammars/atom-fsharp"]
|
||||
path = vendor/grammars/atom-fsharp
|
||||
url = https://github.com/fsprojects/atom-fsharp
|
||||
@@ -602,9 +593,6 @@
|
||||
[submodule "vendor/grammars/X10"]
|
||||
path = vendor/grammars/X10
|
||||
url = https://github.com/x10-lang/x10-highlighting
|
||||
[submodule "vendor/grammars/language-babel"]
|
||||
path = vendor/grammars/language-babel
|
||||
url = https://github.com/gandm/language-babel
|
||||
[submodule "vendor/grammars/UrWeb-Language-Definition"]
|
||||
path = vendor/grammars/UrWeb-Language-Definition
|
||||
url = https://github.com/gwalborn/UrWeb-Language-Definition.git
|
||||
@@ -669,8 +657,8 @@
|
||||
path = vendor/grammars/pig-latin
|
||||
url = https://github.com/goblindegook/sublime-text-pig-latin
|
||||
[submodule "vendor/grammars/sourcepawn"]
|
||||
path = vendor/grammars/sourcepawn
|
||||
url = https://github.com/austinwagner/sublime-sourcepawn
|
||||
path = vendor/grammars/sourcepawn
|
||||
url = https://github.com/github-linguist/sublime-sourcepawn
|
||||
[submodule "vendor/grammars/gdscript"]
|
||||
path = vendor/grammars/gdscript
|
||||
url = https://github.com/beefsack/GDScript-sublime
|
||||
@@ -782,6 +770,43 @@ url = https://github.com/austinwagner/sublime-sourcepawn
|
||||
[submodule "vendor/grammars/vhdl"]
|
||||
path = vendor/grammars/vhdl
|
||||
url = https://github.com/textmate/vhdl.tmbundle
|
||||
[submodule "vendor/grammars/xquery"]
|
||||
path = vendor/grammars/xquery
|
||||
url = https://github.com/textmate/xquery.tmbundle
|
||||
[submodule "vendor/grammars/language-rpm-spec"]
|
||||
path = vendor/grammars/language-rpm-spec
|
||||
url = https://github.com/waveclaw/language-rpm-spec
|
||||
[submodule "vendor/grammars/language-emacs-lisp"]
|
||||
path = vendor/grammars/language-emacs-lisp
|
||||
url = https://github.com/Alhadis/language-emacs-lisp
|
||||
[submodule "vendor/grammars/language-babel"]
|
||||
path = vendor/grammars/language-babel
|
||||
url = https://github.com/github-linguist/language-babel
|
||||
[submodule "vendor/CodeMirror"]
|
||||
path = vendor/CodeMirror
|
||||
url = https://github.com/codemirror/CodeMirror
|
||||
[submodule "vendor/grammars/MQL5-sublime"]
|
||||
path = vendor/grammars/MQL5-sublime
|
||||
url = https://github.com/mqsoft/MQL5-sublime
|
||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
|
||||
path = vendor/grammars/actionscript3-tmbundle
|
||||
url = https://github.com/simongregory/actionscript3-tmbundle
|
||||
[submodule "vendor/grammars/ABNF.tmbundle"]
|
||||
path = vendor/grammars/ABNF.tmbundle
|
||||
url = https://github.com/sanssecours/ABNF.tmbundle
|
||||
[submodule "vendor/grammars/EBNF.tmbundle"]
|
||||
path = vendor/grammars/EBNF.tmbundle
|
||||
url = https://github.com/sanssecours/EBNF.tmbundle
|
||||
[submodule "vendor/grammars/language-haml"]
|
||||
path = vendor/grammars/language-haml
|
||||
url = https://github.com/ezekg/language-haml
|
||||
[submodule "vendor/grammars/language-ninja"]
|
||||
path = vendor/grammars/language-ninja
|
||||
url = https://github.com/khyo/language-ninja
|
||||
[submodule "vendor/grammars/language-fontforge"]
|
||||
path = vendor/grammars/language-fontforge
|
||||
url = https://github.com/Alhadis/language-fontforge
|
||||
[submodule "vendor/grammars/language-gn"]
|
||||
path = vendor/grammars/language-gn
|
||||
url = https://github.com/devoncarew/language-gn
|
||||
[submodule "vendor/grammars/rascal-syntax-highlighting"]
|
||||
path = vendor/grammars/rascal-syntax-highlighting
|
||||
url = https://github.com/usethesource/rascal-syntax-highlighting
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ To add support for a new extension:
|
||||
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` 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 `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
|
||||
|
||||
|
||||
@@ -27,18 +27,16 @@ We try only to add languages once they have some usage on GitHub. In most cases
|
||||
|
||||
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 [one of these licenses](https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11).
|
||||
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. Download the license for the grammar: `script/licensed`. Be careful to only commit the file for the new grammar, as this script may update licenses for other grammars as well.
|
||||
0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
|
||||
0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
|
||||
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
|
||||
0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
|
||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
|
||||
|
||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
|
||||
|
||||
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
|
||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
|
||||
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!
|
||||
@@ -81,10 +79,15 @@ Here's our current build status: [
|
||||
- @larsbrinkhoff
|
||||
- @pchaigno
|
||||
|
||||
- **@Alhadis**
|
||||
- **@arfon**
|
||||
- **@brandonblack** (GitHub staff)
|
||||
- **@larsbrinkhoff**
|
||||
- **@lildude** (GitHub staff)
|
||||
- **@lizzhale** (GitHub staff)
|
||||
- **@mikemcquaid** (GitHub staff)
|
||||
- **@pchaigno**
|
||||
|
||||
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
|
||||
|
||||
- Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub member of staff
|
||||
@@ -112,5 +115,6 @@ If you are the current maintainer of this gem:
|
||||
|
||||
[grammars]: /grammars.yml
|
||||
[languages]: /lib/linguist/languages.yml
|
||||
[licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11
|
||||
[samples]: /samples
|
||||
[new-issue]: https://github.com/github/linguist/issues/new
|
||||
|
||||
@@ -20,6 +20,12 @@ The Language stats bar displays languages percentages for the files in the repos
|
||||
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
|
||||
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
|
||||
|
||||
### There's a problem with the syntax highlighting of a file
|
||||
|
||||
Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md).
|
||||
|
||||
If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed.
|
||||
|
||||
## Overrides
|
||||
|
||||
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
|
||||
|
||||
@@ -23,7 +23,7 @@ class GitLinguist
|
||||
if @incremental && stats = load_language_stats
|
||||
old_commit_oid, old_stats = stats
|
||||
|
||||
# A cache with NULL oid means that we want to froze
|
||||
# A cache with NULL oid means that we want to freeze
|
||||
# these language stats in place and stop computing
|
||||
# them (for performance reasons)
|
||||
return old_stats if old_commit_oid == NULL_OID
|
||||
@@ -111,7 +111,7 @@ def git_linguist(args)
|
||||
parser.parse!(args)
|
||||
|
||||
git_dir = `git rev-parse --git-dir`.strip
|
||||
raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success?
|
||||
raise "git-linguist must be run in a Git repository (#{Dir.pwd})" unless $?.success?
|
||||
wrapper = GitLinguist.new(git_dir, commit, incremental)
|
||||
|
||||
case args.pop
|
||||
|
||||
@@ -26,6 +26,5 @@ Gem::Specification.new do |s|
|
||||
s.add_development_dependency 'yajl-ruby'
|
||||
s.add_development_dependency 'color-proximity', '~> 0.2.1'
|
||||
s.add_development_dependency 'licensed'
|
||||
s.add_development_dependency 'licensee', '>= 8.3.0'
|
||||
|
||||
s.add_development_dependency 'licensee', '>= 8.6.0'
|
||||
end
|
||||
|
||||
151
grammars.yml
151
grammars.yml
@@ -4,13 +4,15 @@ http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/M
|
||||
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
|
||||
- source.systemverilog
|
||||
- source.ucfconstraints
|
||||
vendor/grammars/ABNF.tmbundle:
|
||||
- source.abnf
|
||||
vendor/grammars/Agda.tmbundle:
|
||||
- source.agda
|
||||
vendor/grammars/Alloy.tmbundle:
|
||||
- source.alloy
|
||||
vendor/grammars/AutoHotkey/:
|
||||
vendor/grammars/AutoHotkey:
|
||||
- source.ahk
|
||||
vendor/grammars/BrightScript.tmbundle/:
|
||||
vendor/grammars/BrightScript.tmbundle:
|
||||
- source.brightauthorproject
|
||||
- source.brightscript
|
||||
vendor/grammars/ColdFusion:
|
||||
@@ -20,11 +22,15 @@ vendor/grammars/ColdFusion:
|
||||
- text.html.cfm
|
||||
vendor/grammars/Docker.tmbundle:
|
||||
- source.dockerfile
|
||||
vendor/grammars/Elm/:
|
||||
vendor/grammars/EBNF.tmbundle:
|
||||
- source.ebnf
|
||||
vendor/grammars/Elm/Syntaxes:
|
||||
- source.elm
|
||||
- text.html.mediawiki.elm-build-output
|
||||
- text.html.mediawiki.elm-documentation
|
||||
vendor/grammars/FreeMarker.tmbundle:
|
||||
- text.html.ftl
|
||||
vendor/grammars/G-Code/:
|
||||
vendor/grammars/G-Code:
|
||||
- source.LS
|
||||
- source.MCPOST
|
||||
- source.MOD
|
||||
@@ -37,7 +43,7 @@ vendor/grammars/IDL-Syntax:
|
||||
vendor/grammars/Isabelle.tmbundle:
|
||||
- source.isabelle.root
|
||||
- source.isabelle.theory
|
||||
vendor/grammars/JSyntax/:
|
||||
vendor/grammars/JSyntax:
|
||||
- source.j
|
||||
vendor/grammars/Julia.tmbundle:
|
||||
- source.julia
|
||||
@@ -45,10 +51,12 @@ vendor/grammars/Lean.tmbundle:
|
||||
- source.lean
|
||||
vendor/grammars/LiveScript.tmbundle:
|
||||
- source.livescript
|
||||
vendor/grammars/MQL5-sublime:
|
||||
- source.mql5
|
||||
vendor/grammars/MagicPython:
|
||||
- source.python
|
||||
- source.regexp.python
|
||||
vendor/grammars/Modelica/:
|
||||
vendor/grammars/Modelica:
|
||||
- source.modelica
|
||||
vendor/grammars/NSIS:
|
||||
- source.nsis
|
||||
@@ -58,7 +66,7 @@ vendor/grammars/NimLime:
|
||||
- source.nimcfg
|
||||
vendor/grammars/PHP-Twig.tmbundle:
|
||||
- text.html.twig
|
||||
vendor/grammars/PogoScript.tmbundle/:
|
||||
vendor/grammars/PogoScript.tmbundle:
|
||||
- source.pogoscript
|
||||
vendor/grammars/RDoc.tmbundle:
|
||||
- text.rdoc
|
||||
@@ -73,10 +81,10 @@ vendor/grammars/Scalate.tmbundle:
|
||||
- text.html.ssp
|
||||
vendor/grammars/Slash.tmbundle:
|
||||
- text.html.slash
|
||||
vendor/grammars/Stata.tmbundle/:
|
||||
vendor/grammars/Stata.tmbundle:
|
||||
- source.mata
|
||||
- source.stata
|
||||
vendor/grammars/Stylus/:
|
||||
vendor/grammars/Stylus:
|
||||
- source.stylus
|
||||
vendor/grammars/Sublime-Coq:
|
||||
- source.coq
|
||||
@@ -86,7 +94,7 @@ vendor/grammars/Sublime-Lasso:
|
||||
- file.lasso
|
||||
vendor/grammars/Sublime-Loom:
|
||||
- source.loomscript
|
||||
vendor/grammars/Sublime-Modula-2/:
|
||||
vendor/grammars/Sublime-Modula-2:
|
||||
- source.modula2
|
||||
vendor/grammars/Sublime-Nit:
|
||||
- source.nit
|
||||
@@ -101,26 +109,24 @@ vendor/grammars/Sublime-SQF-Language:
|
||||
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
|
||||
- source.abl
|
||||
- text.html.abl
|
||||
vendor/grammars/Sublime-VimL:
|
||||
- source.viml
|
||||
vendor/grammars/SublimeBrainfuck:
|
||||
- source.bf
|
||||
vendor/grammars/SublimeClarion/:
|
||||
vendor/grammars/SublimeClarion:
|
||||
- source.clarion
|
||||
vendor/grammars/SublimeGDB/:
|
||||
vendor/grammars/SublimeGDB:
|
||||
- source.disasm
|
||||
- source.gdb
|
||||
- source.gdb.session
|
||||
- source.gdbregs
|
||||
vendor/grammars/SublimePapyrus/:
|
||||
vendor/grammars/SublimePapyrus:
|
||||
- source.papyrus.skyrim
|
||||
vendor/grammars/SublimePuppet/:
|
||||
vendor/grammars/SublimePuppet:
|
||||
- source.puppet
|
||||
vendor/grammars/SublimeXtend:
|
||||
- source.xtend
|
||||
vendor/grammars/TLA:
|
||||
- source.tla
|
||||
vendor/grammars/TXL/:
|
||||
vendor/grammars/TXL:
|
||||
- source.txl
|
||||
vendor/grammars/Textmate-Gosu-Bundle:
|
||||
- source.gosu.2
|
||||
@@ -134,7 +140,7 @@ vendor/grammars/X10:
|
||||
- source.x10
|
||||
vendor/grammars/abap.tmbundle:
|
||||
- source.abap
|
||||
vendor/grammars/actionscript3-tmbundle:
|
||||
vendor/grammars/actionscript3-tmbundle/:
|
||||
- source.actionscript.3
|
||||
- text.html.asdoc
|
||||
- text.xml.flex-config
|
||||
@@ -149,20 +155,20 @@ vendor/grammars/antlr.tmbundle:
|
||||
vendor/grammars/apache.tmbundle:
|
||||
- source.apache-config
|
||||
- source.apache-config.mod_perl
|
||||
vendor/grammars/api-blueprint-sublime-plugin/:
|
||||
vendor/grammars/api-blueprint-sublime-plugin:
|
||||
- text.html.markdown.source.gfm.apib
|
||||
- text.html.markdown.source.gfm.mson
|
||||
vendor/grammars/applescript.tmbundle:
|
||||
- source.applescript
|
||||
vendor/grammars/asciidoc.tmbundle/:
|
||||
vendor/grammars/asciidoc.tmbundle:
|
||||
- text.html.asciidoc
|
||||
vendor/grammars/asp.tmbundle:
|
||||
- source.asp
|
||||
- text.html.asp
|
||||
vendor/grammars/assembly/:
|
||||
vendor/grammars/assembly:
|
||||
- objdump.x86asm
|
||||
- source.x86asm
|
||||
vendor/grammars/atom-fsharp/:
|
||||
vendor/grammars/atom-fsharp:
|
||||
- source.fsharp
|
||||
- source.fsharp.fsi
|
||||
- source.fsharp.fsl
|
||||
@@ -172,16 +178,16 @@ vendor/grammars/atom-language-1c-bsl:
|
||||
- source.sdbl
|
||||
vendor/grammars/atom-language-clean:
|
||||
- source.clean
|
||||
vendor/grammars/atom-language-purescript/:
|
||||
vendor/grammars/atom-language-purescript:
|
||||
- source.purescript
|
||||
vendor/grammars/atom-language-srt:
|
||||
- text.srt
|
||||
vendor/grammars/atom-language-stan/:
|
||||
vendor/grammars/atom-language-stan:
|
||||
- source.stan
|
||||
vendor/grammars/atom-salt:
|
||||
- source.python.salt
|
||||
- source.yaml.salt
|
||||
vendor/grammars/atomic-dreams/:
|
||||
vendor/grammars/atomic-dreams:
|
||||
- source.dm
|
||||
- source.dmf
|
||||
vendor/grammars/ats:
|
||||
@@ -192,7 +198,7 @@ vendor/grammars/bison.tmbundle:
|
||||
- source.bison
|
||||
vendor/grammars/blitzmax:
|
||||
- source.blitzmax
|
||||
vendor/grammars/boo/:
|
||||
vendor/grammars/boo:
|
||||
- source.boo
|
||||
vendor/grammars/bro-sublime:
|
||||
- source.bro
|
||||
@@ -217,7 +223,7 @@ vendor/grammars/cool-tmbundle:
|
||||
vendor/grammars/cpp-qt.tmbundle:
|
||||
- source.c++.qt
|
||||
- source.qmake
|
||||
vendor/grammars/creole/:
|
||||
vendor/grammars/creole:
|
||||
- text.html.creole
|
||||
vendor/grammars/css.tmbundle:
|
||||
- source.css
|
||||
@@ -241,9 +247,7 @@ vendor/grammars/dylan.tmbundle:
|
||||
- source.dylan
|
||||
- source.lid
|
||||
- source.makegen
|
||||
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
|
||||
- source.dosbatch
|
||||
vendor/grammars/ec.tmbundle/:
|
||||
vendor/grammars/ec.tmbundle:
|
||||
- source.c.ec
|
||||
vendor/grammars/eiffel.tmbundle:
|
||||
- source.eiffel
|
||||
@@ -268,9 +272,9 @@ vendor/grammars/forth:
|
||||
vendor/grammars/fortran.tmbundle:
|
||||
- source.fortran
|
||||
- source.fortran.modern
|
||||
vendor/grammars/gap-tmbundle/:
|
||||
vendor/grammars/gap-tmbundle:
|
||||
- source.gap
|
||||
vendor/grammars/gdscript/:
|
||||
vendor/grammars/gdscript:
|
||||
- source.gdscript
|
||||
vendor/grammars/gettext.tmbundle:
|
||||
- source.po
|
||||
@@ -298,7 +302,7 @@ vendor/grammars/idl.tmbundle:
|
||||
- source.idl
|
||||
- source.idl-dlm
|
||||
- text.idl-idldoc
|
||||
vendor/grammars/idris/:
|
||||
vendor/grammars/idris:
|
||||
- source.idris
|
||||
vendor/grammars/ini.tmbundle:
|
||||
- source.ini
|
||||
@@ -330,12 +334,14 @@ vendor/grammars/language-apl:
|
||||
- source.apl
|
||||
vendor/grammars/language-asn1:
|
||||
- source.asn
|
||||
vendor/grammars/language-babel/:
|
||||
vendor/grammars/language-babel:
|
||||
- source.js.jsx
|
||||
- source.regexp.babel
|
||||
vendor/grammars/language-blade/:
|
||||
vendor/grammars/language-batchfile:
|
||||
- source.batchfile
|
||||
vendor/grammars/language-blade:
|
||||
- text.html.php.blade
|
||||
vendor/grammars/language-click/:
|
||||
vendor/grammars/language-click:
|
||||
- source.click
|
||||
vendor/grammars/language-clojure:
|
||||
- source.clojure
|
||||
@@ -354,10 +360,21 @@ vendor/grammars/language-csound:
|
||||
- source.csound
|
||||
- source.csound-document
|
||||
- source.csound-score
|
||||
vendor/grammars/language-emacs-lisp:
|
||||
- source.emacs.lisp
|
||||
vendor/grammars/language-fontforge:
|
||||
- source.fontforge
|
||||
- source.opentype
|
||||
- text.sfd
|
||||
vendor/grammars/language-gfm:
|
||||
- source.gfm
|
||||
vendor/grammars/language-gn:
|
||||
- source.gn
|
||||
vendor/grammars/language-graphql:
|
||||
- source.graphql
|
||||
vendor/grammars/language-haml:
|
||||
- text.haml
|
||||
- text.hamlc
|
||||
vendor/grammars/language-haskell:
|
||||
- hint.haskell
|
||||
- hint.message.haskell
|
||||
@@ -373,17 +390,20 @@ vendor/grammars/language-inform7:
|
||||
- source.inform7
|
||||
vendor/grammars/language-javascript:
|
||||
- source.js
|
||||
- source.js.embedded.html
|
||||
- source.js.regexp
|
||||
- source.js.regexp.replacement
|
||||
vendor/grammars/language-jsoniq/:
|
||||
vendor/grammars/language-jsoniq:
|
||||
- source.jq
|
||||
- source.xq
|
||||
vendor/grammars/language-less/:
|
||||
vendor/grammars/language-less:
|
||||
- source.css.less
|
||||
vendor/grammars/language-maxscript:
|
||||
- source.maxscript
|
||||
vendor/grammars/language-ncl:
|
||||
- source.ncl
|
||||
vendor/grammars/language-ninja:
|
||||
- source.ninja
|
||||
vendor/grammars/language-povray:
|
||||
- source.pov-ray sdl
|
||||
vendor/grammars/language-python:
|
||||
@@ -398,6 +418,9 @@ vendor/grammars/language-roff:
|
||||
- source.pic
|
||||
- text.roff
|
||||
- text.runoff
|
||||
vendor/grammars/language-rpm-spec:
|
||||
- source.changelogs.rpm-spec
|
||||
- source.rpm-spec
|
||||
vendor/grammars/language-shellscript:
|
||||
- source.shell
|
||||
- text.shell-session
|
||||
@@ -407,6 +430,8 @@ vendor/grammars/language-toc-wow:
|
||||
- source.toc
|
||||
vendor/grammars/language-turing:
|
||||
- source.turing
|
||||
vendor/grammars/language-viml:
|
||||
- source.viml
|
||||
vendor/grammars/language-wavefront:
|
||||
- source.wavefront.mtl
|
||||
- source.wavefront.obj
|
||||
@@ -414,7 +439,7 @@ vendor/grammars/language-xbase:
|
||||
- source.harbour
|
||||
vendor/grammars/language-yaml:
|
||||
- source.yaml
|
||||
vendor/grammars/language-yang/:
|
||||
vendor/grammars/language-yang:
|
||||
- source.yang
|
||||
vendor/grammars/latex.tmbundle:
|
||||
- text.bibtex
|
||||
@@ -448,11 +473,11 @@ vendor/grammars/matlab.tmbundle:
|
||||
- source.octave
|
||||
vendor/grammars/maven.tmbundle:
|
||||
- text.xml.pom
|
||||
vendor/grammars/mediawiki.tmbundle/:
|
||||
vendor/grammars/mediawiki.tmbundle:
|
||||
- text.html.mediawiki
|
||||
vendor/grammars/mercury-tmlanguage:
|
||||
- source.mercury
|
||||
vendor/grammars/monkey/:
|
||||
vendor/grammars/monkey:
|
||||
- source.monkey
|
||||
vendor/grammars/moonscript-tmbundle:
|
||||
- source.moonscript
|
||||
@@ -460,8 +485,6 @@ vendor/grammars/nemerle.tmbundle:
|
||||
- source.nemerle
|
||||
vendor/grammars/nesC:
|
||||
- source.nesc
|
||||
vendor/grammars/ninja.tmbundle:
|
||||
- source.ninja
|
||||
vendor/grammars/nix:
|
||||
- source.nix
|
||||
vendor/grammars/nu.tmbundle:
|
||||
@@ -486,9 +509,9 @@ vendor/grammars/parrot:
|
||||
- source.parrot.pir
|
||||
vendor/grammars/pascal.tmbundle:
|
||||
- source.pascal
|
||||
vendor/grammars/pawn-sublime-language/:
|
||||
vendor/grammars/pawn-sublime-language:
|
||||
- source.pawn
|
||||
vendor/grammars/perl.tmbundle/:
|
||||
vendor/grammars/perl.tmbundle:
|
||||
- source.perl
|
||||
- source.perl.6
|
||||
vendor/grammars/perl6fe:
|
||||
@@ -499,7 +522,7 @@ vendor/grammars/php-smarty.tmbundle:
|
||||
- text.html.smarty
|
||||
vendor/grammars/php.tmbundle:
|
||||
- text.html.php
|
||||
vendor/grammars/pig-latin/:
|
||||
vendor/grammars/pig-latin:
|
||||
- source.pig_latin
|
||||
vendor/grammars/pike-textmate:
|
||||
- source.pike
|
||||
@@ -517,8 +540,8 @@ vendor/grammars/python-django.tmbundle:
|
||||
vendor/grammars/r.tmbundle:
|
||||
- source.r
|
||||
- text.tex.latex.rd
|
||||
vendor/grammars/ruby-haml.tmbundle:
|
||||
- text.haml
|
||||
vendor/grammars/rascal-syntax-highlighting:
|
||||
- source.rascal
|
||||
vendor/grammars/ruby-slim.tmbundle:
|
||||
- text.slim
|
||||
vendor/grammars/ruby.tmbundle:
|
||||
@@ -538,11 +561,11 @@ vendor/grammars/scilab.tmbundle:
|
||||
- source.scilab
|
||||
vendor/grammars/secondlife-lsl:
|
||||
- source.lsl
|
||||
vendor/grammars/smali-sublime/smali.tmLanguage:
|
||||
vendor/grammars/smali-sublime:
|
||||
- source.smali
|
||||
vendor/grammars/smalltalk-tmbundle:
|
||||
- source.smalltalk
|
||||
vendor/grammars/sourcepawn/:
|
||||
vendor/grammars/sourcepawn:
|
||||
- source.sp
|
||||
vendor/grammars/sql.tmbundle:
|
||||
- source.sql
|
||||
@@ -553,9 +576,9 @@ vendor/grammars/standard-ml.tmbundle:
|
||||
- source.ml
|
||||
vendor/grammars/sublime-MuPAD:
|
||||
- source.mupad
|
||||
vendor/grammars/sublime-aspectj/:
|
||||
vendor/grammars/sublime-aspectj:
|
||||
- source.aspectj
|
||||
vendor/grammars/sublime-autoit/:
|
||||
vendor/grammars/sublime-autoit:
|
||||
- source.autoit
|
||||
vendor/grammars/sublime-befunge:
|
||||
- source.befunge
|
||||
@@ -563,12 +586,12 @@ vendor/grammars/sublime-bsv:
|
||||
- source.bsv
|
||||
vendor/grammars/sublime-cirru:
|
||||
- source.cirru
|
||||
vendor/grammars/sublime-clips/:
|
||||
vendor/grammars/sublime-clips:
|
||||
- source.clips
|
||||
vendor/grammars/sublime-glsl:
|
||||
- source.essl
|
||||
- source.glsl
|
||||
vendor/grammars/sublime-golo/:
|
||||
vendor/grammars/sublime-golo:
|
||||
- source.golo
|
||||
vendor/grammars/sublime-mask:
|
||||
- source.mask
|
||||
@@ -577,29 +600,31 @@ vendor/grammars/sublime-netlinx:
|
||||
- source.netlinx.erb
|
||||
vendor/grammars/sublime-nginx:
|
||||
- source.nginx
|
||||
vendor/grammars/sublime-opal/:
|
||||
vendor/grammars/sublime-opal:
|
||||
- source.opal
|
||||
- source.opalsysdefs
|
||||
vendor/grammars/sublime-pony:
|
||||
- source.pony
|
||||
vendor/grammars/sublime-rexx/:
|
||||
vendor/grammars/sublime-rexx:
|
||||
- source.rexx
|
||||
vendor/grammars/sublime-robot-plugin:
|
||||
- text.robot
|
||||
vendor/grammars/sublime-rust:
|
||||
- source.rust
|
||||
vendor/grammars/sublime-spintools/:
|
||||
vendor/grammars/sublime-spintools:
|
||||
- source.regexp.spin
|
||||
- source.spin
|
||||
vendor/grammars/sublime-tea:
|
||||
- source.tea
|
||||
vendor/grammars/sublime-terra:
|
||||
- source.terra
|
||||
vendor/grammars/sublime-text-ox/:
|
||||
vendor/grammars/sublime-text-ox:
|
||||
- source.ox
|
||||
vendor/grammars/sublime-typescript/:
|
||||
vendor/grammars/sublime-typescript:
|
||||
- source.ts
|
||||
- source.tsx
|
||||
- text.error-list
|
||||
- text.find-refs
|
||||
vendor/grammars/sublime-varnish:
|
||||
- source.varnish.vcl
|
||||
vendor/grammars/sublime_cobol:
|
||||
@@ -607,9 +632,9 @@ vendor/grammars/sublime_cobol:
|
||||
- source.cobol
|
||||
- source.jcl
|
||||
- source.opencobol
|
||||
vendor/grammars/sublimeassembly/:
|
||||
vendor/grammars/sublimeassembly:
|
||||
- source.assembly
|
||||
vendor/grammars/sublimeprolog/:
|
||||
vendor/grammars/sublimeprolog:
|
||||
- source.prolog
|
||||
- source.prolog.eclipse
|
||||
vendor/grammars/sublimetext-cuda-cpp:
|
||||
@@ -632,12 +657,10 @@ vendor/grammars/vhdl:
|
||||
- source.vhdl
|
||||
vendor/grammars/vue-syntax-highlight:
|
||||
- text.html.vue
|
||||
vendor/grammars/xc.tmbundle/:
|
||||
vendor/grammars/xc.tmbundle:
|
||||
- source.xc
|
||||
vendor/grammars/xml.tmbundle:
|
||||
- text.xml
|
||||
- text.xml.xsl
|
||||
vendor/grammars/xquery:
|
||||
- source.xquery
|
||||
vendor/grammars/zephir-sublime:
|
||||
- source.php.zephir
|
||||
|
||||
@@ -63,7 +63,7 @@ module Linguist
|
||||
#
|
||||
# Returns an Array
|
||||
def extensions
|
||||
_, *segments = name.downcase.split(".")
|
||||
_, *segments = name.downcase.split(".", -1)
|
||||
|
||||
segments.map.with_index do |segment, index|
|
||||
"." + segments[index..-1].join(".")
|
||||
|
||||
@@ -56,6 +56,7 @@ module Linguist
|
||||
generated_net_specflow_feature_file? ||
|
||||
composer_lock? ||
|
||||
node_modules? ||
|
||||
go_vendor? ||
|
||||
npm_shrinkwrap? ||
|
||||
godeps? ||
|
||||
generated_by_zephir? ||
|
||||
@@ -274,16 +275,14 @@ module Linguist
|
||||
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
|
||||
end
|
||||
|
||||
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp']
|
||||
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
|
||||
|
||||
# Internal: Is the blob generated by Apache Thrift compiler?
|
||||
#
|
||||
# Returns true or false
|
||||
def generated_apache_thrift?
|
||||
return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)
|
||||
return false unless lines.count > 1
|
||||
|
||||
return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler")
|
||||
return lines.first(6).any? { |l| l.include?("Autogenerated by Thrift Compiler") }
|
||||
end
|
||||
|
||||
# Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?
|
||||
@@ -304,6 +303,14 @@ module Linguist
|
||||
!!name.match(/node_modules\//)
|
||||
end
|
||||
|
||||
# Internal: Is the blob part of the Go vendor/ tree,
|
||||
# not meant for humans in pull requests.
|
||||
#
|
||||
# Returns true or false.
|
||||
def go_vendor?
|
||||
!!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/)
|
||||
end
|
||||
|
||||
# Internal: Is the blob a generated npm shrinkwrap file.
|
||||
#
|
||||
# Returns true or false.
|
||||
|
||||
@@ -110,6 +110,12 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".cls" do |data|
|
||||
if /\\\w+{/.match(data)
|
||||
Language["TeX"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".cs" do |data|
|
||||
if /![\w\s]+methodsFor: /.match(data)
|
||||
Language["Smalltalk"]
|
||||
@@ -144,10 +150,22 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".for", ".f" do |data|
|
||||
fortran_rx = /^([c*][^abd-z]| (subroutine|program|end|data)\s|\s*!)/i
|
||||
|
||||
disambiguate ".f" do |data|
|
||||
if /^: /.match(data)
|
||||
Language["Forth"]
|
||||
elsif /^([c*][^abd-z]| (subroutine|program|end)\s|\s*!)/i.match(data)
|
||||
elsif data.include?("flowop")
|
||||
Language["Filebench WML"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["FORTRAN"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".for" do |data|
|
||||
if /^: /.match(data)
|
||||
Language["Forth"]
|
||||
elsif fortran_rx.match(data)
|
||||
Language["FORTRAN"]
|
||||
end
|
||||
end
|
||||
@@ -190,6 +208,8 @@ module Linguist
|
||||
disambiguate ".inc" do |data|
|
||||
if /^<\?(?:php)?/.match(data)
|
||||
Language["PHP"]
|
||||
elsif /^\s*#(declare|local|macro|while)\s/.match(data)
|
||||
Language["POV-Ray SDL"]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -230,7 +250,7 @@ module Linguist
|
||||
Language["MUF"]
|
||||
elsif /^\s*;/.match(data)
|
||||
Language["M"]
|
||||
elsif /^\s*\(\*/.match(data)
|
||||
elsif /\*\)$/.match(data)
|
||||
Language["Mathematica"]
|
||||
elsif /^\s*%/.match(data)
|
||||
Language["Matlab"]
|
||||
@@ -240,7 +260,7 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".md" do |data|
|
||||
if /^[-a-z0-9=#!\*\[|]/i.match(data)
|
||||
if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty?
|
||||
Language["Markdown"]
|
||||
elsif /^(;;|\(define_)/.match(data)
|
||||
Language["GCC machine description"]
|
||||
@@ -354,7 +374,7 @@ module Linguist
|
||||
disambiguate ".r" do |data|
|
||||
if /\bRebol\b/i.match(data)
|
||||
Language["Rebol"]
|
||||
elsif data.include?("<-")
|
||||
elsif /<-|^\s*#/.match(data)
|
||||
Language["R"]
|
||||
end
|
||||
end
|
||||
@@ -430,7 +450,7 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".ts" do |data|
|
||||
if data.include?("</TS>")
|
||||
if data.include?("<TS")
|
||||
Language["XML"]
|
||||
else
|
||||
Language["TypeScript"]
|
||||
|
||||
@@ -20,10 +20,11 @@ module Linguist
|
||||
#
|
||||
# Languages are defined in `lib/linguist/languages.yml`.
|
||||
class Language
|
||||
@languages = []
|
||||
@index = {}
|
||||
@name_index = {}
|
||||
@alias_index = {}
|
||||
@languages = []
|
||||
@index = {}
|
||||
@name_index = {}
|
||||
@alias_index = {}
|
||||
@language_id_index = {}
|
||||
|
||||
@extension_index = Hash.new { |h,k| h[k] = [] }
|
||||
@interpreter_index = Hash.new { |h,k| h[k] = [] }
|
||||
@@ -84,6 +85,8 @@ module Linguist
|
||||
@filename_index[filename] << language
|
||||
end
|
||||
|
||||
@language_id_index[language.language_id] = language
|
||||
|
||||
language
|
||||
end
|
||||
|
||||
@@ -193,6 +196,19 @@ module Linguist
|
||||
@interpreter_index[interpreter]
|
||||
end
|
||||
|
||||
# Public: Look up Languages by its language_id.
|
||||
#
|
||||
# language_id - Integer of language_id
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# Language.find_by_id(100)
|
||||
# # => [#<Language name="Elixir">]
|
||||
#
|
||||
# Returns the matching Language
|
||||
def self.find_by_id(language_id)
|
||||
@language_id_index[language_id.to_i]
|
||||
end
|
||||
|
||||
# Public: Look up Language by its name.
|
||||
#
|
||||
@@ -251,6 +267,7 @@ module Linguist
|
||||
# Returns an Array of Languages.
|
||||
def self.ace_modes
|
||||
warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set."
|
||||
warn caller
|
||||
@ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
|
||||
end
|
||||
|
||||
@@ -284,11 +301,16 @@ module Linguist
|
||||
end
|
||||
|
||||
@ace_mode = attributes[:ace_mode]
|
||||
@codemirror_mode = attributes[:codemirror_mode]
|
||||
@codemirror_mime_type = attributes[:codemirror_mime_type]
|
||||
@wrap = attributes[:wrap] || false
|
||||
|
||||
# Set legacy search term
|
||||
@search_term = attributes[:search_term] || default_alias_name
|
||||
|
||||
# Set the language_id
|
||||
@language_id = attributes[:language_id]
|
||||
|
||||
# Set extensions or default to [].
|
||||
@extensions = attributes[:extensions] || []
|
||||
@interpreters = attributes[:interpreters] || []
|
||||
@@ -351,6 +373,17 @@ module Linguist
|
||||
# Returns the name String
|
||||
attr_reader :search_term
|
||||
|
||||
# Public: Get language_id (used in GitHub search)
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "1"
|
||||
# # => "2"
|
||||
# # => "3"
|
||||
#
|
||||
# Returns the integer language_id
|
||||
attr_reader :language_id
|
||||
|
||||
# Public: Get the name of a TextMate-compatible scope
|
||||
#
|
||||
# Returns the scope
|
||||
@@ -367,6 +400,31 @@ module Linguist
|
||||
# Returns a String name or nil
|
||||
attr_reader :ace_mode
|
||||
|
||||
# Public: Get CodeMirror mode
|
||||
#
|
||||
# Maps to a directory in the `mode/` source code.
|
||||
# https://github.com/codemirror/CodeMirror/tree/master/mode
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "nil"
|
||||
# # => "javascript"
|
||||
# # => "clike"
|
||||
#
|
||||
# Returns a String name or nil
|
||||
attr_reader :codemirror_mode
|
||||
|
||||
# Public: Get CodeMirror MIME type mode
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# # => "nil"
|
||||
# # => "text/x-javascript"
|
||||
# # => "text/x-csrc"
|
||||
#
|
||||
# Returns a String name or nil
|
||||
attr_reader :codemirror_mime_type
|
||||
|
||||
# Public: Should language lines be wrapped
|
||||
#
|
||||
# Returns true or false
|
||||
@@ -543,10 +601,13 @@ module Linguist
|
||||
:aliases => options['aliases'],
|
||||
:tm_scope => options['tm_scope'],
|
||||
:ace_mode => options['ace_mode'],
|
||||
:codemirror_mode => options['codemirror_mode'],
|
||||
:codemirror_mime_type => options['codemirror_mime_type'],
|
||||
:wrap => options['wrap'],
|
||||
:group_name => options['group'],
|
||||
:searchable => options.fetch('searchable', true),
|
||||
:search_term => options['search_term'],
|
||||
:language_id => options['language_id'],
|
||||
:extensions => Array(options['extensions']),
|
||||
:interpreters => options['interpreters'].sort,
|
||||
:filenames => options['filenames'],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +1,98 @@
|
||||
module Linguist
|
||||
module Strategy
|
||||
class Modeline
|
||||
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
||||
EMACS_MODELINE = /
|
||||
-\*-
|
||||
(?:
|
||||
# Short form: `-*- ruby -*-`
|
||||
\s* (?= [^:;\s]+ \s* -\*-)
|
||||
|
|
||||
# Longer form: `-*- foo:bar; mode: ruby; -*-`
|
||||
(?:
|
||||
.*? # Preceding variables: `-*- foo:bar bar:baz;`
|
||||
[;\s] # Which are delimited by spaces or semicolons
|
||||
|
|
||||
(?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-`
|
||||
)
|
||||
mode # Major mode indicator
|
||||
\s*:\s* # Allow whitespace around colon: `mode : ruby`
|
||||
)
|
||||
([^:;\s]+) # Name of mode
|
||||
|
||||
# First form vim modeline
|
||||
# [text]{white}{vi:|vim:|ex:}[white]{options}
|
||||
# ex: 'vim: syntax=ruby'
|
||||
VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
|
||||
# Ensure the mode is terminated correctly
|
||||
(?=
|
||||
# Followed by semicolon or whitespace
|
||||
[\s;]
|
||||
|
|
||||
# Touching the ending sequence: `ruby-*-`
|
||||
(?<![-*]) # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode
|
||||
-\*- # Emacs has no problems reading `ruby --*-`, however.
|
||||
)
|
||||
.*? # Anything between a cleanly-terminated mode and the ending -*-
|
||||
-\*-
|
||||
/xi
|
||||
|
||||
# Second form vim modeline (compatible with some versions of Vi)
|
||||
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
|
||||
# ex: 'vim set syntax=ruby:'
|
||||
VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
|
||||
VIM_MODELINE = /
|
||||
|
||||
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
|
||||
# Start modeline. Could be `vim:`, `vi:` or `ex:`
|
||||
(?:
|
||||
(?:\s|^)
|
||||
vi
|
||||
(?:m[<=>]?\d+|m)? # Version-specific modeline
|
||||
|
|
||||
[\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:"
|
||||
ex
|
||||
)
|
||||
|
||||
# If the option-list begins with `set ` or `se `, it indicates an alternative
|
||||
# modeline syntax partly-compatible with older versions of Vi. Here, the colon
|
||||
# serves as a terminator for an option sequence, delimited by whitespace.
|
||||
(?=
|
||||
# So we have to ensure the modeline ends with a colon
|
||||
: (?=\s* set? \s [^\n:]+ :) |
|
||||
|
||||
# Otherwise, it isn't valid syntax and should be ignored
|
||||
: (?!\s* set? \s)
|
||||
)
|
||||
|
||||
# Possible (unrelated) `option=value` pairs to skip past
|
||||
(?:
|
||||
# Option separator. Vim uses whitespace or colons to separate options (except if
|
||||
# the alternate "vim: set " form is used, where only whitespace is used)
|
||||
(?:
|
||||
\s
|
||||
|
|
||||
\s* : \s* # Note that whitespace around colons is accepted too:
|
||||
) # vim: noai : ft=ruby:noexpandtab
|
||||
|
||||
# Option's name. All recognised Vim options have an alphanumeric form.
|
||||
\w*
|
||||
|
||||
# Possible value. Not every option takes an argument.
|
||||
(?:
|
||||
# Whitespace between name and value is allowed: `vim: ft =ruby`
|
||||
\s*=
|
||||
|
||||
# Option's value. Might be blank; `vim: ft= ` says "use no filetype".
|
||||
(?:
|
||||
[^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby
|
||||
| # will be read by Vim as { titlestring: " ft=ruby" }.
|
||||
\\.
|
||||
)*
|
||||
)?
|
||||
)*
|
||||
|
||||
# The actual filetype declaration
|
||||
[\s:] (?:filetype|ft|syntax) \s*=
|
||||
|
||||
# Language's name
|
||||
(\w+)
|
||||
|
||||
# Ensure it's followed by a legal separator
|
||||
(?=\s|:|$)
|
||||
/xi
|
||||
|
||||
MODELINES = [EMACS_MODELINE, VIM_MODELINE]
|
||||
|
||||
# Scope of the search for modelines
|
||||
# Number of lines to check at the beginning and at the end of the file
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
# Dependencies
|
||||
- ^[Dd]ependencies/
|
||||
|
||||
# Distributions
|
||||
- (^|/)dist/
|
||||
|
||||
# C deps
|
||||
# https://github.com/joyent/node
|
||||
- ^deps/
|
||||
@@ -47,6 +50,9 @@
|
||||
# Go dependencies
|
||||
- Godeps/_workspace/
|
||||
|
||||
# GNU indent profiles
|
||||
- .indent.pro
|
||||
|
||||
# Minified JavaScript and CSS
|
||||
- (\.|-)min\.(js|css)$
|
||||
|
||||
@@ -165,7 +171,7 @@
|
||||
# Chart.js
|
||||
- (^|/)Chart\.js$
|
||||
|
||||
# Codemirror
|
||||
# CodeMirror
|
||||
- (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo)
|
||||
|
||||
# SyntaxHighlighter - http://alexgorbatchev.com/
|
||||
@@ -229,6 +235,9 @@
|
||||
# Fabric
|
||||
- Fabric.framework/
|
||||
|
||||
# BuddyBuild
|
||||
- BuddyBuildSDK.framework/
|
||||
|
||||
# git config files
|
||||
- gitattributes$
|
||||
- gitignore$
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "4.8.9"
|
||||
VERSION = "4.8.18"
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"repository": "https://github.com/github/linguist",
|
||||
"dependencies": {
|
||||
"season": "~>5.0"
|
||||
"season": "~>5.4"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
|
||||
190
samples/ABNF/toml.abnf
Normal file
190
samples/ABNF/toml.abnf
Normal file
@@ -0,0 +1,190 @@
|
||||
; Source: https://github.com/toml-lang/toml
|
||||
; License: MIT
|
||||
|
||||
;; This is an attempt to define TOML in ABNF according to the grammar defined
|
||||
;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt).
|
||||
|
||||
;; TOML
|
||||
|
||||
toml = expression *( newline expression )
|
||||
expression = (
|
||||
ws /
|
||||
ws comment /
|
||||
ws keyval ws [ comment ] /
|
||||
ws table ws [ comment ]
|
||||
)
|
||||
|
||||
;; Newline
|
||||
|
||||
newline = (
|
||||
%x0A / ; LF
|
||||
%x0D.0A ; CRLF
|
||||
)
|
||||
|
||||
newlines = 1*newline
|
||||
|
||||
;; Whitespace
|
||||
|
||||
ws = *(
|
||||
%x20 / ; Space
|
||||
%x09 ; Horizontal tab
|
||||
)
|
||||
|
||||
;; Comment
|
||||
|
||||
comment-start-symbol = %x23 ; #
|
||||
non-eol = %x09 / %x20-10FFFF
|
||||
comment = comment-start-symbol *non-eol
|
||||
|
||||
;; Key-Value pairs
|
||||
|
||||
keyval-sep = ws %x3D ws ; =
|
||||
keyval = key keyval-sep val
|
||||
|
||||
key = unquoted-key / quoted-key
|
||||
unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
|
||||
quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings
|
||||
|
||||
val = integer / float / string / boolean / date-time / array / inline-table
|
||||
|
||||
;; Table
|
||||
|
||||
table = std-table / array-table
|
||||
|
||||
;; Standard Table
|
||||
|
||||
std-table-open = %x5B ws ; [ Left square bracket
|
||||
std-table-close = ws %x5D ; ] Right square bracket
|
||||
table-key-sep = ws %x2E ws ; . Period
|
||||
|
||||
std-table = std-table-open key *( table-key-sep key) std-table-close
|
||||
|
||||
;; Array Table
|
||||
|
||||
array-table-open = %x5B.5B ws ; [[ Double left square bracket
|
||||
array-table-close = ws %x5D.5D ; ]] Double right square bracket
|
||||
|
||||
array-table = array-table-open key *( table-key-sep key) array-table-close
|
||||
|
||||
;; Integer
|
||||
|
||||
integer = [ minus / plus ] int
|
||||
minus = %x2D ; -
|
||||
plus = %x2B ; +
|
||||
digit1-9 = %x31-39 ; 1-9
|
||||
underscore = %x5F ; _
|
||||
int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )
|
||||
|
||||
;; Float
|
||||
|
||||
float = integer ( frac / frac exp / exp )
|
||||
zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
|
||||
frac = decimal-point zero-prefixable-int
|
||||
decimal-point = %x2E ; .
|
||||
exp = e integer
|
||||
e = %x65 / %x45 ; e E
|
||||
|
||||
;; String
|
||||
|
||||
string = basic-string / ml-basic-string / literal-string / ml-literal-string
|
||||
|
||||
;; Basic String
|
||||
|
||||
basic-string = quotation-mark *basic-char quotation-mark
|
||||
|
||||
quotation-mark = %x22 ; "
|
||||
|
||||
basic-char = basic-unescaped / escaped
|
||||
escaped = escape ( %x22 / ; " quotation mark U+0022
|
||||
%x5C / ; \ reverse solidus U+005C
|
||||
%x2F / ; / solidus U+002F
|
||||
%x62 / ; b backspace U+0008
|
||||
%x66 / ; f form feed U+000C
|
||||
%x6E / ; n line feed U+000A
|
||||
%x72 / ; r carriage return U+000D
|
||||
%x74 / ; t tab U+0009
|
||||
%x75 4HEXDIG / ; uXXXX U+XXXX
|
||||
%x55 8HEXDIG ) ; UXXXXXXXX U+XXXXXXXX
|
||||
|
||||
basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
|
||||
|
||||
escape = %x5C ; \
|
||||
|
||||
;; Multiline Basic String
|
||||
|
||||
ml-basic-string-delim = quotation-mark quotation-mark quotation-mark
|
||||
ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim
|
||||
ml-basic-body = *( ml-basic-char / newline / ( escape newline ))
|
||||
|
||||
ml-basic-char = ml-basic-unescaped / escaped
|
||||
ml-basic-unescaped = %x20-5B / %x5D-10FFFF
|
||||
|
||||
;; Literal String
|
||||
|
||||
literal-string = apostraphe *literal-char apostraphe
|
||||
|
||||
apostraphe = %x27 ; ' Apostrophe
|
||||
|
||||
literal-char = %x09 / %x20-26 / %x28-10FFFF
|
||||
|
||||
;; Multiline Literal String
|
||||
|
||||
ml-literal-string-delim = apostraphe apostraphe apostraphe
|
||||
ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim
|
||||
|
||||
ml-literal-body = *( ml-literal-char / newline )
|
||||
ml-literal-char = %x09 / %x20-10FFFF
|
||||
|
||||
;; Boolean
|
||||
|
||||
boolean = true / false
|
||||
true = %x74.72.75.65 ; true
|
||||
false = %x66.61.6C.73.65 ; false
|
||||
|
||||
;; Datetime (as defined in RFC 3339)
|
||||
|
||||
date-fullyear = 4DIGIT
|
||||
date-month = 2DIGIT ; 01-12
|
||||
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
|
||||
time-hour = 2DIGIT ; 00-23
|
||||
time-minute = 2DIGIT ; 00-59
|
||||
time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
|
||||
time-secfrac = "." 1*DIGIT
|
||||
time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
|
||||
time-offset = "Z" / time-numoffset
|
||||
|
||||
partial-time = time-hour ":" time-minute ":" time-second [time-secfrac]
|
||||
full-date = date-fullyear "-" date-month "-" date-mday
|
||||
full-time = partial-time time-offset
|
||||
|
||||
date-time = full-date "T" full-time
|
||||
|
||||
;; Array
|
||||
|
||||
array-open = %x5B ws ; [
|
||||
array-close = ws %x5D ; ]
|
||||
|
||||
array = array-open array-values array-close
|
||||
|
||||
array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] /
|
||||
val array-sep [ ( comment newlines) / newlines ] array-values ]
|
||||
|
||||
array-sep = ws %x2C ws ; , Comma
|
||||
|
||||
;; Inline Table
|
||||
|
||||
inline-table-open = %x7B ws ; {
|
||||
inline-table-close = ws %x7D ; }
|
||||
inline-table-sep = ws %x2C ws ; , Comma
|
||||
|
||||
inline-table = inline-table-open inline-table-keyvals inline-table-close
|
||||
|
||||
inline-table-keyvals = [ inline-table-keyvals-non-empty ]
|
||||
inline-table-keyvals-non-empty = key keyval-sep val /
|
||||
key keyval-sep val inline-table-sep inline-table-keyvals-non-empty
|
||||
|
||||
;; Built-in ABNF terms, reproduced here for clarity
|
||||
|
||||
; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
|
||||
; DIGIT = %x30-39 ; 0-9
|
||||
; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
|
||||
72
samples/CSON/base.cson
Normal file
72
samples/CSON/base.cson
Normal file
@@ -0,0 +1,72 @@
|
||||
'atom-text-editor':
|
||||
# Platform Bindings
|
||||
'home': 'editor:move-to-first-character-of-line'
|
||||
'end': 'editor:move-to-end-of-screen-line'
|
||||
'shift-home': 'editor:select-to-first-character-of-line'
|
||||
'shift-end': 'editor:select-to-end-of-line'
|
||||
|
||||
'atom-text-editor:not([mini])':
|
||||
# Atom Specific
|
||||
'ctrl-C': 'editor:copy-path'
|
||||
|
||||
# Sublime Parity
|
||||
'tab': 'editor:indent'
|
||||
'enter': 'editor:newline'
|
||||
'shift-tab': 'editor:outdent-selected-rows'
|
||||
'ctrl-K': 'editor:delete-line'
|
||||
|
||||
'.select-list atom-text-editor[mini]':
|
||||
'enter': 'core:confirm'
|
||||
|
||||
'.tool-panel.panel-left, .tool-panel.panel-right':
|
||||
'escape': 'tool-panel:unfocus'
|
||||
|
||||
'atom-text-editor !important, atom-text-editor[mini] !important':
|
||||
'escape': 'editor:consolidate-selections'
|
||||
|
||||
# allow standard input fields to work correctly
|
||||
'body .native-key-bindings':
|
||||
'tab': 'core:focus-next'
|
||||
'shift-tab': 'core:focus-previous'
|
||||
'enter': 'native!'
|
||||
'backspace': 'native!'
|
||||
'shift-backspace': 'native!'
|
||||
'delete': 'native!'
|
||||
'up': 'native!'
|
||||
'down': 'native!'
|
||||
'shift-up': 'native!'
|
||||
'shift-down': 'native!'
|
||||
'alt-up': 'native!'
|
||||
'alt-down': 'native!'
|
||||
'alt-shift-up': 'native!'
|
||||
'alt-shift-down': 'native!'
|
||||
'cmd-up': 'native!'
|
||||
'cmd-down': 'native!'
|
||||
'cmd-shift-up': 'native!'
|
||||
'cmd-shift-down': 'native!'
|
||||
'ctrl-up': 'native!'
|
||||
'ctrl-down': 'native!'
|
||||
'ctrl-shift-up': 'native!'
|
||||
'ctrl-shift-down': 'native!'
|
||||
'left': 'native!'
|
||||
'right': 'native!'
|
||||
'shift-left': 'native!'
|
||||
'shift-right': 'native!'
|
||||
'alt-left': 'native!'
|
||||
'alt-right': 'native!'
|
||||
'alt-shift-left': 'native!'
|
||||
'alt-shift-right': 'native!'
|
||||
'cmd-left': 'native!'
|
||||
'cmd-right': 'native!'
|
||||
'cmd-shift-left': 'native!'
|
||||
'cmd-shift-right': 'native!'
|
||||
'ctrl-left': 'native!'
|
||||
'ctrl-right': 'native!'
|
||||
'ctrl-shift-left': 'native!'
|
||||
'ctrl-shift-right': 'native!'
|
||||
'ctrl-b': 'native!'
|
||||
'ctrl-f': 'native!'
|
||||
'ctrl-F': 'native!'
|
||||
'ctrl-B': 'native!'
|
||||
'ctrl-h': 'native!'
|
||||
'ctrl-d': 'native!'
|
||||
59
samples/CSON/config.cson
Normal file
59
samples/CSON/config.cson
Normal file
@@ -0,0 +1,59 @@
|
||||
directoryIcons:
|
||||
|
||||
Atom:
|
||||
icon: "atom"
|
||||
match: /^\.atom$/
|
||||
colour: "dark-green"
|
||||
|
||||
Bower:
|
||||
icon: "bower"
|
||||
match: /^bower[-_]components$/
|
||||
colour: "bower"
|
||||
|
||||
Dropbox:
|
||||
icon: "dropbox"
|
||||
match: /^(?:Dropbox|\.dropbox\.cache)$/
|
||||
colour: "medium-blue"
|
||||
|
||||
Git:
|
||||
icon: "git"
|
||||
match: /^\.git$/
|
||||
|
||||
GitHub:
|
||||
icon: "github"
|
||||
match: /^\.github$/
|
||||
|
||||
Meteor:
|
||||
icon: "meteor"
|
||||
match: /^\.meteor$/
|
||||
|
||||
NodeJS:
|
||||
icon: "node"
|
||||
match: /^node_modules$/
|
||||
colour: "medium-green"
|
||||
|
||||
Package:
|
||||
icon: "package"
|
||||
match: /^\.bundle$/i
|
||||
|
||||
TextMate:
|
||||
icon: "textmate"
|
||||
match: ".tmBundle"
|
||||
|
||||
|
||||
fileIcons:
|
||||
|
||||
ABAP:
|
||||
icon: "abap"
|
||||
scope: "abp"
|
||||
match: ".abap"
|
||||
colour: "medium-orange"
|
||||
|
||||
ActionScript: # Or Flash-related
|
||||
icon: "as"
|
||||
match: [
|
||||
[".swf", "medium-blue"]
|
||||
[".as", "medium-red", scope: /\.(?:flex-config|actionscript(?:\.\d+)?)$/i, alias: /ActionScript\s?3|as3/i]
|
||||
[".jsfl", "auto-yellow"]
|
||||
[".swc", "dark-red"]
|
||||
]
|
||||
108
samples/CSON/ff-sfd.cson
Normal file
108
samples/CSON/ff-sfd.cson
Normal file
@@ -0,0 +1,108 @@
|
||||
name: "Spline Font Database"
|
||||
scopeName: "text.sfd"
|
||||
fileTypes: ["sfd"]
|
||||
firstLineMatch: "^SplineFontDB: [\\d.]+"
|
||||
patterns: [include: "#main"]
|
||||
|
||||
repository:
|
||||
main:
|
||||
patterns: [
|
||||
{include: "#punctuation"}
|
||||
{include: "#private"}
|
||||
{include: "#image"}
|
||||
{include: "#pickleData"}
|
||||
{include: "#sections"}
|
||||
{include: "#copyright"}
|
||||
{include: "#property"}
|
||||
{include: "#control"}
|
||||
{include: "#address"}
|
||||
{include: "#encoding"}
|
||||
{include: "source.fontforge#shared"}
|
||||
{include: "#colour"}
|
||||
]
|
||||
|
||||
punctuation:
|
||||
patterns: [
|
||||
{match: "<|>", name: "punctuation.definition.brackets.angle.sfd"}
|
||||
{match: "[{}]", name: "punctuation.definition.brackets.curly.sfd"}
|
||||
]
|
||||
|
||||
private:
|
||||
name: "meta.section.private.sfd"
|
||||
begin: "^BeginPrivate(?=:)"
|
||||
end: "^EndPrivate\\b"
|
||||
beginCaptures: 0: name: "keyword.control.begin.private.sfd"
|
||||
endCaptures: 0: name: "keyword.control.end.private.sfd"
|
||||
patterns: [
|
||||
{match: "^\\S+", name: "entity.name.private.property.sfd"}
|
||||
{include: "$self"}
|
||||
]
|
||||
|
||||
image:
|
||||
name: "meta.image.sfd"
|
||||
begin: "^(Image)(?=:)(.+)$"
|
||||
end: "^(EndImage)\\b"
|
||||
contentName: "string.unquoted.raw.data.sfd"
|
||||
beginCaptures:
|
||||
1: name: "keyword.control.begin.image.sfd"
|
||||
2: patterns: [include: "$self"]
|
||||
endCaptures:
|
||||
1: name: "keyword.control.end.image.sfd"
|
||||
|
||||
pickleData:
|
||||
name: "meta.pickle-data.sfd"
|
||||
begin: "^(PickledData)(:)\\s*(\")"
|
||||
end: '"'
|
||||
beginCaptures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
3: name: "punctuation.definition.string.begin.sfd"
|
||||
endCaptures:
|
||||
0: name: "punctuation.definition.string.end.sfd"
|
||||
patterns: [match: "\\\\.", name: "constant.character.escape.sfd"]
|
||||
|
||||
sections:
|
||||
name: "meta.section.${2:/downcase}.sfd"
|
||||
begin: "^(Start|Begin)([A-Z]\\w+)(?=:)"
|
||||
end: "^(End\\2)\\b"
|
||||
beginCaptures: 0: name: "keyword.control.begin.${2:/downcase}.sfd"
|
||||
endCaptures: 0: name: "keyword.control.end.${2:/downcase}.sfd"
|
||||
patterns: [include: "$self"]
|
||||
|
||||
control:
|
||||
name: "keyword.control.${1:/downcase}.sfd"
|
||||
match: "\\b(Fore|Back|SplineSet|^End\\w+)\\b"
|
||||
|
||||
colour:
|
||||
name: "constant.other.hex.colour.sfd"
|
||||
match: "(#)[A-Fa-f0-9]{3,}|(?<=\\s)[A-Fa-f0-9]{6,8}"
|
||||
captures:
|
||||
1: name: "punctuation.definition.colour.sfd"
|
||||
|
||||
encoding:
|
||||
name: "constant.language.encoding.sfd"
|
||||
match: "(?i)\\b(ISO[-\\w]+)(?<=\\d)(?=\\s|$)"
|
||||
|
||||
# Don't highlight numbers in freeform strings (years/version strings)
|
||||
copyright:
|
||||
name: "meta.${1:/downcase}-string.sfd"
|
||||
begin: "^(Copyright|U?Comments?|\\w+Name)(:)"
|
||||
end: "$"
|
||||
beginCaptures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
patterns: [include: "source.fontforge#stringEscapes"]
|
||||
|
||||
# No idea what this is, but it looks distracting without a fix
|
||||
# Assuming it's referring to a memory register or something.
|
||||
address:
|
||||
match: "\\d+[xX][A-Fa-f0-9]+"
|
||||
name: "constant.numeric.hexadecimal.sfd"
|
||||
|
||||
property:
|
||||
match: "^([^:]+)(:)"
|
||||
name: "meta.dictionary.key-value.sfd"
|
||||
captures:
|
||||
1: name: "entity.name.property.sfd"
|
||||
2: name: "punctuation.separator.dictionary.key-value.sfd"
|
||||
|
||||
11
samples/CSON/wercker-status.cson
Normal file
11
samples/CSON/wercker-status.cson
Normal file
@@ -0,0 +1,11 @@
|
||||
'menu': [
|
||||
{
|
||||
'label': 'Packages'
|
||||
'submenu': [
|
||||
'label': 'Wercker Status'
|
||||
'submenu': [
|
||||
{ 'label': 'Check now!', 'command': 'wercker-status:checknow' }
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -1,707 +0,0 @@
|
||||
Inductive day : Type :=
|
||||
| monday : day
|
||||
| tuesday : day
|
||||
| wednesday : day
|
||||
| thursday : day
|
||||
| friday : day
|
||||
| saturday : day
|
||||
| sunday : day.
|
||||
|
||||
Definition next_weekday (d:day) : day :=
|
||||
match d with
|
||||
| monday => tuesday
|
||||
| tuesday => wednesday
|
||||
| wednesday => thursday
|
||||
| thursday => friday
|
||||
| friday => monday
|
||||
| saturday => monday
|
||||
| sunday => monday
|
||||
end.
|
||||
|
||||
Example test_next_weekday:
|
||||
(next_weekday (next_weekday saturday)) = tuesday.
|
||||
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Inductive bool : Type :=
|
||||
| true : bool
|
||||
| false : bool.
|
||||
|
||||
Definition negb (b:bool) : bool :=
|
||||
match b with
|
||||
| true => false
|
||||
| false => true
|
||||
end.
|
||||
|
||||
Definition andb (b1:bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => b2
|
||||
| false => false
|
||||
end.
|
||||
|
||||
Definition orb (b1:bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => true
|
||||
| false => b2
|
||||
end.
|
||||
|
||||
Example test_orb1: (orb true false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb2: (orb false false) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb3: (orb false true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Example test_orb4: (orb true true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition nandb (b1: bool) (b2:bool) : bool :=
|
||||
match b1 with
|
||||
| true => match b2 with
|
||||
| false => true
|
||||
| true => false
|
||||
end
|
||||
| false => true
|
||||
end.
|
||||
|
||||
Example test_nandb1: (nandb true false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb2: (nandb false false) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb3: (nandb false true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_nandb4: (nandb true true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition andb3 (b1: bool) (b2:bool) (b3:bool) : bool :=
|
||||
match b1 with
|
||||
| false => false
|
||||
| true => match b2 with
|
||||
| false => false
|
||||
| true => b3
|
||||
end
|
||||
end.
|
||||
|
||||
Example test_andb31: (andb3 true true true) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb32: (andb3 false true true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb33: (andb3 true false true) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_andb34: (andb3 true true false) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Module Playground1.
|
||||
|
||||
Inductive nat : Type :=
|
||||
| O : nat
|
||||
| S : nat -> nat.
|
||||
|
||||
Definition pred (n : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => n'
|
||||
end.
|
||||
|
||||
Definition minustwo (n : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S O => O
|
||||
| S (S n') => n'
|
||||
end.
|
||||
|
||||
Fixpoint evenb (n : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S O => false
|
||||
| S (S n') => evenb n'
|
||||
end.
|
||||
|
||||
Definition oddb (n : nat) : bool := negb (evenb n).
|
||||
|
||||
Example test_oddb1: (oddb (S O)) = true.
|
||||
Proof. reflexivity. Qed.
|
||||
Example test_oddb2: (oddb (S (S (S (S O))))) = false.
|
||||
Proof. reflexivity. Qed.
|
||||
|
||||
Fixpoint plus (n : nat) (m : nat) : nat :=
|
||||
match n with
|
||||
| O => m
|
||||
| S n' => S (plus n' m)
|
||||
end.
|
||||
|
||||
Fixpoint mult (n m : nat) : nat :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => plus m (mult n' m)
|
||||
end.
|
||||
|
||||
Fixpoint minus (n m : nat) : nat :=
|
||||
match n, m with
|
||||
| O, _ => n
|
||||
| S n', O => S n'
|
||||
| S n', S m' => minus n' m'
|
||||
end.
|
||||
|
||||
Fixpoint exp (base power : nat) : nat :=
|
||||
match power with
|
||||
| O => S O
|
||||
| S p => mult base (exp base p)
|
||||
end.
|
||||
|
||||
Fixpoint factorial (n : nat) : nat :=
|
||||
match n with
|
||||
| O => S O
|
||||
| S n' => mult n (factorial n')
|
||||
end.
|
||||
|
||||
Example test_factorial1: (factorial (S (S (S O)))) = (S (S (S (S (S (S O)))))).
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Notation "x + y" := (plus x y) (at level 50, left associativity) : nat_scope.
|
||||
Notation "x - y" := (minus x y) (at level 50, left associativity) : nat_scope.
|
||||
Notation "x * y" := (mult x y) (at level 40, left associativity) : nat_scope.
|
||||
|
||||
Fixpoint beq_nat (n m : nat) : bool :=
|
||||
match n with
|
||||
| O => match m with
|
||||
| O => true
|
||||
| S m' => false
|
||||
end
|
||||
| S n' => match m with
|
||||
| O => false
|
||||
| S m' => beq_nat n' m'
|
||||
end
|
||||
end.
|
||||
|
||||
Fixpoint ble_nat (n m : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S n' =>
|
||||
match m with
|
||||
| O => false
|
||||
| S m' => ble_nat n' m'
|
||||
end
|
||||
end.
|
||||
|
||||
Example test_ble_nat1: (ble_nat (S (S O)) (S (S O))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_ble_nat2: (ble_nat (S (S O)) (S (S (S (S O))))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_ble_nat3: (ble_nat (S (S (S (S O)))) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Definition blt_nat (n m : nat) : bool :=
|
||||
(andb (negb (beq_nat n m)) (ble_nat n m)).
|
||||
|
||||
Example test_blt_nat1: (blt_nat (S (S O)) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_blt_nat3: (blt_nat (S (S (S (S O)))) (S (S O))) = false.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
Example test_blt_nat2 : (blt_nat (S (S O)) (S (S (S (S O))))) = true.
|
||||
Proof. simpl. reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
simpl. reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n' : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_O_n'' : forall n : nat, O + n = n.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem plus_1_1 : forall n : nat, (S O) + n = S n.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem mult_0_1: forall n : nat, O * n = O.
|
||||
Proof.
|
||||
intros n. reflexivity. Qed.
|
||||
|
||||
Theorem plus_id_example : forall n m:nat,
|
||||
n = m -> n + n = m + m.
|
||||
Proof.
|
||||
intros n m.
|
||||
intros H.
|
||||
rewrite -> H.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_id_exercise : forall n m o: nat,
|
||||
n = m -> m = o -> n + m = m + o.
|
||||
Proof.
|
||||
intros n m o.
|
||||
intros H.
|
||||
intros H'.
|
||||
rewrite -> H.
|
||||
rewrite <- H'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_0_plus : forall n m : nat,
|
||||
(O + n) * m = n * m.
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> plus_O_n.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem mult_1_plus : forall n m: nat,
|
||||
((S O) + n) * m = m + (n * m).
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> plus_1_1.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1 : forall n : nat,
|
||||
n * (S O) = n.
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_1_neq_0 : forall n : nat,
|
||||
beq_nat (n + (S O)) O = false.
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n as [| n'].
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem zero_nbeq_plus_1 : forall n : nat,
|
||||
beq_nat O (n + (S O)) = false.
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Require String. Open Scope string_scope.
|
||||
|
||||
Ltac move_to_top x :=
|
||||
match reverse goal with
|
||||
| H : _ |- _ => try move x after H
|
||||
end.
|
||||
|
||||
Tactic Notation "assert_eq" ident(x) constr(v) :=
|
||||
let H := fresh in
|
||||
assert (x = v) as H by reflexivity;
|
||||
clear H.
|
||||
|
||||
Tactic Notation "Case_aux" ident(x) constr(name) :=
|
||||
first [
|
||||
set (x := name); move_to_top x
|
||||
| assert_eq x name; move_to_top x
|
||||
| fail 1 "because we are working on a different case" ].
|
||||
|
||||
Ltac Case name := Case_aux Case name.
|
||||
Ltac SCase name := Case_aux SCase name.
|
||||
Ltac SSCase name := Case_aux SSCase name.
|
||||
Ltac SSSCase name := Case_aux SSSCase name.
|
||||
Ltac SSSSCase name := Case_aux SSSSCase name.
|
||||
Ltac SSSSSCase name := Case_aux SSSSSCase name.
|
||||
Ltac SSSSSSCase name := Case_aux SSSSSSCase name.
|
||||
Ltac SSSSSSSCase name := Case_aux SSSSSSSCase name.
|
||||
|
||||
Theorem andb_true_elim1 : forall b c : bool,
|
||||
andb b c = true -> b = true.
|
||||
Proof.
|
||||
intros b c H.
|
||||
destruct b.
|
||||
Case "b = true".
|
||||
reflexivity.
|
||||
Case "b = false".
|
||||
rewrite <- H. reflexivity. Qed.
|
||||
|
||||
Theorem plus_0_r : forall n : nat, n + O = n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0". reflexivity.
|
||||
Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem minus_diag : forall n,
|
||||
minus n n = O.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl. reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
|
||||
Theorem mult_0_r : forall n:nat,
|
||||
n * O = O.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem plus_n_Sm : forall n m : nat,
|
||||
S (n + m) = n + (S m).
|
||||
Proof.
|
||||
intros n m. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem plus_assoc : forall n m p : nat,
|
||||
n + (m + p) = (n + m) + p.
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_distr : forall n m: nat, S (n + m) = n + (S m).
|
||||
Proof.
|
||||
intros n m. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'. reflexivity. Qed.
|
||||
|
||||
Theorem mult_distr : forall n m: nat, n * ((S O) + m) = n * (S m).
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n as [| n'].
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_comm : forall n m : nat,
|
||||
n + m = m + n.
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl.
|
||||
rewrite -> plus_0_r.
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl.
|
||||
rewrite -> IHn'.
|
||||
rewrite -> plus_distr.
|
||||
reflexivity. Qed.
|
||||
|
||||
Fixpoint double (n:nat) :=
|
||||
match n with
|
||||
| O => O
|
||||
| S n' => S (S (double n'))
|
||||
end.
|
||||
|
||||
Lemma double_plus : forall n, double n = n + n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl. rewrite -> IHn'.
|
||||
rewrite -> plus_distr. reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem beq_nat_refl : forall n : nat,
|
||||
true = beq_nat n n.
|
||||
Proof.
|
||||
intros n. induction n as [| n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n".
|
||||
simpl. rewrite <- IHn'.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem plus_rearrange: forall n m p q : nat,
|
||||
(n + m) + (p + q) = (m + n) + (p + q).
|
||||
Proof.
|
||||
intros n m p q.
|
||||
assert(H: n + m = m + n).
|
||||
Case "Proof by assertion".
|
||||
rewrite -> plus_comm. reflexivity.
|
||||
rewrite -> H. reflexivity. Qed.
|
||||
|
||||
Theorem plus_swap : forall n m p: nat,
|
||||
n + (m + p) = m + (n + p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
rewrite -> plus_assoc.
|
||||
assert(H: m + (n + p) = (m + n) + p).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H.
|
||||
assert(H2: m + n = n + m).
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
rewrite -> H2.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_swap' : forall n m p: nat,
|
||||
n + (m + p) = m + (n + p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
rewrite -> plus_assoc.
|
||||
assert(H: m + (n + p) = (m + n) + p).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H.
|
||||
replace (m + n) with (n + m).
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
rewrite -> plus_comm.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1_distr: forall m n: nat,
|
||||
n * ((S O) + m) = n * (S O) + n * m.
|
||||
Proof.
|
||||
intros n m.
|
||||
rewrite -> mult_1.
|
||||
rewrite -> plus_1_1.
|
||||
simpl.
|
||||
induction m as [|m'].
|
||||
simpl.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> plus_swap.
|
||||
rewrite <- IHm'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_comm: forall m n : nat,
|
||||
m * n = n * m.
|
||||
Proof.
|
||||
intros m n.
|
||||
induction n as [| n'].
|
||||
Case "n = 0".
|
||||
simpl.
|
||||
rewrite -> mult_0_r.
|
||||
reflexivity.
|
||||
Case "n = S n'".
|
||||
simpl.
|
||||
rewrite <- mult_distr.
|
||||
rewrite -> mult_1_distr.
|
||||
rewrite -> mult_1.
|
||||
rewrite -> IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem evenb_next : forall n : nat,
|
||||
evenb n = evenb (S (S n)).
|
||||
Proof.
|
||||
intros n.
|
||||
Admitted.
|
||||
|
||||
Theorem negb_negb : forall n : bool,
|
||||
n = negb (negb n).
|
||||
Proof.
|
||||
intros n.
|
||||
destruct n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem evenb_n_oddb_Sn : forall n : nat,
|
||||
evenb n = negb (evenb (S n)).
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [|n'].
|
||||
reflexivity.
|
||||
assert(H: evenb n' = evenb (S (S n'))).
|
||||
reflexivity.
|
||||
rewrite <- H.
|
||||
rewrite -> IHn'.
|
||||
rewrite <- negb_negb.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(*Fixpoint bad (n : nat) : bool :=
|
||||
match n with
|
||||
| O => true
|
||||
| S O => bad (S n)
|
||||
| S (S n') => bad n'
|
||||
end.*)
|
||||
|
||||
Theorem ble_nat_refl : forall n:nat,
|
||||
true = ble_nat n n.
|
||||
Proof.
|
||||
intros n.
|
||||
induction n as [|n'].
|
||||
Case "n = 0".
|
||||
reflexivity.
|
||||
Case "n = S n".
|
||||
simpl.
|
||||
rewrite <- IHn'.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem zero_nbeq_S : forall n: nat,
|
||||
beq_nat O (S n) = false.
|
||||
Proof.
|
||||
intros n.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem andb_false_r : forall b : bool,
|
||||
andb b false = false.
|
||||
Proof.
|
||||
intros b.
|
||||
destruct b.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem plus_ble_compat_1 : forall n m p : nat,
|
||||
ble_nat n m = true -> ble_nat (p + n) (p + m) = true.
|
||||
Proof.
|
||||
intros n m p.
|
||||
intros H.
|
||||
induction p.
|
||||
Case "p = 0".
|
||||
simpl.
|
||||
rewrite -> H.
|
||||
reflexivity.
|
||||
Case "p = S p'".
|
||||
simpl.
|
||||
rewrite -> IHp.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem S_nbeq_0 : forall n:nat,
|
||||
beq_nat (S n) O = false.
|
||||
Proof.
|
||||
intros n.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_1_1 : forall n:nat, (S O) * n = n.
|
||||
Proof.
|
||||
intros n.
|
||||
simpl.
|
||||
rewrite -> plus_0_r.
|
||||
reflexivity. Qed.
|
||||
|
||||
Theorem all3_spec : forall b c : bool,
|
||||
orb (andb b c)
|
||||
(orb (negb b)
|
||||
(negb c))
|
||||
= true.
|
||||
Proof.
|
||||
intros b c.
|
||||
destruct b.
|
||||
destruct c.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma mult_plus_1 : forall n m : nat,
|
||||
S(m + n) = m + (S n).
|
||||
Proof.
|
||||
intros n m.
|
||||
induction m.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHm.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_mult : forall n m : nat,
|
||||
n * (S m) = n * m + n.
|
||||
Proof.
|
||||
intros n m.
|
||||
induction n.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn.
|
||||
rewrite -> plus_assoc.
|
||||
rewrite -> mult_plus_1.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_plus_distr_r : forall n m p:nat,
|
||||
(n + m) * p = (n * p) + (m * p).
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction p.
|
||||
rewrite -> mult_0_r.
|
||||
rewrite -> mult_0_r.
|
||||
rewrite -> mult_0_r.
|
||||
reflexivity.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> mult_mult.
|
||||
rewrite -> IHp.
|
||||
assert(H1: ((n * p) + n) + (m * p + m) = (n * p) + (n + (m * p + m))).
|
||||
rewrite <- plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H1.
|
||||
assert(H2: (n + (m * p + m)) = (m * p + (n + m))).
|
||||
rewrite -> plus_swap.
|
||||
reflexivity.
|
||||
rewrite -> H2.
|
||||
assert(H3: (n * p) + (m * p + (n + m)) = ((n * p ) + (m * p)) + (n + m)).
|
||||
rewrite -> plus_assoc.
|
||||
reflexivity.
|
||||
rewrite -> H3.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Theorem mult_assoc : forall n m p : nat,
|
||||
n * (m * p) = (n * m) * p.
|
||||
Proof.
|
||||
intros n m p.
|
||||
induction n.
|
||||
simpl.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> mult_plus_distr_r.
|
||||
rewrite -> IHn.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Inductive bin : Type :=
|
||||
| BO : bin
|
||||
| D : bin -> bin
|
||||
| M : bin -> bin.
|
||||
|
||||
Fixpoint incbin (n : bin) : bin :=
|
||||
match n with
|
||||
| BO => M (BO)
|
||||
| D n' => M n'
|
||||
| M n' => D (incbin n')
|
||||
end.
|
||||
|
||||
Fixpoint bin2un (n : bin) : nat :=
|
||||
match n with
|
||||
| BO => O
|
||||
| D n' => double (bin2un n')
|
||||
| M n' => S (double (bin2un n'))
|
||||
end.
|
||||
|
||||
Theorem bin_comm : forall n : bin,
|
||||
bin2un(incbin n) = S (bin2un n).
|
||||
Proof.
|
||||
intros n.
|
||||
induction n.
|
||||
reflexivity.
|
||||
reflexivity.
|
||||
simpl.
|
||||
rewrite -> IHn.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
End Playground1.
|
||||
85
samples/Coq/Computation.v
Normal file
85
samples/Coq/Computation.v
Normal file
@@ -0,0 +1,85 @@
|
||||
(** The definition of computations, used to represent interactive programs. *)
|
||||
Require Import Coq.NArith.NArith.
|
||||
Require Import ListString.All.
|
||||
|
||||
Local Open Scope type.
|
||||
|
||||
(** System calls. *)
|
||||
Module Command.
|
||||
Inductive t :=
|
||||
| AskCard
|
||||
| AskPIN
|
||||
| CheckPIN (pin : N)
|
||||
| AskAmount
|
||||
| CheckAmount (amount : N)
|
||||
| GiveCard
|
||||
| GiveAmount (amount : N)
|
||||
| ShowError (message : LString.t).
|
||||
|
||||
(** The type of an answer for a command depends on the value of the command. *)
|
||||
Definition answer (command : t) : Type :=
|
||||
match command with
|
||||
| AskCard => bool (* If the given card seems valid. *)
|
||||
| AskPIN => option N (* A number or cancellation. *)
|
||||
| CheckPIN _ => bool (* If the PIN number is valid. *)
|
||||
| AskAmount => option N (* A number or cancellation. *)
|
||||
| CheckAmount _ => bool (* If the amount can be withdrawn. *)
|
||||
| GiveCard => bool (* If the card was given. *)
|
||||
| GiveAmount _ => bool (* If the money was given. *)
|
||||
| ShowError _ => unit (* Show an error message. *)
|
||||
end.
|
||||
End Command.
|
||||
|
||||
(** Computations with I/Os. *)
|
||||
Module C.
|
||||
(** A computation can either does nothing, or do a system call and wait
|
||||
for the answer to run another computation. *)
|
||||
Inductive t : Type :=
|
||||
| Ret : t
|
||||
| Call : forall (command : Command.t), (Command.answer command -> t) -> t.
|
||||
Arguments Ret.
|
||||
Arguments Call _ _.
|
||||
|
||||
(** Some optional notations. *)
|
||||
Module Notations.
|
||||
(** A nicer notation for `Ret`. *)
|
||||
Definition ret : t :=
|
||||
Ret.
|
||||
|
||||
(** We define an explicit apply function so that Coq does not try to expand
|
||||
the notations everywhere. *)
|
||||
Definition apply {A B} (f : A -> B) (x : A) := f x.
|
||||
|
||||
(** System call. *)
|
||||
Notation "'call!' answer ':=' command 'in' X" :=
|
||||
(Call command (fun answer => X))
|
||||
(at level 200, answer ident, command at level 100, X at level 200).
|
||||
|
||||
(** System call with typed answer. *)
|
||||
Notation "'call!' answer : A ':=' command 'in' X" :=
|
||||
(Call command (fun (answer : A) => X))
|
||||
(at level 200, answer ident, command at level 100, A at level 200, X at level 200).
|
||||
|
||||
(** System call ignoring the answer. *)
|
||||
Notation "'do_call!' command 'in' X" :=
|
||||
(Call command (fun _ => X))
|
||||
(at level 200, command at level 100, X at level 200).
|
||||
|
||||
(** This notation is useful to compose computations which wait for a
|
||||
continuation. We do not have an explicit bind operator to simplify the
|
||||
language and the proofs. *)
|
||||
Notation "'let!' x ':=' X 'in' Y" :=
|
||||
(apply X (fun x => Y))
|
||||
(at level 200, x ident, X at level 100, Y at level 200).
|
||||
|
||||
(** Let with a typed answer. *)
|
||||
Notation "'let!' x : A ':=' X 'in' Y" :=
|
||||
(apply X (fun (x : A) => Y))
|
||||
(at level 200, x ident, X at level 100, A at level 200, Y at level 200).
|
||||
|
||||
(** Let ignoring the answer. *)
|
||||
Notation "'do!' X 'in' Y" :=
|
||||
(apply X (fun _ => Y))
|
||||
(at level 200, X at level 100, Y at level 200).
|
||||
End Notations.
|
||||
End C.
|
||||
@@ -1,290 +0,0 @@
|
||||
(** A development of Treesort on Heap trees. It has an average
|
||||
complexity of O(n.log n) but of O(n²) in the worst case (e.g. if
|
||||
the list is already sorted) *)
|
||||
|
||||
(* G. Huet 1-9-95 uses Multiset *)
|
||||
|
||||
Require Import List Multiset PermutSetoid Relations Sorting.
|
||||
|
||||
Section defs.
|
||||
|
||||
(** * Trees and heap trees *)
|
||||
|
||||
(** ** Definition of trees over an ordered set *)
|
||||
|
||||
Variable A : Type.
|
||||
Variable leA : relation A.
|
||||
Variable eqA : relation A.
|
||||
|
||||
Let gtA (x y:A) := ~ leA x y.
|
||||
|
||||
Hypothesis leA_dec : forall x y:A, {leA x y} + {leA y x}.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis leA_refl : forall x y:A, eqA x y -> leA x y.
|
||||
Hypothesis leA_trans : forall x y z:A, leA x y -> leA y z -> leA x z.
|
||||
Hypothesis leA_antisym : forall x y:A, leA x y -> leA y x -> eqA x y.
|
||||
|
||||
Hint Resolve leA_refl.
|
||||
Hint Immediate eqA_dec leA_dec leA_antisym.
|
||||
|
||||
Let emptyBag := EmptyBag A.
|
||||
Let singletonBag := SingletonBag _ eqA_dec.
|
||||
|
||||
Inductive Tree :=
|
||||
| Tree_Leaf : Tree
|
||||
| Tree_Node : A -> Tree -> Tree -> Tree.
|
||||
|
||||
(** [a] is lower than a Tree [T] if [T] is a Leaf
|
||||
or [T] is a Node holding [b>a] *)
|
||||
|
||||
Definition leA_Tree (a:A) (t:Tree) :=
|
||||
match t with
|
||||
| Tree_Leaf => True
|
||||
| Tree_Node b T1 T2 => leA a b
|
||||
end.
|
||||
|
||||
Lemma leA_Tree_Leaf : forall a:A, leA_Tree a Tree_Leaf.
|
||||
Proof.
|
||||
simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma leA_Tree_Node :
|
||||
forall (a b:A) (G D:Tree), leA a b -> leA_Tree a (Tree_Node b G D).
|
||||
Proof.
|
||||
simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** The heap property *)
|
||||
|
||||
Inductive is_heap : Tree -> Prop :=
|
||||
| nil_is_heap : is_heap Tree_Leaf
|
||||
| node_is_heap :
|
||||
forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> is_heap T2 -> is_heap (Tree_Node a T1 T2).
|
||||
|
||||
Lemma invert_heap :
|
||||
forall (a:A) (T1 T2:Tree),
|
||||
is_heap (Tree_Node a T1 T2) ->
|
||||
leA_Tree a T1 /\ leA_Tree a T2 /\ is_heap T1 /\ is_heap T2.
|
||||
Proof.
|
||||
intros; inversion H; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(* This lemma ought to be generated automatically by the Inversion tools *)
|
||||
Lemma is_heap_rect :
|
||||
forall P:Tree -> Type,
|
||||
P Tree_Leaf ->
|
||||
(forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) ->
|
||||
forall T:Tree, is_heap T -> P T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros a G PG D PD PN.
|
||||
elim (invert_heap a G D); auto with datatypes.
|
||||
intros H1 H2; elim H2; intros H3 H4; elim H4; intros.
|
||||
apply X0; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(* This lemma ought to be generated automatically by the Inversion tools *)
|
||||
Lemma is_heap_rec :
|
||||
forall P:Tree -> Set,
|
||||
P Tree_Leaf ->
|
||||
(forall (a:A) (T1 T2:Tree),
|
||||
leA_Tree a T1 ->
|
||||
leA_Tree a T2 ->
|
||||
is_heap T1 -> P T1 -> is_heap T2 -> P T2 -> P (Tree_Node a T1 T2)) ->
|
||||
forall T:Tree, is_heap T -> P T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros a G PG D PD PN.
|
||||
elim (invert_heap a G D); auto with datatypes.
|
||||
intros H1 H2; elim H2; intros H3 H4; elim H4; intros.
|
||||
apply X; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma low_trans :
|
||||
forall (T:Tree) (a b:A), leA a b -> leA_Tree b T -> leA_Tree a T.
|
||||
Proof.
|
||||
simple induction T; auto with datatypes.
|
||||
intros; simpl; apply leA_trans with b; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(** ** Merging two sorted lists *)
|
||||
|
||||
Inductive merge_lem (l1 l2:list A) : Type :=
|
||||
merge_exist :
|
||||
forall l:list A,
|
||||
Sorted leA l ->
|
||||
meq (list_contents _ eqA_dec l)
|
||||
(munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2)) ->
|
||||
(forall a, HdRel leA a l1 -> HdRel leA a l2 -> HdRel leA a l) ->
|
||||
merge_lem l1 l2.
|
||||
Require Import Morphisms.
|
||||
|
||||
Instance: Equivalence (@meq A).
|
||||
Proof. constructor; auto with datatypes. red. apply meq_trans. Defined.
|
||||
|
||||
Instance: Proper (@meq A ++> @meq _ ++> @meq _) (@munion A).
|
||||
Proof. intros x y H x' y' H'. now apply meq_congr. Qed.
|
||||
|
||||
Lemma merge :
|
||||
forall l1:list A, Sorted leA l1 ->
|
||||
forall l2:list A, Sorted leA l2 -> merge_lem l1 l2.
|
||||
Proof.
|
||||
fix 1; intros; destruct l1.
|
||||
apply merge_exist with l2; auto with datatypes.
|
||||
rename l1 into l.
|
||||
revert l2 H0. fix 1. intros.
|
||||
destruct l2 as [|a0 l0].
|
||||
apply merge_exist with (a :: l); simpl; auto with datatypes.
|
||||
elim (leA_dec a a0); intros.
|
||||
|
||||
(* 1 (leA a a0) *)
|
||||
apply Sorted_inv in H. destruct H.
|
||||
destruct (merge l H (a0 :: l0) H0).
|
||||
apply merge_exist with (a :: l1). clear merge merge0.
|
||||
auto using cons_sort, cons_leA with datatypes.
|
||||
simpl. rewrite m. now rewrite munion_ass.
|
||||
intros. apply cons_leA.
|
||||
apply (@HdRel_inv _ leA) with l; trivial with datatypes.
|
||||
|
||||
(* 2 (leA a0 a) *)
|
||||
apply Sorted_inv in H0. destruct H0.
|
||||
destruct (merge0 l0 H0). clear merge merge0.
|
||||
apply merge_exist with (a0 :: l1);
|
||||
auto using cons_sort, cons_leA with datatypes.
|
||||
simpl; rewrite m. simpl. setoid_rewrite munion_ass at 1. rewrite munion_comm.
|
||||
repeat rewrite munion_ass. setoid_rewrite munion_comm at 3. reflexivity.
|
||||
intros. apply cons_leA.
|
||||
apply (@HdRel_inv _ leA) with l0; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
(** ** From trees to multisets *)
|
||||
|
||||
(** contents of a tree as a multiset *)
|
||||
|
||||
(** Nota Bene : In what follows the definition of SingletonBag
|
||||
in not used. Actually, we could just take as postulate:
|
||||
[Parameter SingletonBag : A->multiset]. *)
|
||||
|
||||
Fixpoint contents (t:Tree) : multiset A :=
|
||||
match t with
|
||||
| Tree_Leaf => emptyBag
|
||||
| Tree_Node a t1 t2 =>
|
||||
munion (contents t1) (munion (contents t2) (singletonBag a))
|
||||
end.
|
||||
|
||||
|
||||
(** equivalence of two trees is equality of corresponding multisets *)
|
||||
Definition equiv_Tree (t1 t2:Tree) := meq (contents t1) (contents t2).
|
||||
|
||||
|
||||
|
||||
(** * From lists to sorted lists *)
|
||||
|
||||
(** ** Specification of heap insertion *)
|
||||
|
||||
Inductive insert_spec (a:A) (T:Tree) : Type :=
|
||||
insert_exist :
|
||||
forall T1:Tree,
|
||||
is_heap T1 ->
|
||||
meq (contents T1) (munion (contents T) (singletonBag a)) ->
|
||||
(forall b:A, leA b a -> leA_Tree b T -> leA_Tree b T1) ->
|
||||
insert_spec a T.
|
||||
|
||||
|
||||
Lemma insert : forall T:Tree, is_heap T -> forall a:A, insert_spec a T.
|
||||
Proof.
|
||||
simple induction 1; intros.
|
||||
apply insert_exist with (Tree_Node a Tree_Leaf Tree_Leaf);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
simpl; unfold meq, munion; auto using node_is_heap with datatypes.
|
||||
elim (leA_dec a a0); intros.
|
||||
elim (X a0); intros.
|
||||
apply insert_exist with (Tree_Node a T2 T0);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
simpl; apply treesort_twist1; trivial with datatypes.
|
||||
elim (X a); intros T3 HeapT3 ConT3 LeA.
|
||||
apply insert_exist with (Tree_Node a0 T2 T3);
|
||||
auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
apply node_is_heap; auto using node_is_heap, nil_is_heap, leA_Tree_Leaf with datatypes.
|
||||
apply low_trans with a; auto with datatypes.
|
||||
apply LeA; auto with datatypes.
|
||||
apply low_trans with a; auto with datatypes.
|
||||
simpl; apply treesort_twist2; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** Building a heap from a list *)
|
||||
|
||||
Inductive build_heap (l:list A) : Type :=
|
||||
heap_exist :
|
||||
forall T:Tree,
|
||||
is_heap T ->
|
||||
meq (list_contents _ eqA_dec l) (contents T) -> build_heap l.
|
||||
|
||||
Lemma list_to_heap : forall l:list A, build_heap l.
|
||||
Proof.
|
||||
simple induction l.
|
||||
apply (heap_exist nil Tree_Leaf); auto with datatypes.
|
||||
simpl; unfold meq; exact nil_is_heap.
|
||||
simple induction 1.
|
||||
intros T i m; elim (insert T i a).
|
||||
intros; apply heap_exist with T1; simpl; auto with datatypes.
|
||||
apply meq_trans with (munion (contents T) (singletonBag a)).
|
||||
apply meq_trans with (munion (singletonBag a) (contents T)).
|
||||
apply meq_right; trivial with datatypes.
|
||||
apply munion_comm.
|
||||
apply meq_sym; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** ** Building the sorted list *)
|
||||
|
||||
Inductive flat_spec (T:Tree) : Type :=
|
||||
flat_exist :
|
||||
forall l:list A,
|
||||
Sorted leA l ->
|
||||
(forall a:A, leA_Tree a T -> HdRel leA a l) ->
|
||||
meq (contents T) (list_contents _ eqA_dec l) -> flat_spec T.
|
||||
|
||||
Lemma heap_to_list : forall T:Tree, is_heap T -> flat_spec T.
|
||||
Proof.
|
||||
intros T h; elim h; intros.
|
||||
apply flat_exist with (nil (A:=A)); auto with datatypes.
|
||||
elim X; intros l1 s1 i1 m1; elim X0; intros l2 s2 i2 m2.
|
||||
elim (merge _ s1 _ s2); intros.
|
||||
apply flat_exist with (a :: l); simpl; auto with datatypes.
|
||||
apply meq_trans with
|
||||
(munion (list_contents _ eqA_dec l1)
|
||||
(munion (list_contents _ eqA_dec l2) (singletonBag a))).
|
||||
apply meq_congr; auto with datatypes.
|
||||
apply meq_trans with
|
||||
(munion (singletonBag a)
|
||||
(munion (list_contents _ eqA_dec l1) (list_contents _ eqA_dec l2))).
|
||||
apply munion_rotate.
|
||||
apply meq_right; apply meq_sym; trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
|
||||
(** * Specification of treesort *)
|
||||
|
||||
Theorem treesort :
|
||||
forall l:list A,
|
||||
{m : list A | Sorted leA m & permutation _ eqA_dec l m}.
|
||||
Proof.
|
||||
intro l; unfold permutation.
|
||||
elim (list_to_heap l).
|
||||
intros.
|
||||
elim (heap_to_list T); auto with datatypes.
|
||||
intros.
|
||||
exists l0; auto with datatypes.
|
||||
apply meq_trans with (contents T); trivial with datatypes.
|
||||
Qed.
|
||||
|
||||
End defs.
|
||||
5944
samples/Coq/JsCorrectness.v
Normal file
5944
samples/Coq/JsCorrectness.v
Normal file
File diff suppressed because it is too large
Load Diff
249
samples/Coq/JsInterpreterExtraction.v
Normal file
249
samples/Coq/JsInterpreterExtraction.v
Normal file
@@ -0,0 +1,249 @@
|
||||
Set Implicit Arguments.
|
||||
Require Import JsSyntax JsInterpreterMonads JsInterpreter JsInit.
|
||||
Require Import LibFix LibList.
|
||||
|
||||
Require Export Shared.
|
||||
Require Export LibTactics LibLogic LibReflect LibList
|
||||
LibOperation LibStruct LibNat LibEpsilon LibFunc LibHeap.
|
||||
Require Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits.
|
||||
|
||||
|
||||
|
||||
(* Here stands some commands to extract relatively correctly the interpreter to Ocaml. *)
|
||||
Extraction Language Ocaml.
|
||||
|
||||
Require Import ExtrOcamlBasic.
|
||||
Require Import ExtrOcamlNatInt.
|
||||
Require Import ExtrOcamlString.
|
||||
|
||||
(* Optimal fixpoint. *)
|
||||
Extraction Inline FixFun3 FixFun3Mod FixFun4 FixFun4Mod FixFunMod curry3 uncurry3 curry4 uncurry4.
|
||||
(* As classical logic statements are now unused, they should not be extracted
|
||||
(otherwise, useless errors will be launched). *)
|
||||
Extraction Inline epsilon epsilon_def classicT arbitrary indefinite_description Inhab_witness Fix isTrue.
|
||||
|
||||
(**************************************************************)
|
||||
(** ** Numerical values *)
|
||||
|
||||
(* number *)
|
||||
|
||||
Extract Inductive positive => float
|
||||
[ "(fun p -> 1. +. (2. *. p))"
|
||||
"(fun p -> 2. *. p)"
|
||||
"1." ]
|
||||
"(fun f2p1 f2p f1 p ->
|
||||
if p <= 1. then f1 () else if mod_float p 2. = 0. then f2p (floor (p /. 2.)) else f2p1 (floor (p /. 2.)))".
|
||||
|
||||
Extract Inductive Z => float [ "0." "" "(~-.)" ]
|
||||
"(fun f0 fp fn z -> if z=0. then f0 () else if z>0. then fp z else fn (~-. z))".
|
||||
|
||||
Extract Inductive N => float [ "0." "" ]
|
||||
"(fun f0 fp n -> if n=0. then f0 () else fp n)".
|
||||
|
||||
Extract Constant Z.add => "(+.)".
|
||||
Extract Constant Z.succ => "(+.) 1.".
|
||||
Extract Constant Z.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant Z.sub => "(-.)".
|
||||
Extract Constant Z.mul => "( *. )".
|
||||
Extract Constant Z.opp => "(~-.)".
|
||||
Extract Constant Z.abs => "abs_float".
|
||||
Extract Constant Z.min => "min".
|
||||
Extract Constant Z.max => "max".
|
||||
Extract Constant Z.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
|
||||
Extract Constant Pos.add => "(+.)".
|
||||
Extract Constant Pos.succ => "(+.) 1.".
|
||||
Extract Constant Pos.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant Pos.sub => "(-.)".
|
||||
Extract Constant Pos.mul => "( *. )".
|
||||
Extract Constant Pos.min => "min".
|
||||
Extract Constant Pos.max => "max".
|
||||
Extract Constant Pos.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
Extract Constant Pos.compare_cont =>
|
||||
"fun x y c -> if x=y then c else if x<y then Lt else Gt".
|
||||
|
||||
Extract Constant N.add => "(+.)".
|
||||
Extract Constant N.succ => "(+.) 1.".
|
||||
Extract Constant N.pred => "(fun x -> x -. 1.)".
|
||||
Extract Constant N.sub => "(-.)".
|
||||
Extract Constant N.mul => "( *. )".
|
||||
Extract Constant N.min => "min".
|
||||
Extract Constant N.max => "max".
|
||||
Extract Constant N.div => "(fun x y -> if x = 0. then 0. else floor (x /. y))".
|
||||
Extract Constant N.modulo => "mod_float".
|
||||
Extract Constant N.compare =>
|
||||
"fun x y -> if x=y then Eq else if x<y then Lt else Gt".
|
||||
|
||||
Extract Inductive Fappli_IEEE.binary_float => float [
|
||||
"(fun s -> if s then (0.) else (-0.))"
|
||||
"(fun s -> if s then infinity else neg_infinity)"
|
||||
"nan"
|
||||
"(fun (s, m, e) -> failwith ""FIXME: No extraction from binary float allowed yet."")"
|
||||
].
|
||||
|
||||
Extract Constant JsNumber.of_int => "fun x -> x".
|
||||
|
||||
Extract Constant JsNumber.nan => "nan".
|
||||
Extract Constant JsNumber.zero => "0.".
|
||||
Extract Constant JsNumber.neg_zero => "(-0.)".
|
||||
Extract Constant JsNumber.one => "1.".
|
||||
Extract Constant JsNumber.infinity => "infinity".
|
||||
Extract Constant JsNumber.neg_infinity => "neg_infinity".
|
||||
Extract Constant JsNumber.max_value => "max_float".
|
||||
Extract Constant JsNumber.min_value => "(Int64.float_of_bits Int64.one)".
|
||||
Extract Constant JsNumber.pi => "(4. *. atan 1.)".
|
||||
Extract Constant JsNumber.e => "(exp 1.)".
|
||||
Extract Constant JsNumber.ln2 => "(log 2.)".
|
||||
Extract Constant JsNumber.floor => "floor".
|
||||
Extract Constant JsNumber.absolute => "abs_float".
|
||||
|
||||
Extract Constant JsNumber.from_string =>
|
||||
"(fun s ->
|
||||
try
|
||||
let s = (String.concat """" (List.map (String.make 1) s)) in
|
||||
if s = """" then 0. else float_of_string s
|
||||
with Failure ""float_of_string"" -> nan)
|
||||
(* Note that we're using `float_of_string' there, which does not have the same
|
||||
behavior than JavaScript. For instance it will read ""022"" as 22 instead of
|
||||
18, which should be the JavaScript result for it. *)".
|
||||
|
||||
Extract Constant JsNumber.to_string =>
|
||||
"(fun f ->
|
||||
prerr_string (""Warning: JsNumber.to_string called. This might be responsible for errors. Argument value: "" ^ string_of_float f ^ ""."");
|
||||
prerr_newline();
|
||||
let string_of_number n =
|
||||
let sfn = string_of_float n in
|
||||
(if (sfn = ""inf"") then ""Infinity"" else
|
||||
if (sfn = ""-inf"") then ""-Infinity"" else
|
||||
if (sfn = ""nan"") then ""NaN"" else
|
||||
let inum = int_of_float n in
|
||||
if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in
|
||||
let ret = ref [] in (* Ugly, but the API for OCaml string is not very functional... *)
|
||||
String.iter (fun c -> ret := c :: !ret) (string_of_number f);
|
||||
List.rev !ret)
|
||||
(* Note that this is ugly, we should use the spec of JsNumber.to_string here (9.8.1). *)".
|
||||
|
||||
Extract Constant JsNumber.add => "(+.)".
|
||||
Extract Constant JsNumber.sub => "(-.)".
|
||||
Extract Constant JsNumber.mult => "( *. )".
|
||||
Extract Constant JsNumber.div => "(/.)".
|
||||
Extract Constant JsNumber.fmod => "mod_float".
|
||||
Extract Constant JsNumber.neg => "(~-.)".
|
||||
Extract Constant JsNumber.sign => "(fun f -> float_of_int (compare f 0.))".
|
||||
Extract Constant JsNumber.number_comparable => "(fun n1 n2 -> 0 = compare n1 n2)".
|
||||
Extract Constant JsNumber.lt_bool => "(<)".
|
||||
|
||||
Extract Constant JsNumber.to_int32 =>
|
||||
"fun n ->
|
||||
match classify_float n with
|
||||
| FP_normal | FP_subnormal ->
|
||||
let i32 = 2. ** 32. in
|
||||
let i31 = 2. ** 31. in
|
||||
let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in
|
||||
let int32bit =
|
||||
let smod = mod_float posint i32 in
|
||||
if smod < 0. then smod +. i32 else smod
|
||||
in
|
||||
(if int32bit >= i31 then int32bit -. i32 else int32bit)
|
||||
| _ -> 0.". (* LATER: do in Coq. Spec is 9.5, p. 47.*)
|
||||
|
||||
Extract Constant JsNumber.to_uint32 =>
|
||||
"fun n ->
|
||||
match classify_float n with
|
||||
| FP_normal | FP_subnormal ->
|
||||
let i32 = 2. ** 32. in
|
||||
let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in
|
||||
let int32bit =
|
||||
let smod = mod_float posint i32 in
|
||||
if smod < 0. then smod +. i32 else smod
|
||||
in
|
||||
int32bit
|
||||
| _ -> 0.". (* LAER: do in Coq. Spec is 9.6, p47.*)
|
||||
|
||||
Extract Constant JsNumber.modulo_32 => "(fun x -> let r = mod_float x 32. in if x < 0. then r +. 32. else r)".
|
||||
Extract Constant JsNumber.int32_bitwise_not => "fun x -> Int32.to_float (Int32.lognot (Int32.of_float x))".
|
||||
Extract Constant JsNumber.int32_bitwise_and => "fun x y -> Int32.to_float (Int32.logand (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_bitwise_or => "fun x y -> Int32.to_float (Int32.logor (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_bitwise_xor => "fun x y -> Int32.to_float (Int32.logxor (Int32.of_float x) (Int32.of_float y))".
|
||||
Extract Constant JsNumber.int32_left_shift => "(fun x y -> Int32.to_float (Int32.shift_left (Int32.of_float x) (int_of_float y)))".
|
||||
Extract Constant JsNumber.int32_right_shift => "(fun x y -> Int32.to_float (Int32.shift_right (Int32.of_float x) (int_of_float y)))".
|
||||
Extract Constant JsNumber.uint32_right_shift =>
|
||||
"(fun x y ->
|
||||
let i31 = 2. ** 31. in
|
||||
let i32 = 2. ** 32. in
|
||||
let newx = if x >= i31 then x -. i32 else x in
|
||||
let r = Int32.to_float (Int32.shift_right_logical (Int32.of_float newx) (int_of_float y)) in
|
||||
if r < 0. then r +. i32 else r)".
|
||||
|
||||
Extract Constant int_of_char => "(fun c -> float_of_int (int_of_char c))".
|
||||
|
||||
Extract Constant ascii_comparable => "(=)".
|
||||
Extract Constant lt_int_decidable => "(<)".
|
||||
Extract Constant le_int_decidable => "(<=)".
|
||||
Extract Constant ge_nat_decidable => "(>=)".
|
||||
|
||||
(* TODO ARTHUR: This TLC lemma does not extract to something computable... whereas it should! *)
|
||||
Extract Constant prop_eq_decidable => "(=)".
|
||||
|
||||
Extract Constant env_loc_global_env_record => "0".
|
||||
|
||||
(* The following functions make pattern matches with floats and shall thus be removed. *)
|
||||
Extraction Inline Fappli_IEEE.Bplus Fappli_IEEE.binary_normalize Fappli_IEEE_bits.b64_plus.
|
||||
Extraction Inline Fappli_IEEE.Bmult Fappli_IEEE.Bmult_FF Fappli_IEEE_bits.b64_mult.
|
||||
Extraction Inline Fappli_IEEE.Bdiv Fappli_IEEE_bits.b64_div.
|
||||
|
||||
(* New options for the interpreter to work in Coq 8.4 *)
|
||||
Set Extraction AccessOpaque.
|
||||
|
||||
(* These parameters are implementation-dependant according to the spec.
|
||||
I've chosed some very simple values, but we could choose another thing for them. *)
|
||||
Extract Constant object_prealloc_global_proto => "(Coq_value_prim Coq_prim_null)".
|
||||
Extract Constant object_prealloc_global_class => "(
|
||||
let rec aux s = function
|
||||
| 0 -> []
|
||||
| n -> let n' = n - 1 in
|
||||
s.[n'] :: aux s n'
|
||||
in let aux2 s =
|
||||
List.rev (aux s (String.length s))
|
||||
in aux2 ""GlobalClass"")".
|
||||
|
||||
|
||||
(* Parsing *)
|
||||
Extract Constant parse_pickable => "(fun s strict ->
|
||||
let str = String.concat """" (List.map (String.make 1) s) in
|
||||
try
|
||||
let parserExp = Parser_main.exp_from_string ~force_strict:strict str in
|
||||
Some (JsSyntaxInfos.add_infos_prog strict
|
||||
(Translate_syntax.exp_to_prog parserExp))
|
||||
with
|
||||
(* | Translate_syntax.CoqSyntaxDoesNotSupport _ -> assert false (* Temporary *) *)
|
||||
| Parser.ParserFailure _
|
||||
| Parser.InvalidArgument ->
|
||||
prerr_string (""Warning: Parser error on eval. Input string: \"""" ^ str ^ ""\""\n"");
|
||||
None
|
||||
)".
|
||||
|
||||
|
||||
(* Debugging *)
|
||||
Extract Inlined Constant not_yet_implemented_because => "(fun s ->
|
||||
print_endline (__LOC__ ^ "": Not implemented because: "" ^ Prheap.string_of_char_list s) ;
|
||||
Coq_result_not_yet_implemented)".
|
||||
Extract Inlined Constant impossible_because => "(fun s ->
|
||||
print_endline (__LOC__ ^ "": Stuck because: "" ^ Prheap.string_of_char_list s) ;
|
||||
Coq_result_impossible)".
|
||||
Extract Inlined Constant impossible_with_heap_because => "(fun s message ->
|
||||
print_endline (__LOC__ ^ "": Stuck!\nState: "" ^ Prheap.prstate true s
|
||||
^ ""\nMessage:\t"" ^ Prheap.string_of_char_list message) ;
|
||||
Coq_result_impossible)".
|
||||
|
||||
|
||||
(* Final Extraction *)
|
||||
Extraction Blacklist string list bool.
|
||||
Separate Extraction runs run_javascript.
|
||||
|
||||
|
||||
|
||||
(* -- LATER: extract inequality_test_string in more efficient way*)
|
||||
|
||||
1051
samples/Coq/JsNumber.v
Normal file
1051
samples/Coq/JsNumber.v
Normal file
File diff suppressed because it is too large
Load Diff
1766
samples/Coq/JsPrettyInterm.v
Normal file
1766
samples/Coq/JsPrettyInterm.v
Normal file
File diff suppressed because it is too large
Load Diff
42
samples/Coq/Main.v
Normal file
42
samples/Coq/Main.v
Normal file
@@ -0,0 +1,42 @@
|
||||
Require Import FunctionNinjas.All.
|
||||
Require Import ListString.All.
|
||||
Require Import Computation.
|
||||
|
||||
Import C.Notations.
|
||||
|
||||
Definition error (message : LString.t) : C.t :=
|
||||
do_call! Command.ShowError message in
|
||||
ret.
|
||||
|
||||
Definition main : C.t :=
|
||||
call! card_is_valid := Command.AskCard in
|
||||
if card_is_valid then
|
||||
call! pin := Command.AskPIN in
|
||||
match pin with
|
||||
| None => error @@ LString.s "No PIN given."
|
||||
| Some pin =>
|
||||
call! pin_is_valid := Command.CheckPIN pin in
|
||||
if pin_is_valid then
|
||||
call! ask_amount := Command.AskAmount in
|
||||
match ask_amount with
|
||||
| None => error @@ LString.s "No amount given."
|
||||
| Some amount =>
|
||||
call! amount_is_valid := Command.CheckAmount amount in
|
||||
if amount_is_valid then
|
||||
call! card_is_given := Command.GiveCard in
|
||||
if card_is_given then
|
||||
call! amount_is_given := Command.GiveAmount amount in
|
||||
if amount_is_given then
|
||||
ret
|
||||
else
|
||||
error @@ LString.s "Cannot give you the amount. Please contact your bank."
|
||||
else
|
||||
error @@ LString.s "Cannot give you back the card. Please contact your bank."
|
||||
else
|
||||
error @@ LString.s "Invalid amount."
|
||||
end
|
||||
else
|
||||
error @@ LString.s "Invalid PIN."
|
||||
end
|
||||
else
|
||||
error @@ LString.s "Invalid card.".
|
||||
@@ -1,539 +0,0 @@
|
||||
Require Import Omega Relations Multiset SetoidList.
|
||||
|
||||
(** This file is deprecated, use [Permutation.v] instead.
|
||||
|
||||
Indeed, this file defines a notion of permutation based on
|
||||
multisets (there exists a permutation between two lists iff every
|
||||
elements have the same multiplicity in the two lists) which
|
||||
requires a more complex apparatus (the equipment of the domain
|
||||
with a decidable equality) than [Permutation] in [Permutation.v].
|
||||
|
||||
The relation between the two relations are in lemma
|
||||
[permutation_Permutation].
|
||||
|
||||
File [Permutation] concerns Leibniz equality : it shows in particular
|
||||
that [List.Permutation] and [permutation] are equivalent in this context.
|
||||
*)
|
||||
|
||||
Set Implicit Arguments.
|
||||
|
||||
Local Notation "[ ]" := nil.
|
||||
Local Notation "[ a ; .. ; b ]" := (a :: .. (b :: []) ..).
|
||||
|
||||
Section Permut.
|
||||
|
||||
(** * From lists to multisets *)
|
||||
|
||||
Variable A : Type.
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
|
||||
Let emptyBag := EmptyBag A.
|
||||
Let singletonBag := SingletonBag _ eqA_dec.
|
||||
|
||||
(** contents of a list *)
|
||||
|
||||
Fixpoint list_contents (l:list A) : multiset A :=
|
||||
match l with
|
||||
| [] => emptyBag
|
||||
| a :: l => munion (singletonBag a) (list_contents l)
|
||||
end.
|
||||
|
||||
Lemma list_contents_app :
|
||||
forall l m:list A,
|
||||
meq (list_contents (l ++ m)) (munion (list_contents l) (list_contents m)).
|
||||
Proof.
|
||||
simple induction l; simpl; auto with datatypes.
|
||||
intros.
|
||||
apply meq_trans with
|
||||
(munion (singletonBag a) (munion (list_contents l0) (list_contents m)));
|
||||
auto with datatypes.
|
||||
Qed.
|
||||
|
||||
(** * [permutation]: definition and basic properties *)
|
||||
|
||||
Definition permutation (l m:list A) := meq (list_contents l) (list_contents m).
|
||||
|
||||
Lemma permut_refl : forall l:list A, permutation l l.
|
||||
Proof.
|
||||
unfold permutation; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_sym :
|
||||
forall l1 l2 : list A, permutation l1 l2 -> permutation l2 l1.
|
||||
Proof.
|
||||
unfold permutation, meq; intros; symmetry; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_trans :
|
||||
forall l m n:list A, permutation l m -> permutation m n -> permutation l n.
|
||||
Proof.
|
||||
unfold permutation; intros.
|
||||
apply meq_trans with (list_contents m); auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons_eq :
|
||||
forall l m:list A,
|
||||
permutation l m -> forall a a', eqA a a' -> permutation (a :: l) (a' :: m).
|
||||
Proof.
|
||||
unfold permutation; simpl; intros.
|
||||
apply meq_trans with (munion (singletonBag a') (list_contents l)).
|
||||
apply meq_left, meq_singleton; auto.
|
||||
auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons :
|
||||
forall l m:list A,
|
||||
permutation l m -> forall a:A, permutation (a :: l) (a :: m).
|
||||
Proof.
|
||||
unfold permutation; simpl; auto with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app :
|
||||
forall l l' m m':list A,
|
||||
permutation l l' -> permutation m m' -> permutation (l ++ m) (l' ++ m').
|
||||
Proof.
|
||||
unfold permutation; intros.
|
||||
apply meq_trans with (munion (list_contents l) (list_contents m));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
apply meq_trans with (munion (list_contents l') (list_contents m'));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
apply meq_trans with (munion (list_contents l') (list_contents m));
|
||||
auto using permut_cons, list_contents_app with datatypes.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_inside_eq :
|
||||
forall a a' l1 l2 l3 l4, eqA a a' ->
|
||||
permutation (l1 ++ l2) (l3 ++ l4) ->
|
||||
permutation (l1 ++ a :: l2) (l3 ++ a' :: l4).
|
||||
Proof.
|
||||
unfold permutation, meq in *; intros.
|
||||
specialize H0 with a0.
|
||||
repeat rewrite list_contents_app in *; simpl in *.
|
||||
destruct (eqA_dec a a0) as [Ha|Ha]; rewrite H in Ha;
|
||||
decide (eqA_dec a' a0) with Ha; simpl; auto with arith.
|
||||
do 2 rewrite <- plus_n_Sm; f_equal; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_inside :
|
||||
forall a l1 l2 l3 l4,
|
||||
permutation (l1 ++ l2) (l3 ++ l4) ->
|
||||
permutation (l1 ++ a :: l2) (l3 ++ a :: l4).
|
||||
Proof.
|
||||
unfold permutation, meq in *; intros.
|
||||
generalize (H a0); clear H.
|
||||
do 4 rewrite list_contents_app.
|
||||
simpl.
|
||||
destruct (eqA_dec a a0); simpl; auto with arith.
|
||||
do 2 rewrite <- plus_n_Sm; f_equal; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_cons_inside_eq :
|
||||
forall a a' l l1 l2, eqA a a' ->
|
||||
permutation l (l1 ++ l2) ->
|
||||
permutation (a :: l) (l1 ++ a' :: l2).
|
||||
Proof.
|
||||
intros;
|
||||
replace (a :: l) with ([] ++ a :: l); trivial;
|
||||
apply permut_add_inside_eq; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_add_cons_inside :
|
||||
forall a l l1 l2,
|
||||
permutation l (l1 ++ l2) ->
|
||||
permutation (a :: l) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
intros;
|
||||
replace (a :: l) with ([] ++ a :: l); trivial;
|
||||
apply permut_add_inside; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_middle :
|
||||
forall (l m:list A) (a:A), permutation (a :: l ++ m) (l ++ a :: m).
|
||||
Proof.
|
||||
intros; apply permut_add_cons_inside; auto using permut_sym, permut_refl.
|
||||
Qed.
|
||||
|
||||
Lemma permut_sym_app :
|
||||
forall l1 l2, permutation (l1 ++ l2) (l2 ++ l1).
|
||||
Proof.
|
||||
intros l1 l2;
|
||||
unfold permutation, meq;
|
||||
intro a; do 2 rewrite list_contents_app; simpl;
|
||||
auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma permut_rev :
|
||||
forall l, permutation l (rev l).
|
||||
Proof.
|
||||
induction l.
|
||||
simpl; trivial using permut_refl.
|
||||
simpl.
|
||||
apply permut_add_cons_inside.
|
||||
rewrite <- app_nil_end. trivial.
|
||||
Qed.
|
||||
|
||||
(** * Some inversion results. *)
|
||||
Lemma permut_conv_inv :
|
||||
forall e l1 l2, permutation (e :: l1) (e :: l2) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros e l1 l2; unfold permutation, meq; simpl; intros H a;
|
||||
generalize (H a); apply plus_reg_l.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app_inv1 :
|
||||
forall l l1 l2, permutation (l1 ++ l) (l2 ++ l) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros l l1 l2; unfold permutation, meq; simpl;
|
||||
intros H a; generalize (H a); clear H.
|
||||
do 2 rewrite list_contents_app.
|
||||
simpl.
|
||||
intros; apply plus_reg_l with (multiplicity (list_contents l) a).
|
||||
rewrite plus_comm; rewrite H; rewrite plus_comm.
|
||||
trivial.
|
||||
Qed.
|
||||
|
||||
(** we can use [multiplicity] to define [InA] and [NoDupA]. *)
|
||||
|
||||
Fact if_eqA_then : forall a a' (B:Type)(b b':B),
|
||||
eqA a a' -> (if eqA_dec a a' then b else b') = b.
|
||||
Proof.
|
||||
intros. destruct eqA_dec as [_|NEQ]; auto.
|
||||
contradict NEQ; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_app_inv2 :
|
||||
forall l l1 l2, permutation (l ++ l1) (l ++ l2) -> permutation l1 l2.
|
||||
Proof.
|
||||
intros l l1 l2; unfold permutation, meq; simpl;
|
||||
intros H a; generalize (H a); clear H.
|
||||
do 2 rewrite list_contents_app.
|
||||
simpl.
|
||||
intros; apply plus_reg_l with (multiplicity (list_contents l) a).
|
||||
trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_remove_hd_eq :
|
||||
forall l l1 l2 a b, eqA a b ->
|
||||
permutation (a :: l) (l1 ++ b :: l2) -> permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
unfold permutation, meq; simpl; intros l l1 l2 a b Heq H a0.
|
||||
specialize H with a0.
|
||||
rewrite list_contents_app in *; simpl in *.
|
||||
apply plus_reg_l with (if eqA_dec a a0 then 1 else 0).
|
||||
rewrite H; clear H.
|
||||
symmetry; rewrite plus_comm, <- ! plus_assoc; f_equal.
|
||||
rewrite plus_comm.
|
||||
destruct (eqA_dec a a0) as [Ha|Ha]; rewrite Heq in Ha;
|
||||
decide (eqA_dec b a0) with Ha; reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma permut_remove_hd :
|
||||
forall l l1 l2 a,
|
||||
permutation (a :: l) (l1 ++ a :: l2) -> permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
eauto using permut_remove_hd_eq, Equivalence_Reflexive.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_else : forall a a' (B:Type)(b b':B),
|
||||
~eqA a a' -> (if eqA_dec a a' then b else b') = b'.
|
||||
Proof.
|
||||
intros. decide (eqA_dec a a') with H; auto.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_refl : forall a (B:Type)(b b':B),
|
||||
(if eqA_dec a a then b else b') = b.
|
||||
Proof.
|
||||
intros; apply (decide_left (eqA_dec a a)); auto with *.
|
||||
Qed.
|
||||
|
||||
(** PL: Inutilisable dans un rewrite sans un change prealable. *)
|
||||
|
||||
Global Instance if_eqA (B:Type)(b b':B) :
|
||||
Proper (eqA==>eqA==>@eq _) (fun x y => if eqA_dec x y then b else b').
|
||||
Proof.
|
||||
intros x x' Hxx' y y' Hyy'.
|
||||
intros; destruct (eqA_dec x y) as [H|H];
|
||||
destruct (eqA_dec x' y') as [H'|H']; auto.
|
||||
contradict H'; transitivity x; auto with *; transitivity y; auto with *.
|
||||
contradict H; transitivity x'; auto with *; transitivity y'; auto with *.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_rewrite_l : forall a1 a1' a2 (B:Type)(b b':B),
|
||||
eqA a1 a1' -> (if eqA_dec a1 a2 then b else b') =
|
||||
(if eqA_dec a1' a2 then b else b').
|
||||
Proof.
|
||||
intros; destruct (eqA_dec a1 a2) as [A1|A1];
|
||||
destruct (eqA_dec a1' a2) as [A1'|A1']; auto.
|
||||
contradict A1'; transitivity a1; eauto with *.
|
||||
contradict A1; transitivity a1'; eauto with *.
|
||||
Qed.
|
||||
|
||||
Fact if_eqA_rewrite_r : forall a1 a2 a2' (B:Type)(b b':B),
|
||||
eqA a2 a2' -> (if eqA_dec a1 a2 then b else b') =
|
||||
(if eqA_dec a1 a2' then b else b').
|
||||
Proof.
|
||||
intros; destruct (eqA_dec a1 a2) as [A2|A2];
|
||||
destruct (eqA_dec a1 a2') as [A2'|A2']; auto.
|
||||
contradict A2'; transitivity a2; eauto with *.
|
||||
contradict A2; transitivity a2'; eauto with *.
|
||||
Qed.
|
||||
|
||||
|
||||
Global Instance multiplicity_eqA (l:list A) :
|
||||
Proper (eqA==>@eq _) (multiplicity (list_contents l)).
|
||||
Proof.
|
||||
intros x x' Hxx'.
|
||||
induction l as [|y l Hl]; simpl; auto.
|
||||
rewrite (@if_eqA_rewrite_r y x x'); auto.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA :
|
||||
forall l a, InA eqA a l <-> 0 < multiplicity (list_contents l) a.
|
||||
Proof.
|
||||
induction l.
|
||||
simpl.
|
||||
split; inversion 1.
|
||||
simpl.
|
||||
intros a'; split; intros H. inversion_clear H.
|
||||
apply (decide_left (eqA_dec a a')); auto with *.
|
||||
destruct (eqA_dec a a'); auto with *. simpl; rewrite <- IHl; auto.
|
||||
destruct (eqA_dec a a'); auto with *. right. rewrite IHl; auto.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA_O :
|
||||
forall l a, ~ InA eqA a l -> multiplicity (list_contents l) a = 0.
|
||||
Proof.
|
||||
intros l a; rewrite multiplicity_InA;
|
||||
destruct (multiplicity (list_contents l) a); auto with arith.
|
||||
destruct 1; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_InA_S :
|
||||
forall l a, InA eqA a l -> multiplicity (list_contents l) a >= 1.
|
||||
Proof.
|
||||
intros l a; rewrite multiplicity_InA; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma multiplicity_NoDupA : forall l,
|
||||
NoDupA eqA l <-> (forall a, multiplicity (list_contents l) a <= 1).
|
||||
Proof.
|
||||
induction l.
|
||||
simpl.
|
||||
split; auto with arith.
|
||||
split; simpl.
|
||||
inversion_clear 1.
|
||||
rewrite IHl in H1.
|
||||
intros; destruct (eqA_dec a a0) as [EQ|NEQ]; simpl; auto with *.
|
||||
rewrite <- EQ.
|
||||
rewrite multiplicity_InA_O; auto.
|
||||
intros; constructor.
|
||||
rewrite multiplicity_InA.
|
||||
specialize (H a).
|
||||
rewrite if_eqA_refl in H.
|
||||
clear IHl; omega.
|
||||
rewrite IHl; intros.
|
||||
specialize (H a0). omega.
|
||||
Qed.
|
||||
|
||||
(** Permutation is compatible with InA. *)
|
||||
Lemma permut_InA_InA :
|
||||
forall l1 l2 e, permutation l1 l2 -> InA eqA e l1 -> InA eqA e l2.
|
||||
Proof.
|
||||
intros l1 l2 e.
|
||||
do 2 rewrite multiplicity_InA.
|
||||
unfold permutation, meq.
|
||||
intros H;rewrite H; auto.
|
||||
Qed.
|
||||
|
||||
Lemma permut_cons_InA :
|
||||
forall l1 l2 e, permutation (e :: l1) l2 -> InA eqA e l2.
|
||||
Proof.
|
||||
intros; apply (permut_InA_InA (e:=e) H); auto with *.
|
||||
Qed.
|
||||
|
||||
(** Permutation of an empty list. *)
|
||||
Lemma permut_nil :
|
||||
forall l, permutation l [] -> l = [].
|
||||
Proof.
|
||||
intro l; destruct l as [ | e l ]; trivial.
|
||||
assert (InA eqA e (e::l)) by (auto with *).
|
||||
intro Abs; generalize (permut_InA_InA Abs H).
|
||||
inversion 1.
|
||||
Qed.
|
||||
|
||||
(** Permutation for short lists. *)
|
||||
|
||||
Lemma permut_length_1:
|
||||
forall a b, permutation [a] [b] -> eqA a b.
|
||||
Proof.
|
||||
intros a b; unfold permutation, meq.
|
||||
intro P; specialize (P b); simpl in *.
|
||||
rewrite if_eqA_refl in *.
|
||||
destruct (eqA_dec a b); simpl; auto; discriminate.
|
||||
Qed.
|
||||
|
||||
Lemma permut_length_2 :
|
||||
forall a1 b1 a2 b2, permutation [a1; b1] [a2; b2] ->
|
||||
(eqA a1 a2) /\ (eqA b1 b2) \/ (eqA a1 b2) /\ (eqA a2 b1).
|
||||
Proof.
|
||||
intros a1 b1 a2 b2 P.
|
||||
assert (H:=permut_cons_InA P).
|
||||
inversion_clear H.
|
||||
left; split; auto.
|
||||
apply permut_length_1.
|
||||
red; red; intros.
|
||||
specialize (P a). simpl in *.
|
||||
rewrite (@if_eqA_rewrite_l a1 a2 a) in P by auto. omega.
|
||||
right.
|
||||
inversion_clear H0; [|inversion H].
|
||||
split; auto.
|
||||
apply permut_length_1.
|
||||
red; red; intros.
|
||||
specialize (P a); simpl in *.
|
||||
rewrite (@if_eqA_rewrite_l a1 b2 a) in P by auto. omega.
|
||||
Qed.
|
||||
|
||||
(** Permutation is compatible with length. *)
|
||||
Lemma permut_length :
|
||||
forall l1 l2, permutation l1 l2 -> length l1 = length l2.
|
||||
Proof.
|
||||
induction l1; intros l2 H.
|
||||
rewrite (permut_nil (permut_sym H)); auto.
|
||||
assert (H0:=permut_cons_InA H).
|
||||
destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))).
|
||||
subst l2.
|
||||
rewrite app_length.
|
||||
simpl; rewrite <- plus_n_Sm; f_equal.
|
||||
rewrite <- app_length.
|
||||
apply IHl1.
|
||||
apply permut_remove_hd with b.
|
||||
apply permut_trans with (a::l1); auto.
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
rewrite (@if_eqA_rewrite_l a b a0); auto.
|
||||
Qed.
|
||||
|
||||
Lemma NoDupA_equivlistA_permut :
|
||||
forall l l', NoDupA eqA l -> NoDupA eqA l' ->
|
||||
equivlistA eqA l l' -> permutation l l'.
|
||||
Proof.
|
||||
intros.
|
||||
red; unfold meq; intros.
|
||||
rewrite multiplicity_NoDupA in H, H0.
|
||||
generalize (H a) (H0 a) (H1 a); clear H H0 H1.
|
||||
do 2 rewrite multiplicity_InA.
|
||||
destruct 3; omega.
|
||||
Qed.
|
||||
|
||||
End Permut.
|
||||
|
||||
Section Permut_map.
|
||||
|
||||
Variables A B : Type.
|
||||
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
|
||||
Variable eqB : B->B->Prop.
|
||||
Hypothesis eqB_dec : forall x y:B, { eqB x y }+{ ~eqB x y }.
|
||||
Hypothesis eqB_trans : Transitive eqB.
|
||||
|
||||
(** Permutation is compatible with map. *)
|
||||
|
||||
Lemma permut_map :
|
||||
forall f,
|
||||
(Proper (eqA==>eqB) f) ->
|
||||
forall l1 l2, permutation _ eqA_dec l1 l2 ->
|
||||
permutation _ eqB_dec (map f l1) (map f l2).
|
||||
Proof.
|
||||
intros f; induction l1.
|
||||
intros l2 P; rewrite (permut_nil eqA_equiv (permut_sym P)); apply permut_refl.
|
||||
intros l2 P.
|
||||
simpl.
|
||||
assert (H0:=permut_cons_InA eqA_equiv P).
|
||||
destruct (InA_split H0) as (h2,(b,(t2,(H1,H2)))).
|
||||
subst l2.
|
||||
rewrite map_app.
|
||||
simpl.
|
||||
apply permut_trans with (f b :: map f l1).
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
destruct (eqB_dec (f b) a0) as [H2|H2];
|
||||
destruct (eqB_dec (f a) a0) as [H3|H3]; auto.
|
||||
destruct H3; transitivity (f b); auto with *.
|
||||
destruct H2; transitivity (f a); auto with *.
|
||||
apply permut_add_cons_inside.
|
||||
rewrite <- map_app.
|
||||
apply IHl1; auto.
|
||||
apply permut_remove_hd with b; trivial.
|
||||
apply permut_trans with (a::l1); auto.
|
||||
revert H1; unfold permutation, meq; simpl.
|
||||
intros; f_equal; auto.
|
||||
rewrite (@if_eqA_rewrite_l _ _ eqA_equiv eqA_dec a b a0); auto.
|
||||
Qed.
|
||||
|
||||
End Permut_map.
|
||||
|
||||
Require Import Permutation.
|
||||
|
||||
Section Permut_permut.
|
||||
|
||||
Variable A : Type.
|
||||
|
||||
Variable eqA : relation A.
|
||||
Hypothesis eqA_dec : forall x y:A, {eqA x y} + {~ eqA x y}.
|
||||
Hypothesis eqA_equiv : Equivalence eqA.
|
||||
|
||||
Lemma Permutation_impl_permutation : forall l l',
|
||||
Permutation l l' -> permutation _ eqA_dec l l'.
|
||||
Proof.
|
||||
induction 1.
|
||||
apply permut_refl.
|
||||
apply permut_cons; auto using Equivalence_Reflexive.
|
||||
change (x :: y :: l) with ([x] ++ y :: l);
|
||||
apply permut_add_cons_inside; simpl;
|
||||
apply permut_cons_eq; auto using Equivalence_Reflexive, permut_refl.
|
||||
apply permut_trans with l'; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permut_eqA : forall l l', Forall2 eqA l l' -> permutation _ eqA_dec l l'.
|
||||
Proof.
|
||||
induction 1.
|
||||
apply permut_refl.
|
||||
apply permut_cons_eq; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma permutation_Permutation : forall l l',
|
||||
permutation _ eqA_dec l l' <->
|
||||
exists l'', Permutation l l'' /\ Forall2 eqA l'' l'.
|
||||
Proof.
|
||||
split; intro H.
|
||||
(* -> *)
|
||||
induction l in l', H |- *.
|
||||
exists []; apply permut_sym, permut_nil in H as ->; auto using Forall2.
|
||||
pose proof H as H'.
|
||||
apply permut_cons_InA, InA_split in H
|
||||
as (l1 & y & l2 & Heq & ->); trivial.
|
||||
apply permut_remove_hd_eq, IHl in H'
|
||||
as (l'' & IHP & IHA); clear IHl; trivial.
|
||||
apply Forall2_app_inv_r in IHA as (l1'' & l2'' & Hl1 & Hl2 & ->).
|
||||
exists (l1'' ++ a :: l2''); split.
|
||||
apply Permutation_cons_app; trivial.
|
||||
apply Forall2_app, Forall2_cons; trivial.
|
||||
(* <- *)
|
||||
destruct H as (l'' & H & Heq).
|
||||
apply permut_trans with l''.
|
||||
apply Permutation_impl_permutation; trivial.
|
||||
apply permut_eqA; trivial.
|
||||
Qed.
|
||||
|
||||
End Permut_permut.
|
||||
|
||||
(* begin hide *)
|
||||
(** For compatibilty *)
|
||||
Notation permut_right := permut_cons (only parsing).
|
||||
Notation permut_tran := permut_trans (only parsing).
|
||||
(* end hide *)
|
||||
@@ -1,632 +0,0 @@
|
||||
(* Adapted in May 2006 by Jean-Marc Notin from initial contents by
|
||||
Laurent Thery (Huffmann contribution, October 2003) *)
|
||||
|
||||
Require Import List Setoid Compare_dec Morphisms.
|
||||
Import ListNotations. (* For notations [] and [a;b;c] *)
|
||||
Set Implicit Arguments.
|
||||
|
||||
Section Permutation.
|
||||
|
||||
Variable A:Type.
|
||||
|
||||
Inductive Permutation : list A -> list A -> Prop :=
|
||||
| perm_nil: Permutation [] []
|
||||
| perm_skip x l l' : Permutation l l' -> Permutation (x::l) (x::l')
|
||||
| perm_swap x y l : Permutation (y::x::l) (x::y::l)
|
||||
| perm_trans l l' l'' :
|
||||
Permutation l l' -> Permutation l' l'' -> Permutation l l''.
|
||||
|
||||
Local Hint Constructors Permutation.
|
||||
|
||||
(** Some facts about [Permutation] *)
|
||||
|
||||
Theorem Permutation_nil : forall (l : list A), Permutation [] l -> l = [].
|
||||
Proof.
|
||||
intros l HF.
|
||||
remember (@nil A) as m in HF.
|
||||
induction HF; discriminate || auto.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_nil_cons : forall (l : list A) (x : A),
|
||||
~ Permutation nil (x::l).
|
||||
Proof.
|
||||
intros l x HF.
|
||||
apply Permutation_nil in HF; discriminate.
|
||||
Qed.
|
||||
|
||||
(** Permutation over lists is a equivalence relation *)
|
||||
|
||||
Theorem Permutation_refl : forall l : list A, Permutation l l.
|
||||
Proof.
|
||||
induction l; constructor. exact IHl.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_sym : forall l l' : list A,
|
||||
Permutation l l' -> Permutation l' l.
|
||||
Proof.
|
||||
intros l l' Hperm; induction Hperm; auto.
|
||||
apply perm_trans with (l':=l'); assumption.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_trans : forall l l' l'' : list A,
|
||||
Permutation l l' -> Permutation l' l'' -> Permutation l l''.
|
||||
Proof.
|
||||
exact perm_trans.
|
||||
Qed.
|
||||
|
||||
End Permutation.
|
||||
|
||||
Hint Resolve Permutation_refl perm_nil perm_skip.
|
||||
|
||||
(* These hints do not reduce the size of the problem to solve and they
|
||||
must be used with care to avoid combinatoric explosions *)
|
||||
|
||||
Local Hint Resolve perm_swap perm_trans.
|
||||
Local Hint Resolve Permutation_sym Permutation_trans.
|
||||
|
||||
(* This provides reflexivity, symmetry and transitivity and rewriting
|
||||
on morphims to come *)
|
||||
|
||||
Instance Permutation_Equivalence A : Equivalence (@Permutation A) | 10 := {
|
||||
Equivalence_Reflexive := @Permutation_refl A ;
|
||||
Equivalence_Symmetric := @Permutation_sym A ;
|
||||
Equivalence_Transitive := @Permutation_trans A }.
|
||||
|
||||
Instance Permutation_cons A :
|
||||
Proper (Logic.eq ==> @Permutation A ==> @Permutation A) (@cons A) | 10.
|
||||
Proof.
|
||||
repeat intro; subst; auto using perm_skip.
|
||||
Qed.
|
||||
|
||||
Section Permutation_properties.
|
||||
|
||||
Variable A:Type.
|
||||
|
||||
Implicit Types a b : A.
|
||||
Implicit Types l m : list A.
|
||||
|
||||
(** Compatibility with others operations on lists *)
|
||||
|
||||
Theorem Permutation_in : forall (l l' : list A) (x : A),
|
||||
Permutation l l' -> In x l -> In x l'.
|
||||
Proof.
|
||||
intros l l' x Hperm; induction Hperm; simpl; tauto.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_in' :
|
||||
Proper (Logic.eq ==> @Permutation A ==> iff) (@In A) | 10.
|
||||
Proof.
|
||||
repeat red; intros; subst; eauto using Permutation_in.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_app_tail : forall (l l' tl : list A),
|
||||
Permutation l l' -> Permutation (l++tl) (l'++tl).
|
||||
Proof.
|
||||
intros l l' tl Hperm; induction Hperm as [|x l l'|x y l|l l' l'']; simpl; auto.
|
||||
eapply Permutation_trans with (l':=l'++tl); trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_app_head : forall (l tl tl' : list A),
|
||||
Permutation tl tl' -> Permutation (l++tl) (l++tl').
|
||||
Proof.
|
||||
intros l tl tl' Hperm; induction l;
|
||||
[trivial | repeat rewrite <- app_comm_cons; constructor; assumption].
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app : forall (l m l' m' : list A),
|
||||
Permutation l l' -> Permutation m m' -> Permutation (l++m) (l'++m').
|
||||
Proof.
|
||||
intros l m l' m' Hpermll' Hpermmm';
|
||||
induction Hpermll' as [|x l l'|x y l|l l' l''];
|
||||
repeat rewrite <- app_comm_cons; auto.
|
||||
apply Permutation_trans with (l' := (x :: y :: l ++ m));
|
||||
[idtac | repeat rewrite app_comm_cons; apply Permutation_app_head]; trivial.
|
||||
apply Permutation_trans with (l' := (l' ++ m')); try assumption.
|
||||
apply Permutation_app_tail; assumption.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_app' :
|
||||
Proper (@Permutation A ==> @Permutation A ==> @Permutation A) (@app A) | 10.
|
||||
Proof.
|
||||
repeat intro; now apply Permutation_app.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_add_inside : forall a (l l' tl tl' : list A),
|
||||
Permutation l l' -> Permutation tl tl' ->
|
||||
Permutation (l ++ a :: tl) (l' ++ a :: tl').
|
||||
Proof.
|
||||
intros; apply Permutation_app; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_cons_append : forall (l : list A) x,
|
||||
Permutation (x :: l) (l ++ x :: nil).
|
||||
Proof. induction l; intros; auto. simpl. rewrite <- IHl; auto. Qed.
|
||||
Local Hint Resolve Permutation_cons_append.
|
||||
|
||||
Theorem Permutation_app_comm : forall (l l' : list A),
|
||||
Permutation (l ++ l') (l' ++ l).
|
||||
Proof.
|
||||
induction l as [|x l]; simpl; intro l'.
|
||||
rewrite app_nil_r; trivial. rewrite IHl.
|
||||
rewrite app_comm_cons, Permutation_cons_append.
|
||||
now rewrite <- app_assoc.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_app_comm.
|
||||
|
||||
Theorem Permutation_cons_app : forall (l l1 l2:list A) a,
|
||||
Permutation l (l1 ++ l2) -> Permutation (a :: l) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
intros l l1 l2 a H. rewrite H.
|
||||
rewrite app_comm_cons, Permutation_cons_append.
|
||||
now rewrite <- app_assoc.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_cons_app.
|
||||
|
||||
Theorem Permutation_middle : forall (l1 l2:list A) a,
|
||||
Permutation (a :: l1 ++ l2) (l1 ++ a :: l2).
|
||||
Proof.
|
||||
auto.
|
||||
Qed.
|
||||
Local Hint Resolve Permutation_middle.
|
||||
|
||||
Theorem Permutation_rev : forall (l : list A), Permutation l (rev l).
|
||||
Proof.
|
||||
induction l as [| x l]; simpl; trivial. now rewrite IHl at 1.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_rev' :
|
||||
Proper (@Permutation A ==> @Permutation A) (@rev A) | 10.
|
||||
Proof.
|
||||
repeat intro; now rewrite <- 2 Permutation_rev.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_length : forall (l l' : list A),
|
||||
Permutation l l' -> length l = length l'.
|
||||
Proof.
|
||||
intros l l' Hperm; induction Hperm; simpl; auto. now transitivity (length l').
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_length' :
|
||||
Proper (@Permutation A ==> Logic.eq) (@length A) | 10.
|
||||
Proof.
|
||||
exact Permutation_length.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_ind_bis :
|
||||
forall P : list A -> list A -> Prop,
|
||||
P [] [] ->
|
||||
(forall x l l', Permutation l l' -> P l l' -> P (x :: l) (x :: l')) ->
|
||||
(forall x y l l', Permutation l l' -> P l l' -> P (y :: x :: l) (x :: y :: l')) ->
|
||||
(forall l l' l'', Permutation l l' -> P l l' -> Permutation l' l'' -> P l' l'' -> P l l'') ->
|
||||
forall l l', Permutation l l' -> P l l'.
|
||||
Proof.
|
||||
intros P Hnil Hskip Hswap Htrans.
|
||||
induction 1; auto.
|
||||
apply Htrans with (x::y::l); auto.
|
||||
apply Hswap; auto.
|
||||
induction l; auto.
|
||||
apply Hskip; auto.
|
||||
apply Hskip; auto.
|
||||
induction l; auto.
|
||||
eauto.
|
||||
Qed.
|
||||
|
||||
Ltac break_list l x l' H :=
|
||||
destruct l as [|x l']; simpl in *;
|
||||
injection H; intros; subst; clear H.
|
||||
|
||||
Theorem Permutation_nil_app_cons : forall (l l' : list A) (x : A),
|
||||
~ Permutation nil (l++x::l').
|
||||
Proof.
|
||||
intros l l' x HF.
|
||||
apply Permutation_nil in HF. destruct l; discriminate.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv : forall (l1 l2 l3 l4:list A) a,
|
||||
Permutation (l1++a::l2) (l3++a::l4) -> Permutation (l1++l2) (l3 ++ l4).
|
||||
Proof.
|
||||
intros l1 l2 l3 l4 a; revert l1 l2 l3 l4.
|
||||
set (P l l' :=
|
||||
forall l1 l2 l3 l4, l=l1++a::l2 -> l'=l3++a::l4 ->
|
||||
Permutation (l1++l2) (l3++l4)).
|
||||
cut (forall l l', Permutation l l' -> P l l').
|
||||
intros H; intros; eapply H; eauto.
|
||||
apply (Permutation_ind_bis P); unfold P; clear P.
|
||||
- (* nil *)
|
||||
intros; now destruct l1.
|
||||
- (* skip *)
|
||||
intros x l l' H IH; intros.
|
||||
break_list l1 b l1' H0; break_list l3 c l3' H1.
|
||||
auto.
|
||||
now rewrite H.
|
||||
now rewrite <- H.
|
||||
now rewrite (IH _ _ _ _ eq_refl eq_refl).
|
||||
- (* swap *)
|
||||
intros x y l l' Hp IH; intros.
|
||||
break_list l1 b l1' H; break_list l3 c l3' H0.
|
||||
auto.
|
||||
break_list l3' b l3'' H.
|
||||
auto.
|
||||
constructor. now rewrite Permutation_middle.
|
||||
break_list l1' c l1'' H1.
|
||||
auto.
|
||||
constructor. now rewrite Permutation_middle.
|
||||
break_list l3' d l3'' H; break_list l1' e l1'' H1.
|
||||
auto.
|
||||
rewrite perm_swap. constructor. now rewrite Permutation_middle.
|
||||
rewrite perm_swap. constructor. now rewrite Permutation_middle.
|
||||
now rewrite perm_swap, (IH _ _ _ _ eq_refl eq_refl).
|
||||
- (*trans*)
|
||||
intros.
|
||||
destruct (In_split a l') as (l'1,(l'2,H6)).
|
||||
rewrite <- H.
|
||||
subst l.
|
||||
apply in_or_app; right; red; auto.
|
||||
apply perm_trans with (l'1++l'2).
|
||||
apply (H0 _ _ _ _ H3 H6).
|
||||
apply (H2 _ _ _ _ H6 H4).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_cons_inv l l' a :
|
||||
Permutation (a::l) (a::l') -> Permutation l l'.
|
||||
Proof.
|
||||
intro H; exact (Permutation_app_inv [] l [] l' a H).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_cons_app_inv l l1 l2 a :
|
||||
Permutation (a :: l) (l1 ++ a :: l2) -> Permutation l (l1 ++ l2).
|
||||
Proof.
|
||||
intro H; exact (Permutation_app_inv [] l l1 l2 a H).
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv_l : forall l l1 l2,
|
||||
Permutation (l ++ l1) (l ++ l2) -> Permutation l1 l2.
|
||||
Proof.
|
||||
induction l; simpl; auto.
|
||||
intros.
|
||||
apply IHl.
|
||||
apply Permutation_cons_inv with a; auto.
|
||||
Qed.
|
||||
|
||||
Theorem Permutation_app_inv_r : forall l l1 l2,
|
||||
Permutation (l1 ++ l) (l2 ++ l) -> Permutation l1 l2.
|
||||
Proof.
|
||||
induction l.
|
||||
intros l1 l2; do 2 rewrite app_nil_r; auto.
|
||||
intros.
|
||||
apply IHl.
|
||||
apply Permutation_app_inv with a; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_1_inv: forall a l, Permutation [a] l -> l = [a].
|
||||
Proof.
|
||||
intros a l H; remember [a] as m in H.
|
||||
induction H; try (injection Heqm as -> ->; clear Heqm);
|
||||
discriminate || auto.
|
||||
apply Permutation_nil in H as ->; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_1: forall a b, Permutation [a] [b] -> a = b.
|
||||
Proof.
|
||||
intros a b H.
|
||||
apply Permutation_length_1_inv in H; injection H as ->; trivial.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_2_inv :
|
||||
forall a1 a2 l, Permutation [a1;a2] l -> l = [a1;a2] \/ l = [a2;a1].
|
||||
Proof.
|
||||
intros a1 a2 l H; remember [a1;a2] as m in H.
|
||||
revert a1 a2 Heqm.
|
||||
induction H; intros; try (injection Heqm; intros; subst; clear Heqm);
|
||||
discriminate || (try tauto).
|
||||
apply Permutation_length_1_inv in H as ->; left; auto.
|
||||
apply IHPermutation1 in Heqm as [H1|H1]; apply IHPermutation2 in H1 as ();
|
||||
auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_length_2 :
|
||||
forall a1 a2 b1 b2, Permutation [a1;a2] [b1;b2] ->
|
||||
a1 = b1 /\ a2 = b2 \/ a1 = b2 /\ a2 = b1.
|
||||
Proof.
|
||||
intros a1 b1 a2 b2 H.
|
||||
apply Permutation_length_2_inv in H as [H|H]; injection H as -> ->; auto.
|
||||
Qed.
|
||||
|
||||
Let in_middle l l1 l2 (a:A) : l = l1 ++ a :: l2 ->
|
||||
forall x, In x l <-> a = x \/ In x (l1++l2).
|
||||
Proof.
|
||||
intros; subst; rewrite !in_app_iff; simpl. tauto.
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_cardinal_incl (l l' : list A) : NoDup l -> NoDup l' ->
|
||||
length l = length l' -> incl l l' -> incl l' l.
|
||||
Proof.
|
||||
intros N. revert l'. induction N as [|a l Hal Hl IH].
|
||||
- destruct l'; now auto.
|
||||
- intros l' Hl' E H x Hx.
|
||||
assert (Ha : In a l') by (apply H; simpl; auto).
|
||||
destruct (in_split _ _ Ha) as (l1 & l2 & H12). clear Ha.
|
||||
rewrite in_middle in Hx; eauto.
|
||||
destruct Hx as [Hx|Hx]; [left|right]; auto.
|
||||
apply (IH (l1++l2)); auto.
|
||||
* apply NoDup_remove_1 with a; rewrite <- H12; auto.
|
||||
* apply eq_add_S.
|
||||
simpl in E; rewrite E, H12, !app_length; simpl; auto with arith.
|
||||
* intros y Hy. assert (Hy' : In y l') by (apply H; simpl; auto).
|
||||
rewrite in_middle in Hy'; eauto.
|
||||
destruct Hy'; auto. subst y; intuition.
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_Permutation l l' : NoDup l -> NoDup l' ->
|
||||
(forall x:A, In x l <-> In x l') -> Permutation l l'.
|
||||
Proof.
|
||||
intros N. revert l'. induction N as [|a l Hal Hl IH].
|
||||
- destruct l'; simpl; auto.
|
||||
intros Hl' H. exfalso. rewrite (H a); auto.
|
||||
- intros l' Hl' H.
|
||||
assert (Ha : In a l') by (apply H; simpl; auto).
|
||||
destruct (In_split _ _ Ha) as (l1 & l2 & H12).
|
||||
rewrite H12.
|
||||
apply Permutation_cons_app.
|
||||
apply IH; auto.
|
||||
* apply NoDup_remove_1 with a; rewrite <- H12; auto.
|
||||
* intro x. split; intros Hx.
|
||||
+ assert (Hx' : In x l') by (apply H; simpl; auto).
|
||||
rewrite in_middle in Hx'; eauto.
|
||||
destruct Hx'; auto. subst; intuition.
|
||||
+ assert (Hx' : In x l') by (rewrite (in_middle l1 l2 a); eauto).
|
||||
rewrite <- H in Hx'. destruct Hx'; auto.
|
||||
subst. destruct (NoDup_remove_2 _ _ _ Hl' Hx).
|
||||
Qed.
|
||||
|
||||
Lemma NoDup_Permutation_bis l l' : NoDup l -> NoDup l' ->
|
||||
length l = length l' -> incl l l' -> Permutation l l'.
|
||||
Proof.
|
||||
intros. apply NoDup_Permutation; auto.
|
||||
split; auto. apply NoDup_cardinal_incl; auto.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_NoDup l l' : Permutation l l' -> NoDup l -> NoDup l'.
|
||||
Proof.
|
||||
induction 1; auto.
|
||||
* inversion_clear 1; constructor; eauto using Permutation_in.
|
||||
* inversion_clear 1 as [|? ? H1 H2]. inversion_clear H2; simpl in *.
|
||||
constructor. simpl; intuition. constructor; intuition.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_NoDup' :
|
||||
Proper (@Permutation A ==> iff) (@NoDup A) | 10.
|
||||
Proof.
|
||||
repeat red; eauto using Permutation_NoDup.
|
||||
Qed.
|
||||
|
||||
End Permutation_properties.
|
||||
|
||||
Section Permutation_map.
|
||||
|
||||
Variable A B : Type.
|
||||
Variable f : A -> B.
|
||||
|
||||
Lemma Permutation_map l l' :
|
||||
Permutation l l' -> Permutation (map f l) (map f l').
|
||||
Proof.
|
||||
induction 1; simpl; eauto.
|
||||
Qed.
|
||||
|
||||
Global Instance Permutation_map' :
|
||||
Proper (@Permutation A ==> @Permutation B) (map f) | 10.
|
||||
Proof.
|
||||
exact Permutation_map.
|
||||
Qed.
|
||||
|
||||
End Permutation_map.
|
||||
|
||||
Section Injection.
|
||||
|
||||
Definition injective {A B} (f : A->B) :=
|
||||
forall x y, f x = f y -> x = y.
|
||||
|
||||
Lemma injective_map_NoDup {A B} (f:A->B) (l:list A) :
|
||||
injective f -> NoDup l -> NoDup (map f l).
|
||||
Proof.
|
||||
intros Hf. induction 1 as [|x l Hx Hl IH]; simpl; constructor; trivial.
|
||||
rewrite in_map_iff. intros (y & Hy & Hy'). apply Hf in Hy. now subst.
|
||||
Qed.
|
||||
|
||||
Lemma injective_bounded_surjective n f :
|
||||
injective f ->
|
||||
(forall x, x < n -> f x < n) ->
|
||||
(forall y, y < n -> exists x, x < n /\ f x = y).
|
||||
Proof.
|
||||
intros Hf H.
|
||||
set (l := seq 0 n).
|
||||
assert (P : incl (map f l) l).
|
||||
{ intros x. rewrite in_map_iff. intros (y & <- & Hy').
|
||||
unfold l in *. rewrite in_seq in *. simpl in *.
|
||||
destruct Hy' as (_,Hy'). auto with arith. }
|
||||
assert (P' : incl l (map f l)).
|
||||
{ unfold l.
|
||||
apply NoDup_cardinal_incl; auto using injective_map_NoDup, seq_NoDup.
|
||||
now rewrite map_length. }
|
||||
intros x Hx.
|
||||
assert (Hx' : In x l) by (unfold l; rewrite in_seq; auto with arith).
|
||||
apply P' in Hx'.
|
||||
rewrite in_map_iff in Hx'. destruct Hx' as (y & Hy & Hy').
|
||||
exists y; split; auto. unfold l in *; rewrite in_seq in Hy'.
|
||||
destruct Hy'; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma nat_bijection_Permutation n f :
|
||||
injective f -> (forall x, x < n -> f x < n) ->
|
||||
let l := seq 0 n in Permutation (map f l) l.
|
||||
Proof.
|
||||
intros Hf BD.
|
||||
apply NoDup_Permutation_bis; auto using injective_map_NoDup, seq_NoDup.
|
||||
* now rewrite map_length.
|
||||
* intros x. rewrite in_map_iff. intros (y & <- & Hy').
|
||||
rewrite in_seq in *. simpl in *.
|
||||
destruct Hy' as (_,Hy'). auto with arith.
|
||||
Qed.
|
||||
|
||||
End Injection.
|
||||
|
||||
Section Permutation_alt.
|
||||
Variable A:Type.
|
||||
Implicit Type a : A.
|
||||
Implicit Type l : list A.
|
||||
|
||||
(** Alternative characterization of permutation
|
||||
via [nth_error] and [nth] *)
|
||||
|
||||
Let adapt f n :=
|
||||
let m := f (S n) in if le_lt_dec m (f 0) then m else pred m.
|
||||
|
||||
Let adapt_injective f : injective f -> injective (adapt f).
|
||||
Proof.
|
||||
unfold adapt. intros Hf x y EQ.
|
||||
destruct le_lt_dec as [LE|LT]; destruct le_lt_dec as [LE'|LT'].
|
||||
- now apply eq_add_S, Hf.
|
||||
- apply Lt.le_lt_or_eq in LE.
|
||||
destruct LE as [LT|EQ']; [|now apply Hf in EQ'].
|
||||
unfold lt in LT. rewrite EQ in LT.
|
||||
rewrite <- (Lt.S_pred _ _ LT') in LT.
|
||||
elim (Lt.lt_not_le _ _ LT' LT).
|
||||
- apply Lt.le_lt_or_eq in LE'.
|
||||
destruct LE' as [LT'|EQ']; [|now apply Hf in EQ'].
|
||||
unfold lt in LT'. rewrite <- EQ in LT'.
|
||||
rewrite <- (Lt.S_pred _ _ LT) in LT'.
|
||||
elim (Lt.lt_not_le _ _ LT LT').
|
||||
- apply eq_add_S, Hf.
|
||||
now rewrite (Lt.S_pred _ _ LT), (Lt.S_pred _ _ LT'), EQ.
|
||||
Qed.
|
||||
|
||||
Let adapt_ok a l1 l2 f : injective f -> length l1 = f 0 ->
|
||||
forall n, nth_error (l1++a::l2) (f (S n)) = nth_error (l1++l2) (adapt f n).
|
||||
Proof.
|
||||
unfold adapt. intros Hf E n.
|
||||
destruct le_lt_dec as [LE|LT].
|
||||
- apply Lt.le_lt_or_eq in LE.
|
||||
destruct LE as [LT|EQ]; [|now apply Hf in EQ].
|
||||
rewrite <- E in LT.
|
||||
rewrite 2 nth_error_app1; auto.
|
||||
- rewrite (Lt.S_pred _ _ LT) at 1.
|
||||
rewrite <- E, (Lt.S_pred _ _ LT) in LT.
|
||||
rewrite 2 nth_error_app2; auto with arith.
|
||||
rewrite <- Minus.minus_Sn_m; auto with arith.
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth_error l l' :
|
||||
Permutation l l' <->
|
||||
(length l = length l' /\
|
||||
exists f:nat->nat,
|
||||
injective f /\ forall n, nth_error l' n = nth_error l (f n)).
|
||||
Proof.
|
||||
split.
|
||||
{ intros P.
|
||||
split; [now apply Permutation_length|].
|
||||
induction P.
|
||||
- exists (fun n => n).
|
||||
split; try red; auto.
|
||||
- destruct IHP as (f & Hf & Hf').
|
||||
exists (fun n => match n with O => O | S n => S (f n) end).
|
||||
split; try red.
|
||||
* intros [|y] [|z]; simpl; now auto.
|
||||
* intros [|n]; simpl; auto.
|
||||
- exists (fun n => match n with 0 => 1 | 1 => 0 | n => n end).
|
||||
split; try red.
|
||||
* intros [|[|z]] [|[|t]]; simpl; now auto.
|
||||
* intros [|[|n]]; simpl; auto.
|
||||
- destruct IHP1 as (f & Hf & Hf').
|
||||
destruct IHP2 as (g & Hg & Hg').
|
||||
exists (fun n => f (g n)).
|
||||
split; try red.
|
||||
* auto.
|
||||
* intros n. rewrite <- Hf'; auto. }
|
||||
{ revert l. induction l'.
|
||||
- intros [|l] (E & _); now auto.
|
||||
- intros l (E & f & Hf & Hf').
|
||||
simpl in E.
|
||||
assert (Ha : nth_error l (f 0) = Some a)
|
||||
by (symmetry; apply (Hf' 0)).
|
||||
destruct (nth_error_split l (f 0) Ha) as (l1 & l2 & L12 & L1).
|
||||
rewrite L12. rewrite <- Permutation_middle. constructor.
|
||||
apply IHl'; split; [|exists (adapt f); split].
|
||||
* revert E. rewrite L12, !app_length. simpl.
|
||||
rewrite <- plus_n_Sm. now injection 1.
|
||||
* now apply adapt_injective.
|
||||
* intro n. rewrite <- (adapt_ok a), <- L12; auto.
|
||||
apply (Hf' (S n)). }
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth_error_bis l l' :
|
||||
Permutation l l' <->
|
||||
exists f:nat->nat,
|
||||
injective f /\
|
||||
(forall n, n < length l -> f n < length l) /\
|
||||
(forall n, nth_error l' n = nth_error l (f n)).
|
||||
Proof.
|
||||
rewrite Permutation_nth_error; split.
|
||||
- intros (E & f & Hf & Hf').
|
||||
exists f. do 2 (split; trivial).
|
||||
intros n Hn.
|
||||
destruct (Lt.le_or_lt (length l) (f n)) as [LE|LT]; trivial.
|
||||
rewrite <- nth_error_None, <- Hf', nth_error_None, <- E in LE.
|
||||
elim (Lt.lt_not_le _ _ Hn LE).
|
||||
- intros (f & Hf & Hf2 & Hf3); split; [|exists f; auto].
|
||||
assert (H : length l' <= length l') by auto with arith.
|
||||
rewrite <- nth_error_None, Hf3, nth_error_None in H.
|
||||
destruct (Lt.le_or_lt (length l) (length l')) as [LE|LT];
|
||||
[|apply Hf2 in LT; elim (Lt.lt_not_le _ _ LT H)].
|
||||
apply Lt.le_lt_or_eq in LE. destruct LE as [LT|EQ]; trivial.
|
||||
rewrite <- nth_error_Some, Hf3, nth_error_Some in LT.
|
||||
destruct (injective_bounded_surjective Hf Hf2 LT) as (y & Hy & Hy').
|
||||
apply Hf in Hy'. subst y. elim (Lt.lt_irrefl _ Hy).
|
||||
Qed.
|
||||
|
||||
Lemma Permutation_nth l l' d :
|
||||
Permutation l l' <->
|
||||
(let n := length l in
|
||||
length l' = n /\
|
||||
exists f:nat->nat,
|
||||
(forall x, x < n -> f x < n) /\
|
||||
(forall x y, x < n -> y < n -> f x = f y -> x = y) /\
|
||||
(forall x, x < n -> nth x l' d = nth (f x) l d)).
|
||||
Proof.
|
||||
split.
|
||||
- intros H.
|
||||
assert (E := Permutation_length H).
|
||||
split; auto.
|
||||
apply Permutation_nth_error_bis in H.
|
||||
destruct H as (f & Hf & Hf2 & Hf3).
|
||||
exists f. split; [|split]; auto.
|
||||
intros n Hn. rewrite <- 2 nth_default_eq. unfold nth_default.
|
||||
now rewrite Hf3.
|
||||
- intros (E & f & Hf1 & Hf2 & Hf3).
|
||||
rewrite Permutation_nth_error.
|
||||
split; auto.
|
||||
exists (fun n => if le_lt_dec (length l) n then n else f n).
|
||||
split.
|
||||
* intros x y.
|
||||
destruct le_lt_dec as [LE|LT];
|
||||
destruct le_lt_dec as [LE'|LT']; auto.
|
||||
+ apply Hf1 in LT'. intros ->.
|
||||
elim (Lt.lt_irrefl (f y)). eapply Lt.lt_le_trans; eauto.
|
||||
+ apply Hf1 in LT. intros <-.
|
||||
elim (Lt.lt_irrefl (f x)). eapply Lt.lt_le_trans; eauto.
|
||||
* intros n.
|
||||
destruct le_lt_dec as [LE|LT].
|
||||
+ assert (LE' : length l' <= n) by (now rewrite E).
|
||||
rewrite <- nth_error_None in LE, LE'. congruence.
|
||||
+ assert (LT' : n < length l') by (now rewrite E).
|
||||
specialize (Hf3 n LT). rewrite <- 2 nth_default_eq in Hf3.
|
||||
unfold nth_default in Hf3.
|
||||
apply Hf1 in LT.
|
||||
rewrite <- nth_error_Some in LT, LT'.
|
||||
do 2 destruct nth_error; congruence.
|
||||
Qed.
|
||||
|
||||
End Permutation_alt.
|
||||
|
||||
(* begin hide *)
|
||||
Notation Permutation_app_swap := Permutation_app_comm (only parsing).
|
||||
(* end hide *)
|
||||
@@ -1,2 +0,0 @@
|
||||
Require Export Sorted.
|
||||
Require Export Mergesort.
|
||||
62
samples/Coq/Spec.v
Normal file
62
samples/Coq/Spec.v
Normal file
@@ -0,0 +1,62 @@
|
||||
(** Specifications. *)
|
||||
Require Import Coq.Lists.List.
|
||||
Require Import Coq.Strings.Ascii.
|
||||
Require Import FunctionNinjas.All.
|
||||
Require Import ListString.All.
|
||||
Require Import Computation.
|
||||
|
||||
Import ListNotations.
|
||||
Local Open Scope char.
|
||||
|
||||
(** A run is an execution of the program with explicit answers for the
|
||||
system calls. *)
|
||||
Module Run.
|
||||
(** We define a run by induction on the structure of a computation. *)
|
||||
Inductive t : C.t -> Type :=
|
||||
| Ret : t C.Ret
|
||||
| Call : forall (command : Command.t) (answer : Command.answer command)
|
||||
{handler : Command.answer command -> C.t}, t (handler answer) ->
|
||||
t (C.Call command handler).
|
||||
|
||||
(** The trace of a run. *)
|
||||
Fixpoint trace {x : C.t} (run : t x)
|
||||
: list {command : Command.t & Command.answer command} :=
|
||||
match run with
|
||||
| Ret => []
|
||||
| Call command answer _ run => existT _ command answer :: trace run
|
||||
end.
|
||||
End Run.
|
||||
|
||||
Module Temporal.
|
||||
Module All.
|
||||
Inductive t (P : Command.t -> Prop) : C.t -> Prop :=
|
||||
| Ret : t P C.Ret
|
||||
| Call : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P c -> (forall a, t P (h a)) ->
|
||||
t P (C.Call c h).
|
||||
End All.
|
||||
|
||||
Module One.
|
||||
Inductive t (P : Command.t -> Prop) : C.t -> Prop :=
|
||||
| CallThis : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P c ->
|
||||
t P (C.Call c h)
|
||||
| CallOther : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
(forall a, t P (h a)) ->
|
||||
t P (C.Call c h).
|
||||
End One.
|
||||
|
||||
Module Then.
|
||||
Inductive t (P1 P2 : Command.t -> Prop) : C.t -> Prop :=
|
||||
| Ret : t P1 P2 C.Ret
|
||||
| Call : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
(forall a, t P1 P2 (h a)) ->
|
||||
t P1 P2 (C.Call c h)
|
||||
| CallThen : forall (c : Command.t) (h : Command.answer c -> C.t),
|
||||
P1 c -> (forall a, One.t P2 (h a)) ->
|
||||
t P1 P2 (C.Call c h).
|
||||
End Then.
|
||||
End Temporal.
|
||||
|
||||
Module CardBeforeMoney.
|
||||
End CardBeforeMoney.
|
||||
@@ -1,419 +0,0 @@
|
||||
(** Sketch of the proof of {p:nat|p<=n} = {p:nat|p<=m} -> n=m
|
||||
|
||||
- preliminary results on the irrelevance of boundedness proofs
|
||||
- introduce the notion of finite cardinal |A|
|
||||
- prove that |{p:nat|p<=n}| = n
|
||||
- prove that |A| = n /\ |A| = m -> n = m if equality is decidable on A
|
||||
- prove that equality is decidable on A
|
||||
- conclude
|
||||
*)
|
||||
|
||||
(** * Preliminary results on [nat] and [le] *)
|
||||
|
||||
(** Proving axiom K on [nat] *)
|
||||
|
||||
Require Import Eqdep_dec.
|
||||
Require Import Arith.
|
||||
|
||||
Theorem eq_rect_eq_nat :
|
||||
forall (p:nat) (Q:nat->Type) (x:Q p) (h:p=p), x = eq_rect p Q x p h.
|
||||
Proof.
|
||||
intros.
|
||||
apply K_dec_set with (p := h).
|
||||
apply eq_nat_dec.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Proving unicity of proofs of [(n<=m)%nat] *)
|
||||
|
||||
Scheme le_ind' := Induction for le Sort Prop.
|
||||
|
||||
Theorem le_uniqueness_proof : forall (n m : nat) (p q : n <= m), p = q.
|
||||
Proof.
|
||||
induction p using le_ind'; intro q.
|
||||
replace (le_n n) with
|
||||
(eq_rect _ (fun n0 => n <= n0) (le_n n) _ (refl_equal n)).
|
||||
2:reflexivity.
|
||||
generalize (refl_equal n).
|
||||
pattern n at 2 4 6 10, q; case q; [intro | intros m l e].
|
||||
rewrite <- eq_rect_eq_nat; trivial.
|
||||
contradiction (le_Sn_n m); rewrite <- e; assumption.
|
||||
replace (le_S n m p) with
|
||||
(eq_rect _ (fun n0 => n <= n0) (le_S n m p) _ (refl_equal (S m))).
|
||||
2:reflexivity.
|
||||
generalize (refl_equal (S m)).
|
||||
pattern (S m) at 1 3 4 6, q; case q; [intro Heq | intros m0 l HeqS].
|
||||
contradiction (le_Sn_n m); rewrite Heq; assumption.
|
||||
injection HeqS; intro Heq; generalize l HeqS.
|
||||
rewrite <- Heq; intros; rewrite <- eq_rect_eq_nat.
|
||||
rewrite (IHp l0); reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Proving irrelevance of boundedness proofs while building
|
||||
elements of interval *)
|
||||
|
||||
Lemma dep_pair_intro :
|
||||
forall (n x y:nat) (Hx : x<=n) (Hy : y<=n), x=y ->
|
||||
exist (fun x => x <= n) x Hx = exist (fun x => x <= n) y Hy.
|
||||
Proof.
|
||||
intros n x y Hx Hy Heq.
|
||||
generalize Hy.
|
||||
rewrite <- Heq.
|
||||
intros.
|
||||
rewrite (le_uniqueness_proof x n Hx Hy0).
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** * Proving that {p:nat|p<=n} = {p:nat|p<=m} -> n=m *)
|
||||
|
||||
(** Definition of having finite cardinality [n+1] for a set [A] *)
|
||||
|
||||
Definition card (A:Set) n :=
|
||||
exists f,
|
||||
(forall x:A, f x <= n) /\
|
||||
(forall x y:A, f x = f y -> x = y) /\
|
||||
(forall m, m <= n -> exists x:A, f x = m).
|
||||
|
||||
Require Import Arith.
|
||||
|
||||
(** Showing that the interval [0;n] has cardinality [n+1] *)
|
||||
|
||||
Theorem card_interval : forall n, card {x:nat|x<=n} n.
|
||||
Proof.
|
||||
intro n.
|
||||
exists (fun x:{x:nat|x<=n} => proj1_sig x).
|
||||
split.
|
||||
(* bounded *)
|
||||
intro x; apply (proj2_sig x).
|
||||
split.
|
||||
(* injectivity *)
|
||||
intros (p,Hp) (q,Hq).
|
||||
simpl.
|
||||
intro Hpq.
|
||||
apply dep_pair_intro; assumption.
|
||||
(* surjectivity *)
|
||||
intros m Hmn.
|
||||
exists (exist (fun x : nat => x <= n) m Hmn).
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
(** Showing that equality on the interval [0;n] is decidable *)
|
||||
|
||||
Lemma interval_dec :
|
||||
forall n (x y : {m:nat|m<=n}), {x=y}+{x<>y}.
|
||||
Proof.
|
||||
intros n (p,Hp).
|
||||
induction p; intros ([|q],Hq).
|
||||
left.
|
||||
apply dep_pair_intro.
|
||||
reflexivity.
|
||||
right.
|
||||
intro H; discriminate H.
|
||||
right.
|
||||
intro H; discriminate H.
|
||||
assert (Hp' : p <= n).
|
||||
apply le_Sn_le; assumption.
|
||||
assert (Hq' : q <= n).
|
||||
apply le_Sn_le; assumption.
|
||||
destruct (IHp Hp' (exist (fun m => m <= n) q Hq'))
|
||||
as [Heq|Hneq].
|
||||
left.
|
||||
injection Heq; intro Heq'.
|
||||
apply dep_pair_intro.
|
||||
apply eq_S.
|
||||
assumption.
|
||||
right.
|
||||
intro HeqS.
|
||||
injection HeqS; intro Heq.
|
||||
apply Hneq.
|
||||
apply dep_pair_intro.
|
||||
assumption.
|
||||
Qed.
|
||||
|
||||
(** Showing that the cardinality relation is functional on decidable sets *)
|
||||
|
||||
Lemma card_inj_aux :
|
||||
forall (A:Type) f g n,
|
||||
(forall x:A, f x <= 0) ->
|
||||
(forall x y:A, f x = f y -> x = y) ->
|
||||
(forall m, m <= S n -> exists x:A, g x = m)
|
||||
-> False.
|
||||
Proof.
|
||||
intros A f g n Hfbound Hfinj Hgsurj.
|
||||
destruct (Hgsurj (S n) (le_n _)) as (x,Hx).
|
||||
destruct (Hgsurj n (le_S _ _ (le_n _))) as (x',Hx').
|
||||
assert (Hfx : 0 = f x).
|
||||
apply le_n_O_eq.
|
||||
apply Hfbound.
|
||||
assert (Hfx' : 0 = f x').
|
||||
apply le_n_O_eq.
|
||||
apply Hfbound.
|
||||
assert (x=x').
|
||||
apply Hfinj.
|
||||
rewrite <- Hfx.
|
||||
rewrite <- Hfx'.
|
||||
reflexivity.
|
||||
rewrite H in Hx.
|
||||
rewrite Hx' in Hx.
|
||||
apply (n_Sn _ Hx).
|
||||
Qed.
|
||||
|
||||
(** For [dec_restrict], we use a lemma on the negation of equality
|
||||
that requires proof-irrelevance. It should be possible to avoid this
|
||||
lemma by generalizing over a first-order definition of [x<>y], say
|
||||
[neq] such that [{x=y}+{neq x y}] and [~(x=y /\ neq x y)]; for such
|
||||
[neq], unicity of proofs could be proven *)
|
||||
|
||||
Require Import Classical.
|
||||
Lemma neq_dep_intro :
|
||||
forall (A:Set) (z x y:A) (p:x<>z) (q:y<>z), x=y ->
|
||||
exist (fun x => x <> z) x p = exist (fun x => x <> z) y q.
|
||||
Proof.
|
||||
intros A z x y p q Heq.
|
||||
generalize q; clear q; rewrite <- Heq; intro q.
|
||||
rewrite (proof_irrelevance _ p q); reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma dec_restrict :
|
||||
forall (A:Set),
|
||||
(forall x y :A, {x=y}+{x<>y}) ->
|
||||
forall z (x y :{a:A|a<>z}), {x=y}+{x<>y}.
|
||||
Proof.
|
||||
intros A Hdec z (x,Hx) (y,Hy).
|
||||
destruct (Hdec x y) as [Heq|Hneq].
|
||||
left; apply neq_dep_intro; assumption.
|
||||
right; intro Heq; injection Heq; exact Hneq.
|
||||
Qed.
|
||||
|
||||
Lemma pred_inj : forall n m,
|
||||
0 <> n -> 0 <> m -> pred m = pred n -> m = n.
|
||||
Proof.
|
||||
destruct n.
|
||||
intros m H; destruct H; reflexivity.
|
||||
destruct m.
|
||||
intros _ H; destruct H; reflexivity.
|
||||
simpl; intros _ _ H.
|
||||
rewrite H.
|
||||
reflexivity.
|
||||
Qed.
|
||||
|
||||
Lemma le_neq_lt : forall n m, n <= m -> n<>m -> n < m.
|
||||
Proof.
|
||||
intros n m Hle Hneq.
|
||||
destruct (le_lt_eq_dec n m Hle).
|
||||
assumption.
|
||||
contradiction.
|
||||
Qed.
|
||||
|
||||
Lemma inj_restrict :
|
||||
forall (A:Set) (f:A->nat) x y z,
|
||||
(forall x y : A, f x = f y -> x = y)
|
||||
-> x <> z -> f y < f z -> f z <= f x
|
||||
-> pred (f x) = f y
|
||||
-> False.
|
||||
|
||||
(* Search error sans le type de f !! *)
|
||||
Proof.
|
||||
intros A f x y z Hfinj Hneqx Hfy Hfx Heq.
|
||||
assert (f z <> f x).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqx.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (f x = S (f y)).
|
||||
assert (0 < f x).
|
||||
apply le_lt_trans with (f z).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
apply pred_inj.
|
||||
apply O_S.
|
||||
apply lt_O_neq; assumption.
|
||||
exact Heq.
|
||||
assert (f z <= f y).
|
||||
destruct (le_lt_or_eq _ _ Hfx).
|
||||
apply lt_n_Sm_le.
|
||||
rewrite <- H0.
|
||||
assumption.
|
||||
contradiction Hneqx.
|
||||
symmetry.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
contradiction (lt_not_le (f y) (f z)).
|
||||
Qed.
|
||||
|
||||
Theorem card_inj : forall m n (A:Set),
|
||||
(forall x y :A, {x=y}+{x<>y}) ->
|
||||
card A m -> card A n -> m = n.
|
||||
Proof.
|
||||
induction m; destruct n;
|
||||
intros A Hdec
|
||||
(f,(Hfbound,(Hfinj,Hfsurj)))
|
||||
(g,(Hgbound,(Hginj,Hgsurj))).
|
||||
(* 0/0 *)
|
||||
reflexivity.
|
||||
(* 0/Sm *)
|
||||
destruct (card_inj_aux _ _ _ _ Hfbound Hfinj Hgsurj).
|
||||
(* Sn/0 *)
|
||||
destruct (card_inj_aux _ _ _ _ Hgbound Hginj Hfsurj).
|
||||
(* Sn/Sm *)
|
||||
destruct (Hgsurj (S n) (le_n _)) as (xSn,HSnx).
|
||||
rewrite IHm with (n:=n) (A := {x:A|x<>xSn}).
|
||||
reflexivity.
|
||||
(* decidability of eq on {x:A|x<>xSm} *)
|
||||
apply dec_restrict.
|
||||
assumption.
|
||||
(* cardinality of {x:A|x<>xSn} is m *)
|
||||
pose (f' := fun x' : {x:A|x<>xSn} =>
|
||||
let (x,Hneq) := x' in
|
||||
if le_lt_dec (f xSn) (f x)
|
||||
then pred (f x)
|
||||
else f x).
|
||||
exists f'.
|
||||
split.
|
||||
(* f' is bounded *)
|
||||
unfold f'.
|
||||
intros (x,_).
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle|Hge].
|
||||
change m with (pred (S m)).
|
||||
apply le_pred.
|
||||
apply Hfbound.
|
||||
apply le_S_n.
|
||||
apply le_trans with (f xSn).
|
||||
exact Hge.
|
||||
apply Hfbound.
|
||||
split.
|
||||
(* f' is injective *)
|
||||
unfold f'.
|
||||
intros (x,Hneqx) (y,Hneqy) Heqf'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hlefx|Hgefx];
|
||||
destruct (le_lt_dec (f xSn) (f y)) as [Hlefy|Hgefy].
|
||||
(* f xSn <= f x et f xSn <= f y *)
|
||||
assert (Heq : x = y).
|
||||
apply Hfinj.
|
||||
assert (f xSn <> f y).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqy.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (0 < f y).
|
||||
apply le_lt_trans with (f xSn).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
assert (f xSn <> f x).
|
||||
apply sym_not_eq.
|
||||
intro Heqf.
|
||||
apply Hneqx.
|
||||
apply Hfinj.
|
||||
assumption.
|
||||
assert (0 < f x).
|
||||
apply le_lt_trans with (f xSn).
|
||||
apply le_O_n.
|
||||
apply le_neq_lt; assumption.
|
||||
apply pred_inj.
|
||||
apply lt_O_neq; assumption.
|
||||
apply lt_O_neq; assumption.
|
||||
assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* f y < f xSn <= f x *)
|
||||
destruct (inj_restrict A f x y xSn); assumption.
|
||||
(* f x < f xSn <= f y *)
|
||||
symmetry in Heqf'.
|
||||
destruct (inj_restrict A f y x xSn); assumption.
|
||||
(* f x < f xSn et f y < f xSn *)
|
||||
assert (Heq : x=y).
|
||||
apply Hfinj; assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* f' is surjective *)
|
||||
intros p Hlep.
|
||||
destruct (le_lt_dec (f xSn) p) as [Hle|Hlt].
|
||||
(* case f xSn <= p *)
|
||||
destruct (Hfsurj (S p) (le_n_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x <> xSn).
|
||||
intro Heqx.
|
||||
rewrite Heqx in Hx.
|
||||
rewrite Hx in Hle.
|
||||
apply le_Sn_n with p; assumption.
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
unfold f'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt'].
|
||||
rewrite Hx; reflexivity.
|
||||
rewrite Hx in Hlt'.
|
||||
contradiction (le_not_lt (f xSn) p).
|
||||
apply lt_trans with (S p).
|
||||
apply lt_n_Sn.
|
||||
assumption.
|
||||
(* case p < f xSn *)
|
||||
destruct (Hfsurj p (le_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x <> xSn).
|
||||
intro Heqx.
|
||||
rewrite Heqx in Hx.
|
||||
rewrite Hx in Hlt.
|
||||
apply (lt_irrefl p).
|
||||
assumption.
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
unfold f'.
|
||||
destruct (le_lt_dec (f xSn) (f x)) as [Hle'|Hlt'].
|
||||
rewrite Hx in Hle'.
|
||||
contradiction (lt_irrefl p).
|
||||
apply lt_le_trans with (f xSn); assumption.
|
||||
assumption.
|
||||
(* cardinality of {x:A|x<>xSn} is n *)
|
||||
pose (g' := fun x' : {x:A|x<>xSn} =>
|
||||
let (x,Hneq) := x' in
|
||||
if Hdec x xSn then 0 else g x).
|
||||
exists g'.
|
||||
split.
|
||||
(* g is bounded *)
|
||||
unfold g'.
|
||||
intros (x,_).
|
||||
destruct (Hdec x xSn) as [_|Hneq].
|
||||
apply le_O_n.
|
||||
assert (Hle_gx:=Hgbound x).
|
||||
destruct (le_lt_or_eq _ _ Hle_gx).
|
||||
apply lt_n_Sm_le.
|
||||
assumption.
|
||||
contradiction Hneq.
|
||||
apply Hginj.
|
||||
rewrite HSnx.
|
||||
assumption.
|
||||
split.
|
||||
(* g is injective *)
|
||||
unfold g'.
|
||||
intros (x,Hneqx) (y,Hneqy) Heqg'.
|
||||
destruct (Hdec x xSn) as [Heqx|_].
|
||||
contradiction Hneqx.
|
||||
destruct (Hdec y xSn) as [Heqy|_].
|
||||
contradiction Hneqy.
|
||||
assert (Heq : x=y).
|
||||
apply Hginj; assumption.
|
||||
apply neq_dep_intro; assumption.
|
||||
(* g is surjective *)
|
||||
intros p Hlep.
|
||||
destruct (Hgsurj p (le_S _ _ Hlep)) as (x,Hx).
|
||||
assert (Hneq : x<>xSn).
|
||||
intro Heq.
|
||||
rewrite Heq in Hx.
|
||||
rewrite Hx in HSnx.
|
||||
rewrite HSnx in Hlep.
|
||||
contradiction (le_Sn_n _ Hlep).
|
||||
exists (exist (fun a => a<>xSn) x Hneq).
|
||||
simpl.
|
||||
destruct (Hdec x xSn) as [Heqx|_].
|
||||
contradiction Hneq.
|
||||
assumption.
|
||||
Qed.
|
||||
|
||||
(** Conclusion *)
|
||||
|
||||
Theorem interval_discr :
|
||||
forall n m, {p:nat|p<=n} = {p:nat|p<=m} -> n=m.
|
||||
Proof.
|
||||
intros n m Heq.
|
||||
apply card_inj with (A := {p:nat|p<=n}).
|
||||
apply interval_dec.
|
||||
apply card_interval.
|
||||
rewrite Heq.
|
||||
apply card_interval.
|
||||
Qed.
|
||||
24
samples/EBNF/grammar.ebnf
Normal file
24
samples/EBNF/grammar.ebnf
Normal file
@@ -0,0 +1,24 @@
|
||||
(*
|
||||
Source: https://github.com/sunjay/lion
|
||||
License: MIT
|
||||
*)
|
||||
|
||||
Statement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , "\n" ;
|
||||
Expr = AnonymousFunction | Term | "(" , Expr , ")" ,
|
||||
{ AnonymousFunction | Term | "(" , Expr , ")" } ;
|
||||
|
||||
Assignment = Symbol , "=" , Expr ;
|
||||
|
||||
AnonymousFunction = "\" , FunctionRHS ;
|
||||
NamedFunction = Symbol , FunctionRHS ;
|
||||
|
||||
FunctionRHS = FunctionParams , "=" , FunctionBody ;
|
||||
FunctionParams = FunctionParam , { FunctionParam } ;
|
||||
FunctionParam = Term ;
|
||||
FunctionBody = Expr ;
|
||||
|
||||
Term = Symbol | Number | SingleWordString ;
|
||||
SingleWordString = '"' , Symbol , '"' ;
|
||||
(* Symbol is a collection of valid symbol characters, not defined here *)
|
||||
(* Number is a valid numeric literal *)
|
||||
|
||||
40
samples/EBNF/material.ebnf
Normal file
40
samples/EBNF/material.ebnf
Normal file
@@ -0,0 +1,40 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
name =
|
||||
"name" , string , ";" ;
|
||||
|
||||
diffuse =
|
||||
"diffuse" , real , real , real , ";" ;
|
||||
|
||||
ambient =
|
||||
"ambient" , real , real , real , ";" ;
|
||||
|
||||
specular =
|
||||
"specular" , real , real , real , real , ";" ;
|
||||
|
||||
shininess =
|
||||
"shininess" , real , ";" ;
|
||||
|
||||
alpha =
|
||||
"alpha" , real , ";" ;
|
||||
|
||||
mapping =
|
||||
"map_chrome" | "map_uv" ;
|
||||
|
||||
texture =
|
||||
"texture" , string , real , mapping , ";" ;
|
||||
|
||||
material =
|
||||
"material" , ";" ,
|
||||
name ,
|
||||
diffuse ,
|
||||
ambient ,
|
||||
specular ,
|
||||
shininess ,
|
||||
alpha ,
|
||||
[ texture ] ,
|
||||
"end" , ";" ;
|
||||
|
||||
61
samples/EBNF/object.ebnf
Normal file
61
samples/EBNF/object.ebnf
Normal file
@@ -0,0 +1,61 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
vertex_p3n3_name =
|
||||
"vertex_p3n3" ;
|
||||
|
||||
vertex_p3n3t2_name =
|
||||
"vertex_p3n3t2" ;
|
||||
|
||||
vertex_type =
|
||||
vertex_p3n3_name | vertex_p3n3t2_name ;
|
||||
|
||||
vertex_position =
|
||||
"position" , real , real , real , ";" ;
|
||||
|
||||
vertex_normal =
|
||||
"normal" , real , real , real , ";" ;
|
||||
|
||||
vertex_uv =
|
||||
"uv" , real , real , ";" ;
|
||||
|
||||
vertex_p3n3 =
|
||||
vertex_p3n3_name , vertex_position , vertex_normal , "end" , ";" ;
|
||||
|
||||
vertex_p3n3t2 =
|
||||
vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , "end" , ";" ;
|
||||
|
||||
vertex =
|
||||
vertex_p3n3 | vertex_p3n3t2 ;
|
||||
|
||||
vertex_array =
|
||||
"array" , positive , vertex_type , { vertex } , "end" , ";" ;
|
||||
|
||||
vertices =
|
||||
"vertices" , ";" , vertex_array , "end" , ";" ;
|
||||
|
||||
triangle =
|
||||
"triangle" , natural , natural , natural , ";" ;
|
||||
|
||||
triangle_array =
|
||||
"array" , positive, "triangle" , { triangle } , "end" , ";" ;
|
||||
|
||||
triangles =
|
||||
"triangles" , ";" , triangle_array , "end" , ";" ;
|
||||
|
||||
name =
|
||||
"name" , string , ";" ;
|
||||
|
||||
material_name =
|
||||
"material_name" , string , ";" ;
|
||||
|
||||
object =
|
||||
"object" , ";" ,
|
||||
name ,
|
||||
material_name ,
|
||||
vertices ,
|
||||
triangles ,
|
||||
"end" , ";" ;
|
||||
|
||||
20
samples/EBNF/types.ebnf
Normal file
20
samples/EBNF/types.ebnf
Normal file
@@ -0,0 +1,20 @@
|
||||
(*
|
||||
Source: https://github.com/io7m/jsom0
|
||||
License: ISC
|
||||
*)
|
||||
|
||||
digit_without_zero =
|
||||
"1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
|
||||
|
||||
digit =
|
||||
"0" | digit_without_zero ;
|
||||
|
||||
positive =
|
||||
digit_without_zero , { digit } ;
|
||||
|
||||
natural =
|
||||
"0" | positive ;
|
||||
|
||||
real =
|
||||
[ "-" ] , digit , [ "." , { digit } ] ;
|
||||
|
||||
6
samples/Emacs Lisp/filenames/.abbrev_defs
Normal file
6
samples/Emacs Lisp/filenames/.abbrev_defs
Normal file
@@ -0,0 +1,6 @@
|
||||
(define-abbrev-table 'c-mode-abbrev-table '(
|
||||
))
|
||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
|
||||
("TM" "™" nil 0)
|
||||
("(R)" "®" nil 0)
|
||||
("C=" "€" nil 0)))
|
||||
20
samples/Emacs Lisp/filenames/.gnus
Normal file
20
samples/Emacs Lisp/filenames/.gnus
Normal file
@@ -0,0 +1,20 @@
|
||||
(setq user-full-name "Alhadis")
|
||||
(setq user-mail-address "fake.account@gmail.com")
|
||||
|
||||
(auto-image-file-mode)
|
||||
(setq mm-inline-large-images t)
|
||||
(add-to-list 'mm-attachment-override-types "image/*")
|
||||
|
||||
(setq gnus-select-method
|
||||
'(nnimap "gmail"
|
||||
(nnimap-address "imap.gmail.com")
|
||||
(nnimap-server-port 777)
|
||||
(nnimap-stream ssl)))
|
||||
|
||||
(setq message-send-mail-function 'smtpmail-send-it
|
||||
smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil))
|
||||
smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil))
|
||||
smtpmail-default-smtp-server "smtp.gmail.com"
|
||||
smtpmail-smtp-server "smtp.gmail.com"
|
||||
smtpmail-smtp-service 800
|
||||
setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks")
|
||||
197
samples/Emacs Lisp/filenames/.spacemacs
Normal file
197
samples/Emacs Lisp/filenames/.spacemacs
Normal file
@@ -0,0 +1,197 @@
|
||||
;; -*- mode: emacs-lisp -*-
|
||||
;; This file is loaded by Spacemacs at startup.
|
||||
;; It must be stored in your home directory.
|
||||
|
||||
(defun dotspacemacs/layers ()
|
||||
"Configuration Layers declaration."
|
||||
(setq-default
|
||||
;; List of additional paths where to look for configuration layers.
|
||||
;; Paths must have a trailing slash (i.e. `~/.mycontribs/')
|
||||
dotspacemacs-configuration-layer-path '()
|
||||
;; List of configuration layers to load. If it is the symbol `all' instead
|
||||
;; of a list then all discovered layers will be installed.
|
||||
dotspacemacs-configuration-layers
|
||||
'(
|
||||
;; ----------------------------------------------------------------
|
||||
;; Example of useful layers you may want to use right away.
|
||||
;; Uncomment some layer names and press <SPC f e R> (Vim style) or
|
||||
;; <M-m f e R> (Emacs style) to install them.
|
||||
;; ----------------------------------------------------------------
|
||||
emacs-lisp
|
||||
charlock_holmes
|
||||
escape_utils
|
||||
mime-types
|
||||
rugged
|
||||
minitest
|
||||
mocha
|
||||
plist
|
||||
pry
|
||||
rake
|
||||
yajl-ruby
|
||||
colour-proximity
|
||||
licensed
|
||||
licensee
|
||||
;; List of additional packages that will be installed without being
|
||||
;; wrapped in a layer. If you need some configuration for these
|
||||
;; packages then consider to create a layer, you can also put the
|
||||
;; configuration in `dotspacemacs/config'.
|
||||
dotspacemacs-additional-packages '()
|
||||
;; A list of packages and/or extensions that will not be install and loaded.
|
||||
dotspacemacs-excluded-packages '()
|
||||
;; If non-nil spacemacs will delete any orphan packages, i.e. packages that
|
||||
;; are declared in a layer which is not a member of
|
||||
;; the list `dotspacemacs-configuration-layers'
|
||||
dotspacemacs-delete-orphan-packages t))
|
||||
|
||||
(defun dotspacemacs/init ()
|
||||
"Initialization function.
|
||||
This function is called at the very startup of Spacemacs initialization
|
||||
before layers configuration."
|
||||
;; This setq-default sexp is an exhaustive list of all the supported
|
||||
;; spacemacs settings.
|
||||
(setq-default
|
||||
;; Either `vim' or `emacs'. Evil is always enabled but if the variable
|
||||
;; is `emacs' then the `holy-mode' is enabled at startup.
|
||||
dotspacemacs-editing-style 'vim
|
||||
;; If non nil output loading progress in `*Messages*' buffer.
|
||||
dotspacemacs-verbose-loading nil
|
||||
;; Specify the startup banner. Default value is `official', it displays
|
||||
;; the official spacemacs logo. An integer value is the index of text
|
||||
;; banner, `random' chooses a random text banner in `core/banners'
|
||||
;; directory. A string value must be a path to an image format supported
|
||||
;; by your Emacs build.
|
||||
;; If the value is nil then no banner is displayed.
|
||||
dotspacemacs-startup-banner 'official
|
||||
;; List of items to show in the startup buffer. If nil it is disabled.
|
||||
;; Possible values are: `recents' `bookmarks' `projects'."
|
||||
dotspacemacs-startup-lists '(bookmarks projects recents)
|
||||
;; List of themes, the first of the list is loaded when spacemacs starts.
|
||||
;; Press <SPC> T n to cycle to the next theme in the list (works great
|
||||
;; with 2 themes variants, one dark and one light)
|
||||
dotspacemacs-themes '(
|
||||
spacemacs-dark
|
||||
spacemacs-light
|
||||
solarized-dark
|
||||
solarized-light
|
||||
atom-light-ui
|
||||
atom-dark-ui
|
||||
atom-material-ui
|
||||
zenburn
|
||||
;; If non nil the cursor colour matches the state colour.
|
||||
dotspacemacs-colorize-cursor-according-to-state t
|
||||
;; Default font. `powerline-scale' allows to quickly tweak the mode-line
|
||||
;; size to make separators look not too crappy.
|
||||
dotspacemacs-default-font '("Menloco"
|
||||
:size 11
|
||||
:weight normal
|
||||
:width normal
|
||||
:powerline-scale 1.1)
|
||||
;; The leader key
|
||||
dotspacemacs-leader-key "SPC"
|
||||
;; The leader key accessible in `emacs state' and `insert state'
|
||||
dotspacemacs-emacs-leader-key "M-m"
|
||||
;; Major mode leader key is a shortcut key which is the equivalent of
|
||||
;; pressing `<leader> m`. Set it to `nil` to disable it.
|
||||
dotspacemacs-major-mode-leader-key ","
|
||||
;; Major mode leader key accessible in `emacs state' and `insert state'
|
||||
dotspacemacs-major-mode-emacs-leader-key "C-M-m"
|
||||
;; The command key used for Evil commands (ex-commands) and
|
||||
;; Emacs commands (M-x).
|
||||
;; By default the command key is `:' so ex-commands are executed like in Vim
|
||||
;; with `:' and Emacs commands are executed with `<leader> :'.
|
||||
dotspacemacs-command-key ":"
|
||||
;; Location where to auto-save files. Possible values are `original' to
|
||||
;; auto-save the file in-place, `cache' to auto-save the file to another
|
||||
;; file stored in the cache directory and `nil' to disable auto-saving.
|
||||
;; Default value is `cache'.
|
||||
dotspacemacs-auto-save-file-location 'cache
|
||||
;; If non nil then `ido' replaces `helm' for some commands. For now only
|
||||
;; `find-files' (SPC f f) is replaced.
|
||||
dotspacemacs-use-ido nil
|
||||
;; If non nil the paste micro-state is enabled. When enabled pressing `p`
|
||||
;; several times cycle between the kill ring content.
|
||||
dotspacemacs-enable-paste-micro-state nil
|
||||
;; Guide-key delay in seconds. The Guide-key is the popup buffer listing
|
||||
;; the commands bound to the current keystrokes.
|
||||
dotspacemacs-guide-key-delay 0.4
|
||||
;; If non nil a progress bar is displayed when spacemacs is loading. This
|
||||
;; may increase the boot time on some systems and emacs builds, set it to
|
||||
;; nil ;; to boost the loading time.
|
||||
dotspacemacs-loading-progress-bar t
|
||||
;; If non nil the frame is fullscreen when Emacs starts up.
|
||||
;; (Emacs 24.4+ only)
|
||||
dotspacemacs-fullscreen-at-startup nil
|
||||
;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen.
|
||||
;; Use to disable fullscreen animations in OSX."
|
||||
dotspacemacs-fullscreen-use-non-native nil
|
||||
;; If non nil the frame is maximized when Emacs starts up.
|
||||
;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.
|
||||
;; (Emacs 24.4+ only)
|
||||
dotspacemacs-maximized-at-startup nil
|
||||
;; A value from the range (0..100), in increasing opacity, which describes
|
||||
;; the transparency level of a frame when it's active or selected.
|
||||
;; Transparency can be toggled through `toggle-transparency'.
|
||||
dotspacemacs-active-transparency 90
|
||||
;; A value from the range (0..100), in increasing opacity, which describes
|
||||
;; the transparency level of a frame when it's inactive or deselected.
|
||||
;; Transparency can be toggled through `toggle-transparency'.
|
||||
dotspacemacs-inactive-transparency 90
|
||||
;; If non nil unicode symbols are displayed in the mode line.
|
||||
dotspacemacs-mode-line-unicode-symbols t
|
||||
;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth
|
||||
;; scrolling overrides the default behavior of Emacs which recenters the
|
||||
;; point when it reaches the top or bottom of the screen.
|
||||
dotspacemacs-smooth-scrolling t
|
||||
;; If non-nil smartparens-strict-mode will be enabled in programming modes.
|
||||
dotspacemacs-smartparens-strict-mode nil
|
||||
;; Select a scope to highlight delimiters. Possible value is `all',
|
||||
;; `current' or `nil'. Default is `all'
|
||||
dotspacemacs-highlight-delimiters 'all
|
||||
;; If non nil advises quit functions to keep server open when quitting.
|
||||
dotspacemacs-persistent-server nil
|
||||
;; List of search tool executable names. Spacemacs uses the first installed
|
||||
;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'.
|
||||
dotspacemacs-search-tools '("ag" "pt" "ack" "grep")
|
||||
;; The default package repository used if no explicit repository has been
|
||||
;; specified with an installed package.
|
||||
;; Not used for now.
|
||||
dotspacemacs-default-package-repository nil
|
||||
|
||||
;; If non nil line numbers are turned on in all `prog-mode' and `text-mode'
|
||||
;; derivatives. If set to `relative', also turns on relative line numbers.
|
||||
;; (default nil)
|
||||
dotspacemacs-line-numbers 'relative
|
||||
|
||||
;; Delete whitespace while saving buffer. Possible values are `all',
|
||||
;; `trailing', `changed' or `nil'. Default is `changed' (cleanup whitespace
|
||||
;; on changed lines) (default 'changed)
|
||||
dotspacemacs-whitespace-cleanup 'changed
|
||||
)
|
||||
;; User initialization goes here
|
||||
)
|
||||
|
||||
(defun dotspacemacs/user-config ()
|
||||
"Configuration function.
|
||||
This function is called at the very end of Spacemacs initialization after
|
||||
layers configuration."
|
||||
(add-hook 'alchemist-mode-hook 'company-mode)
|
||||
|
||||
(add-hook 'projectile-mode-hook 'projectile-rails-on)
|
||||
(setq ruby-insert-encoding-magic-comment nil)
|
||||
|
||||
(setq web-mode-markup-indent-offset 2)
|
||||
(setq web-mode-code-indent-offset 2)
|
||||
|
||||
(spacemacs/toggle-golden-ratio-on)
|
||||
(spacemacs/toggle-indent-guide-globally-on)
|
||||
(spacemacs/toggle-centered-point-globally-on)
|
||||
)
|
||||
|
||||
;; Do not write anything past this comment. This is where Emacs will
|
||||
;; auto-generate custom variable definitions.
|
||||
(custom-set-variables
|
||||
;; custom-set-variables was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
10
samples/Emacs Lisp/filenames/.viper
Normal file
10
samples/Emacs Lisp/filenames/.viper
Normal file
@@ -0,0 +1,10 @@
|
||||
(setq viper-inhibit-startup-message 't)
|
||||
(setq viper-expert-level '5)
|
||||
|
||||
; Key bindings
|
||||
(define-key viper-vi-global-user-map "\C-d" 'end-of-line)
|
||||
|
||||
; Return to top of window
|
||||
(defun my-viper-return-to-top ()
|
||||
(interactive)
|
||||
(beginning-of-buffer))
|
||||
34
samples/Emacs Lisp/filenames/Project.ede
Normal file
34
samples/Emacs Lisp/filenames/Project.ede
Normal file
@@ -0,0 +1,34 @@
|
||||
;; Object EDE
|
||||
(ede-proj-project "Linguist"
|
||||
:name "Linguist"
|
||||
:version "4.9"
|
||||
:file "Project.ede"
|
||||
:targets (list
|
||||
(ede-proj-target-elisp-autoloads "autoloads"
|
||||
:name "autoloads"
|
||||
:path "test/samples/Emacs Lisp"
|
||||
:autoload-file "dude.el"
|
||||
)
|
||||
(ede-proj-target-elisp "init"
|
||||
:name "init"
|
||||
:path ""
|
||||
:source '("ede-load.el" "wait-what.el")
|
||||
:compiler 'ede-emacs-preload-compiler
|
||||
:pre-load-packages '("sample-names")
|
||||
)
|
||||
(ede-proj-target-elisp "what"
|
||||
:name "the"
|
||||
:path ""
|
||||
:source '("h.el" "am-i-writing.el")
|
||||
:versionsource '("hell.el")
|
||||
:compiler 'ede-emacs-preload-compiler
|
||||
:aux-packages '("what" "the" "hell-files" "am-i-writing")
|
||||
)
|
||||
)
|
||||
:web-site-url "https://github.com/github/linguist"
|
||||
:web-site-directory "../"
|
||||
:web-site-file "CONTRIBUTING.md"
|
||||
:ftp-upload-site "/ftp@git.hub.com:/madeup"
|
||||
:configuration-variables 'nil
|
||||
:metasubproject 't
|
||||
)
|
||||
70
samples/Emacs Lisp/filenames/_emacs
Normal file
70
samples/Emacs Lisp/filenames/_emacs
Normal file
@@ -0,0 +1,70 @@
|
||||
;; UTF-8 support
|
||||
;; (set-language-environment "UTF-8")
|
||||
(setenv "LANG" "en_AU.UTF-8")
|
||||
(setenv "LC_ALL" "en_AU.UTF-8")
|
||||
(setq default-tab-width 4)
|
||||
|
||||
|
||||
;;; Function to load all ".el" files in ~/.emacs.d/config
|
||||
(defun load-directory (directory)
|
||||
"Recursively load all Emacs Lisp files in a directory."
|
||||
(dolist (element (directory-files-and-attributes directory nil nil nil))
|
||||
(let* ((path (car element))
|
||||
(fullpath (concat directory "/" path))
|
||||
(isdir (car (cdr element)))
|
||||
(ignore-dir (or (string= path ".") (string= path ".."))))
|
||||
(cond
|
||||
((and (eq isdir t) (not ignore-dir))
|
||||
(load-directory fullpath))
|
||||
((and (eq isdir nil) (string= (substring path -3) ".el"))
|
||||
(load (file-name-sans-extension fullpath)))))))
|
||||
|
||||
;; Tell Emacs we'd like to use Hunspell for spell-checking
|
||||
(setq ispell-program-name (executable-find "hunspell"))
|
||||
|
||||
;; Load Homebrew-installed packages
|
||||
(let ((default-directory "/usr/local/share/emacs/site-lisp/"))
|
||||
(normal-top-level-add-subdirs-to-load-path))
|
||||
(load "aggressive-indent")
|
||||
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
|
||||
(autoload 'rust-mode "rust-mode" nil t)
|
||||
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
|
||||
|
||||
;; Load Git-related syntax highlighting
|
||||
(add-to-list 'load-path "~/.emacs.d/lisp/")
|
||||
(load "git-modes")
|
||||
(load "git-commit")
|
||||
|
||||
;; Keybindings
|
||||
(global-set-key (kbd "C-u") (lambda ()
|
||||
(interactive)
|
||||
(kill-line 0)))
|
||||
|
||||
;; Show cursor's current column number
|
||||
(setq column-number-mode t)
|
||||
|
||||
;; Disable autosave
|
||||
(setq auto-save-default nil)
|
||||
|
||||
;; Use a single directory for storing backup files
|
||||
(setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list")))
|
||||
(setq backup-by-copying t)
|
||||
(setq delete-old-versions t
|
||||
kept-new-versions 6
|
||||
kept-old-versions 2
|
||||
version-control t)
|
||||
|
||||
(custom-set-variables
|
||||
;; custom-set-variables was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
'(blink-cursor-mode nil)
|
||||
'(column-number-mode t)
|
||||
'(show-paren-mode t))
|
||||
(custom-set-faces
|
||||
;; custom-set-faces was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
8
samples/Emacs Lisp/filenames/abbrev_defs
Normal file
8
samples/Emacs Lisp/filenames/abbrev_defs
Normal file
@@ -0,0 +1,8 @@
|
||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
|
||||
("cat" "Concatenate" nil 0)
|
||||
("WTF" "World Trade Federation " nil 0)
|
||||
("rtbtm" "Read that back to me" nil 0)))
|
||||
|
||||
(define-abbrev-table 'shell-script-mode-abbrev-table '(
|
||||
("brake", "bundle rake exec" nil 0)
|
||||
("pls", "warning: setting Encoding.default_external")))
|
||||
6
samples/FORTRAN/bug-185631.f
Normal file
6
samples/FORTRAN/bug-185631.f
Normal file
@@ -0,0 +1,6 @@
|
||||
! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/
|
||||
real onemu, twomu
|
||||
data onemu/0.0098/
|
||||
data twomu/1./
|
||||
data threemu/0.e9/
|
||||
end
|
||||
51
samples/Filebench WML/copyfiles.f
Normal file
51
samples/Filebench WML/copyfiles.f
Normal file
@@ -0,0 +1,51 @@
|
||||
#
|
||||
# CDDL HEADER START
|
||||
#
|
||||
# The contents of this file are subject to the terms of the
|
||||
# Common Development and Distribution License (the "License").
|
||||
# You may not use this file except in compliance with the License.
|
||||
#
|
||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||
# or http://www.opensolaris.org/os/licensing.
|
||||
# See the License for the specific language governing permissions
|
||||
# and limitations under the License.
|
||||
#
|
||||
# When distributing Covered Code, include this CDDL HEADER in each
|
||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||
# If applicable, add the following below this CDDL HEADER, with the
|
||||
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# Use is subject to license terms.
|
||||
#
|
||||
|
||||
set $dir=/tmp
|
||||
set $nfiles=1000
|
||||
set $meandirwidth=20
|
||||
set $meanfilesize=16k
|
||||
set $iosize=1m
|
||||
set $nthreads=1
|
||||
|
||||
set mode quit firstdone
|
||||
|
||||
define fileset name=bigfileset,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=100,paralloc
|
||||
define fileset name=destfiles,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth
|
||||
|
||||
define process name=filereader,instances=1
|
||||
{
|
||||
thread name=filereaderthread,memsize=10m,instances=$nthreads
|
||||
{
|
||||
flowop openfile name=openfile1,filesetname=bigfileset,fd=1
|
||||
flowop readwholefile name=readfile1,fd=1,iosize=$iosize
|
||||
flowop createfile name=createfile2,filesetname=destfiles,fd=2
|
||||
flowop writewholefile name=writefile2,fd=2,srcfd=1,iosize=$iosize
|
||||
flowop closefile name=closefile1,fd=1
|
||||
flowop closefile name=closefile2,fd=2
|
||||
}
|
||||
}
|
||||
|
||||
echo "Copyfiles Version 3.0 personality successfully loaded"
|
||||
59
samples/GN/BUILD.2.gn
Normal file
59
samples/GN/BUILD.2.gn
Normal file
@@ -0,0 +1,59 @@
|
||||
# Copyright 2016 the V8 project authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import("../gni/isolate.gni")
|
||||
|
||||
group("gn_all") {
|
||||
testonly = true
|
||||
|
||||
if (v8_test_isolation_mode != "noop") {
|
||||
deps = [
|
||||
":check-static-initializers_run",
|
||||
":jsfunfuzz_run",
|
||||
":run-deopt-fuzzer_run",
|
||||
":run-gcmole_run",
|
||||
":run-valgrind_run",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
v8_isolate_run("check-static-initializers") {
|
||||
deps = [
|
||||
"..:d8_run",
|
||||
]
|
||||
|
||||
isolate = "check-static-initializers.isolate"
|
||||
}
|
||||
|
||||
v8_isolate_run("jsfunfuzz") {
|
||||
deps = [
|
||||
"..:d8_run",
|
||||
]
|
||||
|
||||
isolate = "jsfunfuzz/jsfunfuzz.isolate"
|
||||
}
|
||||
|
||||
v8_isolate_run("run-deopt-fuzzer") {
|
||||
deps = [
|
||||
"..:d8_run",
|
||||
]
|
||||
|
||||
isolate = "run-deopt-fuzzer.isolate"
|
||||
}
|
||||
|
||||
v8_isolate_run("run-gcmole") {
|
||||
deps = [
|
||||
"..:d8_run",
|
||||
]
|
||||
|
||||
isolate = "gcmole/run-gcmole.isolate"
|
||||
}
|
||||
|
||||
v8_isolate_run("run-valgrind") {
|
||||
deps = [
|
||||
"..:d8_run",
|
||||
]
|
||||
|
||||
isolate = "run-valgrind.isolate"
|
||||
}
|
||||
1646
samples/GN/BUILD.3.gn
Normal file
1646
samples/GN/BUILD.3.gn
Normal file
File diff suppressed because it is too large
Load Diff
2583
samples/GN/BUILD.gn
Normal file
2583
samples/GN/BUILD.gn
Normal file
File diff suppressed because it is too large
Load Diff
2781
samples/GN/android-rules.gni
Normal file
2781
samples/GN/android-rules.gni
Normal file
File diff suppressed because it is too large
Load Diff
13
samples/GN/clang.gni
Normal file
13
samples/GN/clang.gni
Normal file
@@ -0,0 +1,13 @@
|
||||
# Copyright 2014 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import("//build/toolchain/toolchain.gni")
|
||||
|
||||
declare_args() {
|
||||
# Indicates if the build should use the Chrome-specific plugins for enforcing
|
||||
# coding guidelines, etc. Only used when compiling with Clang.
|
||||
clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang
|
||||
|
||||
clang_base_path = "//third_party/llvm-build/Release+Asserts"
|
||||
}
|
||||
25
samples/GN/filenames/.gn
Normal file
25
samples/GN/filenames/.gn
Normal file
@@ -0,0 +1,25 @@
|
||||
# This file is used by the GN meta build system to find the root of the source
|
||||
# tree and to set startup options. For documentation on the values set in this
|
||||
# file, run "gn help dotfile" at the command line.
|
||||
|
||||
import("//build/dotfile_settings.gni")
|
||||
|
||||
# The location of the build configuration file.
|
||||
buildconfig = "//build/config/BUILDCONFIG.gn"
|
||||
|
||||
# The secondary source root is a parallel directory tree where
|
||||
# GN build files are placed when they can not be placed directly
|
||||
# in the source tree, e.g. for third party source trees.
|
||||
secondary_source = "//build/secondary/"
|
||||
|
||||
# These are the targets to check headers for by default. The files in targets
|
||||
# matching these patterns (see "gn help label_pattern" for format) will have
|
||||
# their includes checked for proper dependencies when you run either
|
||||
# "gn check" or "gn gen --check".
|
||||
check_targets = []
|
||||
|
||||
# These are the list of GN files that run exec_script. This whitelist exists
|
||||
# to force additional review for new uses of exec_script, which is strongly
|
||||
# discouraged except for gypi_to_gn calls.
|
||||
exec_script_whitelist =
|
||||
build_dotfile_settings.exec_script_whitelist + [ "//test/test262/BUILD.gn" ]
|
||||
503
samples/GN/gcc_toolchain.gni
Normal file
503
samples/GN/gcc_toolchain.gni
Normal file
@@ -0,0 +1,503 @@
|
||||
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import("//build/config/android/config.gni")
|
||||
import("//build/config/clang/clang.gni")
|
||||
import("//build/config/nacl/config.gni")
|
||||
import("//build/config/sanitizers/sanitizers.gni")
|
||||
import("//build/config/v8_target_cpu.gni")
|
||||
import("//build/toolchain/cc_wrapper.gni")
|
||||
import("//build/toolchain/goma.gni")
|
||||
import("//build/toolchain/toolchain.gni")
|
||||
|
||||
# This template defines a toolchain for something that works like gcc
|
||||
# (including clang).
|
||||
#
|
||||
# It requires the following variables specifying the executables to run:
|
||||
# - ar
|
||||
# - cc
|
||||
# - cxx
|
||||
# - ld
|
||||
#
|
||||
# Optional parameters that control the tools:
|
||||
#
|
||||
# - extra_cflags
|
||||
# Extra flags to be appended when compiling C files (but not C++ files).
|
||||
# - extra_cppflags
|
||||
# Extra flags to be appended when compiling both C and C++ files. "CPP"
|
||||
# stands for "C PreProcessor" in this context, although it can be
|
||||
# used for non-preprocessor flags as well. Not to be confused with
|
||||
# "CXX" (which follows).
|
||||
# - extra_cxxflags
|
||||
# Extra flags to be appended when compiling C++ files (but not C files).
|
||||
# - extra_ldflags
|
||||
# Extra flags to be appended when linking
|
||||
#
|
||||
# - libs_section_prefix
|
||||
# - libs_section_postfix
|
||||
# The contents of these strings, if specified, will be placed around
|
||||
# the libs section of the linker line. It allows one to inject libraries
|
||||
# at the beginning and end for all targets in a toolchain.
|
||||
# - solink_libs_section_prefix
|
||||
# - solink_libs_section_postfix
|
||||
# Same as libs_section_{pre,post}fix except used for solink instead of link.
|
||||
# - link_outputs
|
||||
# The content of this array, if specified, will be added to the list of
|
||||
# outputs from the link command. This can be useful in conjunction with
|
||||
# the post_link parameter.
|
||||
# - post_link
|
||||
# The content of this string, if specified, will be run as a separate
|
||||
# command following the the link command.
|
||||
# - deps
|
||||
# Just forwarded to the toolchain definition.
|
||||
# - executable_extension
|
||||
# If this string is specified it will be used for the file extension
|
||||
# for an executable, rather than using no extension; targets will
|
||||
# still be able to override the extension using the output_extension
|
||||
# variable.
|
||||
# - rebuild_define
|
||||
# The contents of this string, if specified, will be passed as a #define
|
||||
# to the toolchain. It can be used to force recompiles whenever a
|
||||
# toolchain is updated.
|
||||
# - shlib_extension
|
||||
# If this string is specified it will be used for the file extension
|
||||
# for a shared library, rather than default value specified in
|
||||
# toolchain.gni
|
||||
# - strip
|
||||
# Location of the strip executable. When specified, strip will be run on
|
||||
# all shared libraries and executables as they are built. The pre-stripped
|
||||
# artifacts will be put in lib.unstripped/ and exe.unstripped/.
|
||||
template("gcc_toolchain") {
|
||||
toolchain(target_name) {
|
||||
assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value")
|
||||
assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value")
|
||||
assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value")
|
||||
assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value")
|
||||
|
||||
# This define changes when the toolchain changes, forcing a rebuild.
|
||||
# Nothing should ever use this define.
|
||||
if (defined(invoker.rebuild_define)) {
|
||||
rebuild_string = "-D" + invoker.rebuild_define + " "
|
||||
} else {
|
||||
rebuild_string = ""
|
||||
}
|
||||
|
||||
# GN's syntax can't handle more than one scope dereference at once, like
|
||||
# "invoker.toolchain_args.foo", so make a temporary to hold the toolchain
|
||||
# args so we can do "invoker_toolchain_args.foo".
|
||||
assert(defined(invoker.toolchain_args),
|
||||
"Toolchains must specify toolchain_args")
|
||||
invoker_toolchain_args = invoker.toolchain_args
|
||||
assert(defined(invoker_toolchain_args.current_cpu),
|
||||
"toolchain_args must specify a current_cpu")
|
||||
assert(defined(invoker_toolchain_args.current_os),
|
||||
"toolchain_args must specify a current_os")
|
||||
|
||||
# When invoking this toolchain not as the default one, these args will be
|
||||
# passed to the build. They are ignored when this is the default toolchain.
|
||||
toolchain_args = {
|
||||
# Populate toolchain args from the invoker.
|
||||
forward_variables_from(invoker_toolchain_args, "*")
|
||||
|
||||
# The host toolchain value computed by the default toolchain's setup
|
||||
# needs to be passed through unchanged to all secondary toolchains to
|
||||
# ensure that it's always the same, regardless of the values that may be
|
||||
# set on those toolchains.
|
||||
host_toolchain = host_toolchain
|
||||
|
||||
if (!defined(invoker_toolchain_args.v8_current_cpu)) {
|
||||
v8_current_cpu = invoker_toolchain_args.current_cpu
|
||||
}
|
||||
}
|
||||
|
||||
# When the invoker has explicitly overridden use_goma or cc_wrapper in the
|
||||
# toolchain args, use those values, otherwise default to the global one.
|
||||
# This works because the only reasonable override that toolchains might
|
||||
# supply for these values are to force-disable them.
|
||||
if (defined(toolchain_args.use_goma)) {
|
||||
toolchain_uses_goma = toolchain_args.use_goma
|
||||
} else {
|
||||
toolchain_uses_goma = use_goma
|
||||
}
|
||||
if (defined(toolchain_args.cc_wrapper)) {
|
||||
toolchain_cc_wrapper = toolchain_args.cc_wrapper
|
||||
} else {
|
||||
toolchain_cc_wrapper = cc_wrapper
|
||||
}
|
||||
|
||||
# Compute the compiler prefix.
|
||||
if (toolchain_uses_goma) {
|
||||
assert(toolchain_cc_wrapper == "",
|
||||
"Goma and cc_wrapper can't be used together.")
|
||||
compiler_prefix = "$goma_dir/gomacc "
|
||||
} else if (toolchain_cc_wrapper != "") {
|
||||
compiler_prefix = toolchain_cc_wrapper + " "
|
||||
} else {
|
||||
compiler_prefix = ""
|
||||
}
|
||||
|
||||
cc = compiler_prefix + invoker.cc
|
||||
cxx = compiler_prefix + invoker.cxx
|
||||
ar = invoker.ar
|
||||
ld = invoker.ld
|
||||
if (defined(invoker.readelf)) {
|
||||
readelf = invoker.readelf
|
||||
} else {
|
||||
readelf = "readelf"
|
||||
}
|
||||
if (defined(invoker.nm)) {
|
||||
nm = invoker.nm
|
||||
} else {
|
||||
nm = "nm"
|
||||
}
|
||||
|
||||
if (defined(invoker.shlib_extension)) {
|
||||
default_shlib_extension = invoker.shlib_extension
|
||||
} else {
|
||||
default_shlib_extension = shlib_extension
|
||||
}
|
||||
|
||||
if (defined(invoker.executable_extension)) {
|
||||
default_executable_extension = invoker.executable_extension
|
||||
} else {
|
||||
default_executable_extension = ""
|
||||
}
|
||||
|
||||
# Bring these into our scope for string interpolation with default values.
|
||||
if (defined(invoker.libs_section_prefix)) {
|
||||
libs_section_prefix = invoker.libs_section_prefix
|
||||
} else {
|
||||
libs_section_prefix = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.libs_section_postfix)) {
|
||||
libs_section_postfix = invoker.libs_section_postfix
|
||||
} else {
|
||||
libs_section_postfix = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.solink_libs_section_prefix)) {
|
||||
solink_libs_section_prefix = invoker.solink_libs_section_prefix
|
||||
} else {
|
||||
solink_libs_section_prefix = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.solink_libs_section_postfix)) {
|
||||
solink_libs_section_postfix = invoker.solink_libs_section_postfix
|
||||
} else {
|
||||
solink_libs_section_postfix = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") {
|
||||
extra_cflags = " " + invoker.extra_cflags
|
||||
} else {
|
||||
extra_cflags = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") {
|
||||
extra_cppflags = " " + invoker.extra_cppflags
|
||||
} else {
|
||||
extra_cppflags = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") {
|
||||
extra_cxxflags = " " + invoker.extra_cxxflags
|
||||
} else {
|
||||
extra_cxxflags = ""
|
||||
}
|
||||
|
||||
if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") {
|
||||
extra_ldflags = " " + invoker.extra_ldflags
|
||||
} else {
|
||||
extra_ldflags = ""
|
||||
}
|
||||
|
||||
# These library switches can apply to all tools below.
|
||||
lib_switch = "-l"
|
||||
lib_dir_switch = "-L"
|
||||
|
||||
# Object files go in this directory.
|
||||
object_subdir = "{{target_out_dir}}/{{label_name}}"
|
||||
|
||||
tool("cc") {
|
||||
depfile = "{{output}}.d"
|
||||
command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}"
|
||||
depsformat = "gcc"
|
||||
description = "CC {{output}}"
|
||||
outputs = [
|
||||
# The whitelist file is also an output, but ninja does not
|
||||
# currently support multiple outputs for tool("cc").
|
||||
"$object_subdir/{{source_name_part}}.o",
|
||||
]
|
||||
if (enable_resource_whitelist_generation) {
|
||||
compile_wrapper =
|
||||
rebase_path("//build/toolchain/gcc_compile_wrapper.py",
|
||||
root_build_dir)
|
||||
command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command"
|
||||
}
|
||||
}
|
||||
|
||||
tool("cxx") {
|
||||
depfile = "{{output}}.d"
|
||||
command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}"
|
||||
depsformat = "gcc"
|
||||
description = "CXX {{output}}"
|
||||
outputs = [
|
||||
# The whitelist file is also an output, but ninja does not
|
||||
# currently support multiple outputs for tool("cxx").
|
||||
"$object_subdir/{{source_name_part}}.o",
|
||||
]
|
||||
if (enable_resource_whitelist_generation) {
|
||||
compile_wrapper =
|
||||
rebase_path("//build/toolchain/gcc_compile_wrapper.py",
|
||||
root_build_dir)
|
||||
command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command"
|
||||
}
|
||||
}
|
||||
|
||||
tool("asm") {
|
||||
# For GCC we can just use the C compiler to compile assembly.
|
||||
depfile = "{{output}}.d"
|
||||
command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
|
||||
depsformat = "gcc"
|
||||
description = "ASM {{output}}"
|
||||
outputs = [
|
||||
"$object_subdir/{{source_name_part}}.o",
|
||||
]
|
||||
}
|
||||
|
||||
tool("alink") {
|
||||
rspfile = "{{output}}.rsp"
|
||||
whitelist_flag = " "
|
||||
if (enable_resource_whitelist_generation) {
|
||||
whitelist_flag = " --resource-whitelist=\"{{output}}.whitelist\""
|
||||
}
|
||||
|
||||
# This needs a Python script to avoid using simple sh features in this
|
||||
# command, in case the host does not use a POSIX shell (e.g. compiling
|
||||
# POSIX-like toolchains such as NaCl on Windows).
|
||||
ar_wrapper =
|
||||
rebase_path("//build/toolchain/gcc_ar_wrapper.py", root_build_dir)
|
||||
command = "$python_path \"$ar_wrapper\"$whitelist_flag --output={{output}} --ar=\"$ar\" {{arflags}} rcsD @\"$rspfile\""
|
||||
description = "AR {{output}}"
|
||||
rspfile_content = "{{inputs}}"
|
||||
outputs = [
|
||||
"{{output_dir}}/{{target_output_name}}{{output_extension}}",
|
||||
]
|
||||
|
||||
# Shared libraries go in the target out directory by default so we can
|
||||
# generate different targets with the same name and not have them collide.
|
||||
default_output_dir = "{{target_out_dir}}"
|
||||
default_output_extension = ".a"
|
||||
output_prefix = "lib"
|
||||
}
|
||||
|
||||
tool("solink") {
|
||||
soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so".
|
||||
sofile = "{{output_dir}}/$soname" # Possibly including toolchain dir.
|
||||
rspfile = sofile + ".rsp"
|
||||
pool = "//build/toolchain:link_pool($default_toolchain)"
|
||||
whitelist_flag = " "
|
||||
if (enable_resource_whitelist_generation) {
|
||||
whitelist_file = "$sofile.whitelist"
|
||||
whitelist_flag = " --resource-whitelist=\"$whitelist_file\""
|
||||
}
|
||||
|
||||
if (defined(invoker.strip)) {
|
||||
unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
|
||||
} else {
|
||||
unstripped_sofile = sofile
|
||||
}
|
||||
|
||||
# These variables are not built into GN but are helpers that
|
||||
# implement (1) linking to produce a .so, (2) extracting the symbols
|
||||
# from that file (3) if the extracted list differs from the existing
|
||||
# .TOC file, overwrite it, otherwise, don't change it.
|
||||
tocfile = sofile + ".TOC"
|
||||
|
||||
link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\""
|
||||
|
||||
assert(defined(readelf), "to solink you must have a readelf")
|
||||
assert(defined(nm), "to solink you must have an nm")
|
||||
strip_switch = ""
|
||||
if (defined(invoker.strip)) {
|
||||
strip_switch = "--strip=${invoker.strip}"
|
||||
}
|
||||
|
||||
# This needs a Python script to avoid using a complex shell command
|
||||
# requiring sh control structures, pipelines, and POSIX utilities.
|
||||
# The host might not have a POSIX shell and utilities (e.g. Windows).
|
||||
solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py")
|
||||
command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --output=\"$sofile\"$whitelist_flag -- $link_command"
|
||||
|
||||
rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
|
||||
|
||||
description = "SOLINK $sofile"
|
||||
|
||||
# Use this for {{output_extension}} expansions unless a target manually
|
||||
# overrides it (in which case {{output_extension}} will be what the target
|
||||
# specifies).
|
||||
default_output_extension = default_shlib_extension
|
||||
|
||||
default_output_dir = "{{root_out_dir}}"
|
||||
if (shlib_subdir != ".") {
|
||||
default_output_dir += "/$shlib_subdir"
|
||||
}
|
||||
|
||||
output_prefix = "lib"
|
||||
|
||||
# Since the above commands only updates the .TOC file when it changes, ask
|
||||
# Ninja to check if the timestamp actually changed to know if downstream
|
||||
# dependencies should be recompiled.
|
||||
restat = true
|
||||
|
||||
# Tell GN about the output files. It will link to the sofile but use the
|
||||
# tocfile for dependency management.
|
||||
outputs = [
|
||||
sofile,
|
||||
tocfile,
|
||||
]
|
||||
if (enable_resource_whitelist_generation) {
|
||||
outputs += [ whitelist_file ]
|
||||
}
|
||||
if (sofile != unstripped_sofile) {
|
||||
outputs += [ unstripped_sofile ]
|
||||
}
|
||||
link_output = sofile
|
||||
depend_output = tocfile
|
||||
}
|
||||
|
||||
tool("solink_module") {
|
||||
soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so".
|
||||
sofile = "{{output_dir}}/$soname"
|
||||
rspfile = sofile + ".rsp"
|
||||
pool = "//build/toolchain:link_pool($default_toolchain)"
|
||||
|
||||
if (defined(invoker.strip)) {
|
||||
unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname"
|
||||
} else {
|
||||
unstripped_sofile = sofile
|
||||
}
|
||||
|
||||
command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\""
|
||||
|
||||
if (defined(invoker.strip)) {
|
||||
strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\""
|
||||
command += " && " + strip_command
|
||||
}
|
||||
rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
|
||||
|
||||
description = "SOLINK_MODULE $sofile"
|
||||
|
||||
# Use this for {{output_extension}} expansions unless a target manually
|
||||
# overrides it (in which case {{output_extension}} will be what the target
|
||||
# specifies).
|
||||
if (defined(invoker.loadable_module_extension)) {
|
||||
default_output_extension = invoker.loadable_module_extension
|
||||
} else {
|
||||
default_output_extension = default_shlib_extension
|
||||
}
|
||||
|
||||
default_output_dir = "{{root_out_dir}}"
|
||||
if (shlib_subdir != ".") {
|
||||
default_output_dir += "/$shlib_subdir"
|
||||
}
|
||||
|
||||
output_prefix = "lib"
|
||||
|
||||
outputs = [
|
||||
sofile,
|
||||
]
|
||||
if (sofile != unstripped_sofile) {
|
||||
outputs += [ unstripped_sofile ]
|
||||
}
|
||||
}
|
||||
|
||||
tool("link") {
|
||||
exename = "{{target_output_name}}{{output_extension}}"
|
||||
outfile = "{{output_dir}}/$exename"
|
||||
rspfile = "$outfile.rsp"
|
||||
unstripped_outfile = outfile
|
||||
pool = "//build/toolchain:link_pool($default_toolchain)"
|
||||
|
||||
# Use this for {{output_extension}} expansions unless a target manually
|
||||
# overrides it (in which case {{output_extension}} will be what the target
|
||||
# specifies).
|
||||
default_output_extension = default_executable_extension
|
||||
|
||||
default_output_dir = "{{root_out_dir}}"
|
||||
|
||||
if (defined(invoker.strip)) {
|
||||
unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename"
|
||||
}
|
||||
|
||||
command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix"
|
||||
if (defined(invoker.strip)) {
|
||||
link_wrapper =
|
||||
rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir)
|
||||
command = "$python_path \"$link_wrapper\" --strip=\"${invoker.strip}\" --unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command"
|
||||
}
|
||||
description = "LINK $outfile"
|
||||
rspfile_content = "{{inputs}}"
|
||||
outputs = [
|
||||
outfile,
|
||||
]
|
||||
if (outfile != unstripped_outfile) {
|
||||
outputs += [ unstripped_outfile ]
|
||||
}
|
||||
if (defined(invoker.link_outputs)) {
|
||||
outputs += invoker.link_outputs
|
||||
}
|
||||
}
|
||||
|
||||
# These two are really entirely generic, but have to be repeated in
|
||||
# each toolchain because GN doesn't allow a template to be used here.
|
||||
# See //build/toolchain/toolchain.gni for details.
|
||||
tool("stamp") {
|
||||
command = stamp_command
|
||||
description = stamp_description
|
||||
}
|
||||
tool("copy") {
|
||||
command = copy_command
|
||||
description = copy_description
|
||||
}
|
||||
|
||||
forward_variables_from(invoker, [ "deps" ])
|
||||
}
|
||||
}
|
||||
|
||||
# This is a shorthand for gcc_toolchain instances based on the Chromium-built
|
||||
# version of Clang. Only the toolchain_cpu and toolchain_os variables need to
|
||||
# be specified by the invoker, and optionally toolprefix if it's a
|
||||
# cross-compile case. Note that for a cross-compile case this toolchain
|
||||
# requires a config to pass the appropriate -target option, or else it will
|
||||
# actually just be doing a native compile. The invoker can optionally override
|
||||
# use_gold too.
|
||||
template("clang_toolchain") {
|
||||
if (defined(invoker.toolprefix)) {
|
||||
toolprefix = invoker.toolprefix
|
||||
} else {
|
||||
toolprefix = ""
|
||||
}
|
||||
|
||||
gcc_toolchain(target_name) {
|
||||
prefix = rebase_path("$clang_base_path/bin", root_build_dir)
|
||||
cc = "$prefix/clang"
|
||||
cxx = "$prefix/clang++"
|
||||
ld = cxx
|
||||
|
||||
readelf = "${toolprefix}readelf"
|
||||
ar = "${toolprefix}ar"
|
||||
nm = "${toolprefix}nm"
|
||||
|
||||
forward_variables_from(invoker, [ "strip" ])
|
||||
|
||||
toolchain_args = {
|
||||
if (defined(invoker.toolchain_args)) {
|
||||
forward_variables_from(invoker.toolchain_args, "*")
|
||||
}
|
||||
is_clang = true
|
||||
}
|
||||
}
|
||||
}
|
||||
235
samples/GN/icu.gn
Normal file
235
samples/GN/icu.gn
Normal file
@@ -0,0 +1,235 @@
|
||||
# Copyright 2016 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import("//build/config/linux/pkg_config.gni")
|
||||
import("//build/shim_headers.gni")
|
||||
|
||||
group("icu") {
|
||||
public_deps = [
|
||||
":icui18n",
|
||||
":icuuc",
|
||||
]
|
||||
}
|
||||
|
||||
config("icu_config") {
|
||||
defines = [
|
||||
"USING_SYSTEM_ICU=1",
|
||||
"ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC",
|
||||
]
|
||||
}
|
||||
|
||||
pkg_config("system_icui18n") {
|
||||
packages = [ "icu-i18n" ]
|
||||
}
|
||||
|
||||
pkg_config("system_icuuc") {
|
||||
packages = [ "icu-uc" ]
|
||||
}
|
||||
|
||||
source_set("icui18n") {
|
||||
deps = [
|
||||
":icui18n_shim",
|
||||
]
|
||||
public_configs = [
|
||||
":icu_config",
|
||||
":system_icui18n",
|
||||
]
|
||||
}
|
||||
|
||||
source_set("icuuc") {
|
||||
deps = [
|
||||
":icuuc_shim",
|
||||
]
|
||||
public_configs = [
|
||||
":icu_config",
|
||||
":system_icuuc",
|
||||
]
|
||||
}
|
||||
|
||||
shim_headers("icui18n_shim") {
|
||||
root_path = "source/i18n"
|
||||
headers = [
|
||||
# This list can easily be updated using the command below:
|
||||
# find third_party/icu/source/i18n/unicode \
|
||||
# -iname '*.h' -printf '"%p",\n' | \
|
||||
# sed -e 's|third_party/icu/i18n/common/||' | sort -u
|
||||
"unicode/alphaindex.h",
|
||||
"unicode/basictz.h",
|
||||
"unicode/calendar.h",
|
||||
"unicode/choicfmt.h",
|
||||
"unicode/coleitr.h",
|
||||
"unicode/coll.h",
|
||||
"unicode/compactdecimalformat.h",
|
||||
"unicode/curramt.h",
|
||||
"unicode/currpinf.h",
|
||||
"unicode/currunit.h",
|
||||
"unicode/datefmt.h",
|
||||
"unicode/dcfmtsym.h",
|
||||
"unicode/decimfmt.h",
|
||||
"unicode/dtfmtsym.h",
|
||||
"unicode/dtitvfmt.h",
|
||||
"unicode/dtitvinf.h",
|
||||
"unicode/dtptngen.h",
|
||||
"unicode/dtrule.h",
|
||||
"unicode/fieldpos.h",
|
||||
"unicode/fmtable.h",
|
||||
"unicode/format.h",
|
||||
"unicode/fpositer.h",
|
||||
"unicode/gender.h",
|
||||
"unicode/gregocal.h",
|
||||
"unicode/locdspnm.h",
|
||||
"unicode/measfmt.h",
|
||||
"unicode/measunit.h",
|
||||
"unicode/measure.h",
|
||||
"unicode/msgfmt.h",
|
||||
"unicode/numfmt.h",
|
||||
"unicode/numsys.h",
|
||||
"unicode/plurfmt.h",
|
||||
"unicode/plurrule.h",
|
||||
"unicode/rbnf.h",
|
||||
"unicode/rbtz.h",
|
||||
"unicode/regex.h",
|
||||
"unicode/region.h",
|
||||
"unicode/reldatefmt.h",
|
||||
"unicode/scientificnumberformatter.h",
|
||||
"unicode/search.h",
|
||||
"unicode/selfmt.h",
|
||||
"unicode/simpletz.h",
|
||||
"unicode/smpdtfmt.h",
|
||||
"unicode/sortkey.h",
|
||||
"unicode/stsearch.h",
|
||||
"unicode/tblcoll.h",
|
||||
"unicode/timezone.h",
|
||||
"unicode/tmunit.h",
|
||||
"unicode/tmutamt.h",
|
||||
"unicode/tmutfmt.h",
|
||||
"unicode/translit.h",
|
||||
"unicode/tzfmt.h",
|
||||
"unicode/tznames.h",
|
||||
"unicode/tzrule.h",
|
||||
"unicode/tztrans.h",
|
||||
"unicode/ucal.h",
|
||||
"unicode/ucol.h",
|
||||
"unicode/ucoleitr.h",
|
||||
"unicode/ucsdet.h",
|
||||
"unicode/ucurr.h",
|
||||
"unicode/udat.h",
|
||||
"unicode/udateintervalformat.h",
|
||||
"unicode/udatpg.h",
|
||||
"unicode/udisplaycontext.h",
|
||||
"unicode/ufieldpositer.h",
|
||||
"unicode/uformattable.h",
|
||||
"unicode/ugender.h",
|
||||
"unicode/uldnames.h",
|
||||
"unicode/ulocdata.h",
|
||||
"unicode/umsg.h",
|
||||
"unicode/unirepl.h",
|
||||
"unicode/unum.h",
|
||||
"unicode/unumsys.h",
|
||||
"unicode/upluralrules.h",
|
||||
"unicode/uregex.h",
|
||||
"unicode/uregion.h",
|
||||
"unicode/usearch.h",
|
||||
"unicode/uspoof.h",
|
||||
"unicode/utmscale.h",
|
||||
"unicode/utrans.h",
|
||||
"unicode/vtzone.h",
|
||||
]
|
||||
}
|
||||
|
||||
shim_headers("icuuc_shim") {
|
||||
root_path = "source/common"
|
||||
headers = [
|
||||
# This list can easily be updated using the command below:
|
||||
# find third_party/icu/source/common/unicode \
|
||||
# -iname '*.h' -printf '"%p",\n' | \
|
||||
# sed -e 's|third_party/icu/source/common/||' | sort -u
|
||||
"unicode/appendable.h",
|
||||
"unicode/brkiter.h",
|
||||
"unicode/bytestream.h",
|
||||
"unicode/bytestrie.h",
|
||||
"unicode/bytestriebuilder.h",
|
||||
"unicode/caniter.h",
|
||||
"unicode/chariter.h",
|
||||
"unicode/dbbi.h",
|
||||
"unicode/docmain.h",
|
||||
"unicode/dtintrv.h",
|
||||
"unicode/enumset.h",
|
||||
"unicode/errorcode.h",
|
||||
"unicode/filteredbrk.h",
|
||||
"unicode/icudataver.h",
|
||||
"unicode/icuplug.h",
|
||||
"unicode/idna.h",
|
||||
"unicode/listformatter.h",
|
||||
"unicode/localpointer.h",
|
||||
"unicode/locid.h",
|
||||
"unicode/messagepattern.h",
|
||||
"unicode/normalizer2.h",
|
||||
"unicode/normlzr.h",
|
||||
"unicode/parseerr.h",
|
||||
"unicode/parsepos.h",
|
||||
"unicode/platform.h",
|
||||
"unicode/ptypes.h",
|
||||
"unicode/putil.h",
|
||||
"unicode/rbbi.h",
|
||||
"unicode/rep.h",
|
||||
"unicode/resbund.h",
|
||||
"unicode/schriter.h",
|
||||
"unicode/std_string.h",
|
||||
"unicode/strenum.h",
|
||||
"unicode/stringpiece.h",
|
||||
"unicode/stringtriebuilder.h",
|
||||
"unicode/symtable.h",
|
||||
"unicode/ubidi.h",
|
||||
"unicode/ubrk.h",
|
||||
"unicode/ucasemap.h",
|
||||
"unicode/ucat.h",
|
||||
"unicode/uchar.h",
|
||||
"unicode/ucharstrie.h",
|
||||
"unicode/ucharstriebuilder.h",
|
||||
"unicode/uchriter.h",
|
||||
"unicode/uclean.h",
|
||||
"unicode/ucnv.h",
|
||||
"unicode/ucnv_cb.h",
|
||||
"unicode/ucnv_err.h",
|
||||
"unicode/ucnvsel.h",
|
||||
"unicode/uconfig.h",
|
||||
"unicode/udata.h",
|
||||
"unicode/uenum.h",
|
||||
"unicode/uidna.h",
|
||||
"unicode/uiter.h",
|
||||
"unicode/ulistformatter.h",
|
||||
"unicode/uloc.h",
|
||||
"unicode/umachine.h",
|
||||
"unicode/umisc.h",
|
||||
"unicode/unifilt.h",
|
||||
"unicode/unifunct.h",
|
||||
"unicode/unimatch.h",
|
||||
"unicode/uniset.h",
|
||||
"unicode/unistr.h",
|
||||
"unicode/unorm.h",
|
||||
"unicode/unorm2.h",
|
||||
"unicode/uobject.h",
|
||||
"unicode/urename.h",
|
||||
"unicode/urep.h",
|
||||
"unicode/ures.h",
|
||||
"unicode/uscript.h",
|
||||
"unicode/uset.h",
|
||||
"unicode/usetiter.h",
|
||||
"unicode/ushape.h",
|
||||
"unicode/usprep.h",
|
||||
"unicode/ustring.h",
|
||||
"unicode/ustringtrie.h",
|
||||
"unicode/utext.h",
|
||||
"unicode/utf.h",
|
||||
"unicode/utf16.h",
|
||||
"unicode/utf32.h",
|
||||
"unicode/utf8.h",
|
||||
"unicode/utf_old.h",
|
||||
"unicode/utrace.h",
|
||||
"unicode/utypes.h",
|
||||
"unicode/uvernum.h",
|
||||
"unicode/uversion.h",
|
||||
]
|
||||
}
|
||||
2788
samples/GN/internal_rules.gni
Normal file
2788
samples/GN/internal_rules.gni
Normal file
File diff suppressed because it is too large
Load Diff
1422
samples/GN/ios-rules.gni
Normal file
1422
samples/GN/ios-rules.gni
Normal file
File diff suppressed because it is too large
Load Diff
193
samples/GN/isolate.gni
Normal file
193
samples/GN/isolate.gni
Normal file
@@ -0,0 +1,193 @@
|
||||
# Copyright 2016 the V8 project authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
import("//build/config/sanitizers/sanitizers.gni")
|
||||
import("//third_party/icu/config.gni")
|
||||
import("v8.gni")
|
||||
|
||||
declare_args() {
|
||||
# Sets the test isolation mode (noop|prepare|check).
|
||||
v8_test_isolation_mode = "noop"
|
||||
}
|
||||
|
||||
template("v8_isolate_run") {
|
||||
forward_variables_from(invoker,
|
||||
"*",
|
||||
[
|
||||
"deps",
|
||||
"isolate",
|
||||
])
|
||||
|
||||
# Remember target name as within the action scope the target name will be
|
||||
# different.
|
||||
name = target_name
|
||||
|
||||
assert(defined(invoker.deps))
|
||||
assert(defined(invoker.isolate))
|
||||
|
||||
if (name != "" && v8_test_isolation_mode != "noop") {
|
||||
action(name + "_run") {
|
||||
testonly = true
|
||||
|
||||
deps = invoker.deps
|
||||
|
||||
script = "//tools/isolate_driver.py"
|
||||
|
||||
sources = [
|
||||
invoker.isolate,
|
||||
]
|
||||
|
||||
inputs = [
|
||||
# Files that are known to be involved in this step.
|
||||
"//tools/swarming_client/isolate.py",
|
||||
"//tools/swarming_client/run_isolated.py",
|
||||
]
|
||||
|
||||
if (v8_test_isolation_mode == "prepare") {
|
||||
outputs = [
|
||||
"$root_out_dir/$name.isolated.gen.json",
|
||||
]
|
||||
} else if (v8_test_isolation_mode == "check") {
|
||||
outputs = [
|
||||
"$root_out_dir/$name.isolated",
|
||||
"$root_out_dir/$name.isolated.state",
|
||||
]
|
||||
}
|
||||
|
||||
# Translate gn to gyp variables.
|
||||
if (is_asan) {
|
||||
asan = "1"
|
||||
} else {
|
||||
asan = "0"
|
||||
}
|
||||
if (is_msan) {
|
||||
msan = "1"
|
||||
} else {
|
||||
msan = "0"
|
||||
}
|
||||
if (is_tsan) {
|
||||
tsan = "1"
|
||||
} else {
|
||||
tsan = "0"
|
||||
}
|
||||
if (is_cfi) {
|
||||
cfi_vptr = "1"
|
||||
} else {
|
||||
cfi_vptr = "0"
|
||||
}
|
||||
if (target_cpu == "x86") {
|
||||
target_arch = "ia32"
|
||||
} else {
|
||||
target_arch = target_cpu
|
||||
}
|
||||
if (is_debug) {
|
||||
configuration_name = "Debug"
|
||||
} else {
|
||||
configuration_name = "Release"
|
||||
}
|
||||
if (is_component_build) {
|
||||
component = "shared_library"
|
||||
} else {
|
||||
component = "static_library"
|
||||
}
|
||||
if (icu_use_data_file) {
|
||||
icu_use_data_file_flag = "1"
|
||||
} else {
|
||||
icu_use_data_file_flag = "0"
|
||||
}
|
||||
if (v8_enable_inspector) {
|
||||
enable_inspector = "1"
|
||||
} else {
|
||||
enable_inspector = "0"
|
||||
}
|
||||
if (v8_use_external_startup_data) {
|
||||
use_external_startup_data = "1"
|
||||
} else {
|
||||
use_external_startup_data = "0"
|
||||
}
|
||||
if (v8_use_snapshot) {
|
||||
use_snapshot = "true"
|
||||
} else {
|
||||
use_snapshot = "false"
|
||||
}
|
||||
if (v8_has_valgrind) {
|
||||
has_valgrind = "1"
|
||||
} else {
|
||||
has_valgrind = "0"
|
||||
}
|
||||
if (v8_gcmole) {
|
||||
gcmole = "1"
|
||||
} else {
|
||||
gcmole = "0"
|
||||
}
|
||||
|
||||
# Note, all paths will be rebased in isolate_driver.py to be relative to
|
||||
# the isolate file.
|
||||
args = [
|
||||
v8_test_isolation_mode,
|
||||
"--isolated",
|
||||
rebase_path("$root_out_dir/$name.isolated", root_build_dir),
|
||||
"--isolate",
|
||||
rebase_path(invoker.isolate, root_build_dir),
|
||||
|
||||
# Path variables are used to replace file paths when loading a .isolate
|
||||
# file
|
||||
"--path-variable",
|
||||
"DEPTH",
|
||||
rebase_path("//", root_build_dir),
|
||||
"--path-variable",
|
||||
"PRODUCT_DIR",
|
||||
rebase_path(root_out_dir, root_build_dir),
|
||||
|
||||
# TODO(machenbach): Set variables for remaining features.
|
||||
"--config-variable",
|
||||
"CONFIGURATION_NAME=$configuration_name",
|
||||
"--config-variable",
|
||||
"OS=$target_os",
|
||||
"--config-variable",
|
||||
"asan=$asan",
|
||||
"--config-variable",
|
||||
"cfi_vptr=$cfi_vptr",
|
||||
"--config-variable",
|
||||
"gcmole=$gcmole",
|
||||
"--config-variable",
|
||||
"has_valgrind=$has_valgrind",
|
||||
"--config-variable",
|
||||
"icu_use_data_file_flag=$icu_use_data_file_flag",
|
||||
"--config-variable",
|
||||
"is_gn=1",
|
||||
"--config-variable",
|
||||
"msan=$msan",
|
||||
"--config-variable",
|
||||
"tsan=$tsan",
|
||||
"--config-variable",
|
||||
"coverage=0",
|
||||
"--config-variable",
|
||||
"sanitizer_coverage=0",
|
||||
"--config-variable",
|
||||
"component=$component",
|
||||
"--config-variable",
|
||||
"target_arch=$target_arch",
|
||||
"--config-variable",
|
||||
"v8_enable_inspector=$enable_inspector",
|
||||
"--config-variable",
|
||||
"v8_use_external_startup_data=$use_external_startup_data",
|
||||
"--config-variable",
|
||||
"v8_use_snapshot=$use_snapshot",
|
||||
]
|
||||
|
||||
if (is_win) {
|
||||
args += [
|
||||
"--config-variable",
|
||||
"msvs_version=2015",
|
||||
]
|
||||
} else {
|
||||
args += [
|
||||
"--config-variable",
|
||||
"msvs_version=0",
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
48
samples/HTML+Django/nunjucks.njk
Normal file
48
samples/HTML+Django/nunjucks.njk
Normal file
@@ -0,0 +1,48 @@
|
||||
{% from "forms.html" import label as description %}
|
||||
|
||||
|
||||
{% macro field(name, value='', type='text') %}
|
||||
<div class="field">
|
||||
<input type="{{ type }}" name="{{ name }}"
|
||||
value="{{ value | escape }}" />
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
<html>
|
||||
<head>
|
||||
{% extends "head.html" %}
|
||||
</head>
|
||||
<body>
|
||||
{% if horse %}
|
||||
Chuck Norris once kicked a horse in the chin. Its descendants are known today as Giraffes.
|
||||
{% elif optimus %}
|
||||
Chuck Norris once urinated in a semi truck's gas tank as a joke....that truck is now known as Optimus Prime.
|
||||
{% else %}
|
||||
Chuck Norris threw a grenade and killed 50 people, then the grenade exploded.
|
||||
{% endif %}
|
||||
|
||||
{% block left %}
|
||||
This is the left side!
|
||||
{% endblock %}
|
||||
|
||||
{% block right %}
|
||||
This is the right side!
|
||||
{% endblock %}
|
||||
|
||||
{{ description('Username') }}
|
||||
{{ field('user') }}
|
||||
{{ field('pass', type='password') }}
|
||||
|
||||
<h1>Posts</h1>
|
||||
<ul>
|
||||
{% for item in items %}
|
||||
<li>{{ item.title }}</li>
|
||||
{% else %}
|
||||
<li>This would display if the 'item' collection were empty</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
{# Don't escape foo #}
|
||||
{{ foo | safe }}
|
||||
</body>
|
||||
</html>
|
||||
6
samples/JSON5/filenames/.babelrc
Normal file
6
samples/JSON5/filenames/.babelrc
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"presets": [
|
||||
"es2015",
|
||||
"es2016"
|
||||
]
|
||||
}
|
||||
60
samples/Julia/julia
Normal file
60
samples/Julia/julia
Normal file
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env julia
|
||||
|
||||
# From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath
|
||||
help_screen = """
|
||||
usage: fullpath *[relative-paths] [-c]
|
||||
|
||||
Prints the fullpath of the paths
|
||||
If no paths are given as args, it will read them from stdin
|
||||
|
||||
If there is only one path, the trailing newline is omitted
|
||||
|
||||
The -c flag will copy the results into your pasteboard
|
||||
"""
|
||||
|
||||
help = false
|
||||
copy = false
|
||||
dir = pwd()
|
||||
paths = []
|
||||
|
||||
for arg = ARGS
|
||||
if arg == "-h" || arg == "--help"
|
||||
help = true
|
||||
elseif arg == "-c" || arg == "--copy"
|
||||
copy = true
|
||||
elseif arg != ""
|
||||
push!(paths, arg)
|
||||
end
|
||||
end
|
||||
|
||||
if help
|
||||
print(help_screen)
|
||||
exit()
|
||||
end
|
||||
|
||||
function notempty(string)
|
||||
return !isempty(string)
|
||||
end
|
||||
|
||||
if length(paths) == 0
|
||||
paths = filter(notempty, map(chomp, readlines()))
|
||||
end
|
||||
|
||||
function print_paths(stream, paths)
|
||||
if length(paths) == 1
|
||||
path = paths[1]
|
||||
print(stream, "$dir/$path")
|
||||
else
|
||||
for path = paths
|
||||
println(stream, "$dir/$path")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if copy
|
||||
read, write, process = readandwrite(`pbcopy`)
|
||||
print_paths(write, paths)
|
||||
close(write)
|
||||
end
|
||||
|
||||
print_paths(STDOUT, paths)
|
||||
47
samples/MQL4/header-sample.mqh
Normal file
47
samples/MQL4/header-sample.mqh
Normal file
@@ -0,0 +1,47 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| header-sample.mqh |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property strict
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
class CSomeObject
|
||||
{
|
||||
protected:
|
||||
int m_someproperty;
|
||||
private:
|
||||
bool SomeFunction() {return true;}
|
||||
public:
|
||||
CSomeObject(void): m_someproperty(0) {}
|
||||
~CSomeObject(void) {}
|
||||
void SetName(int n){m_someproperty=n;}// sets somepropery
|
||||
int GetName(){return(m_someproperty);} // returns someproperty
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
61
samples/MQL4/indicator-sample.mq4
Normal file
61
samples/MQL4/indicator-sample.mq4
Normal file
@@ -0,0 +1,61 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| indicator-sample.mq4 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnInit(void)
|
||||
{
|
||||
//---
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Bears Power |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
Print("The number of bars on the current chart: ",iBars(Symbol(),Period()));
|
||||
//---
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
51
samples/MQL4/script-sample.mq4
Normal file
51
samples/MQL4/script-sample.mq4
Normal file
@@ -0,0 +1,51 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| script-sample.mq4 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
#property script_show_inputs
|
||||
|
||||
input int StopLoss=100; //Stop Loss
|
||||
input int TakeProfit=100; //Take Profit
|
||||
//+------------------------------------------------------------------+
|
||||
//| Script program start function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnStart()
|
||||
{
|
||||
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
|
||||
Print("Minimum Stop Level=",minstoplevel," points");
|
||||
//---
|
||||
double sl=NormalizeDouble(Bid-StopLoss*Point,Digits);
|
||||
double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);
|
||||
//---
|
||||
int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,"Test",0,0,clrNONE);
|
||||
Print("Success? ",result);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
1390
samples/MQL5/Regex.mqh
Normal file
1390
samples/MQL5/Regex.mqh
Normal file
File diff suppressed because it is too large
Load Diff
64
samples/MQL5/indicator-sample.mq5
Normal file
64
samples/MQL5/indicator-sample.mq5
Normal file
@@ -0,0 +1,64 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| indicator-sample.mq5 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
|
||||
#property indicator_chart_window
|
||||
#property indicator_plots 0
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//---
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Custom indicator iteration function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
const datetime &time[],
|
||||
const double &open[],
|
||||
const double &high[],
|
||||
const double &low[],
|
||||
const double &close[],
|
||||
const long &tick_volume[],
|
||||
const long &volume[],
|
||||
const int &spread[])
|
||||
{
|
||||
//---
|
||||
int bars=Bars(Symbol(),0);
|
||||
Print("Bars = ",bars,", rates_total = ",rates_total,", prev_calculated = ",prev_calculated);
|
||||
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
|
||||
//--- return value of prev_calculated for next call
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
56
samples/MQL5/script-sample.mq5
Normal file
56
samples/MQL5/script-sample.mq5
Normal file
@@ -0,0 +1,56 @@
|
||||
//+------------------------------------------------------------------+
|
||||
//| script-sample.mq5 |
|
||||
//| Copyright 2016, Andrey Osorgin |
|
||||
//+------------------------------------------------------------------+
|
||||
//| The MIT License (MIT) |
|
||||
//| |
|
||||
//| Permission is hereby granted, free of charge, to any person |
|
||||
//| obtaining a copy of this software and associated documentation |
|
||||
//| files (the "Software"), to deal in the Software without |
|
||||
//| restriction, including without limitation the rights to use, |
|
||||
//| copy, modify, merge, publish, distribute, sublicense, and/or sell|
|
||||
//| copies of the Software, and to permit persons to whom the |
|
||||
//| Software is furnished to do so, subject to the following |
|
||||
//| conditions: |
|
||||
//| |
|
||||
//| The above copyright notice and this permission notice shall be |
|
||||
//| included in all copies or substantial portions of the Software. |
|
||||
//| |
|
||||
//| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
||||
//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
||||
//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
||||
//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
||||
//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
||||
//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
||||
//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
||||
//| OTHER DEALINGS IN THE SOFTWARE. |
|
||||
//| |
|
||||
//| A copy of the MIT License (MIT) is available at |
|
||||
//| https://opensource.org/licenses/MIT |
|
||||
//+------------------------------------------------------------------+
|
||||
#property version "1.00"
|
||||
#property script_show_inputs
|
||||
|
||||
#include <Trade\Trade.mqh>
|
||||
|
||||
input int StopLoss=100; // Stop Loss
|
||||
input int TakeProfit=100; // Take Profit
|
||||
//+------------------------------------------------------------------+
|
||||
//| Script program start function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnStart()
|
||||
{
|
||||
CTrade trade;
|
||||
//---
|
||||
long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
|
||||
Print("Minimum stop level is: ",stoplevel);
|
||||
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
|
||||
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
||||
double sl = NormalizeDouble(bid - StopLoss*Point(),Digits());
|
||||
double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits());
|
||||
//---
|
||||
bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,"test");
|
||||
//---
|
||||
Print("Success? ",result);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
134
samples/Makefile/file-icons.make
Normal file
134
samples/Makefile/file-icons.make
Normal file
@@ -0,0 +1,134 @@
|
||||
charmap := charmap.md
|
||||
font-name := file-icons
|
||||
font-folder := dist
|
||||
font-config := icomoon.json
|
||||
icon-size := 34
|
||||
icon-folder := svg
|
||||
repo-name := Alhadis/FileIcons
|
||||
svg := $(wildcard $(icon-folder)/*.svg)
|
||||
last-commit = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1)
|
||||
|
||||
|
||||
all: unpack $(font-folder)/$(font-name).woff2 charmap
|
||||
|
||||
|
||||
# Aliases
|
||||
unpack: $(font-folder)/$(font-name).ttf
|
||||
charmap: $(charmap)
|
||||
|
||||
|
||||
# Extract a downloaded IcoMoon folder
|
||||
$(font-folder)/%.ttf: %.zip
|
||||
@rm -rf $(font-folder) tmp $(font-config)
|
||||
@unzip -qd tmp $^
|
||||
@mv tmp/fonts $(font-folder)
|
||||
@mv tmp/selection.json $(font-config)
|
||||
@rm -rf tmp $^
|
||||
@perl -pi -e 's|^( {2})+|"\t" x (length($$&)/2)|ge' $(font-config)
|
||||
@echo "" >> $(font-config) # Ensure trailing newline
|
||||
@echo "Files extracted."
|
||||
|
||||
|
||||
# Generate a WOFF2 file from a TTF
|
||||
%.woff2: %.ttf
|
||||
@[ ! -f $@ ] && { \
|
||||
hash woff2_compress 2>/dev/null || { \
|
||||
echo >&2 "WOFF2 conversion tools not found. Consult the readme file."; \
|
||||
exit 2; \
|
||||
}; \
|
||||
woff2_compress $^ >/dev/null; \
|
||||
echo "WOFF2 file generated."; \
|
||||
};
|
||||
|
||||
|
||||
|
||||
# Clean up SVG source
|
||||
lint: $(svg)
|
||||
@perl -0777 -pi -e '\
|
||||
s/\r\n/\n/g; \
|
||||
s/<g id="icomoon-ignore">\s*<\/g>//gmi; \
|
||||
s/<g\s*>\s*<\/g>//gmi; \
|
||||
s/\s+(id|viewBox|xml:space)="[^"]*"/ /gmi; \
|
||||
s/<!DOCTYPE[^>]*>//gi; \
|
||||
s/<\?xml.*?\?>//gi; \
|
||||
s/<!--.*?-->//gm; \
|
||||
s/ style="enable-background:.*?;"//gmi; \
|
||||
s/"\s+>/">/g; \
|
||||
s/\x20{2,}/ /g; \
|
||||
s/[\t\n]+//gm;' $^
|
||||
|
||||
|
||||
|
||||
# Generate/update character map
|
||||
$(charmap):
|
||||
@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@
|
||||
|
||||
|
||||
|
||||
|
||||
# POSIX systems only: reattach hard links to File-Icons package
|
||||
relink:
|
||||
@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG)
|
||||
@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2)
|
||||
|
||||
|
||||
|
||||
# Force an icon's preview to be refreshed on GitHub
|
||||
cachebust:
|
||||
@$(call need-var,icon,ERROR_NO_ICON)
|
||||
@base="https://cdn.rawgit.com/Alhadis/FileIcons/"; \
|
||||
perl -pi -e 's{$$base\K\w+(?=/svg/$(icon:%.svg=%)\.svg")}{$(last-commit)}ig;' $(charmap)
|
||||
|
||||
|
||||
# Dummy task to improve feedback if `cachebust` is mistyped
|
||||
icon:
|
||||
$(call need-var,,ERROR_UNDEF_ICON)
|
||||
|
||||
|
||||
|
||||
# Reset unstaged changes/additions in object directories
|
||||
clean:
|
||||
@git clean -fd $(font-folder)
|
||||
@git checkout -- $(font-folder) 2>/dev/null || true
|
||||
|
||||
|
||||
# Delete extracted and generated files
|
||||
distclean:
|
||||
@rm -rf $(font-folder)
|
||||
|
||||
|
||||
.PHONY: clean distclean $(charmap) cachebust icon
|
||||
.ONESHELL:
|
||||
|
||||
|
||||
# Error message shown to users attempting to run `make relink` without a link
|
||||
ERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \
|
||||
| \
|
||||
| Try this instead:\
|
||||
| \
|
||||
| \ make relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation |
|
||||
|
||||
|
||||
# Error message shown when running `make cachebust` without an icon
|
||||
ERROR_NO_ICON := No icon specified. Task aborted.| \
|
||||
| Usage: \
|
||||
| \ make icon=file[.svg] cachebust \
|
||||
| \
|
||||
| Examples: \
|
||||
| \ make icon=Manpage cachebust \
|
||||
| \ make icon=APL.svg cachebust |
|
||||
|
||||
|
||||
# Shown if user tries running `make icon NAME cachebust` by mistake
|
||||
ERROR_UNDEF_ICON := No task named \"icon\". \
|
||||
| \
|
||||
| Did you mean this? \
|
||||
| \ make icon=NAME cachebust |
|
||||
|
||||
|
||||
|
||||
# If the given value is empty, die with an error message
|
||||
need = @$(if $(1),,echo $(subst | ,$$'\n',$(2)); exit 2)
|
||||
|
||||
# Like `need`, but uses variable names instead of string values
|
||||
need-var = @$(call need,$($(1)),$($(2)))
|
||||
413
samples/Objective-C/cocoa_monitor.m
Normal file
413
samples/Objective-C/cocoa_monitor.m
Normal file
@@ -0,0 +1,413 @@
|
||||
//========================================================================
|
||||
// GLFW 3.3 OS X - www.glfw.org
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||
#include <CoreVideo/CVBase.h>
|
||||
#include <CoreVideo/CVDisplayLink.h>
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
|
||||
// Get the name of the specified display
|
||||
//
|
||||
static char* getDisplayName(CGDirectDisplayID displayID)
|
||||
{
|
||||
char* name;
|
||||
CFDictionaryRef info, names;
|
||||
CFStringRef value;
|
||||
CFIndex size;
|
||||
|
||||
// NOTE: This uses a deprecated function because Apple has
|
||||
// (as of January 2015) not provided any alternative
|
||||
info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID),
|
||||
kIODisplayOnlyPreferredName);
|
||||
names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName));
|
||||
|
||||
if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"),
|
||||
(const void**) &value))
|
||||
{
|
||||
// This may happen if a desktop Mac is running headless
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||
"Cocoa: Failed to retrieve display name");
|
||||
|
||||
CFRelease(info);
|
||||
return strdup("Unknown");
|
||||
}
|
||||
|
||||
size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value),
|
||||
kCFStringEncodingUTF8);
|
||||
name = calloc(size + 1, 1);
|
||||
CFStringGetCString(value, name, size, kCFStringEncodingUTF8);
|
||||
|
||||
CFRelease(info);
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
// Check whether the display mode should be included in enumeration
|
||||
//
|
||||
static GLFWbool modeIsGood(CGDisplayModeRef mode)
|
||||
{
|
||||
uint32_t flags = CGDisplayModeGetIOFlags(mode);
|
||||
if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag))
|
||||
return GLFW_FALSE;
|
||||
|
||||
if (flags & kDisplayModeInterlacedFlag)
|
||||
return GLFW_FALSE;
|
||||
|
||||
if (flags & kDisplayModeStretchedFlag)
|
||||
return GLFW_FALSE;
|
||||
|
||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) &&
|
||||
CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0))
|
||||
{
|
||||
CFRelease(format);
|
||||
return GLFW_FALSE;
|
||||
}
|
||||
|
||||
CFRelease(format);
|
||||
return GLFW_TRUE;
|
||||
}
|
||||
|
||||
// Convert Core Graphics display mode to GLFW video mode
|
||||
//
|
||||
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode,
|
||||
CVDisplayLinkRef link)
|
||||
{
|
||||
GLFWvidmode result;
|
||||
result.width = (int) CGDisplayModeGetWidth(mode);
|
||||
result.height = (int) CGDisplayModeGetHeight(mode);
|
||||
result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode);
|
||||
|
||||
if (result.refreshRate == 0)
|
||||
{
|
||||
const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
|
||||
if (!(time.flags & kCVTimeIsIndefinite))
|
||||
result.refreshRate = (int) (time.timeScale / (double) time.timeValue);
|
||||
}
|
||||
|
||||
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode);
|
||||
|
||||
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0)
|
||||
{
|
||||
result.redBits = 5;
|
||||
result.greenBits = 5;
|
||||
result.blueBits = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.redBits = 8;
|
||||
result.greenBits = 8;
|
||||
result.blueBits = 8;
|
||||
}
|
||||
|
||||
CFRelease(format);
|
||||
return result;
|
||||
}
|
||||
|
||||
// Starts reservation for display fading
|
||||
//
|
||||
static CGDisplayFadeReservationToken beginFadeReservation(void)
|
||||
{
|
||||
CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken;
|
||||
|
||||
if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess)
|
||||
CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
// Ends reservation for display fading
|
||||
//
|
||||
static void endFadeReservation(CGDisplayFadeReservationToken token)
|
||||
{
|
||||
if (token != kCGDisplayFadeReservationInvalidToken)
|
||||
{
|
||||
CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
|
||||
CGReleaseDisplayFadeReservation(token);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW internal API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Change the current video mode
|
||||
//
|
||||
GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired)
|
||||
{
|
||||
CFArrayRef modes;
|
||||
CFIndex count, i;
|
||||
CVDisplayLinkRef link;
|
||||
CGDisplayModeRef native = NULL;
|
||||
GLFWvidmode current;
|
||||
const GLFWvidmode* best;
|
||||
|
||||
best = _glfwChooseVideoMode(monitor, desired);
|
||||
_glfwPlatformGetVideoMode(monitor, ¤t);
|
||||
if (_glfwCompareVideoModes(¤t, best) == 0)
|
||||
return GLFW_TRUE;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||
count = CFArrayGetCount(modes);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||
if (!modeIsGood(dm))
|
||||
continue;
|
||||
|
||||
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||
if (_glfwCompareVideoModes(best, &mode) == 0)
|
||||
{
|
||||
native = dm;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (native)
|
||||
{
|
||||
if (monitor->ns.previousMode == NULL)
|
||||
monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
||||
|
||||
CGDisplayFadeReservationToken token = beginFadeReservation();
|
||||
CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL);
|
||||
endFadeReservation(token);
|
||||
}
|
||||
|
||||
CFRelease(modes);
|
||||
CVDisplayLinkRelease(link);
|
||||
|
||||
if (!native)
|
||||
{
|
||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||
"Cocoa: Monitor mode list changed");
|
||||
return GLFW_FALSE;
|
||||
}
|
||||
|
||||
return GLFW_TRUE;
|
||||
}
|
||||
|
||||
// Restore the previously saved (original) video mode
|
||||
//
|
||||
void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor)
|
||||
{
|
||||
if (monitor->ns.previousMode)
|
||||
{
|
||||
CGDisplayFadeReservationToken token = beginFadeReservation();
|
||||
CGDisplaySetDisplayMode(monitor->ns.displayID,
|
||||
monitor->ns.previousMode, NULL);
|
||||
endFadeReservation(token);
|
||||
|
||||
CGDisplayModeRelease(monitor->ns.previousMode);
|
||||
monitor->ns.previousMode = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW platform API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
_GLFWmonitor** _glfwPlatformGetMonitors(int* count)
|
||||
{
|
||||
uint32_t i, found = 0, displayCount;
|
||||
_GLFWmonitor** monitors;
|
||||
CGDirectDisplayID* displays;
|
||||
|
||||
*count = 0;
|
||||
|
||||
CGGetOnlineDisplayList(0, NULL, &displayCount);
|
||||
displays = calloc(displayCount, sizeof(CGDirectDisplayID));
|
||||
monitors = calloc(displayCount, sizeof(_GLFWmonitor*));
|
||||
|
||||
CGGetOnlineDisplayList(displayCount, displays, &displayCount);
|
||||
|
||||
for (i = 0; i < displayCount; i++)
|
||||
{
|
||||
_GLFWmonitor* monitor;
|
||||
|
||||
if (CGDisplayIsAsleep(displays[i]))
|
||||
continue;
|
||||
|
||||
const CGSize size = CGDisplayScreenSize(displays[i]);
|
||||
char* name = getDisplayName(displays[i]);
|
||||
|
||||
monitor = _glfwAllocMonitor(name, size.width, size.height);
|
||||
monitor->ns.displayID = displays[i];
|
||||
monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]);
|
||||
|
||||
free(name);
|
||||
|
||||
found++;
|
||||
monitors[found - 1] = monitor;
|
||||
}
|
||||
|
||||
free(displays);
|
||||
|
||||
*count = found;
|
||||
return monitors;
|
||||
}
|
||||
|
||||
GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second)
|
||||
{
|
||||
// HACK: Compare unit numbers instead of display IDs to work around display
|
||||
// replacement on machines with automatic graphics switching
|
||||
return first->ns.unitNumber == second->ns.unitNumber;
|
||||
}
|
||||
|
||||
void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
|
||||
{
|
||||
const CGRect bounds = CGDisplayBounds(monitor->ns.displayID);
|
||||
|
||||
if (xpos)
|
||||
*xpos = (int) bounds.origin.x;
|
||||
if (ypos)
|
||||
*ypos = (int) bounds.origin.y;
|
||||
}
|
||||
|
||||
GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count)
|
||||
{
|
||||
CFArrayRef modes;
|
||||
CFIndex found, i, j;
|
||||
GLFWvidmode* result;
|
||||
CVDisplayLinkRef link;
|
||||
|
||||
*count = 0;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
|
||||
found = CFArrayGetCount(modes);
|
||||
result = calloc(found, sizeof(GLFWvidmode));
|
||||
|
||||
for (i = 0; i < found; i++)
|
||||
{
|
||||
CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
|
||||
if (!modeIsGood(dm))
|
||||
continue;
|
||||
|
||||
const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link);
|
||||
|
||||
for (j = 0; j < *count; j++)
|
||||
{
|
||||
if (_glfwCompareVideoModes(result + j, &mode) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
// Skip duplicate modes
|
||||
if (i < *count)
|
||||
continue;
|
||||
|
||||
(*count)++;
|
||||
result[*count - 1] = mode;
|
||||
}
|
||||
|
||||
CFRelease(modes);
|
||||
CVDisplayLinkRelease(link);
|
||||
return result;
|
||||
}
|
||||
|
||||
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode)
|
||||
{
|
||||
CGDisplayModeRef displayMode;
|
||||
CVDisplayLinkRef link;
|
||||
|
||||
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link);
|
||||
|
||||
displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID);
|
||||
*mode = vidmodeFromCGDisplayMode(displayMode, link);
|
||||
CGDisplayModeRelease(displayMode);
|
||||
|
||||
CVDisplayLinkRelease(link);
|
||||
}
|
||||
|
||||
void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
|
||||
{
|
||||
uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID);
|
||||
CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue));
|
||||
|
||||
CGGetDisplayTransferByTable(monitor->ns.displayID,
|
||||
size,
|
||||
values,
|
||||
values + size,
|
||||
values + size * 2,
|
||||
&size);
|
||||
|
||||
_glfwAllocGammaArrays(ramp, size);
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
ramp->red[i] = (unsigned short) (values[i] * 65535);
|
||||
ramp->green[i] = (unsigned short) (values[i + size] * 65535);
|
||||
ramp->blue[i] = (unsigned short) (values[i + size * 2] * 65535);
|
||||
}
|
||||
|
||||
free(values);
|
||||
}
|
||||
|
||||
void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
|
||||
{
|
||||
int i;
|
||||
CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue));
|
||||
|
||||
for (i = 0; i < ramp->size; i++)
|
||||
{
|
||||
values[i] = ramp->red[i] / 65535.f;
|
||||
values[i + ramp->size] = ramp->green[i] / 65535.f;
|
||||
values[i + ramp->size * 2] = ramp->blue[i] / 65535.f;
|
||||
}
|
||||
|
||||
CGSetDisplayTransferByTable(monitor->ns.displayID,
|
||||
ramp->size,
|
||||
values,
|
||||
values + ramp->size,
|
||||
values + ramp->size * 2);
|
||||
|
||||
free(values);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
////// GLFW native API //////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle)
|
||||
{
|
||||
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay);
|
||||
return monitor->ns.displayID;
|
||||
}
|
||||
|
||||
93
samples/PHP/ThriftGenerated.php
Normal file
93
samples/PHP/ThriftGenerated.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
namespace github\com;
|
||||
|
||||
/**
|
||||
* Autogenerated by Thrift Compiler (0.9.3)
|
||||
*
|
||||
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||
* @generated
|
||||
*/
|
||||
use Thrift\Base\TBase;
|
||||
use Thrift\Type\TType;
|
||||
use Thrift\Type\TMessageType;
|
||||
use Thrift\Exception\TException;
|
||||
use Thrift\Exception\TProtocolException;
|
||||
use Thrift\Protocol\TProtocol;
|
||||
use Thrift\Protocol\TBinaryProtocolAccelerated;
|
||||
use Thrift\Exception\TApplicationException;
|
||||
|
||||
|
||||
class PullRequest {
|
||||
static $_TSPEC;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $title = null;
|
||||
|
||||
public function __construct($vals=null) {
|
||||
if (!isset(self::$_TSPEC)) {
|
||||
self::$_TSPEC = array(
|
||||
1 => array(
|
||||
'var' => 'title',
|
||||
'type' => TType::STRING,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (is_array($vals)) {
|
||||
if (isset($vals['title'])) {
|
||||
$this->title = $vals['title'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getName() {
|
||||
return 'PullRequest';
|
||||
}
|
||||
|
||||
public function read($input)
|
||||
{
|
||||
$xfer = 0;
|
||||
$fname = null;
|
||||
$ftype = 0;
|
||||
$fid = 0;
|
||||
$xfer += $input->readStructBegin($fname);
|
||||
while (true)
|
||||
{
|
||||
$xfer += $input->readFieldBegin($fname, $ftype, $fid);
|
||||
if ($ftype == TType::STOP) {
|
||||
break;
|
||||
}
|
||||
switch ($fid)
|
||||
{
|
||||
case 1:
|
||||
if ($ftype == TType::STRING) {
|
||||
$xfer += $input->readString($this->title);
|
||||
} else {
|
||||
$xfer += $input->skip($ftype);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$xfer += $input->skip($ftype);
|
||||
break;
|
||||
}
|
||||
$xfer += $input->readFieldEnd();
|
||||
}
|
||||
$xfer += $input->readStructEnd();
|
||||
return $xfer;
|
||||
}
|
||||
|
||||
public function write($output) {
|
||||
$xfer = 0;
|
||||
$xfer += $output->writeStructBegin('PullRequest');
|
||||
if ($this->title !== null) {
|
||||
$xfer += $output->writeFieldBegin('title', TType::STRING, 1);
|
||||
$xfer += $output->writeString($this->title);
|
||||
$xfer += $output->writeFieldEnd();
|
||||
}
|
||||
$xfer += $output->writeFieldStop();
|
||||
$xfer += $output->writeStructEnd();
|
||||
return $xfer;
|
||||
}
|
||||
|
||||
}
|
||||
37
samples/PHP/filenames/.php_cs
Normal file
37
samples/PHP/filenames/.php_cs
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
$header = <<<'EOF'
|
||||
This file is part of PHP CS Fixer.
|
||||
|
||||
(c) Fabien Potencier <fabien@symfony.com>
|
||||
Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
|
||||
This source file is subject to the MIT license that is bundled
|
||||
with this source code in the file LICENSE.
|
||||
EOF;
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRiskyAllowed(true)
|
||||
->setRules(array(
|
||||
'@Symfony' => true,
|
||||
'@Symfony:risky' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'header_comment' => array('header' => $header),
|
||||
'array_syntax' => array('syntax' => 'long'),
|
||||
'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'),
|
||||
'no_useless_else' => true,
|
||||
'no_useless_return' => true,
|
||||
'ordered_class_elements' => true,
|
||||
'ordered_imports' => true,
|
||||
'php_unit_strict' => true,
|
||||
'phpdoc_add_missing_param_annotation' => true,
|
||||
'psr4' => true,
|
||||
'strict_comparison' => true,
|
||||
'strict_param' => true,
|
||||
))
|
||||
->setFinder(
|
||||
PhpCsFixer\Finder::create()
|
||||
->exclude('tests/Fixtures')
|
||||
->in(__DIR__)
|
||||
)
|
||||
;
|
||||
37
samples/PHP/filenames/.php_cs.dist
Normal file
37
samples/PHP/filenames/.php_cs.dist
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
$header = <<<'EOF'
|
||||
This file is part of PHP CS Fixer.
|
||||
|
||||
(c) Fabien Potencier <fabien@symfony.com>
|
||||
Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
|
||||
This source file is subject to the MIT license that is bundled
|
||||
with this source code in the file LICENSE.
|
||||
EOF;
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRiskyAllowed(true)
|
||||
->setRules(array(
|
||||
'@Symfony' => true,
|
||||
'@Symfony:risky' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'header_comment' => array('header' => $header),
|
||||
'array_syntax' => array('syntax' => 'long'),
|
||||
'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'),
|
||||
'no_useless_else' => true,
|
||||
'no_useless_return' => true,
|
||||
'ordered_class_elements' => true,
|
||||
'ordered_imports' => true,
|
||||
'php_unit_strict' => true,
|
||||
'phpdoc_add_missing_param_annotation' => true,
|
||||
'psr4' => true,
|
||||
'strict_comparison' => true,
|
||||
'strict_param' => true,
|
||||
))
|
||||
->setFinder(
|
||||
PhpCsFixer\Finder::create()
|
||||
->exclude('tests/Fixtures')
|
||||
->in(__DIR__)
|
||||
)
|
||||
;
|
||||
13
samples/Pic/dextroamphetamine.chem
Normal file
13
samples/Pic/dextroamphetamine.chem
Normal file
@@ -0,0 +1,13 @@
|
||||
# Dextroamphetamine molecule
|
||||
.cstart
|
||||
.ps 26
|
||||
size 28
|
||||
R1:
|
||||
ring double 1,2 3,4 5,6
|
||||
bond 60 from R1.V2
|
||||
bond 120
|
||||
A1:
|
||||
front bond down ; CH3
|
||||
bond 60 from A1 ; NH2
|
||||
.ps
|
||||
.cend
|
||||
25
samples/Pic/graph.pic
Normal file
25
samples/Pic/graph.pic
Normal file
@@ -0,0 +1,25 @@
|
||||
.PS
|
||||
ellipse "Pic" "example"
|
||||
arrow
|
||||
box "This is" "a box"
|
||||
arrow right
|
||||
box "Another" "box" dashed
|
||||
move down then right;
|
||||
Thing: ellipse "This is a" "circle-thing"
|
||||
arrow <-> from last box.r to Thing.l
|
||||
move down then left;
|
||||
B: box "Still a box"
|
||||
arrow from Thing.l to B.r
|
||||
sprintf("Width = %g, Height = %g ", B.wid, B.ht) rjust at B.w
|
||||
move down
|
||||
.ps 15
|
||||
define sadness {
|
||||
boxwid = 3;
|
||||
boxht = 1;
|
||||
textht = .5;
|
||||
box "\"I run from my depression by" " " "burying myself in code\""
|
||||
arrow down from last box.s
|
||||
"Me"
|
||||
}
|
||||
sadness();
|
||||
.PE
|
||||
15
samples/Pic/ritalin.chem
Normal file
15
samples/Pic/ritalin.chem
Normal file
@@ -0,0 +1,15 @@
|
||||
.\" RITALIN: Methylphenidate Hydrochloride
|
||||
.cstart
|
||||
.ps 15
|
||||
size 15
|
||||
R1: ring double 1,2 3,4 5,6 pointing up
|
||||
bond 60 length .35 from R1.V2 ; BP
|
||||
bond 120 length .35 from BP
|
||||
R2: ring pointing up put N at 1
|
||||
H above R2
|
||||
bond up length .35 from BP ; BP
|
||||
bond -60 length .35 from BP ; O
|
||||
bond up
|
||||
double bond 60 length .35 from BP ; O
|
||||
.ps 10
|
||||
.cend
|
||||
9
samples/Python/filenames/.gclient
Normal file
9
samples/Python/filenames/.gclient
Normal file
@@ -0,0 +1,9 @@
|
||||
solutions = [
|
||||
{
|
||||
"url": "https://chromium.googlesource.com/v8/v8.git",
|
||||
"managed": False,
|
||||
"name": "v8",
|
||||
"deps_file": "DEPS",
|
||||
"custom_deps": {},
|
||||
},
|
||||
]
|
||||
20
samples/Python/py3.py3
Normal file
20
samples/Python/py3.py3
Normal file
@@ -0,0 +1,20 @@
|
||||
import random
|
||||
|
||||
guesses = 0
|
||||
|
||||
number = random.randint(1, 20)
|
||||
|
||||
print("Guess the number between 1 and 20! You have 6 tries.")
|
||||
while guesses < 6:
|
||||
guess = int(input("Is it... "))
|
||||
|
||||
if guess == number:
|
||||
print("Hooray! You guessed it right!")
|
||||
break
|
||||
elif guess < number:
|
||||
print("It's bigger...")
|
||||
elif guess > number:
|
||||
print("It's not so big.")
|
||||
guesses += 1
|
||||
if guesses == 6:
|
||||
print("You've ran out of tries.")
|
||||
22
samples/Python/spec.linux.spec
Normal file
22
samples/Python/spec.linux.spec
Normal file
@@ -0,0 +1,22 @@
|
||||
a = Analysis(['portablizer.pyqt4.py'],
|
||||
hiddenimports=[],
|
||||
hookspath=None,
|
||||
runtime_hooks=None)
|
||||
pyz = PYZ(a.pure)
|
||||
exe = EXE(pyz,
|
||||
a.scripts,
|
||||
exclude_binaries=True,
|
||||
name='Portablizer',
|
||||
debug=False,
|
||||
strip=None,
|
||||
upx=True,
|
||||
console=False)
|
||||
node = Tree('node', prefix='node')
|
||||
collect = COLLECT(exe,
|
||||
a.binaries,
|
||||
a.zipfiles,
|
||||
a.datas,
|
||||
node,
|
||||
strip=None,
|
||||
upx=True,
|
||||
name='Portablizer')
|
||||
1522
samples/Python/standalone.gypi
Normal file
1522
samples/Python/standalone.gypi
Normal file
File diff suppressed because it is too large
Load Diff
1420
samples/Python/toolchain.gypi
Normal file
1420
samples/Python/toolchain.gypi
Normal file
File diff suppressed because it is too large
Load Diff
673
samples/RPM Spec/apache.spec
Normal file
673
samples/RPM Spec/apache.spec
Normal file
@@ -0,0 +1,673 @@
|
||||
%define _prefix /usr/local
|
||||
%define _mandir /usr/local/man
|
||||
%define _sysconfdir /etc
|
||||
|
||||
%define apache_ver 1.3.42
|
||||
%define mod_ssl_ver 2.8.31
|
||||
%define mod_perl_ver 1.31
|
||||
%define libapreq_ver 1.34
|
||||
|
||||
|
||||
%define aname apache
|
||||
%define pname httpd13
|
||||
%define contentdir %{_var}/www
|
||||
%define suexec_caller apache
|
||||
|
||||
Summary: The 1.x Apache webserver (with static mod_perl, mod_ssl)
|
||||
Name: apache
|
||||
Version: %{apache_ver}
|
||||
Release: 4%{?dist}
|
||||
License: Apache Software License 2.0
|
||||
URL: http://httpd.apache.org/
|
||||
Group: System Environment/Daemons
|
||||
|
||||
Requires: initscripts >= 3.25
|
||||
Requires: openssl >= 0.9.6
|
||||
|
||||
BuildRequires: openssl-devel mm-devel krb5-devel pkgconfig
|
||||
BuildRequires: perl-ExtUtils-MakeMaker perl-libwww-perl perl-HTML-Parser perl-ExtUtils-Embed
|
||||
BuildRequires: gdbm-devel flex
|
||||
Requires: /sbin/chkconfig /bin/mktemp /usr/sbin/useradd
|
||||
Requires: findutils procps
|
||||
|
||||
Provides: webserver
|
||||
Provides: mod_perl = %{mod_perl_ver}
|
||||
Provides: perl(mod_perl) = %{mod_perl_ver}
|
||||
Provides: mod_ssl = %{mod_ssl_ver}
|
||||
Provides: apache = %{apache_ver}
|
||||
|
||||
Source0: http://httpd.apache.org/dist/apache_%{apache_ver}.tar.bz2
|
||||
Source1: http://www.modssl.org/source/mod_ssl-%{mod_ssl_ver}-%{apache_ver}.tar.gz
|
||||
Source2: http://perl.apache.org/dist/mod_perl-%{mod_perl_ver}.tar.gz
|
||||
Source3: httpd.init
|
||||
Source4: apache.logrotate
|
||||
Source5: SSL-Certificate-Creation
|
||||
Source6: ftp://ftp.cpan.org/authors/id/J/JO/JOESUF/libapreq-%{libapreq_ver}.tar.gz
|
||||
|
||||
Patch0: sslcfg.patch
|
||||
Patch1: apache_1.3.39-config.patch
|
||||
Patch3: apache_1.3.39-Makefile.patch
|
||||
Patch5: apache_1.3.20-apachectl-init.patch
|
||||
Patch11: mod_ssl-2.8.4-openssl.patch
|
||||
Patch12: apache_1.3.42-db.patch
|
||||
Patch13: apache-1.3.39-gcc44.patch
|
||||
Patch14: mod_ssl-2.8.31-STACK.patch
|
||||
Patch15: apache_1.3.39-ap_getline.patch
|
||||
Patch16: mod_ssl-openssl-x86_64.patch
|
||||
Patch17: mp1+perl5.14.diff
|
||||
Patch18: apache_1.3.42-64bits.patch
|
||||
|
||||
|
||||
%description
|
||||
This package contains a powerful, full-featured, efficient, and
|
||||
freely-available Web server based on work done by the Apache Software
|
||||
Foundation. It is also the most popular Web server on the Internet.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This package is a custom release containing the httpd server (v%{apache_ver})
|
||||
bundled with: mod_perl v.%{mod_ssl_ver},
|
||||
and mod_ssl v%{mod_ssl_ver}, all BUILT-IN.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
The Apache/Perl integration project brings together the full power
|
||||
of the Perl programming language and the Apache HTTP server.
|
||||
With mod_perl it is possible to write Apache modules entirely in Perl.
|
||||
In addition, the persistent interpreter embedded in the server avoids the
|
||||
overhead of starting an external interpreter and the penalty of Perl
|
||||
start-up time.
|
||||
Mod_SSL provides strong cryptography for the Apache 1.3 webserver
|
||||
via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security
|
||||
(TLSv1) protocols by the help of the Open Source SSL/TLS toolkit OpenSSL.
|
||||
|
||||
|
||||
%package devel
|
||||
Group: Development/Libraries
|
||||
Summary: Module development tools for apache-mod_ssl
|
||||
Provides: eapi = %{mod_ssl_ver}
|
||||
Requires: %{name} = %{version}
|
||||
Provides: mod_perl-devel = %{mod_perl_ver}
|
||||
Provides: mod_ssl-devel = %{mod_ssl_ver}
|
||||
Provides: apache-devel = %{apache_ver}
|
||||
|
||||
%description devel
|
||||
The apache-devel package contains the APXS binary and other files
|
||||
that you need to build Dynamic Shared Objects (DSOs) for Apache.
|
||||
If you are installing the Apache Web server and you want to be able
|
||||
to compile or develop additional modules for Apache, you need to install
|
||||
this package.
|
||||
|
||||
|
||||
%package manual
|
||||
Group: Documentation
|
||||
Summary: Documentation for the Apache Web server
|
||||
|
||||
%description manual
|
||||
The apache-manual package contains the complete manual and reference
|
||||
guide for the Apache Web server.
|
||||
It also contains the basic web content (icons, default welcome messages,
|
||||
etc) provided with Apache's HTTPD distribution.
|
||||
|
||||
|
||||
%prep
|
||||
%setup -q -c -T -n %{name}-%{version} -a 0
|
||||
%setup -q -c -T -D -n %{name}-%{version} -a 1
|
||||
%setup -q -c -T -D -n %{name}-%{version} -a 2
|
||||
%setup -q -c -T -D -n %{name}-%{version} -a 6
|
||||
|
||||
pushd %{aname}_%{apache_ver}
|
||||
%patch0 -p0 -b .sslcfg
|
||||
%patch1 -p1 -b .config
|
||||
%patch3 -p0 -b .make
|
||||
%patch5 -p1 -b .apachectl-init
|
||||
%ifarch x86_64
|
||||
%patch18 -p1 -b .apache-x86_64
|
||||
%endif
|
||||
|
||||
#patch12 -p1 -b .dbmdb
|
||||
%patch13 -p1 -b .compile
|
||||
%patch15 -p0 -b .ap_getline
|
||||
|
||||
|
||||
patch -p0 < ../libapreq-%{libapreq_ver}/patches/apache-1.3+apreq.patch
|
||||
cp ../libapreq-%{libapreq_ver}/c/*.[ch] src/lib/apreq/
|
||||
popd
|
||||
|
||||
pushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}
|
||||
%patch11 -p1 -b .openssl
|
||||
%patch14 -p0 -b .stack
|
||||
%ifarch x86_64
|
||||
%patch16 -p1 -b .openssl-x86_64
|
||||
%endif
|
||||
popd
|
||||
|
||||
pushd mod_perl-%{mod_perl_ver}
|
||||
%patch17 -p1 -b .mp1+perl5.14.diff
|
||||
popd
|
||||
|
||||
# Substitute values to match the configuration. The first two are
|
||||
# for the default httpd.conf file, the rest is for the mod_ssl
|
||||
# additions.
|
||||
pushd %{aname}_%{apache_ver}
|
||||
sed -e 's,@@ServerRoot@@,%{_sysconfdir}/%{pname},g' \
|
||||
-e 's,@@ContentRoot@@,%{contentdir},g' \
|
||||
-e 's,^DocumentRoot "@@ContentRoot@@",#DocumentRoot "%{_sysconfdir}/%{pname}/htdocs",g' \
|
||||
-e 's,^<Directory "@@ContentRoot@@/cgi-bin">,<Directory "%{contentdir}/cgi-bin">,g' \
|
||||
-e 's,^ServerName new.host.name,#ServerName new.host.name,g' \
|
||||
-e 's,^ServerAdmin you@your.address,#ServerAdmin you@your.address,g' \
|
||||
-e 's,^SSLCipherSuite,#SSLCipherSuite,g' \
|
||||
-e 's,^SSLLogLevel info,SSLLogLevel error,g' \
|
||||
-e 's,^SSLSessionCache dbm:logs/ssl_scache,SSLSessionCache shm:logs/ssl_scache(512000),g' \
|
||||
conf/httpd.conf-dist > conf/httpd.conf
|
||||
popd
|
||||
|
||||
cp %{SOURCE5} .
|
||||
|
||||
#cp %{_tmppath}/rpm-tmp* /tmp/01prep.sh
|
||||
|
||||
%build
|
||||
export CFLAGS="$RPM_OPT_FLAGS -fPIC $(pkg-config --cflags openssl)"
|
||||
export LIBS="-lpthread"
|
||||
export EAPI_MM=SYSTEM
|
||||
|
||||
###############################################
|
||||
echo mod_perl ...
|
||||
pushd mod_perl-%{mod_perl_ver}
|
||||
perl Makefile.PL CCFLAGS="$RPM_OPT_FLAGS -fPIC" \
|
||||
APACHE_SRC=../%{aname}_%{apache_ver}/src \
|
||||
DO_HTTPD=1 USE_APACI=1 PREP_HTTPD=1 EVERYTHING=1
|
||||
make %{?_smp_mflags}
|
||||
## put mod_perl docs in a safe place ;-]~
|
||||
mkdir mod_perl-doc
|
||||
cp -a eg/ faq/ mod_perl-doc/
|
||||
cp {CREDITS,LICENSE,README,SUPPORT,STATUS,Changes,INSTALL*} mod_perl-doc/
|
||||
cp *.{pod,html,gif} mod_perl-doc/
|
||||
find mod_perl-doc -type f -exec chmod 644 {} \;
|
||||
popd
|
||||
|
||||
###############################################
|
||||
echo mod_ssl ...
|
||||
export SSL_COMPAT=yes
|
||||
export SSL_EXPERIMENTAL=yes
|
||||
pushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}
|
||||
./configure --with-apache=../apache_%{apache_ver} \
|
||||
--with-mm=SYSTEM --force
|
||||
popd
|
||||
|
||||
###############################################
|
||||
echo apache ...
|
||||
pushd %{aname}_%{apache_ver}
|
||||
./configure \
|
||||
--prefix=%{_prefix} \
|
||||
--exec-prefix=%{_prefix} \
|
||||
--bindir=%{_bindir} \
|
||||
--sbindir=%{_sbindir} \
|
||||
--mandir=%{_mandir} \
|
||||
--sysconfdir=%{_sysconfdir}/%{pname}/conf \
|
||||
--libexecdir=%{_libdir}/apache \
|
||||
--datadir=%{contentdir} \
|
||||
--iconsdir=%{contentdir}/icons \
|
||||
--htdocsdir=%{contentdir}/html \
|
||||
--manualdir=%{contentdir}/html/manual \
|
||||
--cgidir=%{contentdir}/cgi-bin \
|
||||
--localstatedir=%{_localstatedir} \
|
||||
--runtimedir=%{_sysconfdir}/%{pname}/run \
|
||||
--logfiledir=logs \
|
||||
--proxycachedir=%{_localstatedir}/cache/%{pname} \
|
||||
--with-perl=%{__perl} \
|
||||
--enable-rule=EAPI \
|
||||
--enable-rule=SSL_COMPAT \
|
||||
--enable-rule=SSL_EXPERIMENTAL \
|
||||
--disable-rule=SSL_VENDOR \
|
||||
--disable-rule=WANTHSREGEX \
|
||||
--disable-rule=EXPAT \
|
||||
%{?_with_backtrace:--activate-module=src/modules/experimental/mod_backtrace.c} \
|
||||
%{?_with_whatkilledus:--activate-module=src/modules/experimental/mod_whatkilledus.c} \
|
||||
--activate-module=src/modules/perl/libperl.a \
|
||||
--enable-module=auth_dbm \
|
||||
--enable-module=ssl \
|
||||
--enable-module=all \
|
||||
--enable-shared=max \
|
||||
--disable-shared=perl \
|
||||
--disable-shared=ssl \
|
||||
--disable-module=example \
|
||||
--disable-module=auth_db \
|
||||
--without-execstrip \
|
||||
%{?_with_suexec:--enable-suexec --suexec-docroot=%{contentdir}} \
|
||||
%{?_with_suexec:--suexec-uidmin=300 --suexec-gidmin=300} \
|
||||
%{?_with_suexec:--suexec-umask=022 --suexec-caller=%{suexec_caller}}
|
||||
|
||||
make %{?_smp_mflags}
|
||||
|
||||
popd
|
||||
#cp %{_tmppath}/rpm-tmp* /tmp/02build.sh
|
||||
|
||||
%install
|
||||
###############################################################################
|
||||
### install basic apache stuff
|
||||
pushd apache_%{apache_ver}
|
||||
make install root="$RPM_BUILD_ROOT"
|
||||
popd
|
||||
|
||||
### rename
|
||||
mv $RPM_BUILD_ROOT%{_sbindir}/httpd $RPM_BUILD_ROOT%{_sbindir}/%{pname}
|
||||
|
||||
### install SYSV init stuff
|
||||
mkdir -p $RPM_BUILD_ROOT%{_initrddir}
|
||||
install -m755 %{SOURCE3} $RPM_BUILD_ROOT%{_initrddir}/%{pname}
|
||||
|
||||
### install log rotation stuff
|
||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
|
||||
install -m644 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/apache
|
||||
|
||||
### default rootdir links
|
||||
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{pname}
|
||||
pushd $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}
|
||||
ln -s %{_localstatedir}/log/%{pname} logs
|
||||
ln -s %{_libdir}/%{aname} modules
|
||||
ln -s %{_localstatedir}/run run
|
||||
popd
|
||||
|
||||
### replace Apache's default config file with our patched version
|
||||
install -m644 apache_%{apache_ver}/conf/httpd.conf \
|
||||
$RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf/httpd.conf
|
||||
|
||||
# fix up apxs so that it doesn't think it's in the build root
|
||||
perl -pi -e "s^$RPM_BUILD_ROOT^^g" $RPM_BUILD_ROOT%{_sbindir}/apxs
|
||||
|
||||
# fixup the documentation file naming
|
||||
find $RPM_BUILD_ROOT%{contentdir} -name "*.html.html" | xargs rename .html.html .html
|
||||
|
||||
###############################################################################
|
||||
### install mod_perl files
|
||||
pushd mod_perl-%{mod_perl_ver}
|
||||
export PERL_INSTALL_ROOT=$RPM_BUILD_ROOT
|
||||
make pure_install PREFIX=/usr INSTALLDIRS=vendor
|
||||
|
||||
# convert man pages to UTF-8
|
||||
recode() {
|
||||
iconv -f "$2" -t utf-8 < "$1" > "${1}_"
|
||||
%{__mv} -f "${1}_" "$1"
|
||||
}
|
||||
pushd $RPM_BUILD_ROOT/usr/share/man/man3/
|
||||
for i in * ; do
|
||||
recode "${i}" iso-8859-1
|
||||
done
|
||||
popd
|
||||
|
||||
# fix files mod
|
||||
find $RPM_BUILD_ROOT%{perl_vendorarch} -iname '*.pm' -exec chmod 0644 {} \;
|
||||
|
||||
# bake web docs...
|
||||
mkdir -p $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl
|
||||
install -c -m 644 htdocs/manual/mod/mod_perl.html \
|
||||
$RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/
|
||||
make -C faq
|
||||
rm -f faq/pod2htm*
|
||||
install -m644 faq/*.html \
|
||||
$RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/
|
||||
|
||||
popd
|
||||
|
||||
# remove special perl files this is specific for rpms , already have in own .packlist
|
||||
find $RPM_BUILD_ROOT%{perl_vendorarch}/.. -name perllocal.pod -o -name .packlist \
|
||||
-o -name '*.bs' | xargs -r -i rm -f {}
|
||||
|
||||
### ssl leftovers
|
||||
# point to the right makefile.
|
||||
ln -sf ../../../etc/pki/tls/certs/Makefile $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf
|
||||
# create a prototype session cache
|
||||
touch $RPM_BUILD_ROOT%{_localstatedir}/cache/ssl_gcache_data.{dir,pag,sem}
|
||||
|
||||
# drop shellbang from .exp files
|
||||
for exp in $RPM_BUILD_ROOT%{perl_vendorarch}/auto/Apache/mod_perl.exp $RPM_BUILD_ROOT%{_libdir}/%{aname}/httpd.exp
|
||||
do
|
||||
sed -i '/^#!/ d' $exp
|
||||
done
|
||||
|
||||
#cp %{_tmppath}/rpm-tmp* /tmp/03install.sh
|
||||
|
||||
%post
|
||||
/sbin/chkconfig --add %{pname}
|
||||
/sbin/ldconfig
|
||||
|
||||
# safely build a test certificate
|
||||
umask 077
|
||||
if [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.key/server.key ] ; then
|
||||
openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > %{_sysconfdir}/%{pname}/conf/ssl.key/server.key 2> /dev/null
|
||||
fi
|
||||
|
||||
if [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt ] ; then
|
||||
cat << EOF | openssl req -new -key %{_sysconfdir}/%{pname}/conf/ssl.key/server.key -x509 -days 365 -out %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt 2>/dev/null
|
||||
--
|
||||
SomeState
|
||||
SomeCity
|
||||
SomeOrganization
|
||||
SomeOrganizationalUnit
|
||||
localhost.localdomain
|
||||
root@localhost.localdomain
|
||||
EOF
|
||||
fi
|
||||
|
||||
# safely add .htm to mime types if it is not already there
|
||||
[ -f %{_sysconfdir}/mime.types ] || exit 0
|
||||
TEMPTYPES=`/bin/mktemp /tmp/mimetypes.XXXXXX`
|
||||
[ -z "$TEMPTYPES" ] && {
|
||||
echo "could not make temporary file, htm not added to %{_sysconfdir}/mime.types" >&2
|
||||
exit 1
|
||||
}
|
||||
( grep -v "^text/html" %{_sysconfdir}/mime.types
|
||||
types=$(grep "^text/html" %{_sysconfdir}/mime.types | cut -f2-)
|
||||
echo -en "text/html\t\t\t"
|
||||
for val in $types ; do
|
||||
if [ "$val" = "htm" ] ; then
|
||||
continue
|
||||
fi
|
||||
echo -n "$val "
|
||||
done
|
||||
echo "htm"
|
||||
) > $TEMPTYPES
|
||||
cat $TEMPTYPES > %{_sysconfdir}/mime.types && /bin/rm -f $TEMPTYPES
|
||||
|
||||
cp %{_tmppath}/rpm-tmp* /tmp/04post.sh
|
||||
|
||||
%pre
|
||||
# Add the "apache" user
|
||||
/usr/sbin/useradd -c "Apache" -u 48 \
|
||||
-s /sbin/nologin -r -d "%{contentdir}" apache 2> /dev/null || :
|
||||
|
||||
%preun
|
||||
if [ $1 = 0 ]; then
|
||||
if [ -f /var/lock/subsys/%{pname} ]; then
|
||||
%{_initrddir}/%{pname} stop
|
||||
fi
|
||||
if [ -f %{_initrddir}/%{pname} ]; then
|
||||
/sbin/chkconfig --del %{pname}
|
||||
fi
|
||||
fi
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%dir %{_sysconfdir}/%{pname}
|
||||
%dir %{_sysconfdir}/%{pname}/conf
|
||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/*.conf
|
||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/Makefile
|
||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/magic
|
||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/mime.types
|
||||
%config(noreplace) %{_sysconfdir}/logrotate.d/*
|
||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/ssl.*
|
||||
%doc %{_sysconfdir}/%{pname}/conf/*.default
|
||||
%attr(755,root,root) %{_initrddir}/*
|
||||
%{_sysconfdir}/%{pname}/logs
|
||||
%{_sysconfdir}/%{pname}/modules
|
||||
%{_sysconfdir}/%{pname}/run
|
||||
%{_libdir}/%{aname}
|
||||
%{perl_vendorarch}/Apache
|
||||
%{perl_vendorarch}/Bundle
|
||||
%{perl_vendorarch}/*.pm
|
||||
%{perl_vendorarch}/*.PL
|
||||
%dir %{perl_vendorarch}/auto/Apache
|
||||
%{perl_vendorarch}/auto/Apache/Leak
|
||||
%{perl_vendorarch}/auto/Apache/Symbol
|
||||
%{perl_vendorarch}/auto/Apache/mod_perl.exp
|
||||
%{perl_vendorarch}/auto/Apache/typemap
|
||||
%attr(0755,root,root) %{_bindir}/*
|
||||
%attr(0755,root,root) %{_sbindir}/ab
|
||||
%attr(0755,root,root) %{_sbindir}/apachectl
|
||||
%attr(0755,root,root) %{_sbindir}/httpd13
|
||||
%attr(0755,root,root) %{_sbindir}/logresolve
|
||||
%attr(0755,root,root) %{_sbindir}/rotatelogs
|
||||
%{?_with_suexec:%attr(4710,root,%{suexec_caller}) %{_sbindir}/suexec}
|
||||
%{_mandir}/man1*/*
|
||||
%{_mandir}/man8/ab.8*
|
||||
%{_mandir}/man8/apachectl.8*
|
||||
%{_mandir}/man8/httpd.8*
|
||||
%{_mandir}/man8/logresolve.8*
|
||||
%{_mandir}/man8/rotatelogs.8*
|
||||
%{?_with_suexec:%{_mandir}/man8/suexec.8*}
|
||||
%attr(0755,apache,root) %dir %{_localstatedir}/cache/%{pname}
|
||||
%attr(0640,apache,root) %{_localstatedir}/cache/ssl_*
|
||||
%attr(0750,root,apache) %dir %{_localstatedir}/log/%{pname}
|
||||
|
||||
|
||||
%files devel
|
||||
%defattr(-,root,root)
|
||||
%{_includedir}
|
||||
%attr(0755,root,root) %{_sbindir}/apxs
|
||||
%{_mandir}/man8/apxs.8*
|
||||
%doc %{perl_vendorarch}/*.pod
|
||||
%{perl_vendorarch}/auto/Apache/include
|
||||
|
||||
%files manual
|
||||
%defattr(-,root,root)
|
||||
%doc apache_%{apache_ver}/cgi-bin
|
||||
%dir %{contentdir}
|
||||
%dir %{contentdir}/cgi-bin
|
||||
%config(noreplace) %{contentdir}/cgi-bin/*
|
||||
%dir %{contentdir}/html
|
||||
%config(noreplace) %{contentdir}/html/*.html*
|
||||
%config(noreplace) %{contentdir}/html/*.gif
|
||||
%dir %{contentdir}/icons
|
||||
%dir %{contentdir}/icons/small
|
||||
%config(noreplace) %{contentdir}/icons/*.*
|
||||
%config(noreplace) %{contentdir}/icons/small/*.*
|
||||
%doc %{contentdir}/icons/README
|
||||
|
||||
%doc apache_%{apache_ver}/{ABOUT_APACHE,LICENSE*,NOTICE,README*,cgi-bin}
|
||||
%doc apache_%{apache_ver}/src/{CHANGES,README}*
|
||||
%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/README.*
|
||||
%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/NEWS
|
||||
%doc mod_perl-%{mod_perl_ver}/mod_perl-doc
|
||||
%doc SSL-Certificate-Creation
|
||||
|
||||
%doc %{contentdir}/html/manual
|
||||
%exclude %{contentdir}/html/manual/mod/mod_ssl/ssl_cover.wml
|
||||
#man3 conflicts with mod_perl2
|
||||
/usr/share/man/man3*/*
|
||||
|
||||
|
||||
%changelog
|
||||
* Sun May 13 2012 Sérgio Basto <sergio@serjux.com> - 1.3.42-4
|
||||
- Many improvements on defaults directories
|
||||
- Separate libapreq in other package, to compile libapreq is need other sources installed.
|
||||
- more cleanups.
|
||||
|
||||
* Wed Nov 16 2011 Sérgio Basto <sergio@serjux.com>
|
||||
- build for F16
|
||||
- mp1+perl5.14.diff (mod_perl1 + perl5.14)
|
||||
- many improvents.
|
||||
|
||||
* Sat Oct 29 2011 Sérgio Basto <sergio@serjux.com>
|
||||
- mock build add many buildrequires
|
||||
- many improvemts on confs
|
||||
|
||||
* Tue Oct 16 2007 Sérgio Basto <sergio@serjux.com>
|
||||
- UNDROPPED CONFIGURATION COMPLETELY: rpm it suposed do all alone.
|
||||
- rename httpd to http13 to work independently of apache 2.2
|
||||
- add patch to Makefile.tmp, resolve all problems at once
|
||||
- change server port number to run out of the box.
|
||||
- Update link to certs/Makefile.
|
||||
|
||||
* Tue Sep 11 2007 Marius FERARU <altblue@n0i.net> - 1.3.39-1.n0i.23.MPSSL
|
||||
- apache 1.3.39
|
||||
- mod_ssl 2.8.29
|
||||
|
||||
* Mon Apr 02 2007 Marius FERARU <altblue@n0i.net> - 1.3.37-3.n0i.22.MPSSL
|
||||
- mod_perl 1.30
|
||||
- initscript: use a "$pidfile" variable for all operations
|
||||
- initscript: added a dummy "alias" for "reload" (will do a 'restart'!)
|
||||
- initscript: added missing "fullstatus" option (will run through "apachectl")
|
||||
- dropped shellbang from .exp files
|
||||
- dropped 2 explicit provides (mod_perl and Apache::Constants)
|
||||
|
||||
* Fri Sep 08 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-2.n0i.21.MPSSL
|
||||
- BR: gdbm-devel, db4-devel
|
||||
|
||||
* Mon Aug 21 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-1.n0i.20.MPSSL
|
||||
- apache 1.3.37
|
||||
- mod_ssl 2.8.28
|
||||
- Dist macro
|
||||
- URL update
|
||||
- updated description
|
||||
- spec cleanups
|
||||
- use "--with backtrace" to activate "mod_backtrace"
|
||||
- use "--with whatkilledus" to activate "mod_whatkilledus"
|
||||
- use "--with suexec" to activate suexec functionality
|
||||
- moved default web content into documentation package
|
||||
|
||||
* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-2.n0i.19.MPSSL
|
||||
- changed "runtimedir" and "logfiledir" to relative paths,
|
||||
letting users run apache on their own
|
||||
|
||||
* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-1.n0i.19.MPSSL
|
||||
- apache 1.3.36
|
||||
- mod_ssl version 2.8.27
|
||||
- spec cleanups
|
||||
|
||||
* Mon Mar 13 2006 Marius FERARU <altblue@n0i.net> - 1.3.34-2.n0i.18.MPSSL
|
||||
- rebuild
|
||||
|
||||
* Thu Nov 24 2005 Marius FERARU <altblue@n0i.net> 1.3.34-1.n0i.17.MPSSL
|
||||
- apache 1.3.34
|
||||
- mod_ssl version 2.8.25
|
||||
|
||||
* Tue Sep 20 2005 Marius FERARU <altblue@n0i.net> 1.3.33-5.n0i.16.MPSSL
|
||||
- mod_ssl version 2.8.24
|
||||
|
||||
* Fri Sep 02 2005 Marius FERARU <altblue@n0i.net> 1.3.33-4.n0i.15.MPSSL
|
||||
- rebuild
|
||||
- dropped more requirements (which Fedora considers to "always have")
|
||||
|
||||
* Sat Jul 23 2005 Marius FERARU <altblue@n0i.net> 1.3.33-3.n0i.14.MPSSL
|
||||
- dropped Epoch
|
||||
- changed Summary and Description
|
||||
- rebuild (perl 5.8.7)
|
||||
|
||||
* Tue Jan 04 2005 Marius FERARU <altblue@n0i.net> 1.3.33-2.n0i.13.MPSSL
|
||||
- libapreq version 1.33
|
||||
|
||||
* Mon Dec 06 2004 Marius FERARU <altblue@n0i.net> 1.3.33-1.n0i.12.MPSSL
|
||||
- apache version 1.3.33
|
||||
- mod_ssl version 2.8.22
|
||||
- description update
|
||||
|
||||
* Tue Aug 17 2004 Marius FERARU <altblue@n0i.net> 1.3.31-5.n0i.11.MPSSL
|
||||
- mod_ssl version 2.8.19
|
||||
|
||||
* Thu Jul 15 2004 Marius FERARU <altblue@n0i.net> 1.3.31-4.n0i.10.MPSSL
|
||||
- mod_ssl version 2.8.18
|
||||
|
||||
* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-3.n0i.9.MPSSL
|
||||
- tweaked rotatelog's build: drop linking with apache libs
|
||||
|
||||
* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-2.n0i.8.MPSSL
|
||||
- applied some fixing patches from current CVS version
|
||||
|
||||
* Thu May 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-1.n0i.7.MPSSL
|
||||
- apache version 1.3.31
|
||||
- mod_ssl version 2.8.17
|
||||
- updated apxs patch
|
||||
- slight spec tweaks
|
||||
- enabled backtrace experimental module
|
||||
- updated config patch
|
||||
|
||||
* Fri Apr 30 2004 Marius Feraru <altblue@n0i.net> 1.3.29-6.n0i.6.MPSSL
|
||||
- automatic rebuild
|
||||
|
||||
* Thu Apr 22 2004 Marius FERARU <altblue@n0i.net> 1.3.29-5.n0i.5.MPSSL
|
||||
- rebuild (perl 5.8.4)
|
||||
|
||||
* Tue Feb 10 2004 Marius FERARU <altblue@n0i.net> 1.3.29-4.n0i.4.MPSSL
|
||||
- fixed the shameful bugs from my httpd.init script
|
||||
|
||||
* Fri Jan 23 2004 Marius FERARU <altblue@n0i.net> 1.3.29-3.n0i.3.MPSSL
|
||||
- rebuild (perl 5.8.3)
|
||||
|
||||
* Fri Jan 16 2004 Marius FERARU <altblue@n0i.net> 1.3.29-2.n0i.2.MPSSL
|
||||
- rebuilt on perl 5.8.2 / Fedora 1 Devel (tobe FC2)
|
||||
- finally clearly enabled modperl.c in apache_1.3.23-config.patch
|
||||
as many helpless people seem to use this dumb default configuration file :(
|
||||
- also updated the same patch to properly define SSL too :)
|
||||
- added a lame "MPSSL" extra tag in release to make people understand this
|
||||
is a !SPECIAL! apache + mod_perl + mod_ssl + libapreq package suite!!!
|
||||
- updated init script to do "real" server shutdown (in squid style) and to NOT
|
||||
shutdown all the apache servers, just the one started with /var/run/httpd.pid
|
||||
- added USE_MODULEARGS=[yes/no] and SHUTDOWN_TIMEOUT=[seconds] configuration
|
||||
parameters to init script
|
||||
|
||||
* Thu Nov 13 2003 Marius FERARU <altblue@n0i.net> 1.3.29-1.n0i.1
|
||||
- apache 1.3.29
|
||||
- modssl 2.8.16
|
||||
- dropped zombie patch
|
||||
- dropped fderr patch
|
||||
- dropped for good thttpd conflict note as THERE IS NO CONFLICT!!! In fact
|
||||
we really use them both for long time without a problem :))
|
||||
- added more Prereq stuff
|
||||
- more Fedora style spec updates
|
||||
|
||||
* Thu Oct 16 2003 Marius FERARU <altblue@n0i.net> 1.3.28-2.n0i
|
||||
- mod_perl 1.29
|
||||
- libapreq 1.3
|
||||
- replaced ALL direct 'etc' occurences to macros (some for other stuff)
|
||||
- perl %%files are now more properly quested.
|
||||
- switched krb5-config to pkg-config
|
||||
- switched textutils to coreutils
|
||||
- using mm 1.3
|
||||
- disabled internal expat linking
|
||||
- added the 'zombie' patch
|
||||
- added the 'file descriptors are erroneously closed' patch
|
||||
|
||||
* Mon Jul 28 2003 Marius FERARU <altblue.net> 1.3.28-1.n0i
|
||||
- mod_perl 1.28
|
||||
- added builtin libapreq
|
||||
|
||||
* Fri Jul 25 2003 Marius FERARU <altblue@n0i.net> 1.3.28-0.n0i
|
||||
- apache version 1.3.28
|
||||
- mod_ssl version 2.8.15
|
||||
- switched the old dbm-gdbm patch with a more elegant one (apache_1.3.27-db);
|
||||
yet, more tests are to be done on other systems before dropping the old one
|
||||
from our src.rpm
|
||||
- disabled suexec SSL env support patch as Apache ppl changed their code heavily
|
||||
and I do not yet have time to update this patch
|
||||
- moved mod_perl header files into apache-devel (are they needed by someone?!)
|
||||
- dropped using RPM_SOURCE_DIR/<filename> stuff.
|
||||
- disabled auth_db module (db4 API changes?!)
|
||||
|
||||
* Mon Apr 21 2003 Marius FERARU <altblue@n0i.net> 1.3.27-2.n0i
|
||||
- automatic rebuild on RHL9
|
||||
|
||||
* Wed Mar 26 2003 Marius FERARU <altblue@n0i.net> 1.3.27-1.n0i
|
||||
- mod_ssl version 2.8.14
|
||||
- dropped thttpd conflict note as THERE IS NO CONFLICT!!! In fact we really
|
||||
use them both :))
|
||||
|
||||
* Fri Oct 18 2002 Marius Feraru <altblue@n0i.net>
|
||||
- apache version 1.3.27
|
||||
- mod_ssl version 2.8.11
|
||||
- eliminated db4 patch
|
||||
- disabled thttpd conflict flag
|
||||
|
||||
* Tue Sep 24 2002 Marius Feraru <altblue@n0i.net>
|
||||
- automatic rebuild (to conform with the openssl update)
|
||||
|
||||
* Wed Sep 4 2002 Marius Feraru <altblue@n0i.net>
|
||||
- some spec cleanups (rpm 4.1.x compatibility)
|
||||
|
||||
* Tue Jul 23 2002 Marius FERARU <altblue@n0i.net>
|
||||
- apache 1.3.26
|
||||
- mod_perl 1.27
|
||||
- mod_ssl 2.8.10
|
||||
- lots of new tweaks to the spec file (hopefully it will be easier now for others to
|
||||
rebuild this package =] )
|
||||
|
||||
|
||||
* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>
|
||||
- updated apache to 1.3.22
|
||||
- reparsed and tweaked all RedHat patches
|
||||
- lots of spec file tweaks: optimisations,
|
||||
file location/integration/modes fixes...
|
||||
|
||||
* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>
|
||||
- updated mod_perl to version 1.26
|
||||
- based on apache-1.3.20-15.src.rpm from Red Hat RawHide
|
||||
- used apache_modperl-1.3.19-1.24-1.src.rpm from
|
||||
perl.apache.org as example spec.
|
||||
62
samples/RPM Spec/erlang-erlydtl.spec
Normal file
62
samples/RPM Spec/erlang-erlydtl.spec
Normal file
@@ -0,0 +1,62 @@
|
||||
%global debug_package %{nil}
|
||||
|
||||
Name: erlang-erlydtl
|
||||
Version: 0.6.0
|
||||
Release: 1%{?dist}
|
||||
Summary: Erlang implementation of the Django Template Language.
|
||||
|
||||
Group: Development/Libraries
|
||||
License: MIT
|
||||
URL: http://code.google.com/p/erlydtl/
|
||||
Source0: http://erlydtl.googlecode.com/files/erlydtl-0.6.0.tar.gz
|
||||
Patch0: erlang-erlydtl-0.6.0-tests.patch
|
||||
Patch1: erlang-erlydtl-0.6.0-r14a.patch
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
|
||||
Provides: ErlyDTL = %{version}-%{release}
|
||||
BuildRequires: erlang
|
||||
Requires: erlang
|
||||
|
||||
%description
|
||||
ErlyDTL is an Erlang implementation of the Django Template Language. The
|
||||
erlydtl module compiles Django Template source code into Erlang bytecode. The
|
||||
compiled template has a "render" function that takes a list of variables and
|
||||
returns a fully rendered document
|
||||
|
||||
%prep
|
||||
%setup -q -n erlydtl-%{version}
|
||||
find examples/ -type f -executable -exec chmod -x {} \;
|
||||
|
||||
%patch0 -p0
|
||||
%patch1 -p0
|
||||
|
||||
%build
|
||||
make %{?_smp_mflags}
|
||||
|
||||
%check
|
||||
make test
|
||||
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
mkdir -p %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
|
||||
cp -r ebin %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
|
||||
cp -r bin %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
|
||||
cp -r priv %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
|
||||
|
||||
|
||||
%clean
|
||||
rm -rf %{buildroot}
|
||||
|
||||
|
||||
%files
|
||||
%defattr(-,root,root,-)
|
||||
%dir %{_libdir}/erlang/lib/erlydtl-%{version}
|
||||
%{_libdir}/erlang/lib/erlydtl-%{version}/*
|
||||
%doc README
|
||||
%doc examples
|
||||
|
||||
|
||||
%changelog
|
||||
* Sun Aug 1 2010 Ilia Cheishvili <ilia.cheishvili@gmail.com> - 0.6.0-1
|
||||
- Initial Package
|
||||
46
samples/RPM Spec/manos.spec
Normal file
46
samples/RPM Spec/manos.spec
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# spec file for package manos
|
||||
#
|
||||
# Copyright (c) 2010 Jackson Harper (jackson@novell.com)
|
||||
#
|
||||
#
|
||||
|
||||
Name: manos-devel
|
||||
Version: 0.1.1
|
||||
Release: 1
|
||||
License: MIT/X11
|
||||
BuildRoot: %{_tmppath}/manos-%{version}-build
|
||||
BuildRequires: mono-devel >= 2.6
|
||||
BuildRequires: mono-nunit >= 2.6
|
||||
Source0: manos-%{version}.tar.bz2
|
||||
Source1: rpmlintrc
|
||||
Summary: The Manos Web Application Framework
|
||||
Group: Development/Web/Servers
|
||||
BuildArch: noarch
|
||||
|
||||
%description
|
||||
Manos is an easy to use, easy to test, high performance web application framework that stays out of your way and makes your life ridiculously simple.
|
||||
|
||||
%files
|
||||
%defattr(-, root, root)
|
||||
%{_prefix}/lib/manos
|
||||
%{_bindir}/manos
|
||||
%{_datadir}/manos
|
||||
%{_prefix}/lib/pkgconfig/manos.pc
|
||||
%{_datadir}/man/man1/manos.1.gz
|
||||
|
||||
%prep
|
||||
%setup -q -n manos-%{version}
|
||||
|
||||
|
||||
%build
|
||||
./configure --prefix=%{buildroot}%{_prefix} --install-prefix=%{_prefix}
|
||||
make
|
||||
|
||||
%install
|
||||
make install
|
||||
|
||||
%clean
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%changelog
|
||||
10
samples/Rascal/Analyze.rsc
Normal file
10
samples/Rascal/Analyze.rsc
Normal file
@@ -0,0 +1,10 @@
|
||||
module Analyze
|
||||
|
||||
import Syntax;
|
||||
|
||||
set[Id] unreachable(Machine m) {
|
||||
r = { <q1,q2> | (State)`state <Id q1> <Trans* ts>` <- m.states,
|
||||
(Trans)`<Id _>: <Id q2>` <- ts }+;
|
||||
qs = [ q.name | /State q := m ];
|
||||
return { q | q <- qs, q notin r[qs[0]] };
|
||||
}
|
||||
18
samples/Rascal/Compile.rsc
Normal file
18
samples/Rascal/Compile.rsc
Normal file
@@ -0,0 +1,18 @@
|
||||
module Compile
|
||||
|
||||
import Syntax;
|
||||
|
||||
str compile(Machine m) =
|
||||
"while (true) {
|
||||
' event = input.next();
|
||||
' switch (current) {
|
||||
' <for (q <- m.states) {>
|
||||
' case \"<q.name>\":
|
||||
' <for (t <- q.out) {>
|
||||
' if (event.equals(\"<t.event>\"))
|
||||
' current = \"<t.to>\";
|
||||
' <}>
|
||||
' break;
|
||||
' <}>
|
||||
' }
|
||||
'}";
|
||||
887
samples/Rascal/Rascal.rsc
Normal file
887
samples/Rascal/Rascal.rsc
Normal file
@@ -0,0 +1,887 @@
|
||||
@license{
|
||||
Copyright (c) 2009-2015 CWI
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are made available under the terms of the Eclipse Public License v1.0
|
||||
which accompanies this distribution, and is available at
|
||||
http://www.eclipse.org/legal/epl-v10.html
|
||||
}
|
||||
@contributor{Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI}
|
||||
@contributor{Tijs van der Storm - Tijs.van.der.Storm@cwi.nl}
|
||||
@contributor{Paul Klint - Paul.Klint@cwi.nl - CWI}
|
||||
@contributor{Arnold Lankamp - Arnold.Lankamp@cwi.nl}
|
||||
@contributor{Michael Steindorfer - Michael.Steindorfer@cwi.nl - CWI}
|
||||
@doc{The syntax definition of Rascal, excluding concrete syntax fragments}
|
||||
module lang::rascal::\syntax::Rascal
|
||||
|
||||
lexical BooleanLiteral
|
||||
= "true"
|
||||
| "false" ;
|
||||
|
||||
syntax Literal
|
||||
= integer: IntegerLiteral integerLiteral
|
||||
| regExp: RegExpLiteral regExpLiteral
|
||||
| \real: RealLiteral realLiteral
|
||||
| boolean: BooleanLiteral booleanLiteral
|
||||
| string: StringLiteral stringLiteral
|
||||
| dateTime: DateTimeLiteral dateTimeLiteral
|
||||
| location: LocationLiteral locationLiteral
|
||||
| rational: RationalLiteral rationalLiteral
|
||||
;
|
||||
|
||||
syntax Expression = concrete: Concrete concrete;
|
||||
syntax Pattern = concrete: Concrete concrete;
|
||||
|
||||
lexical Concrete
|
||||
= typed: "(" LAYOUTLIST l1 Sym symbol LAYOUTLIST l2 ")" LAYOUTLIST l3 "`" ConcretePart* parts "`";
|
||||
|
||||
lexical ConcretePart
|
||||
= @category="MetaSkipped" text : ![`\<\>\\\n]+ !>> ![`\<\>\\\n]
|
||||
| newline: "\n" [\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* "\'"
|
||||
| @category="MetaVariable" hole : ConcreteHole hole
|
||||
| @category="MetaSkipped" lt: "\\\<"
|
||||
| @category="MetaSkipped" gt: "\\\>"
|
||||
| @category="MetaSkipped" bq: "\\`"
|
||||
| @category="MetaSkipped" bs: "\\\\"
|
||||
;
|
||||
|
||||
syntax ConcreteHole
|
||||
= \one: "\<" Sym symbol Name name "\>"
|
||||
;
|
||||
|
||||
start syntax Module
|
||||
= \default: Header header Body body ;
|
||||
|
||||
syntax ModuleParameters
|
||||
= \default: "[" {TypeVar ","}+ parameters "]" ;
|
||||
|
||||
lexical DateAndTime
|
||||
= "$" DatePart "T" TimePartNoTZ !>> [+\-] "$"
|
||||
| "$" DatePart "T" TimePartNoTZ TimeZonePart "$";
|
||||
|
||||
syntax Strategy
|
||||
= topDownBreak: "top-down-break"
|
||||
| topDown: "top-down"
|
||||
| bottomUp: "bottom-up"
|
||||
| bottomUpBreak: "bottom-up-break"
|
||||
| outermost: "outermost"
|
||||
| innermost: "innermost" ;
|
||||
|
||||
lexical UnicodeEscape
|
||||
= utf16: "\\" [u] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f]
|
||||
| utf32: "\\" [U] (("0" [0-9 A-F a-f]) | "10") [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] [0-9 A-F a-f] // 24 bits
|
||||
| ascii: "\\" [a] [0-7] [0-9A-Fa-f]
|
||||
;
|
||||
|
||||
syntax Variable
|
||||
= initialized: Name name "=" Expression initial
|
||||
| unInitialized: Name name ;
|
||||
|
||||
lexical OctalIntegerLiteral
|
||||
= [0] [0-7]+ !>> [0-9 A-Z _ a-z] ;
|
||||
|
||||
syntax TypeArg
|
||||
= \default: Type type
|
||||
| named: Type type Name name ;
|
||||
|
||||
syntax Renaming
|
||||
= \default: Name from "=\>" Name to ;
|
||||
|
||||
syntax Catch
|
||||
= \default: "catch" ":" Statement body
|
||||
| binding: "catch" Pattern pattern ":" Statement body ;
|
||||
|
||||
lexical PathChars
|
||||
= URLChars [|] ;
|
||||
|
||||
syntax Signature
|
||||
= withThrows: FunctionModifiers modifiers Type type Name name Parameters parameters "throws" {Type ","}+ exceptions
|
||||
| noThrows: FunctionModifiers modifiers Type type Name name Parameters parameters ;
|
||||
|
||||
syntax Sym
|
||||
// named non-terminals
|
||||
= nonterminal: Nonterminal nonterminal !>> "["
|
||||
| parameter: "&" Nonterminal nonterminal
|
||||
| parametrized: Nonterminal nonterminal >> "[" "[" {Sym ","}+ parameters "]"
|
||||
| \start: "start" "[" Nonterminal nonterminal "]"
|
||||
| labeled: Sym symbol NonterminalLabel label
|
||||
// literals
|
||||
| characterClass: Class charClass
|
||||
| literal: StringConstant string
|
||||
| caseInsensitiveLiteral: CaseInsensitiveStringConstant cistring
|
||||
// regular expressions
|
||||
| iter: Sym symbol "+"
|
||||
| iterStar: Sym symbol "*"
|
||||
| iterSep: "{" Sym symbol Sym sep "}" "+"
|
||||
| iterStarSep: "{" Sym symbol Sym sep "}" "*"
|
||||
| optional: Sym symbol "?"
|
||||
| alternative: "(" Sym first "|" {Sym "|"}+ alternatives ")"
|
||||
| sequence: "(" Sym first Sym+ sequence ")"
|
||||
// TODO: MinimalIter: Sym symbol IntegerConstant minimal "+"
|
||||
// TODO: MinimalIterSep: "{" Sym symbol Symbol sep "}" IntegerConstant minimal "+"
|
||||
// TODO | Permutation: "(" Sym first "~" {Sym "~"}+ participants ")"
|
||||
// TODO | Combination: "(" Sym first "#" {Sym "#"}+ elements ")"
|
||||
| empty: "(" ")"
|
||||
// conditionals
|
||||
| column: Sym symbol "@" IntegerLiteral column
|
||||
| endOfLine: Sym symbol "$"
|
||||
| startOfLine: "^" Sym symbol
|
||||
| except: Sym symbol "!" NonterminalLabel label
|
||||
>
|
||||
assoc (
|
||||
left ( follow: Sym symbol "\>\>" Sym match
|
||||
| notFollow: Sym symbol "!\>\>" Sym match
|
||||
)
|
||||
|
|
||||
right ( precede: Sym match "\<\<" Sym symbol
|
||||
| notPrecede: Sym match "!\<\<" Sym symbol
|
||||
)
|
||||
)
|
||||
>
|
||||
left unequal: Sym symbol "\\" Sym match
|
||||
;
|
||||
|
||||
lexical TimePartNoTZ
|
||||
= [0-2] [0-9] [0-5] [0-9] [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)?
|
||||
| [0-2] [0-9] ":" [0-5] [0-9] ":" [0-5] [0-9] ([, .] [0-9] ([0-9] [0-9]?)?)?
|
||||
;
|
||||
|
||||
syntax Header
|
||||
= parameters: Tags tags "module" QualifiedName name ModuleParameters params Import* imports
|
||||
| \default: Tags tags "module" QualifiedName name Import* imports ;
|
||||
|
||||
lexical Name
|
||||
// Names are surrounded by non-alphabetical characters, i.e. we want longest match.
|
||||
= ([A-Z a-z _] !<< [A-Z _ a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords
|
||||
| [\\] [A-Z _ a-z] [\- 0-9 A-Z _ a-z]* !>> [\- 0-9 A-Z _ a-z]
|
||||
;
|
||||
|
||||
syntax SyntaxDefinition
|
||||
= @Foldable \layout : Visibility vis "layout" Sym defined "=" Prod production ";"
|
||||
| @Foldable \lexical : "lexical" Sym defined "=" Prod production ";"
|
||||
| @Foldable \keyword : "keyword" Sym defined "=" Prod production ";"
|
||||
| @Foldable language: Start start "syntax" Sym defined "=" Prod production ";" ;
|
||||
|
||||
syntax Kind
|
||||
= function: "function"
|
||||
| variable: "variable"
|
||||
| \all: "all"
|
||||
| \anno: "anno"
|
||||
| \data: "data"
|
||||
| view: "view"
|
||||
| \alias: "alias"
|
||||
| \module: "module"
|
||||
| \tag: "tag" ;
|
||||
|
||||
syntax ImportedModule
|
||||
= \default: QualifiedName name
|
||||
| actualsRenaming: QualifiedName name ModuleActuals actuals Renamings renamings
|
||||
| renamings: QualifiedName name Renamings renamings
|
||||
| actuals: QualifiedName name ModuleActuals actuals
|
||||
;
|
||||
|
||||
syntax Target
|
||||
= empty:
|
||||
| labeled: Name name ;
|
||||
|
||||
syntax IntegerLiteral
|
||||
= /*prefer()*/ decimalIntegerLiteral: DecimalIntegerLiteral decimal
|
||||
| /*prefer()*/ hexIntegerLiteral: HexIntegerLiteral hex
|
||||
| /*prefer()*/ octalIntegerLiteral: OctalIntegerLiteral octal ;
|
||||
|
||||
syntax FunctionBody
|
||||
= \default: "{" Statement* statements "}" ;
|
||||
|
||||
syntax Expression
|
||||
= nonEmptyBlock : "{" Statement+ statements "}"
|
||||
| bracket \bracket: "(" Expression expression ")"
|
||||
| closure : Type type Parameters parameters "{" Statement+ statements "}"
|
||||
| stepRange : "[" Expression first "," Expression second ".." Expression last "]"
|
||||
| voidClosure : Parameters parameters "{" Statement* statements0 "}"
|
||||
| \visit : Label label Visit visit
|
||||
| reducer : "(" Expression init "|" Expression result "|" {Expression ","}+ generators ")"
|
||||
| reifiedType : "type" "(" Expression symbol "," Expression definitions ")"
|
||||
| callOrTree : Expression!transitiveClosure!transitiveReflexiveClosure!isDefined expression "(" {Expression ","}* arguments KeywordArguments[Expression] keywordArguments ")"
|
||||
| literal : Literal literal
|
||||
| \any : "any" "(" {Expression ","}+ generators ")"
|
||||
| \all : "all" "(" {Expression ","}+ generators ")"
|
||||
| comprehension : Comprehension comprehension
|
||||
| \set : "{" {Expression ","}* elements0 "}"
|
||||
| \list : "[" {Expression ","}* elements0 "]"
|
||||
| reifyType : "#" Type type !>> "[" !selector
|
||||
| range : "[" Expression first ".." Expression last "]"
|
||||
| \tuple : "\<" {Expression ","}+ elements "\>"
|
||||
| \map : "(" {Mapping[Expression] ","}* mappings ")"
|
||||
| \it : [A-Z a-z _] !<< "it" !>> [A-Z a-z _]
|
||||
| qualifiedName : QualifiedName qualifiedName
|
||||
| subscript : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" {Expression ","}+ subscripts "]"
|
||||
| slice : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst ".." OptionalExpression optLast "]"
|
||||
| sliceStep : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]"
|
||||
| fieldAccess : Expression expression "." Name field
|
||||
| fieldUpdate : Expression expression "[" Name key "=" Expression replacement "]"
|
||||
| fieldProject : Expression expression!transitiveClosure!transitiveReflexiveClosure!isDefined "\<" {Field ","}+ fields "\>"
|
||||
| setAnnotation: Expression expression "[" "@" Name name "=" Expression value "]"
|
||||
| getAnnotation: Expression expression >> "@" "@" Name name
|
||||
| is : Expression expression "is" Name name
|
||||
| has : Expression expression "has" Name name
|
||||
| transitiveClosure: Expression argument "+" !>> "="
|
||||
| transitiveReflexiveClosure: Expression argument "*" !>> "="
|
||||
> isDefined : Expression argument "?"
|
||||
> negation : "!" Expression!match!noMatch argument
|
||||
| negative : "-" Expression argument
|
||||
| non-assoc splice : "*" Expression argument
|
||||
| asType : "[" Type type "]" Expression!match!noMatch argument
|
||||
> left composition: Expression lhs "o" Expression rhs
|
||||
> left ( product: Expression lhs "*" () !>> "*" Expression!noMatch!match rhs
|
||||
| \join : Expression lhs "join" Expression rhs
|
||||
| remainder: Expression lhs "%" Expression rhs
|
||||
| division: Expression lhs "/" Expression rhs
|
||||
)
|
||||
> left intersection: Expression lhs "&" !>> "&" Expression rhs
|
||||
> left ( addition : Expression lhs "+" Expression!noMatch!match rhs
|
||||
| subtraction: Expression!transitiveClosure!transitiveReflexiveClosure lhs "-" Expression rhs
|
||||
| appendAfter: Expression lhs "\<\<" !>> "=" Expression rhs
|
||||
| insertBefore: Expression lhs "\>\>" Expression rhs
|
||||
)
|
||||
> left modulo: Expression lhs "mod" Expression rhs
|
||||
> non-assoc ( notIn: Expression lhs "notin" Expression rhs
|
||||
| \in: Expression lhs "in" Expression rhs
|
||||
)
|
||||
> non-assoc ( greaterThanOrEq: Expression lhs "\>=" Expression rhs
|
||||
| lessThanOrEq : Expression lhs "\<=" Expression rhs
|
||||
| lessThan : Expression lhs "\<" !>> "-" Expression rhs
|
||||
| greaterThan : Expression lhs "\>" Expression rhs
|
||||
)
|
||||
> non-assoc ( equals : Expression lhs "==" Expression rhs
|
||||
| nonEquals : Expression lhs "!=" Expression rhs
|
||||
)
|
||||
> non-assoc ifDefinedOtherwise: Expression lhs "?" Expression rhs
|
||||
> non-assoc ( noMatch: Pattern pattern "!:=" Expression expression
|
||||
| match: Pattern pattern ":=" Expression expression
|
||||
| enumerator: Pattern pattern "\<-" Expression expression
|
||||
)
|
||||
> non-assoc ( implication: Expression lhs "==\>" Expression rhs
|
||||
| equivalence: Expression lhs "\<==\>" Expression rhs
|
||||
)
|
||||
> left and: Expression lhs "&&" Expression rhs
|
||||
> left or: Expression lhs "||" Expression rhs
|
||||
> right ifThenElse: Expression condition "?" Expression thenExp ":" Expression elseExp
|
||||
;
|
||||
|
||||
syntax OptionalExpression
|
||||
= expression: Expression expression
|
||||
| noExpression: ()
|
||||
;
|
||||
|
||||
syntax UserType
|
||||
= name: QualifiedName name
|
||||
| parametric: QualifiedName name >> "[" "[" {Type ","}+ parameters "]" ;
|
||||
|
||||
syntax Import
|
||||
= \extend: "extend" ImportedModule module ";"
|
||||
| \default: "import" ImportedModule module ";"
|
||||
| \external: "import" QualifiedName name "=" LocationLiteral at ";"
|
||||
| \syntax: SyntaxDefinition syntax ;
|
||||
|
||||
syntax Body
|
||||
= toplevels: Toplevel* toplevels ;
|
||||
|
||||
lexical URLChars
|
||||
= ![\t-\n \r \ \< |]* ;
|
||||
|
||||
lexical TimeZonePart
|
||||
= [+ \-] [0-1] [0-9] ":" [0-5] [0-9]
|
||||
| "Z"
|
||||
| [+ \-] [0-1] [0-9]
|
||||
| [+ \-] [0-1] [0-9] [0-5] [0-9]
|
||||
;
|
||||
|
||||
syntax ProtocolPart
|
||||
= nonInterpolated: ProtocolChars protocolChars
|
||||
| interpolated: PreProtocolChars pre Expression expression ProtocolTail tail ;
|
||||
|
||||
syntax StringTemplate
|
||||
= ifThen : "if" "(" {Expression ","}+ conditions ")" "{" Statement* preStats StringMiddle body Statement* postStats "}"
|
||||
| ifThenElse: "if" "(" {Expression ","}+ conditions ")" "{" Statement* preStatsThen StringMiddle thenString Statement* postStatsThen "}" "else" "{" Statement* preStatsElse StringMiddle elseString Statement* postStatsElse "}"
|
||||
| \for : "for" "(" {Expression ","}+ generators ")" "{" Statement* preStats StringMiddle body Statement* postStats "}"
|
||||
| doWhile : "do" "{" Statement* preStats StringMiddle body Statement* postStats "}" "while" "(" Expression condition ")"
|
||||
| \while : "while" "(" Expression condition ")" "{" Statement* preStats StringMiddle body Statement* postStats "}" ;
|
||||
|
||||
lexical PreStringChars
|
||||
= @category="Constant" [\"] StringCharacter* [\<] ;
|
||||
|
||||
lexical CaseInsensitiveStringConstant
|
||||
= @category="Constant" "\'" StringCharacter* chars "\'" ;
|
||||
|
||||
lexical Backslash
|
||||
= [\\] !>> [/ \< \> \\] ;
|
||||
|
||||
syntax Label
|
||||
= \default: Name name ":"
|
||||
| empty: ;
|
||||
|
||||
lexical MidProtocolChars
|
||||
= "\>" URLChars "\<" ;
|
||||
|
||||
lexical NamedBackslash
|
||||
= [\\] !>> [\< \> \\] ;
|
||||
|
||||
syntax Field
|
||||
= index: IntegerLiteral fieldIndex
|
||||
| name: Name fieldName ;
|
||||
|
||||
lexical JustDate
|
||||
= "$" DatePart "$";
|
||||
|
||||
lexical PostPathChars
|
||||
= "\>" URLChars "|" ;
|
||||
|
||||
syntax PathPart
|
||||
= nonInterpolated: PathChars pathChars
|
||||
| interpolated: PrePathChars pre Expression expression PathTail tail ;
|
||||
|
||||
lexical DatePart
|
||||
= [0-9] [0-9] [0-9] [0-9] "-" [0-1] [0-9] "-" [0-3] [0-9]
|
||||
| [0-9] [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] ;
|
||||
|
||||
syntax FunctionModifier
|
||||
= java: "java"
|
||||
| \test: "test"
|
||||
| \default: "default";
|
||||
|
||||
syntax Assignment
|
||||
= ifDefined: "?="
|
||||
| division: "/="
|
||||
| product: "*="
|
||||
| intersection: "&="
|
||||
| subtraction: "-="
|
||||
| \default: "="
|
||||
| addition: "+="
|
||||
| \append: "\<\<="
|
||||
;
|
||||
|
||||
syntax Assignable
|
||||
= bracket \bracket : "(" Assignable arg ")"
|
||||
| variable : QualifiedName qualifiedName
|
||||
| subscript : Assignable receiver "[" Expression subscript "]"
|
||||
| slice : Assignable receiver "[" OptionalExpression optFirst ".." OptionalExpression optLast "]"
|
||||
| sliceStep : Assignable receiver "[" OptionalExpression optFirst "," Expression second ".." OptionalExpression optLast "]"
|
||||
| fieldAccess : Assignable receiver "." Name field
|
||||
| ifDefinedOrDefault: Assignable receiver "?" Expression defaultExpression
|
||||
| constructor : Name name "(" {Assignable ","}+ arguments ")"
|
||||
| \tuple : "\<" {Assignable ","}+ elements "\>"
|
||||
| annotation : Assignable receiver "@" Name annotation ;
|
||||
|
||||
lexical StringConstant
|
||||
= @category="Constant" "\"" StringCharacter* chars "\"" ;
|
||||
|
||||
|
||||
|
||||
syntax Assoc
|
||||
= associative: "assoc"
|
||||
| left: "left"
|
||||
| nonAssociative: "non-assoc"
|
||||
| right: "right" ;
|
||||
|
||||
syntax Replacement
|
||||
= unconditional: Expression replacementExpression
|
||||
| conditional: Expression replacementExpression "when" {Expression ","}+ conditions ;
|
||||
|
||||
syntax DataTarget
|
||||
= empty:
|
||||
| labeled: Name label ":" ;
|
||||
|
||||
lexical StringCharacter
|
||||
= "\\" [\" \' \< \> \\ b f n r t]
|
||||
| UnicodeEscape
|
||||
| ![\" \' \< \> \\]
|
||||
| [\n][\ \t \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000]* [\'] // margin
|
||||
;
|
||||
|
||||
lexical JustTime
|
||||
= "$T" TimePartNoTZ !>> [+\-] "$"
|
||||
| "$T" TimePartNoTZ TimeZonePart "$"
|
||||
;
|
||||
|
||||
lexical MidStringChars
|
||||
= @category="Constant" [\>] StringCharacter* [\<] ;
|
||||
|
||||
lexical ProtocolChars
|
||||
= [|] URLChars "://" !>> [\t-\n \r \ \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000];
|
||||
|
||||
lexical RegExpModifier
|
||||
= [d i m s]* ;
|
||||
|
||||
syntax CommonKeywordParameters
|
||||
= absent: ()
|
||||
| present: "(" {KeywordFormal ","}+ keywordFormalList ")"
|
||||
;
|
||||
|
||||
syntax Parameters
|
||||
= \default: "(" Formals formals KeywordFormals keywordFormals ")"
|
||||
| varArgs: "(" Formals formals "..." KeywordFormals keywordFormals ")" ;
|
||||
|
||||
lexical OptionalComma = \default: ","? ;
|
||||
|
||||
syntax KeywordFormals
|
||||
= \default: OptionalComma optionalComma [,\ (\t\n] << {KeywordFormal ","}+ keywordFormalList
|
||||
| none: ()
|
||||
;
|
||||
|
||||
syntax KeywordFormal
|
||||
= \default: Type type Name name "=" Expression expression
|
||||
;
|
||||
|
||||
syntax KeywordArguments[&T]
|
||||
= \default: OptionalComma optionalComma [,\ (\t\n] << {KeywordArgument[&T] ","}+ keywordArgumentList
|
||||
| none: ()
|
||||
;
|
||||
|
||||
syntax KeywordArgument[&T] = \default: Name name "=" &T expression ;
|
||||
|
||||
lexical RegExp
|
||||
= ![/ \< \> \\]
|
||||
| "\<" Name "\>"
|
||||
| [\\] [/ \< \> \\]
|
||||
| "\<" Name ":" NamedRegExp* "\>"
|
||||
| Backslash
|
||||
// | @category="MetaVariable" [\<] Expression expression [\>] TODO: find out why this production existed
|
||||
;
|
||||
|
||||
|
||||
layout LAYOUTLIST
|
||||
= LAYOUT* !>> [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000] !>> "//" !>> "/*";
|
||||
|
||||
syntax LocalVariableDeclaration
|
||||
= \default: Declarator declarator
|
||||
| \dynamic: "dynamic" Declarator declarator ;
|
||||
|
||||
lexical RealLiteral
|
||||
= [0-9]+ [D F d f]
|
||||
| [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]?
|
||||
| [0-9]+ "." !>> "." [0-9]* [D F d f]?
|
||||
| [0-9]+ "." [0-9]* [E e] [+ \-]? [0-9]+ [D F d f]?
|
||||
| [.] !<< "." [0-9]+ [D F d f]?
|
||||
| [.] !<< "." [0-9]+ [E e] [+ \-]? [0-9]+ [D F d f]?
|
||||
;
|
||||
|
||||
syntax Range
|
||||
= fromTo: Char start "-" Char end
|
||||
| character: Char character ;
|
||||
|
||||
syntax LocationLiteral
|
||||
= \default: ProtocolPart protocolPart PathPart pathPart ;
|
||||
|
||||
syntax ShellCommand
|
||||
= setOption: "set" QualifiedName name Expression expression
|
||||
| undeclare: "undeclare" QualifiedName name
|
||||
| help: "help"
|
||||
| edit: "edit" QualifiedName name
|
||||
| unimport: "unimport" QualifiedName name
|
||||
| listDeclarations: "declarations"
|
||||
| quit: "quit"
|
||||
| history: "history"
|
||||
| \test: "test"
|
||||
| listModules: "modules"
|
||||
| clear: "clear";
|
||||
|
||||
syntax StringMiddle
|
||||
= mid: MidStringChars mid
|
||||
| template: MidStringChars mid StringTemplate template StringMiddle tail
|
||||
| interpolated: MidStringChars mid Expression expression StringMiddle tail ;
|
||||
|
||||
syntax QualifiedName
|
||||
= \default: {Name "::"}+ names !>> "::" ;
|
||||
|
||||
lexical RationalLiteral
|
||||
= [0-9][0-9]* [r]
|
||||
| [1-9][0-9]* [r] [0-9][0-9]* !>> [0-9 A-Z _ a-z]
|
||||
;
|
||||
|
||||
lexical DecimalIntegerLiteral
|
||||
= "0" !>> [0-9 A-Z _ a-z]
|
||||
| [1-9] [0-9]* !>> [0-9 A-Z _ a-z] ;
|
||||
|
||||
syntax DataTypeSelector
|
||||
= selector: QualifiedName sort "." Name production ;
|
||||
|
||||
syntax StringTail
|
||||
= midInterpolated: MidStringChars mid Expression expression StringTail tail
|
||||
| post: PostStringChars post
|
||||
| midTemplate: MidStringChars mid StringTemplate template StringTail tail ;
|
||||
|
||||
syntax PatternWithAction
|
||||
= replacing: Pattern pattern "=\>" Replacement replacement
|
||||
| arbitrary: Pattern pattern ":" Statement statement ;
|
||||
|
||||
lexical LAYOUT
|
||||
= Comment
|
||||
// all the white space chars defined in Unicode 6.0
|
||||
| [\u0009-\u000D \u0020 \u0085 \u00A0 \u1680 \u180E \u2000-\u200A \u2028 \u2029 \u202F \u205F \u3000]
|
||||
;
|
||||
|
||||
syntax Visit
|
||||
= givenStrategy: Strategy strategy "visit" "(" Expression subject ")" "{" Case+ cases "}"
|
||||
| defaultStrategy: "visit" "(" Expression subject ")" "{" Case+ cases "}" ;
|
||||
|
||||
start syntax Commands
|
||||
= \commandlist: EvalCommand+ commands
|
||||
;
|
||||
|
||||
start syntax EvalCommand
|
||||
= declaration: Declaration declaration
|
||||
| statement: Statement!variableDeclaration!functionDeclaration!visit statement
|
||||
| \import: Import imported
|
||||
| output: Output
|
||||
;
|
||||
|
||||
lexical Output
|
||||
= @category="Result" resultOutput: "⇨" ![\n\r]* [\n]
|
||||
| @category="StdOut" stdoutOutput: ^ "≫" ![\n\r]* [\n]
|
||||
| @category="StdErr" stderrOutput: ^ "⚠" ![\n\r]* [\n]
|
||||
;
|
||||
|
||||
start syntax Command
|
||||
= expression: Expression!nonEmptyBlock expression
|
||||
| declaration: Declaration declaration
|
||||
| shell: ":" ShellCommand command
|
||||
| statement: Statement!variableDeclaration!functionDeclaration!visit statement
|
||||
| \import: Import imported ;
|
||||
|
||||
lexical TagString
|
||||
= "\\" !<< "{" ( ![{}] | ("\\" [{}]) | TagString)* contents "\\" !<< "}";
|
||||
|
||||
syntax ProtocolTail
|
||||
= mid: MidProtocolChars mid Expression expression ProtocolTail tail
|
||||
| post: PostProtocolChars post ;
|
||||
|
||||
lexical Nonterminal
|
||||
= ([A-Z] !<< [A-Z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z]) \ RascalKeywords;
|
||||
|
||||
syntax PathTail
|
||||
= mid: MidPathChars mid Expression expression PathTail tail
|
||||
| post: PostPathChars post ;
|
||||
|
||||
syntax Visibility
|
||||
= \private: "private"
|
||||
| \default:
|
||||
| \public: "public" ;
|
||||
|
||||
syntax StringLiteral
|
||||
= template: PreStringChars pre StringTemplate template StringTail tail
|
||||
| interpolated: PreStringChars pre Expression expression StringTail tail
|
||||
| nonInterpolated: StringConstant constant ;
|
||||
|
||||
lexical Comment
|
||||
= @category="Comment" "/*" (![*] | [*] !>> [/])* "*/"
|
||||
| @category="Comment" "//" ![\n]* !>> [\ \t\r \u00A0 \u1680 \u2000-\u200A \u202F \u205F \u3000] $ // the restriction helps with parsing speed
|
||||
;
|
||||
|
||||
|
||||
syntax Renamings
|
||||
= \default: "renaming" {Renaming ","}+ renamings ;
|
||||
|
||||
syntax Tags
|
||||
= \default: Tag* tags ;
|
||||
|
||||
syntax Formals
|
||||
= \default: {Pattern ","}* formals ;
|
||||
|
||||
lexical PostProtocolChars
|
||||
= "\>" URLChars "://" ;
|
||||
|
||||
syntax Start
|
||||
= absent:
|
||||
| present: "start" ;
|
||||
|
||||
syntax Statement
|
||||
= @breakable \assert: "assert" Expression expression ";"
|
||||
| @breakable assertWithMessage: "assert" Expression expression ":" Expression message ";"
|
||||
| @breakable expression: Expression!visit!nonEmptyBlock expression ";"
|
||||
| @breakable \visit: Label label Visit visit
|
||||
| @breakable \while: Label label "while" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration body
|
||||
| @breakable doWhile: Label label "do" Statement body "while" "(" Expression condition ")" ";"
|
||||
| @breakable @breakable{generators} \for: Label label "for" "(" {Expression ","}+ generators ")" Statement body
|
||||
| @breakable ifThen: Label label "if" "(" {Expression ","}+ conditions ")" Statement!variableDeclaration!functionDeclaration thenStatement () !>> "else"
|
||||
| @breakable ifThenElse: Label label "if" "(" {Expression ","}+ conditions ")" Statement thenStatement "else" Statement!variableDeclaration!functionDeclaration elseStatement
|
||||
| @breakable \switch: Label label "switch" "(" Expression expression ")" "{" Case+ cases "}"
|
||||
| @breakable \fail: "fail" Target target ";"
|
||||
| @breakable \break: "break" Target target ";"
|
||||
| @breakable \continue: "continue" Target target ";"
|
||||
| @breakable \filter: "filter" ";"
|
||||
| @breakable \solve: "solve" "(" {QualifiedName ","}+ variables Bound bound ")" Statement!variableDeclaration!functionDeclaration body
|
||||
| @breakable non-assoc \try: "try" Statement body Catch+ handlers
|
||||
| @breakable tryFinally: "try" Statement body Catch+ handlers "finally" Statement!variableDeclaration!functionDeclaration finallyBody
|
||||
| nonEmptyBlock: Label label "{" Statement+ statements "}"
|
||||
| emptyStatement: ";"
|
||||
| @breakable globalDirective: "global" Type type {QualifiedName ","}+ names ";"
|
||||
| @breakable assignment: Assignable assignable Assignment operator Statement!functionDeclaration!variableDeclaration statement
|
||||
| non-assoc (
|
||||
@breakable \return : "return" Statement!functionDeclaration!variableDeclaration statement
|
||||
| @breakable \throw : "throw" Statement!functionDeclaration!variableDeclaration statement
|
||||
| @breakable \insert : "insert" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement
|
||||
| @breakable \append : "append" DataTarget dataTarget Statement!functionDeclaration!variableDeclaration statement
|
||||
)
|
||||
| @breakable functionDeclaration: FunctionDeclaration functionDeclaration
|
||||
| @breakable variableDeclaration: LocalVariableDeclaration declaration ";"
|
||||
;
|
||||
|
||||
|
||||
syntax StructuredType
|
||||
= \default: BasicType basicType "[" {TypeArg ","}+ arguments "]" ;
|
||||
|
||||
lexical NonterminalLabel
|
||||
= [a-z] [0-9 A-Z _ a-z]* !>> [0-9 A-Z _ a-z] ;
|
||||
|
||||
syntax FunctionType
|
||||
= typeArguments: Type type "(" {TypeArg ","}* arguments ")" ;
|
||||
|
||||
syntax Case
|
||||
= @Foldable patternWithAction: "case" PatternWithAction patternWithAction
|
||||
| @Foldable \default: "default" ":" Statement statement ;
|
||||
|
||||
syntax Declarator
|
||||
= \default: Type type {Variable ","}+ variables ;
|
||||
|
||||
syntax Bound
|
||||
= \default: ";" Expression expression
|
||||
| empty: ;
|
||||
|
||||
keyword RascalKeywords
|
||||
= "o"
|
||||
| "syntax"
|
||||
| "keyword"
|
||||
| "lexical"
|
||||
| "int"
|
||||
| "break"
|
||||
| "continue"
|
||||
| "rat"
|
||||
| "true"
|
||||
| "bag"
|
||||
| "num"
|
||||
| "node"
|
||||
| "finally"
|
||||
| "private"
|
||||
| "real"
|
||||
| "list"
|
||||
| "fail"
|
||||
| "filter"
|
||||
| "if"
|
||||
| "tag"
|
||||
| BasicType
|
||||
| "extend"
|
||||
| "append"
|
||||
| "rel"
|
||||
| "lrel"
|
||||
| "void"
|
||||
| "non-assoc"
|
||||
| "assoc"
|
||||
| "test"
|
||||
| "anno"
|
||||
| "layout"
|
||||
| "data"
|
||||
| "join"
|
||||
| "it"
|
||||
| "bracket"
|
||||
| "in"
|
||||
| "import"
|
||||
| "false"
|
||||
| "all"
|
||||
| "dynamic"
|
||||
| "solve"
|
||||
| "type"
|
||||
| "try"
|
||||
| "catch"
|
||||
| "notin"
|
||||
| "else"
|
||||
| "insert"
|
||||
| "switch"
|
||||
| "return"
|
||||
| "case"
|
||||
| "while"
|
||||
| "str"
|
||||
| "throws"
|
||||
| "visit"
|
||||
| "tuple"
|
||||
| "for"
|
||||
| "assert"
|
||||
| "loc"
|
||||
| "default"
|
||||
| "map"
|
||||
| "alias"
|
||||
| "any"
|
||||
| "module"
|
||||
| "mod"
|
||||
| "bool"
|
||||
| "public"
|
||||
| "one"
|
||||
| "throw"
|
||||
| "set"
|
||||
| "start"
|
||||
| "datetime"
|
||||
| "value"
|
||||
;
|
||||
|
||||
syntax Type
|
||||
= bracket \bracket: "(" Type type ")"
|
||||
| user: UserType user
|
||||
| function: FunctionType function
|
||||
| structured: StructuredType structured
|
||||
| basic: BasicType basic
|
||||
| selector: DataTypeSelector selector
|
||||
| variable: TypeVar typeVar
|
||||
| symbol: Sym!nonterminal!labeled!parametrized!parameter symbol
|
||||
;
|
||||
|
||||
syntax Declaration
|
||||
= variable : Tags tags Visibility visibility Type type {Variable ","}+ variables ";"
|
||||
| annotation : Tags tags Visibility visibility "anno" Type annoType Type onType "@" Name name ";"
|
||||
| \alias : Tags tags Visibility visibility "alias" UserType user "=" Type base ";"
|
||||
| \tag : Tags tags Visibility visibility "tag" Kind kind Name name "on" {Type ","}+ types ";"
|
||||
| dataAbstract: Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters ";"
|
||||
| @Foldable \data : Tags tags Visibility visibility "data" UserType user CommonKeywordParameters commonKeywordParameters"=" {Variant "|"}+ variants ";"
|
||||
| function : FunctionDeclaration functionDeclaration
|
||||
;
|
||||
|
||||
syntax Class
|
||||
= simpleCharclass: "[" Range* ranges "]"
|
||||
| complement: "!" Class charClass
|
||||
> left difference: Class lhs "-" Class rhs
|
||||
> left intersection: Class lhs "&&" Class rhs
|
||||
> left union: Class lhs "||" Class rhs
|
||||
| bracket \bracket: "(" Class charclass ")" ;
|
||||
|
||||
lexical RegExpLiteral
|
||||
= "/" RegExp* "/" RegExpModifier ;
|
||||
|
||||
syntax FunctionModifiers
|
||||
= \modifierlist: FunctionModifier* modifiers ;
|
||||
|
||||
syntax Comprehension
|
||||
= @breakable{results,generators} \set: "{" {Expression ","}+ results "|" {Expression ","}+ generators "}"
|
||||
| @breakable{from,to,generators} \map: "(" Expression from ":" Expression to "|" {Expression ","}+ generators ")"
|
||||
| @breakable{results,generators} \list: "[" {Expression ","}+ results "|" {Expression ","}+ generators "]" ;
|
||||
|
||||
syntax Variant
|
||||
= nAryConstructor: Name name "(" {TypeArg ","}* arguments KeywordFormals keywordArguments ")" ;
|
||||
|
||||
syntax FunctionDeclaration
|
||||
= abstract: Tags tags Visibility visibility Signature signature ";"
|
||||
| @Foldable @breakable{expression} expression: Tags tags Visibility visibility Signature signature "=" Expression expression ";"
|
||||
| @Foldable @breakable{expression,conditions} conditional: Tags tags Visibility visibility Signature signature "=" Expression expression "when" {Expression ","}+ conditions ";"
|
||||
| @Foldable \default: Tags tags Visibility visibility Signature signature FunctionBody body ;
|
||||
|
||||
lexical PreProtocolChars
|
||||
= "|" URLChars "\<" ;
|
||||
|
||||
lexical NamedRegExp
|
||||
= "\<" Name "\>"
|
||||
| [\\] [/ \< \> \\]
|
||||
| NamedBackslash
|
||||
| ![/ \< \> \\] ;
|
||||
|
||||
syntax ProdModifier
|
||||
= associativity: Assoc associativity
|
||||
| \bracket: "bracket"
|
||||
| \tag: Tag tag;
|
||||
|
||||
syntax Toplevel
|
||||
= givenVisibility: Declaration declaration ;
|
||||
|
||||
lexical PostStringChars
|
||||
= @category="Constant" [\>] StringCharacter* [\"] ;
|
||||
|
||||
lexical HexIntegerLiteral
|
||||
= [0] [X x] [0-9 A-F a-f]+ !>> [0-9 A-Z _ a-z] ;
|
||||
|
||||
syntax TypeVar
|
||||
= free: "&" Name name
|
||||
| bounded: "&" Name name "\<:" Type bound ;
|
||||
|
||||
|
||||
|
||||
syntax BasicType
|
||||
= \value: "value"
|
||||
| \loc: "loc"
|
||||
| \node: "node"
|
||||
| \num: "num"
|
||||
| \type: "type"
|
||||
| \bag: "bag"
|
||||
| \int: "int"
|
||||
| rational: "rat"
|
||||
| relation: "rel"
|
||||
| listRelation: "lrel"
|
||||
| \real: "real"
|
||||
| \tuple: "tuple"
|
||||
| string: "str"
|
||||
| \bool: "bool"
|
||||
| \void: "void"
|
||||
| dateTime: "datetime"
|
||||
| \set: "set"
|
||||
| \map: "map"
|
||||
| \list: "list"
|
||||
;
|
||||
|
||||
lexical Char
|
||||
= @category="Constant" "\\" [\ \" \' \- \< \> \[ \\ \] b f n r t]
|
||||
| @category="Constant" ![\ \" \' \- \< \> \[ \\ \]]
|
||||
| @category="Constant" UnicodeEscape
|
||||
;
|
||||
|
||||
syntax Prod
|
||||
= reference: ":" Name referenced
|
||||
| labeled: ProdModifier* modifiers Name name ":" Sym* syms
|
||||
| others: "..."
|
||||
| unlabeled: ProdModifier* modifiers Sym* syms
|
||||
| @Foldable associativityGroup: Assoc associativity "(" Prod group ")"
|
||||
// | TODO add bracket rule for easy readability
|
||||
> left \all : Prod lhs "|" Prod rhs
|
||||
> left first : Prod lhs "\>" !>> "\>" Prod rhs
|
||||
;
|
||||
|
||||
syntax DateTimeLiteral
|
||||
= /*prefer()*/ dateLiteral: JustDate date
|
||||
| /*prefer()*/ timeLiteral: JustTime time
|
||||
| /*prefer()*/ dateAndTimeLiteral: DateAndTime dateAndTime ;
|
||||
|
||||
lexical PrePathChars
|
||||
= URLChars "\<" ;
|
||||
|
||||
syntax Mapping[&T]
|
||||
= \default: &T!ifDefinedOtherwise from ":" &T to
|
||||
;
|
||||
|
||||
lexical MidPathChars
|
||||
= "\>" URLChars "\<" ;
|
||||
|
||||
/*
|
||||
Note that Pattern must closely follow the definitions of Expression because eventually
|
||||
these two non-terminals will be fused just before AST generation.
|
||||
*/
|
||||
syntax Pattern
|
||||
= \set : "{" {Pattern ","}* elements0 "}"
|
||||
| \list : "[" {Pattern ","}* elements0 "]"
|
||||
| qualifiedName : QualifiedName qualifiedName
|
||||
| multiVariable : QualifiedName qualifiedName "*"
|
||||
| splice : "*" Pattern argument
|
||||
| splicePlus : "+" Pattern argument
|
||||
| negative : "-" Pattern argument
|
||||
| literal : Literal literal
|
||||
| \tuple : "\<" {Pattern ","}+ elements "\>"
|
||||
| typedVariable : Type type Name name
|
||||
| \map : "(" {Mapping[Pattern] ","}* mappings ")"
|
||||
| reifiedType : "type" "(" Pattern symbol "," Pattern definitions ")"
|
||||
| callOrTree : Pattern expression "(" {Pattern ","}* arguments KeywordArguments[Pattern] keywordArguments ")"
|
||||
> variableBecomes : Name name ":" Pattern pattern
|
||||
| asType : "[" Type type "]" Pattern argument
|
||||
| descendant : "/" Pattern pattern
|
||||
| anti : "!" Pattern pattern
|
||||
| typedVariableBecomes: Type type Name name ":" Pattern pattern
|
||||
;
|
||||
|
||||
syntax Tag
|
||||
= @Folded @category="Comment" \default : "@" Name name TagString contents
|
||||
| @Folded @category="Comment" empty : "@" Name name
|
||||
| @Folded @category="Comment" expression: "@" Name name "=" Expression expression !>> "@";
|
||||
|
||||
syntax ModuleActuals
|
||||
= \default: "[" {Type ","}+ types "]" ;
|
||||
8
samples/Rascal/Syntax.rsc
Normal file
8
samples/Rascal/Syntax.rsc
Normal file
@@ -0,0 +1,8 @@
|
||||
module Syntax
|
||||
|
||||
extend lang::std::Layout;
|
||||
extend lang::std::Id;
|
||||
|
||||
start syntax Machine = machine: State+ states;
|
||||
syntax State = @Foldable state: "state" Id name Trans* out;
|
||||
syntax Trans = trans: Id event ":" Id to;
|
||||
44
samples/Ruby/any.spec
Normal file
44
samples/Ruby/any.spec
Normal file
@@ -0,0 +1,44 @@
|
||||
require File.dirname(File.expand_path(__FILE__)) + '/../spec_helper'
|
||||
|
||||
describe Spira::Types::Any do
|
||||
|
||||
before :all do
|
||||
@uri = RDF::URI('http://example.org')
|
||||
end
|
||||
|
||||
# this spec is going to be necessarily loose. The 'Any' type is defined to
|
||||
# use RDF.rb's automatic RDF Literal boxing and unboxing, which may or may
|
||||
# not change between verions.
|
||||
#
|
||||
context "when serializing" do
|
||||
it "should serialize literals to RDF Literals" do
|
||||
serialized = Spira::Types::Any.serialize(15)
|
||||
serialized.should be_a RDF::Literal
|
||||
serialized = Spira::Types::Any.serialize("test")
|
||||
serialized.should be_a RDF::Literal
|
||||
end
|
||||
|
||||
it "should keep RDF::URIs as URIs" do
|
||||
Spira::Types::Any.serialize(@uri).should == @uri
|
||||
end
|
||||
|
||||
it "should fail to serialize collections" do
|
||||
lambda { Spira::Types::Any.serialize([]) }.should raise_error TypeError
|
||||
end
|
||||
end
|
||||
|
||||
context "when unserializing" do
|
||||
it "should unserialize to ruby types" do
|
||||
value = Spira::Types::Any.unserialize(RDF::Literal.new(5, :datatype => RDF::XSD.integer))
|
||||
value.should == 5
|
||||
value = Spira::Types::Any.unserialize(RDF::Literal.new("a string"))
|
||||
value.should == "a string"
|
||||
end
|
||||
|
||||
it "should unserialize URIs to URIs" do
|
||||
Spira::Types::Any.unserialize(@uri).should == @uri
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
75
samples/Ruby/filenames/Dangerfile
Normal file
75
samples/Ruby/filenames/Dangerfile
Normal file
@@ -0,0 +1,75 @@
|
||||
# Sometimes its a README fix, or something like that - which isn't relevant for
|
||||
# including in a CHANGELOG for example
|
||||
# From https://github.com/danger/danger/blob/master/Dangerfile
|
||||
|
||||
has_app_changes = !git.modified_files.grep(/lib/).empty?
|
||||
has_test_changes = !git.modified_files.grep(/spec/).empty?
|
||||
is_version_bump = git.modified_files.sort == ["CHANGELOG.md", "lib/danger/version.rb"].sort
|
||||
|
||||
if has_app_changes && !has_test_changes && !is_version_bump
|
||||
warn("Tests were not updated", sticky: false)
|
||||
end
|
||||
|
||||
# Thanks other people!
|
||||
message(":tada:") if is_version_bump && github.pr_author != "orta"
|
||||
|
||||
# Make a note about contributors not in the organization
|
||||
unless github.api.organization_member?('danger', github.pr_author)
|
||||
message "@#{github.pr_author} is not a contributor yet, would you like to join the Danger org?"
|
||||
|
||||
# Pay extra attention if they modify the gemspec
|
||||
if git.modified_files.include?("*.gemspec")
|
||||
warn "External contributor has edited the Gemspec"
|
||||
end
|
||||
end
|
||||
|
||||
# Mainly to encourage writing up some reasoning about the PR, rather than
|
||||
# just leaving a title
|
||||
if github.pr_body.length < 5
|
||||
fail "Please provide a summary in the Pull Request description"
|
||||
end
|
||||
|
||||
# Let people say that this isn't worth a CHANGELOG entry in the PR if they choose
|
||||
declared_trivial = (github.pr_title + github.pr_body).include?("#trivial") || !has_app_changes
|
||||
|
||||
if !git.modified_files.include?("CHANGELOG.md") && !declared_trivial
|
||||
fail("Please include a CHANGELOG entry. \nYou can find it at [CHANGELOG.md](https://github.com/danger/danger/blob/master/CHANGELOG.md).", sticky: false)
|
||||
end
|
||||
|
||||
# Docs are critical, so let's re-run the docs part of the specs and show any issues:
|
||||
core_plugins_docs = `bundle exec danger plugins lint lib/danger/danger_core/plugins/*.rb --warnings-as-errors`
|
||||
|
||||
# If it failed, fail the build, and include markdown with the output error.
|
||||
unless $?.success?
|
||||
# We want to strip ANSI colors for our markdown, and make paths relative
|
||||
colourless_error = core_plugins_docs.gsub(/\e\[(\d+)(;\d+)*m/, "")
|
||||
markdown("### Core Docs Errors \n\n#{colourless_error}")
|
||||
fail("Failing due to documentation issues, see below.", sticky: false)
|
||||
end
|
||||
|
||||
# Oddly enough, it's quite possible to do some testing of Danger, inside Danger
|
||||
# So, you can ignore these, if you're looking at the Dangerfile to get ideas.
|
||||
#
|
||||
# If these are all empty something has gone wrong, better to raise it in a comment
|
||||
if git.modified_files.empty? && git.added_files.empty? && git.deleted_files.empty?
|
||||
fail "This PR has no changes at all, this is likely an issue during development."
|
||||
end
|
||||
|
||||
# This comes from `./danger_plugins/protect_files.rb` which is automatically parsed by Danger
|
||||
files.protect_files(path: "danger.gemspec", message: ".gemspec modified", fail_build: false)
|
||||
|
||||
# Ensure that our core plugins all have 100% documentation
|
||||
core_plugins = Dir.glob("lib/danger/danger_core/plugins/*.rb")
|
||||
core_lint_output = `bundle exec yard stats #{core_plugins.join ' '} --list-undoc --tag tags`
|
||||
|
||||
if !core_lint_output.include?("100.00%")
|
||||
fail "The core plugins are not at 100% doc'd - see below:", sticky: false
|
||||
markdown "```\n#{core_lint_output}```"
|
||||
elsif core_lint_output.include? "warning"
|
||||
warn "The core plugins are have yard warnings - see below", sticky: false
|
||||
markdown "```\n#{core_lint_output}```"
|
||||
end
|
||||
|
||||
junit.parse "junit-results.xml"
|
||||
junit.headers = [:file, :name]
|
||||
junit.report
|
||||
8
samples/Smalltalk/baselineDependency.st
Normal file
8
samples/Smalltalk/baselineDependency.st
Normal file
@@ -0,0 +1,8 @@
|
||||
dependencies
|
||||
neoJSON: spec
|
||||
spec
|
||||
configuration: 'NeoJSON'
|
||||
with: [ spec
|
||||
className: 'ConfigurationOfNeoJSON';
|
||||
version: #stable;
|
||||
repository: 'http://smalltalkhub.com/mc/SvenVanCaekenberghe/Neo/main' ]
|
||||
8
samples/Smalltalk/categories.st
Normal file
8
samples/Smalltalk/categories.st
Normal file
@@ -0,0 +1,8 @@
|
||||
SystemOrganization addCategory: #ChartJs!
|
||||
SystemOrganization addCategory: 'ChartJs-Component'!
|
||||
SystemOrganization addCategory: 'ChartJs-Demo'!
|
||||
SystemOrganization addCategory: 'ChartJs-Exception'!
|
||||
SystemOrganization addCategory: 'ChartJs-Library'!
|
||||
SystemOrganization addCategory: 'ChartJs-Model'!
|
||||
SystemOrganization addCategory: 'ChartJs-Style'!
|
||||
SystemOrganization addCategory: 'ChartJs-Types'!
|
||||
9
samples/Smalltalk/renderSeasideExampleOn..st
Normal file
9
samples/Smalltalk/renderSeasideExampleOn..st
Normal file
@@ -0,0 +1,9 @@
|
||||
rendering
|
||||
renderTitleId: divId on: html
|
||||
^ html div
|
||||
id: #title , divId;
|
||||
class: #aClass;
|
||||
with: [
|
||||
html heading
|
||||
level3;
|
||||
with: self data title ]
|
||||
11
samples/Smalltalk/scriptWithPragma.st
Normal file
11
samples/Smalltalk/scriptWithPragma.st
Normal file
@@ -0,0 +1,11 @@
|
||||
helpers
|
||||
installGitFileTree
|
||||
"GitFileTree is the tool we will use to commit on GitHub."
|
||||
|
||||
<script>
|
||||
Metacello new
|
||||
baseline: 'FileTree';
|
||||
repository:
|
||||
'github://dalehenrich/filetree:pharo' , SystemVersion current dottedMajorMinor
|
||||
, '_dev/repository';
|
||||
load: 'Git'
|
||||
3
samples/Smalltalk/smallMethod.st
Normal file
3
samples/Smalltalk/smallMethod.st
Normal file
@@ -0,0 +1,3 @@
|
||||
ChartJs
|
||||
dataFunction
|
||||
^ 'bars'
|
||||
14
samples/Sublime Text Config/AMPL.sublime-build
Normal file
14
samples/Sublime Text Config/AMPL.sublime-build
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"cmd": ["ampl", "${file_path}/${file_base_name}.run"],
|
||||
"file_regex": "^(?:[(]file )*[ ]*(...*?), line ([0-9]*)",
|
||||
"selector": "source.ampl",
|
||||
|
||||
"osx":
|
||||
{
|
||||
"env":
|
||||
{
|
||||
// "ILOG_LICENSE_FILE": "path/to/access.ilm"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
8
samples/Sublime Text Config/CLIPS.sublime-settings
Normal file
8
samples/Sublime Text Config/CLIPS.sublime-settings
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extensions":
|
||||
[
|
||||
"clp"
|
||||
],
|
||||
"tab_size": 8,
|
||||
"translate_tabs_to_spaces": false
|
||||
}
|
||||
13
samples/Sublime Text Config/Context.sublime-menu
Normal file
13
samples/Sublime Text Config/Context.sublime-menu
Normal file
@@ -0,0 +1,13 @@
|
||||
[
|
||||
{
|
||||
"id" : "nasm",
|
||||
"caption": "NASM Assembly",
|
||||
"children":
|
||||
[
|
||||
{
|
||||
"caption" : "Documentation",
|
||||
"command" : "assembly_doc"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
30
samples/Sublime Text Config/Dart.sublime-commands
Normal file
30
samples/Sublime Text Config/Dart.sublime-commands
Normal file
@@ -0,0 +1,30 @@
|
||||
[
|
||||
{ "caption": "Dart: Polymer: Generate Element", "command": "dart_generate_polymer_element" },
|
||||
{ "caption": "Dart: Polymer: Add Entry Point", "command": "dart_add_polymer_entry_point" },
|
||||
|
||||
{ "caption": "Dart: Check Configuration", "command": "dart_check_config" },
|
||||
{ "caption": "Dart: Browse API Reference", "command": "dart_open_browser", "args": {"url": "https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/home" } },
|
||||
{ "caption": "Dart: Set Default User Browser", "command": "dart_show_user_browsers" },
|
||||
|
||||
{ "caption": "Preferences: Dart Settings - Default", "command": "dart_open_settings", "args": {"kind": "default"} },
|
||||
{ "caption": "Preferences: Dart Settings - User", "command": "dart_open_settings", "args": {"kind": "user"} },
|
||||
{ "caption": "Preferences: Dart Settings - File Type (User)", "command": "dart_open_settings", "args": {"kind": "user", "scope": "file_type"} },
|
||||
|
||||
{ "caption": "Dart: Run", "command": "dart_smart_run" },
|
||||
{ "caption": "Dart: Run (This File)", "command": "dart_smart_run", "args": {"force_update": true} },
|
||||
{ "caption": "Dart: Stop", "command": "dart_smart_run", "args": {"kill_only": true} },
|
||||
|
||||
{ "caption": "Dart: Run In Observatory (This File)", "command": "dart_run_in_observatory" },
|
||||
|
||||
{ "caption": "Dart: Show Output Panel", "command": "show_panel", "args": {"panel": "output.dart.out"} },
|
||||
{ "caption": "Dart: Show Errors Panel", "command": "show_panel", "args": {"panel": "output.dart.errors"} },
|
||||
|
||||
{ "caption": "Dart: Format", "command": "dart_format" },
|
||||
|
||||
{ "caption": "Dart: Generate Documentation", "command": "dart_generate_docs" },
|
||||
{ "caption": "Dart: Serve Documentation", "command": "dart_serve_docs" },
|
||||
|
||||
{ "caption": "Dart: Stagehand", "command": "dart_stagehand_wizard" },
|
||||
|
||||
{ "caption": "Dart: Pub Get", "command": "dart_pub_get" }
|
||||
]
|
||||
40
samples/Sublime Text Config/Dart.sublime-project
Normal file
40
samples/Sublime Text Config/Dart.sublime-project
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"folders":
|
||||
[
|
||||
{
|
||||
"follow_symlinks": true,
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
|
||||
"SublimeLinter":
|
||||
{
|
||||
"@python": 3.4
|
||||
},
|
||||
|
||||
"build_systems":
|
||||
[
|
||||
{
|
||||
"name": "Run",
|
||||
"shell_cmd": "\"$project_path/scripts/build.sh\"",
|
||||
"windows":
|
||||
{
|
||||
"shell_cmd": "powershell -noninteractive -file \"$project_path\\build.ps1\""
|
||||
},
|
||||
"working_dir": "${project_path}",
|
||||
|
||||
"variants": [
|
||||
{
|
||||
"name": "Dart: Test (All)",
|
||||
"target": "run_dart_tests",
|
||||
},
|
||||
|
||||
{
|
||||
"name": "Dart: Test (This File Only)",
|
||||
"target": "run_dart_tests",
|
||||
"active_file_only": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"button": "button1", "count": 1, "modifiers": ["alt"],
|
||||
"press_command": "drag_select",
|
||||
"command": "robot_go_to_keyword"
|
||||
}
|
||||
]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user