mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			210 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 | ||
| 
						 | 
					abf7bee464 | ||
| 
						 | 
					e73a4ecd0e | ||
| 
						 | 
					70779c9986 | ||
| 
						 | 
					b61fe90d12 | ||
| 
						 | 
					e6c849d92c | ||
| 
						 | 
					22d4865c52 | ||
| 
						 | 
					3247d46e81 | ||
| 
						 | 
					be316c2943 | ||
| 
						 | 
					68c45be47d | ||
| 
						 | 
					4584963dd2 | ||
| 
						 | 
					f382abc2f3 | ||
| 
						 | 
					9d57e1e1b5 | ||
| 
						 | 
					2a4150b104 | ||
| 
						 | 
					09612ae42e | ||
| 
						 | 
					49e9ee48d0 | ||
| 
						 | 
					a8719f3e82 | ||
| 
						 | 
					00647be113 | ||
| 
						 | 
					48b64c2d31 | ||
| 
						 | 
					f95365946c | ||
| 
						 | 
					b056df06f4 | ||
| 
						 | 
					6bf223e641 | ||
| 
						 | 
					fa817b6a1d | ||
| 
						 | 
					789607d9bc | ||
| 
						 | 
					d46530989c | ||
| 
						 | 
					3c5bcb434c | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,6 @@
 | 
			
		||||
/Gemfile.lock
 | 
			
		||||
.bundle/
 | 
			
		||||
.idea
 | 
			
		||||
benchmark/
 | 
			
		||||
lib/linguist/samples.json
 | 
			
		||||
/grammars
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -22,9 +22,9 @@
 | 
			
		||||
[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
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -779,9 +770,6 @@
 | 
			
		||||
[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
 | 
			
		||||
@@ -791,3 +779,34 @@
 | 
			
		||||
[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,19 +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. See `script/set-language-ids` for more information. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
 | 
			
		||||
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!
 | 
			
		||||
@@ -82,9 +79,14 @@ 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:
 | 
			
		||||
 | 
			
		||||
@@ -113,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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								grammars.yml
									
									
									
									
									
								
							@@ -4,6 +4,8 @@ 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:
 | 
			
		||||
@@ -20,6 +22,8 @@ vendor/grammars/ColdFusion:
 | 
			
		||||
- text.html.cfm
 | 
			
		||||
vendor/grammars/Docker.tmbundle:
 | 
			
		||||
- source.dockerfile
 | 
			
		||||
vendor/grammars/EBNF.tmbundle:
 | 
			
		||||
- source.ebnf
 | 
			
		||||
vendor/grammars/Elm/Syntaxes:
 | 
			
		||||
- source.elm
 | 
			
		||||
- text.html.mediawiki.elm-build-output
 | 
			
		||||
@@ -47,6 +51,8 @@ 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
 | 
			
		||||
@@ -103,8 +109,6 @@ 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:
 | 
			
		||||
@@ -136,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
 | 
			
		||||
@@ -358,10 +362,19 @@ vendor/grammars/language-csound:
 | 
			
		||||
- 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
 | 
			
		||||
@@ -377,6 +390,7 @@ 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:
 | 
			
		||||
@@ -388,6 +402,8 @@ 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:
 | 
			
		||||
@@ -414,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
 | 
			
		||||
@@ -467,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:
 | 
			
		||||
@@ -524,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:
 | 
			
		||||
@@ -646,7 +662,5 @@ vendor/grammars/xc.tmbundle:
 | 
			
		||||
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,7 +150,7 @@ module Linguist
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end)\s|\s*!)/i
 | 
			
		||||
    fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end|data)\s|\s*!)/i
 | 
			
		||||
 | 
			
		||||
    disambiguate ".f" do |data|
 | 
			
		||||
      if /^: /.match(data)
 | 
			
		||||
@@ -202,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
 | 
			
		||||
 | 
			
		||||
@@ -242,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"]
 | 
			
		||||
@@ -252,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"]
 | 
			
		||||
 
 | 
			
		||||
@@ -267,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
 | 
			
		||||
 | 
			
		||||
@@ -300,6 +301,8 @@ 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
 | 
			
		||||
@@ -397,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
 | 
			
		||||
@@ -573,6 +601,8 @@ 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),
 | 
			
		||||
 
 | 
			
		||||
										
											
												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.11"
 | 
			
		||||
  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")
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
							
								
								
									
										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.")
 | 
			
		||||
							
								
								
									
										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
											
										
									
								
							
							
								
								
									
										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;
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
	}
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										6
									
								
								samples/Sublime Text Config/Default.sublime-keymap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Sublime Text Config/Default.sublime-keymap
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
[
 | 
			
		||||
	// Disable auto-pair for single quote
 | 
			
		||||
	{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'"}, "context":
 | 
			
		||||
		[{ "key": "selector", "operator": "equal", "operand": "source.rust" }]
 | 
			
		||||
	}
 | 
			
		||||
]
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
[
 | 
			
		||||
	{"command": "move_to", "args": {"to": "hardeol"}},
 | 
			
		||||
	{"command": "insert", "args": {"characters": "\n"}},
 | 
			
		||||
	{"command": "insert", "args": {"characters": "*"}},
 | 
			
		||||
	{"command": "insert", "args": {"characters": " "}}
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										5
									
								
								samples/Sublime Text Config/RunBuild.sublime-macro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								samples/Sublime Text Config/RunBuild.sublime-macro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
[
 | 
			
		||||
	{
 | 
			
		||||
		"command": "haxe_run_build"
 | 
			
		||||
	}
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										19
									
								
								samples/Sublime Text Config/SourcePawn.sublime-build
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Sublime Text Config/SourcePawn.sublime-build
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
	// For default sourcemod scripting directory :
 | 
			
		||||
	"cmd": ["<spcomp_path>", "-o$file_path/../plugins/$file_name", "$file"],
 | 
			
		||||
 | 
			
		||||
	// For custom sourcemod  scripting directory :
 | 
			
		||||
	"cmd": ["<spcomp_path>", "-i<include_path>", "-o$file_path/$file_base_name.smx", "$file"],
 | 
			
		||||
 | 
			
		||||
	// Windows example:
 | 
			
		||||
	"cmd": ["X:/somefolder/spcomp", "-iX:/somefolder", "-o$file_path/$file_base_name.smx", "$file"],
 | 
			
		||||
	"cmd": ["X:/game/csgo/addons/sourcemod/scripting/spcomp", "-o$file_path/../plugins/$file_name", "$file"],
 | 
			
		||||
 | 
			
		||||
	// Linux or OSX example:
 | 
			
		||||
	"cmd": ["/home/User/sm/spcomp", "-i/home/User/sm/include", "-o$file_path/$file_base_name.smx", "$file"],
 | 
			
		||||
	"cmd": ["/home/User/game/csgo/addons/sourcemod/scripting/spcomp", "-o$file_path/../plugins/$file_name", "$file"],
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	"file_regex": "(.*)\\((\\d+)\\) :",
 | 
			
		||||
	"selector": "source.sp"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										861
									
								
								samples/Sublime Text Config/Tubnil.sublime-theme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										861
									
								
								samples/Sublime Text Config/Tubnil.sublime-theme
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,861 @@
 | 
			
		||||
[
 | 
			
		||||
	//	Tubnil theme for Sublime Text 2
 | 
			
		||||
	//	https://github.com/nilium/st2-nil-theme
 | 
			
		||||
	//
 | 
			
		||||
	//	TABS
 | 
			
		||||
	//	==========================================================
 | 
			
		||||
	//	- Tabset
 | 
			
		||||
	//	------------------------------------------------------
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tabset_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tabset-bg.png",
 | 
			
		||||
		"layer0.inner_margin": [2, 6],
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [-13, 0, -13,-6], // left, top, right, bottom
 | 
			
		||||
		"tab_overlap": 25,
 | 
			
		||||
		"tab_width": 150,
 | 
			
		||||
		"tab_min_width": 50,
 | 
			
		||||
		"tab_height": 35,
 | 
			
		||||
		"mouse_wheel_switch": false
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tabset_control",
 | 
			
		||||
		"settings": ["mouse_wheel_switches_tabs"],
 | 
			
		||||
		"mouse_wheel_switch": true
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Tab element
 | 
			
		||||
	//	------------------------------------------------------
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_control",
 | 
			
		||||
		"content_margin": [25, 0, 25, 0],
 | 
			
		||||
		"max_margin_trim": 0,
 | 
			
		||||
		"hit_test_level": 0.5,
 | 
			
		||||
 | 
			
		||||
		//	- Inactive tab settings
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-inactive.png",
 | 
			
		||||
		"layer0.inner_margin": [23, 8],
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
 | 
			
		||||
		//	- Active tab setting
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-active.png",
 | 
			
		||||
		"layer1.inner_margin": [23, 8],
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
 | 
			
		||||
		//	- Hover tab setting
 | 
			
		||||
		"layer2.texture": "SourcePawn/assets/tab-hover.png",
 | 
			
		||||
		"layer2.inner_margin": [23, 8],
 | 
			
		||||
		"layer2.opacity": 0.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Tab close state
 | 
			
		||||
		"class": "tab_control",
 | 
			
		||||
		"settings": ["show_tab_close_buttons"],
 | 
			
		||||
		"content_margin": [20, 0, 20, 7]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Hover tab state
 | 
			
		||||
		"class": "tab_control",
 | 
			
		||||
		"attributes": ["hover"],
 | 
			
		||||
		"layer2.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Active tab state
 | 
			
		||||
		"class": "tab_control",
 | 
			
		||||
		"attributes": ["selected"],
 | 
			
		||||
		"layer0.opacity": 0.0,
 | 
			
		||||
		"layer1.opacity": 1.0,
 | 
			
		||||
		"layer2.opacity": 0.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//  - Modified tab state
 | 
			
		||||
		"class": "tab_control",
 | 
			
		||||
		//"settings": ["highlight_modified_tabs"],
 | 
			
		||||
		"attributes": ["dirty"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-inactive-modified.png",
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-active-modified.png",
 | 
			
		||||
		"layer2.texture": "SourcePawn/assets/tab-hover-dirty.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Tab labels
 | 
			
		||||
	//	------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	//	- Inactive tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"fg": [180, 180, 180],
 | 
			
		||||
		"shadow_color": [0, 0, 0, 200],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Active tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["selected"]}],
 | 
			
		||||
		"shadow_color": [0, 0, 0, 165],
 | 
			
		||||
		"shadow_offset": [0, 1],
 | 
			
		||||
		"fg": [240, 240, 240, 255]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Hover tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["hover"]}],
 | 
			
		||||
		"shadow_color": [0, 0, 0, 165],
 | 
			
		||||
		"shadow_offset": [0, 1],
 | 
			
		||||
		"fg": [2, 196, 251, 255]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Dirty Hover tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["hover", "dirty"]}],
 | 
			
		||||
		"shadow_color": [0, 0, 0, 165],
 | 
			
		||||
		"shadow_offset": [0, 1],
 | 
			
		||||
		"fg": [253, 113, 1, 255]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	// - Dirty inactive tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["dirty"]}],
 | 
			
		||||
		"settings": ["highlight_modified_tabs"]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	// - Dirty active tab label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_label",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["selected", "dirty"]}],
 | 
			
		||||
		"settings": ["highlight_modified_tabs"]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Tab buttons
 | 
			
		||||
	//	------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	//	- Tab button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"content_margin": [0, 0],
 | 
			
		||||
 | 
			
		||||
		//	- Tab close default settings
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close.png",
 | 
			
		||||
		"layer1.opacity": 0.0, // hide by default
 | 
			
		||||
		"layer1.inner_margin": 0.0,
 | 
			
		||||
 | 
			
		||||
		//	- Tab close hover settings
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
 | 
			
		||||
		"layer0.opacity": 0.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Tab button size
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"settings": ["show_tab_close_buttons"],
 | 
			
		||||
		"content_margin": [8, 8]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["dirty"]}],
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Tab close hover action
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"parents": [{"class": "tab_control", "attributes": ["hover"]}],
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Tab close press action
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"attributes": ["hover"],
 | 
			
		||||
		"layer1.opacity": 0.4,
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	- Tab close press action
 | 
			
		||||
		"class": "tab_close_button",
 | 
			
		||||
		"attributes": ["pressed"],
 | 
			
		||||
		"layer1.opacity": 1.0,
 | 
			
		||||
		"layer0.opacity": 0.0
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	FOLD BUTTONS
 | 
			
		||||
//	==========================================================
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		"class": "fold_button_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/arrow-right.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": 0,
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/arrow-right-hover.png",
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
		"layer1.inner_margin": 0,
 | 
			
		||||
		"content_margin": [9, 7, 8, 6]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "fold_button_control",
 | 
			
		||||
		"attributes": ["hover"],
 | 
			
		||||
		"layer0.opacity": 0.0,
 | 
			
		||||
		"layer1.opacity": 0.75
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "fold_button_control",
 | 
			
		||||
		"attributes": ["pressed"],
 | 
			
		||||
		"layer0.opacity": 0.0,
 | 
			
		||||
		"layer1.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "fold_button_control",
 | 
			
		||||
		"attributes": ["expanded"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/arrow-down.png",
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/arrow-down-hover.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	SCROLLBARS (overlay scrollbars from Default theme)
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_bar_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/scrollbar/well-vertical.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [1, 1],
 | 
			
		||||
		"blur": false
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_bar_control",
 | 
			
		||||
		"attributes": ["horizontal"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/scrollbar/well-horizontal.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [1, 1],
 | 
			
		||||
		"blur": false
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_corner_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/scrollbar/well-corner.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [1, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/scrollbar/bar-vertical.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [3, 3],
 | 
			
		||||
		"content_margin": [6, 6],
 | 
			
		||||
		"blur": false
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"attributes": ["horizontal"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/scrollbar/bar-horizontal.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_area_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"overlay": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_area_control",
 | 
			
		||||
		"settings": ["!overlay_scroll_bars"],
 | 
			
		||||
		"overlay": false
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_bar_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_bar_vertical.png",
 | 
			
		||||
		"layer0.inner_margin": [0, 5],
 | 
			
		||||
		"blur": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "scroll_bar_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"attributes": ["horizontal"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_bar_horizontal.png",
 | 
			
		||||
		"layer0.inner_margin": [5, 0],
 | 
			
		||||
		"blur": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_thumb_vertical.png",
 | 
			
		||||
		"layer0.inner_margin": [0, 5],
 | 
			
		||||
		"content_margin": [5, 20],
 | 
			
		||||
		"blur": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"attributes": ["horizontal"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_thumb_horizontal.png",
 | 
			
		||||
		"layer0.inner_margin": [5, 0],
 | 
			
		||||
		"content_margin": [20, 5],
 | 
			
		||||
		"blur": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"attributes": ["dark"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_dark_thumb_vertical.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "puck_control",
 | 
			
		||||
		"settings": ["overlay_scroll_bars"],
 | 
			
		||||
		"attributes": ["horizontal", "dark"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay/overlay_dark_thumb_horizontal.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	EMPTY WINDOW BACKGROUND
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sheet_container_control",
 | 
			
		||||
		"layer0.tint": [16, 16, 16],
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	GRID LAYOUT
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "grid_layout_control",
 | 
			
		||||
		"border_size": 1,
 | 
			
		||||
		"border_color": [32, 32, 32]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	MINI MAP
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "minimap_control",
 | 
			
		||||
		"viewport_color": [185, 185, 185, 50]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	LABELS
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	// 	- General labels
 | 
			
		||||
	{
 | 
			
		||||
		"class": "label_control",
 | 
			
		||||
		"color": [230, 230, 230]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Text field labels
 | 
			
		||||
	{
 | 
			
		||||
		"class": "label_control",
 | 
			
		||||
		"parents": [{"class": "panel_control"}],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Button labels
 | 
			
		||||
	{
 | 
			
		||||
		"class": "label_control",
 | 
			
		||||
		"parents": [{"class": "button_control"}],
 | 
			
		||||
		"color": [230, 230, 230],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	TOOLTIP
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	//	- Tooltip container
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tool_tip_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tooltip.png",
 | 
			
		||||
		"layer0.inner_margin": [4, 4],
 | 
			
		||||
		"layer0.opacity": 1,
 | 
			
		||||
		"content_margin": [6, 4]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Tooltip content
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tool_tip_label_control",
 | 
			
		||||
		"color": [160, 160, 160],
 | 
			
		||||
		"shadow_offset": [0, 1],
 | 
			
		||||
		"shadow_color": [0, 0, 0, 255]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	STATUS BAR
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	//	- Status bar container
 | 
			
		||||
	{
 | 
			
		||||
		"class": "status_bar",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/status-bar-bg.png",
 | 
			
		||||
		"layer0.opacity": 1,
 | 
			
		||||
		"layer0.inner_margin": [2, 2],
 | 
			
		||||
		"content_margin": [6, 5, 6, 5]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "status_button",
 | 
			
		||||
		"min_size": [100, 0]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Status bar label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "label_control",
 | 
			
		||||
		"parents": [{"class": "status_bar"}],
 | 
			
		||||
		"font.size": 10,
 | 
			
		||||
		"color": [160, 160, 160],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	SIDEBAR
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	//	- Sidebar container (border)
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_container",
 | 
			
		||||
		"layer0.tint": [150, 150, 150],
 | 
			
		||||
		"layer0.opacity": 0.5,
 | 
			
		||||
		"layer0.draw_center": false,
 | 
			
		||||
		"layer0.inner_margin": [0, 0, 1, 0],
 | 
			
		||||
		"content_margin": [0, 0, 1, 0]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar tree (bg)
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_tree",
 | 
			
		||||
		"row_padding": [8, 3],
 | 
			
		||||
		"indent": 15,
 | 
			
		||||
		"indent_offset": 13,
 | 
			
		||||
		"indent_top_level": false,
 | 
			
		||||
		"layer0.tint": [19, 20, 21],	// darker gray
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"dark_content": true
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar rows
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tree_row",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/row-active.png",
 | 
			
		||||
		"layer0.opacity": 0.0,
 | 
			
		||||
		"layer0.inner_margin": [8, 3],
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
		"layer1.inner_margin": [8, 3]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar row selected
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tree_row",
 | 
			
		||||
		"attributes": ["selected"],
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	// - Sidebar row dirty
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tree_row",
 | 
			
		||||
		"attributes": ["dirty"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/row-inactive-modified.png",
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	// - Sidebar row selected dirty
 | 
			
		||||
	{
 | 
			
		||||
		"class": "tree_row",
 | 
			
		||||
		"attributes": ["selected", "dirty"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/row-active-modified.png",
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar heading
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_heading",
 | 
			
		||||
		"color": [2, 196, 251],
 | 
			
		||||
		"font.bold": true,
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_heading",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["selected"]}],
 | 
			
		||||
		"color": [180, 180, 180]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar entry label
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_label",
 | 
			
		||||
		"color": [200, 200, 200],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "sidebar_label",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["expandable"]}],
 | 
			
		||||
		"settings": ["bold_folder_labels"],
 | 
			
		||||
		"font.bold": true
 | 
			
		||||
	},
 | 
			
		||||
	{	//	Sidebar selected entry label
 | 
			
		||||
		"class": "sidebar_label",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["selected"]}],
 | 
			
		||||
		"color": [240, 240, 240],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{	//	Sidebar Hover entry label
 | 
			
		||||
		"class": "sidebar_label",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["hover"]}],
 | 
			
		||||
		"color": [2, 196, 251],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{	//	Sidebar Hover entry label
 | 
			
		||||
		"class": "sidebar_label",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["dirty"]}],
 | 
			
		||||
		"color": [253, 113, 1],
 | 
			
		||||
		"shadow_color": [0, 0, 0],
 | 
			
		||||
		"shadow_offset": [0, 1]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Sidebar open files close/dirty
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
 | 
			
		||||
		"layer0.opacity": 0.5,
 | 
			
		||||
		"layer0.inner_margin": 4,
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
		"layer1.texture":  "SourcePawn/assets/tab-button-close.png",
 | 
			
		||||
		"layer1.inner_margin": 4,
 | 
			
		||||
		"content_margin": [8, 8]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"attributes": ["dirty"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-button-dirty.png",
 | 
			
		||||
		"layer0.opacity": 0.5
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"attributes": ["hover"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/tab-button-close-hover.png",
 | 
			
		||||
		"layer1.opacity": 0.5,
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"attributes": ["hover", "dirty"],
 | 
			
		||||
		"layer1.opacity": 0.5,
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"attributes": ["pressed"],
 | 
			
		||||
		"layer1.opacity": 1.0,
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "close_button",
 | 
			
		||||
		"attributes": ["pressed", "dirty"],
 | 
			
		||||
		"layer1.opacity": 1.0,
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/tab-button-close-dirty.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Sidebar FOLDERS closed
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"content_margin": [9, 7, 8, 6],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-closed.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": 0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["hover"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-closed-hover.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-closed-selected.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Sidebar Folders open
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"attributes": ["expanded"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-open.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"attributes": ["expanded"],
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["hover"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-open-hover.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "disclosure_button_control",
 | 
			
		||||
		"attributes": ["expanded"],
 | 
			
		||||
		"parents": [{"class": "tree_row", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/folder/group-open-selected.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	STANDARD TEXT BUTTONS
 | 
			
		||||
//	=========================================================
 | 
			
		||||
	//	- Standard buttons (used for Find / Replace panel)
 | 
			
		||||
	{
 | 
			
		||||
		"class": "button_control",
 | 
			
		||||
		"content_margin": [6, 5, 6, 6],
 | 
			
		||||
		"min_size": [75, 0],
 | 
			
		||||
 | 
			
		||||
		//	Default button state
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/btn-large.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [6, 6],
 | 
			
		||||
 | 
			
		||||
		//	Pressed button setup
 | 
			
		||||
		"layer1.texture": "SourcePawn/assets/btn-large-active.png",
 | 
			
		||||
		"layer1.opacity": 0.0,
 | 
			
		||||
		"layer1.inner_margin": [6, 6]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		//	Pressed button state
 | 
			
		||||
		"class": "button_control",
 | 
			
		||||
		"attributes": ["pressed"],
 | 
			
		||||
		"layer1.opacity": 1.0,
 | 
			
		||||
		"content_margin": [6, 6, 6, 6]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	TEXT INPUT FIELD
 | 
			
		||||
//	=========================================================
 | 
			
		||||
 | 
			
		||||
	//	- Text input field item
 | 
			
		||||
	{
 | 
			
		||||
		"class": "text_line_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/text-field.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [10, 10, 10, 10],
 | 
			
		||||
		"content_margin": [5, 5, 5, 5]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	PANEL BACKGROUNDS
 | 
			
		||||
//	=========================================================
 | 
			
		||||
	//	- Bottom panel background
 | 
			
		||||
	{
 | 
			
		||||
		"class": "panel_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/panel-bg.png",
 | 
			
		||||
		"layer0.inner_margin": [4, 4, 4, 4],
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	//	- Quick panel background
 | 
			
		||||
	{
 | 
			
		||||
		"class": "overlay_control",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/overlay-bg.png",
 | 
			
		||||
		"layer0.inner_margin": [10, 5, 10, 20],  // left, top, right, bottom
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer1.opacity": 0, // HIDDEN
 | 
			
		||||
		"content_margin": [11, 8, 11, 17]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	QUICK PANEL
 | 
			
		||||
//	=========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel",
 | 
			
		||||
		"row_padding": [4, 3],
 | 
			
		||||
		"layer0.tint": [45, 45, 45],
 | 
			
		||||
		"layer0.opacity": 1,
 | 
			
		||||
		"dark_content": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel_row",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/qp-row.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"layer0.inner_margin": [4, 4, 4, 4],
 | 
			
		||||
		"layer1.draw_center": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel_row",
 | 
			
		||||
		"attributes": ["selected"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/qp-row-selected.png"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel_label",
 | 
			
		||||
		"fg": [190, 190, 190, 255],
 | 
			
		||||
		"match_fg": [166, 229, 255, 255],
 | 
			
		||||
		"bg": [71, 71, 71, 255],
 | 
			
		||||
		"selected_fg": [220, 220, 220, 255],
 | 
			
		||||
		"selected_match_fg": [2, 196, 251, 255],
 | 
			
		||||
		"selected_bg": [134, 134, 134, 255]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel_path_label",
 | 
			
		||||
		"fg": [100, 100, 100, 255],
 | 
			
		||||
		"match_fg": [166, 229, 255, 255],
 | 
			
		||||
		"bg": [41, 41, 41, 255],
 | 
			
		||||
		"selected_fg": [120, 120, 120, 255],
 | 
			
		||||
		"selected_match_fg": [2, 196, 251, 255],
 | 
			
		||||
		"selected_bg": [24, 24, 24, 255]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "quick_panel_score_label",
 | 
			
		||||
		"fg": [90, 90, 90, 255],
 | 
			
		||||
		"bg": [41, 41, 41, 255],
 | 
			
		||||
		"selected_fg": [114, 114, 114, 255],
 | 
			
		||||
		"selected_bg": [24, 24, 24, 255]
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	MINI QUICK PANEL
 | 
			
		||||
//	=========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "mini_quick_panel_row",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/qp-row.png",
 | 
			
		||||
		"layer0.inner_margin": [4, 4, 4, 4],
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "mini_quick_panel_row",
 | 
			
		||||
		"attributes": ["selected"],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/qp-row-selected.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	CODE COMPLETION DROPDOWN
 | 
			
		||||
//	=========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "popup_control",
 | 
			
		||||
		"content_margin": [0, 0]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "auto_complete",
 | 
			
		||||
		"row_padding": [2, 2],
 | 
			
		||||
		"layer0.tint": [30, 30, 30],
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"dark_content": true
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "auto_complete_label",
 | 
			
		||||
		"fg": [140, 140, 140],
 | 
			
		||||
		"match_fg": [255, 255, 255],
 | 
			
		||||
		"bg": [26, 26, 26],
 | 
			
		||||
		"selected_fg": [255, 255, 255],
 | 
			
		||||
		"selected_match_fg": [255, 255, 255],
 | 
			
		||||
		"selected_bg": [86, 86, 86]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "table_row",
 | 
			
		||||
		"layer0.tint": [45, 45, 45],
 | 
			
		||||
		"layer0.opacity": 0.0,
 | 
			
		||||
		"layer0.inner_margin": [1, 1]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "table_row",
 | 
			
		||||
		"attributes": ["selected"],
 | 
			
		||||
		"layer0.opacity": 1.0
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
//	BOTTOM PANEL BUTTONS
 | 
			
		||||
//	==========================================================
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_button_control",
 | 
			
		||||
		"content_margin": [4, 4]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_button_control",
 | 
			
		||||
		"attributes": ["pressed"]
 | 
			
		||||
	},
 | 
			
		||||
	//	- Regex search button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_regex",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/regex-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_regex",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/regex-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Case sensitive search button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_case",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/case-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_case",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/case-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Match whole word search button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_whole_word",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/whole-word-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_whole_word",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/whole-word-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Reverse search direction button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_reverse",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/reverse-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_reverse",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/reverse-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Search wrap button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_wrap",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/wrap-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_wrap",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/wrap-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Search in selection button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_in_selection",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/selection-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_in_selection",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/selection-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Preserve case button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_preserve_case",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/preserve-case-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_preserve_case",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/preserve-case-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Highlight results button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_highlight",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/highlight-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_highlight",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/highlight-on.png"
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	// 	BOTTOM PANEL ICONS (EXTENDED: FIND IN FILES)
 | 
			
		||||
	//	=========================================================
 | 
			
		||||
 | 
			
		||||
	//	- Show search context button
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_context",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/context-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_context",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/context-on.png"
 | 
			
		||||
	},
 | 
			
		||||
	//	- Use search buffer
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_use_buffer",
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/buffer-off.png",
 | 
			
		||||
		"layer0.opacity": 1.0,
 | 
			
		||||
		"content_margin": [9, 10]
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"class": "icon_use_buffer",
 | 
			
		||||
		"parents": [{"class": "icon_button_control", "attributes": ["selected"]}],
 | 
			
		||||
		"layer0.texture": "SourcePawn/assets/icons/buffer-on.png"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										136
									
								
								samples/Sublime Text Config/jade.sublime-completions
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								samples/Sublime Text Config/jade.sublime-completions
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
{
 | 
			
		||||
	"scope": "entity.name.tag.jade",
 | 
			
		||||
	"completions":
 | 
			
		||||
	[
 | 
			
		||||
		"a",//	Defines a hyperlink
 | 
			
		||||
		"abbr",//	Defines an abbreviation
 | 
			
		||||
		"acronym",//	Not supported in HTML5. Use <abbr> instead.
 | 
			
		||||
		//Defines an acronym
 | 
			
		||||
		"address",//	Defines contact information for the author/owner of a document
 | 
			
		||||
		"applet",//	Not supported in HTML5. Use <object> instead.
 | 
			
		||||
		//Defines an embedded applet
 | 
			
		||||
		"area",//	Defines an area inside an image-map
 | 
			
		||||
		"article",//	Defines an article
 | 
			
		||||
		"aside",//	Defines content aside from the page content
 | 
			
		||||
		"audio",//	Defines sound content
 | 
			
		||||
		"b",//	Defines bold text
 | 
			
		||||
		"base",//	Specifies the base URL/target for all relative URLs in a document
 | 
			
		||||
		"basefont",//	Not supported in HTML5. Use CSS instead.
 | 
			
		||||
		//Specifies a default color, size, and font for all text in a document
 | 
			
		||||
		"bdi",//	Isolates a part of text that might be formatted in a different direction from other text outside it
 | 
			
		||||
		"bdo",//	Overrides the current text direction
 | 
			
		||||
		"big",//	Not supported in HTML5. Use CSS instead.
 | 
			
		||||
		//Defines big text
 | 
			
		||||
		"blockquote",//	Defines a section that is quoted from another source
 | 
			
		||||
		"body",//	Defines the document's body
 | 
			
		||||
		"br",//	Defines a single line break
 | 
			
		||||
		"button",//	Defines a clickable button
 | 
			
		||||
		"canvas",//	Used to draw graphics, on the fly, via scripting (usually JavaScript)
 | 
			
		||||
		"caption",//	Defines a table caption
 | 
			
		||||
		"center",//	Not supported in HTML5. Use CSS instead.
 | 
			
		||||
		//Defines centered text
 | 
			
		||||
		"cite",//	Defines the title of a work
 | 
			
		||||
		"code",//	Defines a piece of computer code
 | 
			
		||||
		"col",//	Specifies column properties for each column within a <colgroup> element 
 | 
			
		||||
		"colgroup",//	Specifies a group of one or more columns in a table for formatting
 | 
			
		||||
		"command",//	Defines a command button that a user can invoke
 | 
			
		||||
		"datalist",//	Specifies a list of pre-defined options for input controls
 | 
			
		||||
		"dd",//	Defines a description/value of a term in a description list
 | 
			
		||||
		"del",//	Defines text that has been deleted from a document
 | 
			
		||||
		"details",//	Defines additional details that the user can view or hide
 | 
			
		||||
		"dfn",//	Defines a definition term
 | 
			
		||||
		"dialog",//	Defines a dialog box or window
 | 
			
		||||
		"dir",//	Not supported in HTML5. Use <ul> instead.
 | 
			
		||||
		//Defines a directory list
 | 
			
		||||
		"div",//	Defines a section in a document
 | 
			
		||||
		"dl",//	Defines a description list
 | 
			
		||||
		"dt",//	Defines a term/name in a description list
 | 
			
		||||
		"em",//	Defines emphasized text 
 | 
			
		||||
		"embed",//	Defines a container for an external (non-HTML) application
 | 
			
		||||
		"fieldset",//	Groups related elements in a form
 | 
			
		||||
		"figcaption",//	Defines a caption for a <figure> element
 | 
			
		||||
		"figure",//	Specifies self-contained content
 | 
			
		||||
		"font",//	Not supported in HTML5. Use CSS instead.
 | 
			
		||||
		//Defines font, color, and size for text
 | 
			
		||||
		"footer",//	Defines a footer for a document or section
 | 
			
		||||
		"form",//	Defines an HTML form for user input
 | 
			
		||||
		"frame",//	Not supported in HTML5.
 | 
			
		||||
		//Defines a window (a frame) in a frameset
 | 
			
		||||
		"frameset",//	Not supported in HTML5.
 | 
			
		||||
		//Defines a set of frames
 | 
			
		||||
		"h1",// to <h6>	 Defines HTML headings
 | 
			
		||||
		"head",//	Defines information about the document
 | 
			
		||||
		"header",//	Defines a header for a document or section
 | 
			
		||||
		"hgroup",//	Groups heading elements
 | 
			
		||||
		"hr",//	 Defines a thematic change in the content
 | 
			
		||||
		"html",//	Defines the root of an HTML document
 | 
			
		||||
		"i",//	Defines a part of text in an alternate voice or mood
 | 
			
		||||
		"iframe",//	Defines an inline frame
 | 
			
		||||
		"img",//	Defines an image
 | 
			
		||||
		"input",//	Defines an input control
 | 
			
		||||
		"ins",//	Defines a text that has been inserted into a document
 | 
			
		||||
		"kbd",//	Defines keyboard input
 | 
			
		||||
		"keygen",//	Defines a key-pair generator field (for forms)
 | 
			
		||||
		"label",//	Defines a label for an <input> element
 | 
			
		||||
		"legend",//	Defines a caption for a <fieldset> element
 | 
			
		||||
		"li",//	Defines a list item
 | 
			
		||||
		"link",//	Defines the relationship between a document and an external resource (most used to link to style sheets)
 | 
			
		||||
		"main",//	Specifies the main content of a document
 | 
			
		||||
		"map",//	Defines a client-side image-map
 | 
			
		||||
		"mark",//	Defines marked/highlighted text
 | 
			
		||||
		"menu",//	Defines a list/menu of commands
 | 
			
		||||
		"meta",//	Defines metadata about an HTML document
 | 
			
		||||
		"meter",//	Defines a scalar measurement within a known range (a gauge)
 | 
			
		||||
		"nav",//	Defines navigation links
 | 
			
		||||
		"noframes",//	Not supported in HTML5.
 | 
			
		||||
		//Defines an alternate content for users that do not support frames
 | 
			
		||||
		"noscript",//	Defines an alternate content for users that do not support client-side scripts
 | 
			
		||||
		"object",//	Defines an embedded object
 | 
			
		||||
		"ol",//	Defines an ordered list
 | 
			
		||||
		"optgroup",//	Defines a group of related options in a drop-down list
 | 
			
		||||
		"option",//	Defines an option in a drop-down list
 | 
			
		||||
		"output",//	Defines the result of a calculation
 | 
			
		||||
		"p",//	Defines a paragraph
 | 
			
		||||
		"param",//	Defines a parameter for an object
 | 
			
		||||
		"pre",//	Defines preformatted text
 | 
			
		||||
		"progress",//	Represents the progress of a task
 | 
			
		||||
		"q",//	Defines a short quotation
 | 
			
		||||
		"rp",//	Defines what to show in browsers that do not support ruby annotations
 | 
			
		||||
		"rt",//	Defines an explanation/pronunciation of characters (for East Asian typography)
 | 
			
		||||
		"ruby",//	Defines a ruby annotation (for East Asian typography)
 | 
			
		||||
		"s",//	Defines text that is no longer correct
 | 
			
		||||
		"samp",//	Defines sample output from a computer program
 | 
			
		||||
		"script",//	Defines a client-side script
 | 
			
		||||
		"section",//	Defines a section in a document
 | 
			
		||||
		"select",//	Defines a drop-down list
 | 
			
		||||
		"small",//	Defines smaller text
 | 
			
		||||
		"source",//	Defines multiple media resources for media elements (<video> and <audio>)
 | 
			
		||||
		"span",//	Defines a section in a document
 | 
			
		||||
		"strike",//	Not supported in HTML5. Use <del> instead.
 | 
			
		||||
		//Defines strikethrough text
 | 
			
		||||
		"strong",//	Defines important text
 | 
			
		||||
		"style",//	Defines style information for a document
 | 
			
		||||
		"sub",//	Defines subscripted text
 | 
			
		||||
		"summary",//	Defines a visible heading for a <details> element
 | 
			
		||||
		"sup",//	Defines superscripted text
 | 
			
		||||
		"table",//	Defines a table
 | 
			
		||||
		"tbody",//	Groups the body content in a table
 | 
			
		||||
		"td",//	Defines a cell in a table
 | 
			
		||||
		"textarea",//	Defines a multiline input control (text area)
 | 
			
		||||
		"tfoot",//	Groups the footer content in a table
 | 
			
		||||
		"th",//	Defines a header cell in a table
 | 
			
		||||
		"thead",//	Groups the header content in a table
 | 
			
		||||
		"time",//	Defines a date/time
 | 
			
		||||
		"title",//	Defines a title for the document
 | 
			
		||||
		"tr",//	Defines a row in a table
 | 
			
		||||
		"track",//	Defines text tracks for media elements (<video> and <audio>)
 | 
			
		||||
		"tt",//	Not supported in HTML5. Use CSS instead.
 | 
			
		||||
		//Defines teletype text
 | 
			
		||||
		"u",//	Defines text that should be stylistically different from normal text
 | 
			
		||||
		"ul",//	Defines an unordered list
 | 
			
		||||
		"var",//	Defines a variable
 | 
			
		||||
		"video",//	Defines a video or movie
 | 
			
		||||
		"wbr"
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								samples/TI Program/srcalpha.8xp.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								samples/TI Program/srcalpha.8xp.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
.AlphaCS
 | 
			
		||||
#ExprOff
 | 
			
		||||
If getKey(41)
 | 
			
		||||
	sub(ADM)
 | 
			
		||||
End
 | 
			
		||||
Lbl START
 | 
			
		||||
"appv alpha "->Str1
 | 
			
		||||
"appvAlphaCS"->Str2
 | 
			
		||||
.ALPHA CS
 | 
			
		||||
[7EFFFFE7FFFFE7E7]->Pic11
 | 
			
		||||
[E0E0E0E0E0FFFF7F]->Pic12
 | 
			
		||||
[FEFFE7FFFEE0E0E0]->Pic13
 | 
			
		||||
[E7E7E7FFFFE7E7E7]->Pic14
 | 
			
		||||
[7EFFFFE7FFFFE7E7]->Pic15
 | 
			
		||||
[7FFFFFE0E0FFFF7F]->Pic16
 | 
			
		||||
[7FFFFF781EFFFFFE]->Pic17
 | 
			
		||||
.arch
 | 
			
		||||
[0038447C44440000]->Pic21
 | 
			
		||||
.hide
 | 
			
		||||
[0054004400540000]->Pic22
 | 
			
		||||
.lock
 | 
			
		||||
[0038447C7C7C0000]->Pic23
 | 
			
		||||
.(c) Scott Mangiapane
 | 
			
		||||
Data(72,8)->GDB0
 | 
			
		||||
[42600A360008000100994DDF2A6C61B1B28091294A22AAAAAAAB005A6DCA226A69B9A9800000000000202000000000000000C0200000000000000000000000000000000000000000]
 | 
			
		||||
.icon unknown
 | 
			
		||||
Data(16,16)->GDB11
 | 
			
		||||
[EFFEA803EB8308032BFB28032BFB0803EBFBA803EBFB08032B8328032FFF07FF]
 | 
			
		||||
.icon SRC
 | 
			
		||||
Data(16,16)->GDB12
 | 
			
		||||
[01801A583E7C3FFC3FFC3E7C1A580A500240FFFFC471BDAFCC6FF5AF8DB1FFFF]
 | 
			
		||||
.icon ASM
 | 
			
		||||
Data(16,16)->GDB13
 | 
			
		||||
[FFFFFFFFFFFFFFFFFFFFCE6BB5D586D5B75DB4DDFFFFFFFFFFFFFFFFFFFFFFFF]
 | 
			
		||||
.icon shell
 | 
			
		||||
Data(16,16)->GDB14
 | 
			
		||||
[FFFFFFFFFFFFFFFFFFFFFFFF97B5B155D5359595FFFFFFFFFFFFFFFFFFFFFFFF]
 | 
			
		||||
Goto SET
 | 
			
		||||
prgmSRCFUNC
 | 
			
		||||
prgmSRCGUI
 | 
			
		||||
prgmSRCSORT
 | 
			
		||||
Lbl SET
 | 
			
		||||
.start, set up
 | 
			
		||||
ClrDraw
 | 
			
		||||
StoreGDB 
 | 
			
		||||
DiagnosticOff
 | 
			
		||||
Fix 5
 | 
			
		||||
Full
 | 
			
		||||
!If GetCalc(Str1,[Y1])
 | 
			
		||||
	sub(NEW)
 | 
			
		||||
	StoreGDB 
 | 
			
		||||
End
 | 
			
		||||
GetCalc(Str1,[Y1])
 | 
			
		||||
If {[Y1]+0}
 | 
			
		||||
	!If sub(CODE)
 | 
			
		||||
		Goto END
 | 
			
		||||
	End
 | 
			
		||||
End
 | 
			
		||||
Asm(FDCB249E)
 | 
			
		||||
If {[Y1]+6}
 | 
			
		||||
	Asm(FDCB24DE)
 | 
			
		||||
End
 | 
			
		||||
Goto DLIST
 | 
			
		||||
							
								
								
									
										194
									
								
								samples/TI Program/srcfunc.8xp.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								samples/TI Program/srcfunc.8xp.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,194 @@
 | 
			
		||||
.FUNC AlphaCS
 | 
			
		||||
Lbl ADM
 | 
			
		||||
DiagnosticOff
 | 
			
		||||
Fix 5
 | 
			
		||||
Full
 | 
			
		||||
StoreGDB 
 | 
			
		||||
sub(D2,13,17,70,29,"Admin Access")
 | 
			
		||||
sub(D1,15,27)
 | 
			
		||||
Text(15,37,"Admin Code:  -   -   -   -")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->A
 | 
			
		||||
End
 | 
			
		||||
Text(55,37,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->B
 | 
			
		||||
End
 | 
			
		||||
Text(62,37,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->C
 | 
			
		||||
End
 | 
			
		||||
Text(69,37,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->D
 | 
			
		||||
End
 | 
			
		||||
Text(76,37,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Normal
 | 
			
		||||
Pause 100
 | 
			
		||||
Full
 | 
			
		||||
If (A!=20) or (B!=35) or (C!=18) or (D!=27)
 | 
			
		||||
	Goto END
 | 
			
		||||
End
 | 
			
		||||
sub(D2,13,17,70,29,"Author Info")
 | 
			
		||||
sub(D1,15,27)
 | 
			
		||||
Bitmap(15,38,GDB0)
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat (getKey) and (getKey(9))
 | 
			
		||||
End
 | 
			
		||||
DelVar "appv alpha "
 | 
			
		||||
Return
 | 
			
		||||
Lbl D1
 | 
			
		||||
.draws title
 | 
			
		||||
Pt-On([r1]+1,[r2]+1,Pic11)
 | 
			
		||||
Pt-On([r1]+10,[r2]+1,Pic12)
 | 
			
		||||
Pt-On([r1]+19,[r2]+1,Pic13)
 | 
			
		||||
Pt-On([r1]+28,[r2]+1,Pic14)
 | 
			
		||||
Pt-On([r1]+37,[r2]+1,Pic15)
 | 
			
		||||
Pt-On([r1]+48,[r2]+1,Pic16)
 | 
			
		||||
Pt-On([r1]+57,[r2]+1,Pic17)
 | 
			
		||||
RectI([r1],[r2],66,10)
 | 
			
		||||
Pxl-Off([r1],[r2])
 | 
			
		||||
RectI([r1]+14,[r2],4,5)
 | 
			
		||||
RectI([r1]+23,[r2]+7,4,3)
 | 
			
		||||
RectI([r1]+46,[r2]+1,1,8)
 | 
			
		||||
RectI([r1]+45,[r2],3,1)
 | 
			
		||||
RectI([r1]+46,[r2]+9,2,1)
 | 
			
		||||
Pxl-Off([r1]+65,[r2]+9)
 | 
			
		||||
Return
 | 
			
		||||
Lbl D2
 | 
			
		||||
.windows
 | 
			
		||||
Rect([r1]+1,[r2],[r3]-2,[r4])
 | 
			
		||||
Rect([r1],[r2]+1,[r3],[r4]-2)
 | 
			
		||||
RectI([r1]+1,[r2]+1,[r3]-2,[r4]-2)
 | 
			
		||||
Text([r1]+2,[r2]+2,[r5])
 | 
			
		||||
RectI([r1]+1,[r2]+1,[r3]-2,8)
 | 
			
		||||
Pt-Off([r1]+[r3]-9,[r2]+1,[C1BEAAB6AABEC1FF])
 | 
			
		||||
Pxl-On([r1]+1,[r2]+[r4]-2)
 | 
			
		||||
Pxl-On([r1]+[r3]-2,[r2]+[r4]-2)
 | 
			
		||||
Return
 | 
			
		||||
Lbl D3
 | 
			
		||||
.archiving box
 | 
			
		||||
sub(D2,15,22,66,20,"Archiving...")
 | 
			
		||||
Text(17,31,"Please wait...")
 | 
			
		||||
Return
 | 
			
		||||
Lbl CODE
 | 
			
		||||
sub(D2,15,22,66,20,"Access Denied")
 | 
			
		||||
Text(29,32," -      -      -      - ")
 | 
			
		||||
DispGraph
 | 
			
		||||
1->[r2]
 | 
			
		||||
Repeat getKey->[r1]
 | 
			
		||||
End
 | 
			
		||||
Text(29,32,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
If [r1]!=({[Y1]+1})
 | 
			
		||||
	0->[r2]
 | 
			
		||||
End
 | 
			
		||||
Repeat getKey->[r1]
 | 
			
		||||
End
 | 
			
		||||
Text(39,32,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
If [r1]!=({[Y1]+2})
 | 
			
		||||
	0->[r2]
 | 
			
		||||
End
 | 
			
		||||
Repeat getKey->[r1]
 | 
			
		||||
End
 | 
			
		||||
Text(49,32,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
If [r1]!=({[Y1]+3})
 | 
			
		||||
	0->[r2]
 | 
			
		||||
End
 | 
			
		||||
Repeat getKey->[r1]
 | 
			
		||||
End
 | 
			
		||||
Text(59,32,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
If [r1]!=({[Y1]+4})
 | 
			
		||||
	0->[r2]
 | 
			
		||||
End
 | 
			
		||||
Normal
 | 
			
		||||
Pause 200
 | 
			
		||||
Full
 | 
			
		||||
Return[r2]
 | 
			
		||||
Lbl NEW
 | 
			
		||||
ClrDraw
 | 
			
		||||
sub(D1,0,0)
 | 
			
		||||
RectI(0,11,96,1)
 | 
			
		||||
Text(1,12,"Installation")
 | 
			
		||||
Text(1,20,"Enter your new keycode:")
 | 
			
		||||
Text(1,26," -  -  -  - ")
 | 
			
		||||
DispGraph
 | 
			
		||||
GetCalc(Str1,16)->[r1]
 | 
			
		||||
Fill([r1],16,1)
 | 
			
		||||
0->{[r1]}
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{[r1]+1}
 | 
			
		||||
Text(1,26,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{[r1]+2}
 | 
			
		||||
Text(7,26,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{[r1]+3}
 | 
			
		||||
Text(13,26,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{[r1]+4}
 | 
			
		||||
Text(19,26,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Fill(L1,50,0)
 | 
			
		||||
Text(1,34,"Confirm keycode:")
 | 
			
		||||
Text(1,40," -  -  -  - ")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{L1+1}
 | 
			
		||||
Text(1,40,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{L1+2}
 | 
			
		||||
Text(7,40,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{L1+3}
 | 
			
		||||
Text(13,40,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
Repeat getKey->[r2]
 | 
			
		||||
End
 | 
			
		||||
[r2]->{L1+4}
 | 
			
		||||
Text(19,40,"*")
 | 
			
		||||
DispGraph
 | 
			
		||||
If ({[r1]+1}={L1+1}) and ({[r1]+2}={L1+2}) and ({[r1]+3}={L1+3}) and ({[r1]+4}={L1+4})
 | 
			
		||||
	sub(D3)
 | 
			
		||||
	DispGraph
 | 
			
		||||
	GetCalc(Str2,10)
 | 
			
		||||
	Archive Str1
 | 
			
		||||
	GetCalc(Str1,[Y1])
 | 
			
		||||
	ClrDraw
 | 
			
		||||
	Return
 | 
			
		||||
	Else
 | 
			
		||||
	Text(1,48,"ERROR keycodes do not")
 | 
			
		||||
	Text(1,54,"match.")
 | 
			
		||||
	DispGraph
 | 
			
		||||
	UnArchive Str1
 | 
			
		||||
	DelVar Str1
 | 
			
		||||
	Repeat getKey
 | 
			
		||||
	End
 | 
			
		||||
	Goto END
 | 
			
		||||
End
 | 
			
		||||
Return
 | 
			
		||||
Lbl END
 | 
			
		||||
Asm(FDCB249E)
 | 
			
		||||
If {[Y1]+6}
 | 
			
		||||
	Asm(FDCB24DE)
 | 
			
		||||
End
 | 
			
		||||
ClrDraw
 | 
			
		||||
ClrDraw^^r
 | 
			
		||||
ClrHome
 | 
			
		||||
Return^^r
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user