mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			253 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					53aa1209ab | ||
| 
						 | 
					b2a486fed2 | ||
| 
						 | 
					4f1e5c34b1 | ||
| 
						 | 
					85c9833081 | ||
| 
						 | 
					33899b9d6b | ||
| 
						 | 
					417239004a | ||
| 
						 | 
					6a1423d28f | ||
| 
						 | 
					96a23ce388 | ||
| 
						 | 
					e8d7eed3aa | ||
| 
						 | 
					9d419c4ab9 | ||
| 
						 | 
					4eefc1f58e | ||
| 
						 | 
					0b94b9cda7 | ||
| 
						 | 
					c736038d94 | ||
| 
						 | 
					ec562138f8 | ||
| 
						 | 
					50013e8dd7 | ||
| 
						 | 
					416c5d1185 | ||
| 
						 | 
					8869912d31 | ||
| 
						 | 
					43fa563b77 | ||
| 
						 | 
					41c6aee8c3 | ||
| 
						 | 
					8cf575c37d | ||
| 
						 | 
					4e20928e04 | ||
| 
						 | 
					3e37bd2680 | ||
| 
						 | 
					a29f5b2d46 | ||
| 
						 | 
					4efc6f8c95 | ||
| 
						 | 
					346aa99fcf | ||
| 
						 | 
					d147778677 | ||
| 
						 | 
					e520209e49 | ||
| 
						 | 
					338cc16239 | ||
| 
						 | 
					67ea35094b | ||
| 
						 | 
					6f0393fcbd | ||
| 
						 | 
					2923d50d7e | ||
| 
						 | 
					4e26f609ef | ||
| 
						 | 
					e86d6e8dd2 | ||
| 
						 | 
					5fa02ad1fb | ||
| 
						 | 
					5a06240f69 | ||
| 
						 | 
					d6e0f74c80 | ||
| 
						 | 
					a5c08bb203 | ||
| 
						 | 
					c6dc29abb1 | ||
| 
						 | 
					ffd984bb7e | ||
| 
						 | 
					dc5473559b | ||
| 
						 | 
					8e9c224952 | ||
| 
						 | 
					d43f111723 | ||
| 
						 | 
					de9ff713a4 | ||
| 
						 | 
					98783560ec | ||
| 
						 | 
					8f31fbbd55 | ||
| 
						 | 
					e4cdbd2b2b | ||
| 
						 | 
					ba52e48ceb | ||
| 
						 | 
					a44ebe493b | ||
| 
						 | 
					eb0e75e11e | ||
| 
						 | 
					22c2cf4967 | ||
| 
						 | 
					39e3688fb8 | ||
| 
						 | 
					6b83e5fb7b | ||
| 
						 | 
					dd2e5ffe07 | ||
| 
						 | 
					f6b6c4e165 | ||
| 
						 | 
					608ed60b5c | ||
| 
						 | 
					2ce2945058 | ||
| 
						 | 
					c8d376754e | ||
| 
						 | 
					ecaef91fa1 | ||
| 
						 | 
					d265b78e7e | ||
| 
						 | 
					5a5bf7d5e5 | ||
| 
						 | 
					e46781b903 | ||
| 
						 | 
					9543a8c8e9 | ||
| 
						 | 
					6ac1ac9232 | ||
| 
						 | 
					1bbb919fef | ||
| 
						 | 
					71dfed0e45 | ||
| 
						 | 
					a2db058ce4 | ||
| 
						 | 
					12695fee2f | ||
| 
						 | 
					4a775dca37 | ||
| 
						 | 
					d7c689fd6b | ||
| 
						 | 
					20b8188384 | ||
| 
						 | 
					26310d9515 | ||
| 
						 | 
					e38cc75da5 | ||
| 
						 | 
					8d55fc1bd5 | ||
| 
						 | 
					7e63399196 | ||
| 
						 | 
					520e5a5cfe | ||
| 
						 | 
					5d85692c24 | ||
| 
						 | 
					676861fff3 | ||
| 
						 | 
					6589bd9dc7 | ||
| 
						 | 
					e32a4f13ef | ||
| 
						 | 
					4e4d851f71 | ||
| 
						 | 
					a3628f86da | ||
| 
						 | 
					fe70965906 | ||
| 
						 | 
					c863435c84 | ||
| 
						 | 
					eeec48198a | ||
| 
						 | 
					82167063da | ||
| 
						 | 
					3ae89b48ba | ||
| 
						 | 
					cd9401c424 | ||
| 
						 | 
					e7e8a7d835 | ||
| 
						 | 
					7654032d2e | ||
| 
						 | 
					05b536fc61 | ||
| 
						 | 
					ebe85788ab | ||
| 
						 | 
					524337d07b | ||
| 
						 | 
					f8ce42e169 | ||
| 
						 | 
					71032cd252 | ||
| 
						 | 
					41593b3ea7 | ||
| 
						 | 
					bed8add2f5 | ||
| 
						 | 
					e424e8e88c | ||
| 
						 | 
					07d4f218a3 | ||
| 
						 | 
					67ed060d37 | ||
| 
						 | 
					3abe081560 | ||
| 
						 | 
					d3f3c0345c | ||
| 
						 | 
					855f1a1f86 | ||
| 
						 | 
					0406a5b326 | ||
| 
						 | 
					0108ef4386 | ||
| 
						 | 
					daefff86ff | ||
| 
						 | 
					fdb962518f | ||
| 
						 | 
					6564078061 | ||
| 
						 | 
					39ea9be5f8 | ||
| 
						 | 
					152b5ade5e | ||
| 
						 | 
					c525e3fbef | ||
| 
						 | 
					88c74fa9c2 | ||
| 
						 | 
					6a54ee767f | ||
| 
						 | 
					2ea1ff2736 | ||
| 
						 | 
					a1901fceff | ||
| 
						 | 
					b4035a3804 | ||
| 
						 | 
					fc67fc525c | ||
| 
						 | 
					f0659d3aa5 | ||
| 
						 | 
					a7a123a8db | ||
| 
						 | 
					0e5327a77a | ||
| 
						 | 
					ecd4ae3bda | ||
| 
						 | 
					7a8bd628e1 | ||
| 
						 | 
					8e19aea39e | ||
| 
						 | 
					6fcba83f3e | ||
| 
						 | 
					d6d7d38eb8 | ||
| 
						 | 
					c8094d3775 | ||
| 
						 | 
					de478d2f2d | ||
| 
						 | 
					991dcef18b | ||
| 
						 | 
					f30e9270f1 | ||
| 
						 | 
					1d7ba18b15 | ||
| 
						 | 
					35a06d6cb8 | ||
| 
						 | 
					4cf7feb275 | ||
| 
						 | 
					30298a9ef8 | ||
| 
						 | 
					cc5f1c57ca | ||
| 
						 | 
					82af10e3fd | ||
| 
						 | 
					63c8d2284c | ||
| 
						 | 
					697380336c | ||
| 
						 | 
					5fd8d71858 | ||
| 
						 | 
					5bc88814e2 | ||
| 
						 | 
					00efd6a463 | ||
| 
						 | 
					81ca6e7766 | ||
| 
						 | 
					cd288a8ee4 | ||
| 
						 | 
					a8d84f3d55 | ||
| 
						 | 
					600115afed | ||
| 
						 | 
					e57273c839 | ||
| 
						 | 
					65491d460e | ||
| 
						 | 
					8dc4a1308f | ||
| 
						 | 
					6841b4d259 | ||
| 
						 | 
					a53423b6e0 | ||
| 
						 | 
					02f3ba1840 | ||
| 
						 | 
					e1216ea4ee | ||
| 
						 | 
					a3227c2c27 | ||
| 
						 | 
					9f1c950a1f | ||
| 
						 | 
					c7a0d7b83d | ||
| 
						 | 
					53c9b2b435 | ||
| 
						 | 
					b4a77abd82 | ||
| 
						 | 
					8a622823b0 | ||
| 
						 | 
					3310d925b6 | ||
| 
						 | 
					65201b322a | ||
| 
						 | 
					b71bf19e37 | ||
| 
						 | 
					1f43664a51 | ||
| 
						 | 
					7cda13afcb | ||
| 
						 | 
					e0d890240b | ||
| 
						 | 
					abf7bee464 | ||
| 
						 | 
					e73a4ecd0e | ||
| 
						 | 
					70779c9986 | ||
| 
						 | 
					1fc4c9fdc6 | ||
| 
						 | 
					fdec52c89a | ||
| 
						 | 
					6e40de47da | ||
| 
						 | 
					28be72892e | ||
| 
						 | 
					6df0e4591d | ||
| 
						 | 
					879c63a25e | ||
| 
						 | 
					ab2e640759 | ||
| 
						 | 
					b61fe90d12 | ||
| 
						 | 
					e6c849d92c | ||
| 
						 | 
					5e4e38b39a | ||
| 
						 | 
					22d4865c52 | ||
| 
						 | 
					3247d46e81 | ||
| 
						 | 
					dad3191238 | ||
| 
						 | 
					35a13b3633 | ||
| 
						 | 
					56fb48ea96 | ||
| 
						 | 
					983ff20d3c | ||
| 
						 | 
					2d51a5dba4 | ||
| 
						 | 
					df98c86acd | ||
| 
						 | 
					98118eb70b | ||
| 
						 | 
					1ec84da277 | ||
| 
						 | 
					3112e6deda | ||
| 
						 | 
					be316c2943 | ||
| 
						 | 
					68c45be47d | ||
| 
						 | 
					4584963dd2 | ||
| 
						 | 
					f382abc2f3 | ||
| 
						 | 
					9d57e1e1b5 | ||
| 
						 | 
					2a4150b104 | ||
| 
						 | 
					09612ae42e | ||
| 
						 | 
					49e9ee48d0 | ||
| 
						 | 
					a8719f3e82 | ||
| 
						 | 
					04e1cc6d0a | ||
| 
						 | 
					dd7b125869 | ||
| 
						 | 
					426818120c | ||
| 
						 | 
					50bd2cc3c8 | ||
| 
						 | 
					00647be113 | ||
| 
						 | 
					e930ee1a8e | ||
| 
						 | 
					48b64c2d31 | ||
| 
						 | 
					f95365946c | ||
| 
						 | 
					5ddccaac83 | ||
| 
						 | 
					51d7c8f905 | ||
| 
						 | 
					ed71855612 | ||
| 
						 | 
					742faebd8b | ||
| 
						 | 
					6763b73d9c | ||
| 
						 | 
					5c3744dfd6 | ||
| 
						 | 
					cb5bc91fe3 | ||
| 
						 | 
					9171ee602b | ||
| 
						 | 
					4da0463768 | ||
| 
						 | 
					8d0a2d9dc1 | ||
| 
						 | 
					6a2cebea7d | ||
| 
						 | 
					ae10395b3a | ||
| 
						 | 
					510abc7cee | ||
| 
						 | 
					e8a700e4e3 | ||
| 
						 | 
					c13e384e18 | ||
| 
						 | 
					4204078b19 | ||
| 
						 | 
					17fc3d0640 | ||
| 
						 | 
					7715254212 | ||
| 
						 | 
					2f50aa460a | ||
| 
						 | 
					6adec161fa | ||
| 
						 | 
					c802ba3a1d | ||
| 
						 | 
					06e80f3889 | ||
| 
						 | 
					216d63f575 | ||
| 
						 | 
					ff042a87a4 | ||
| 
						 | 
					56f0f93bbb | ||
| 
						 | 
					99a3a5b85b | ||
| 
						 | 
					1868d1d190 | ||
| 
						 | 
					705e234044 | ||
| 
						 | 
					0dd78704f7 | ||
| 
						 | 
					257425141d | ||
| 
						 | 
					6482a60c6e | ||
| 
						 | 
					1466b70f10 | ||
| 
						 | 
					b87146056b | ||
| 
						 | 
					b29696d684 | ||
| 
						 | 
					514a8d54db | ||
| 
						 | 
					abfe89d8ff | ||
| 
						 | 
					22609dc297 | ||
| 
						 | 
					93341be396 | ||
| 
						 | 
					f2ae3b6223 | ||
| 
						 | 
					e84204a274 | ||
| 
						 | 
					7024c7cb37 | ||
| 
						 | 
					91e0823b04 | ||
| 
						 | 
					b056df06f4 | ||
| 
						 | 
					6bf223e641 | ||
| 
						 | 
					fa817b6a1d | ||
| 
						 | 
					adaf4011bc | ||
| 
						 | 
					4a031107ac | ||
| 
						 | 
					789607d9bc | ||
| 
						 | 
					d46530989c | ||
| 
						 | 
					3c5bcb434c | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,6 @@
 | 
			
		||||
/Gemfile.lock
 | 
			
		||||
.bundle/
 | 
			
		||||
.idea
 | 
			
		||||
benchmark/
 | 
			
		||||
lib/linguist/samples.json
 | 
			
		||||
/grammars
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -12,7 +12,7 @@
 | 
			
		||||
	url = https://github.com/Drako/SublimeBrainfuck
 | 
			
		||||
[submodule "vendor/grammars/awk-sublime"]
 | 
			
		||||
	path = vendor/grammars/awk-sublime
 | 
			
		||||
	url = https://github.com/JohnNilsson/awk-sublime
 | 
			
		||||
	url = https://github.com/github-linguist/awk-sublime
 | 
			
		||||
[submodule "vendor/grammars/Sublime-SQF-Language"]
 | 
			
		||||
	path = vendor/grammars/Sublime-SQF-Language
 | 
			
		||||
	url = https://github.com/JonBons/Sublime-SQF-Language
 | 
			
		||||
@@ -22,15 +22,15 @@
 | 
			
		||||
[submodule "vendor/grammars/Sublime-REBOL"]
 | 
			
		||||
	path = vendor/grammars/Sublime-REBOL
 | 
			
		||||
	url = https://github.com/Oldes/Sublime-REBOL
 | 
			
		||||
[submodule "vendor/grammars/Sublime-VimL"]
 | 
			
		||||
	path = vendor/grammars/Sublime-VimL
 | 
			
		||||
	url = https://github.com/SalGnt/Sublime-VimL
 | 
			
		||||
[submodule "vendor/grammars/language-viml"]
 | 
			
		||||
	path = vendor/grammars/language-viml
 | 
			
		||||
	url = https://github.com/Alhadis/language-viml
 | 
			
		||||
[submodule "vendor/grammars/ColdFusion"]
 | 
			
		||||
	path = vendor/grammars/ColdFusion
 | 
			
		||||
	url = https://github.com/SublimeText/ColdFusion
 | 
			
		||||
[submodule "vendor/grammars/NSIS"]
 | 
			
		||||
	path = vendor/grammars/NSIS
 | 
			
		||||
	url = https://github.com/SublimeText/NSIS
 | 
			
		||||
	url = https://github.com/github-linguist/NSIS
 | 
			
		||||
[submodule "vendor/grammars/NimLime"]
 | 
			
		||||
	path = vendor/grammars/NimLime
 | 
			
		||||
	url = https://github.com/Varriount/NimLime
 | 
			
		||||
@@ -91,9 +91,6 @@
 | 
			
		||||
[submodule "vendor/grammars/bro-sublime"]
 | 
			
		||||
	path = vendor/grammars/bro-sublime
 | 
			
		||||
	url = https://github.com/bro/bro-sublime
 | 
			
		||||
[submodule "vendor/grammars/sublime_man_page_support"]
 | 
			
		||||
	path = vendor/grammars/sublime_man_page_support
 | 
			
		||||
	url = https://github.com/carsonoid/sublime_man_page_support
 | 
			
		||||
[submodule "vendor/grammars/sublime-MuPAD"]
 | 
			
		||||
	path = vendor/grammars/sublime-MuPAD
 | 
			
		||||
	url = https://github.com/ccreutzig/sublime-MuPAD
 | 
			
		||||
@@ -205,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
 | 
			
		||||
@@ -283,9 +277,6 @@
 | 
			
		||||
[submodule "vendor/grammars/groovy.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/groovy.tmbundle
 | 
			
		||||
	url = https://github.com/textmate/groovy.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/haskell.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/haskell.tmbundle
 | 
			
		||||
	url = https://github.com/textmate/haskell.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/html.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/html.tmbundle
 | 
			
		||||
	url = https://github.com/textmate/html.tmbundle
 | 
			
		||||
@@ -418,9 +409,9 @@
 | 
			
		||||
[submodule "vendor/grammars/oz-tmbundle"]
 | 
			
		||||
	path = vendor/grammars/oz-tmbundle
 | 
			
		||||
	url = https://github.com/eregon/oz-tmbundle
 | 
			
		||||
[submodule "vendor/grammars/ebundles"]
 | 
			
		||||
	path = vendor/grammars/ebundles
 | 
			
		||||
	url = https://github.com/ericzou/ebundles
 | 
			
		||||
[submodule "vendor/grammars/language-batchfile"]
 | 
			
		||||
	path = vendor/grammars/language-batchfile
 | 
			
		||||
	url = https://github.com/mmims/language-batchfile
 | 
			
		||||
[submodule "vendor/grammars/sublime-mask"]
 | 
			
		||||
	path = vendor/grammars/sublime-mask
 | 
			
		||||
	url = https://github.com/tenbits/sublime-mask
 | 
			
		||||
@@ -565,7 +556,7 @@
 | 
			
		||||
	url = https://github.com/ShaneWilton/sublime-smali
 | 
			
		||||
[submodule "vendor/grammars/language-jsoniq"]
 | 
			
		||||
	path = vendor/grammars/language-jsoniq
 | 
			
		||||
	url = http://github.com/wcandillon/language-jsoniq
 | 
			
		||||
	url = https://github.com/wcandillon/language-jsoniq
 | 
			
		||||
[submodule "vendor/grammars/atom-fsharp"]
 | 
			
		||||
	path = vendor/grammars/atom-fsharp
 | 
			
		||||
	url = https://github.com/fsprojects/atom-fsharp
 | 
			
		||||
@@ -608,9 +599,6 @@
 | 
			
		||||
[submodule "vendor/grammars/X10"]
 | 
			
		||||
	path = vendor/grammars/X10
 | 
			
		||||
	url = https://github.com/x10-lang/x10-highlighting
 | 
			
		||||
[submodule "vendor/grammars/language-babel"]
 | 
			
		||||
	path = vendor/grammars/language-babel
 | 
			
		||||
	url = https://github.com/gandm/language-babel
 | 
			
		||||
[submodule "vendor/grammars/UrWeb-Language-Definition"]
 | 
			
		||||
	path = vendor/grammars/UrWeb-Language-Definition
 | 
			
		||||
	url = https://github.com/gwalborn/UrWeb-Language-Definition.git
 | 
			
		||||
@@ -675,8 +663,8 @@
 | 
			
		||||
	path = vendor/grammars/pig-latin
 | 
			
		||||
	url = https://github.com/goblindegook/sublime-text-pig-latin
 | 
			
		||||
[submodule "vendor/grammars/sourcepawn"]
 | 
			
		||||
path = vendor/grammars/sourcepawn
 | 
			
		||||
url = https://github.com/austinwagner/sublime-sourcepawn
 | 
			
		||||
	path = vendor/grammars/sourcepawn
 | 
			
		||||
	url = https://github.com/github-linguist/sublime-sourcepawn
 | 
			
		||||
[submodule "vendor/grammars/gdscript"]
 | 
			
		||||
	path = vendor/grammars/gdscript
 | 
			
		||||
	url = https://github.com/beefsack/GDScript-sublime
 | 
			
		||||
@@ -755,3 +743,63 @@ url = https://github.com/austinwagner/sublime-sourcepawn
 | 
			
		||||
[submodule "vendor/grammars/SublimeGDB"]
 | 
			
		||||
	path = vendor/grammars/SublimeGDB
 | 
			
		||||
	url = https://github.com/quarnster/SublimeGDB
 | 
			
		||||
[submodule "vendor/grammars/language-roff"]
 | 
			
		||||
	path = vendor/grammars/language-roff
 | 
			
		||||
	url = https://github.com/Alhadis/language-roff
 | 
			
		||||
[submodule "vendor/grammars/language-haskell"]
 | 
			
		||||
	path = vendor/grammars/language-haskell
 | 
			
		||||
	url = https://github.com/atom-haskell/language-haskell
 | 
			
		||||
[submodule "vendor/grammars/language-asn1"]
 | 
			
		||||
	path = vendor/grammars/language-asn1
 | 
			
		||||
	url = https://github.com/ajLangley12/language-asn1
 | 
			
		||||
[submodule "vendor/grammars/atom-language-1c-bsl"]
 | 
			
		||||
	path = vendor/grammars/atom-language-1c-bsl
 | 
			
		||||
	url = https://github.com/xDrivenDevelopment/atom-language-1c-bsl.git
 | 
			
		||||
[submodule "vendor/grammars/sublime-rexx"]
 | 
			
		||||
	path = vendor/grammars/sublime-rexx
 | 
			
		||||
	url = https://github.com/mblocker/rexx-sublime
 | 
			
		||||
[submodule "vendor/grammars/blitzmax"]
 | 
			
		||||
	path = vendor/grammars/blitzmax
 | 
			
		||||
	url = https://github.com/textmate/blitzmax.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/cython"]
 | 
			
		||||
	path = vendor/grammars/cython
 | 
			
		||||
	url = https://github.com/textmate/cython.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/forth"]
 | 
			
		||||
	path = vendor/grammars/forth
 | 
			
		||||
	url = https://github.com/textmate/forth.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/parrot"]
 | 
			
		||||
	path = vendor/grammars/parrot
 | 
			
		||||
	url = https://github.com/textmate/parrot.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/secondlife-lsl"]
 | 
			
		||||
	path = vendor/grammars/secondlife-lsl
 | 
			
		||||
	url = https://github.com/textmate/secondlife-lsl.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/vhdl"]
 | 
			
		||||
	path = vendor/grammars/vhdl
 | 
			
		||||
	url = https://github.com/textmate/vhdl.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/xquery"]
 | 
			
		||||
	path = vendor/grammars/xquery
 | 
			
		||||
	url = https://github.com/textmate/xquery.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/language-rpm-spec"]
 | 
			
		||||
	path = vendor/grammars/language-rpm-spec
 | 
			
		||||
	url = https://github.com/waveclaw/language-rpm-spec
 | 
			
		||||
[submodule "vendor/grammars/language-emacs-lisp"]
 | 
			
		||||
	path = vendor/grammars/language-emacs-lisp
 | 
			
		||||
	url = https://github.com/Alhadis/language-emacs-lisp
 | 
			
		||||
[submodule "vendor/grammars/language-babel"]
 | 
			
		||||
	path = vendor/grammars/language-babel
 | 
			
		||||
	url = https://github.com/github-linguist/language-babel
 | 
			
		||||
[submodule "vendor/CodeMirror"]
 | 
			
		||||
	path = vendor/CodeMirror
 | 
			
		||||
	url = https://github.com/codemirror/CodeMirror
 | 
			
		||||
[submodule "vendor/grammars/MQL5-sublime"]
 | 
			
		||||
	path = vendor/grammars/MQL5-sublime
 | 
			
		||||
	url = https://github.com/mqsoft/MQL5-sublime
 | 
			
		||||
[submodule "vendor/grammars/actionscript3-tmbundle"]
 | 
			
		||||
	path = vendor/grammars/actionscript3-tmbundle
 | 
			
		||||
	url = https://github.com/simongregory/actionscript3-tmbundle
 | 
			
		||||
[submodule "vendor/grammars/ABNF.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/ABNF.tmbundle
 | 
			
		||||
	url = https://github.com/sanssecours/ABNF.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/EBNF.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/EBNF.tmbundle
 | 
			
		||||
	url = https://github.com/sanssecours/EBNF.tmbundle
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ To add support for a new extension:
 | 
			
		||||
In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken:
 | 
			
		||||
 | 
			
		||||
0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.
 | 
			
		||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
 | 
			
		||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
			
		||||
0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -27,18 +27,16 @@ We try only to add languages once they have some usage on GitHub. In most cases
 | 
			
		||||
 | 
			
		||||
To add support for a new language:
 | 
			
		||||
 | 
			
		||||
0. Add an entry for your language to [`languages.yml`][languages].
 | 
			
		||||
0. Add a grammar for your language. Please only add grammars that have a license that permits redistribution.
 | 
			
		||||
  0. Add your grammar as a submodule: `git submodule add https://github.com/JaneSmith/MyGrammar vendor/grammars/MyGrammar`.
 | 
			
		||||
  0. Add your grammar to [`grammars.yml`][grammars] by running `script/convert-grammars --add vendor/grammars/MyGrammar`.
 | 
			
		||||
  0. Download the license for the grammar: `script/licensed`. Be careful to only commit the file for the new grammar, as this script may update licenses for other grammars as well.
 | 
			
		||||
0. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now.
 | 
			
		||||
0. Add a grammar for your language: `script/add-grammar https://github.com/JaneSmith/MyGrammar`. Please only add grammars that have [one of these licenses][licenses].
 | 
			
		||||
0. Add samples for your language to the [samples directory][samples] in the correct subdirectory.
 | 
			
		||||
0. Add a `language_id` for your language using `script/set-language-ids`. **You should only ever need to run `script/set-language-ids --update`. Anything other than this risks breaking GitHub search :cry:**
 | 
			
		||||
0. Open a pull request, linking to a [GitHub search result](https://github.com/search?utf8=%E2%9C%93&q=extension%3Aboot+NOT+nothack&type=Code&ref=searchresults) showing in-the-wild usage.
 | 
			
		||||
 | 
			
		||||
In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken:
 | 
			
		||||
 | 
			
		||||
0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`.
 | 
			
		||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files.
 | 
			
		||||
0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files.
 | 
			
		||||
0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help.
 | 
			
		||||
 | 
			
		||||
Remember, the goal here is to try and avoid false positives!
 | 
			
		||||
@@ -81,10 +79,11 @@ Here's our current build status: [
 | 
			
		||||
- @larsbrinkhoff
 | 
			
		||||
- @pchaigno
 | 
			
		||||
 
 | 
			
		||||
- **@arfon** (GitHub Staff)
 | 
			
		||||
- **@Alhadis**
 | 
			
		||||
- **@larsbrinkhoff**
 | 
			
		||||
- **@pchaigno**
 | 
			
		||||
 | 
			
		||||
As Linguist is a production dependency for GitHub we have a couple of workflow restrictions:
 | 
			
		||||
 | 
			
		||||
- Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub member of staff
 | 
			
		||||
@@ -112,5 +111,6 @@ If you are the current maintainer of this gem:
 | 
			
		||||
 | 
			
		||||
[grammars]: /grammars.yml
 | 
			
		||||
[languages]: /lib/linguist/languages.yml
 | 
			
		||||
[licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11
 | 
			
		||||
[samples]: /samples
 | 
			
		||||
[new-issue]: https://github.com/github/linguist/issues/new
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,12 @@ The Language stats bar displays languages percentages for the files in the repos
 | 
			
		||||
0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful.
 | 
			
		||||
0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified.
 | 
			
		||||
 | 
			
		||||
### There's a problem with the syntax highlighting of a file
 | 
			
		||||
 | 
			
		||||
Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md).
 | 
			
		||||
 | 
			
		||||
If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed.
 | 
			
		||||
 | 
			
		||||
## Overrides
 | 
			
		||||
 | 
			
		||||
Linguist supports a number of different custom overrides strategies for language definitions and vendored paths.
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ class GitLinguist
 | 
			
		||||
    if @incremental && stats = load_language_stats
 | 
			
		||||
      old_commit_oid, old_stats = stats
 | 
			
		||||
 | 
			
		||||
      # A cache with NULL oid means that we want to froze
 | 
			
		||||
      # A cache with NULL oid means that we want to freeze
 | 
			
		||||
      # these language stats in place and stop computing
 | 
			
		||||
      # them (for performance reasons)
 | 
			
		||||
      return old_stats if old_commit_oid == NULL_OID
 | 
			
		||||
@@ -111,7 +111,7 @@ def git_linguist(args)
 | 
			
		||||
  parser.parse!(args)
 | 
			
		||||
 | 
			
		||||
  git_dir = `git rev-parse --git-dir`.strip
 | 
			
		||||
  raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success?
 | 
			
		||||
  raise "git-linguist must be run in a Git repository (#{Dir.pwd})" unless $?.success?
 | 
			
		||||
  wrapper = GitLinguist.new(git_dir, commit, incremental)
 | 
			
		||||
 | 
			
		||||
  case args.pop
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,6 @@ 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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										185
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								grammars.yml
									
									
									
									
									
								
							@@ -1,30 +1,18 @@
 | 
			
		||||
---
 | 
			
		||||
http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:
 | 
			
		||||
- text.xml.genshi
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/BlitzMax.tmbundle:
 | 
			
		||||
- source.blitzmax
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/Cython.tmbundle:
 | 
			
		||||
- source.cython
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/Forth.tmbundle:
 | 
			
		||||
- source.forth
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/Parrot.tmbundle:
 | 
			
		||||
- source.parrot.pir
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/SecondLife%20LSL.tmbundle:
 | 
			
		||||
- source.lsl
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/VHDL.tmbundle:
 | 
			
		||||
- source.vhdl
 | 
			
		||||
http://svn.textmate.org/trunk/Review/Bundles/XQuery.tmbundle:
 | 
			
		||||
- source.xquery
 | 
			
		||||
https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz:
 | 
			
		||||
- source.systemverilog
 | 
			
		||||
- source.ucfconstraints
 | 
			
		||||
vendor/grammars/ABNF.tmbundle:
 | 
			
		||||
- source.abnf
 | 
			
		||||
vendor/grammars/Agda.tmbundle:
 | 
			
		||||
- source.agda
 | 
			
		||||
vendor/grammars/Alloy.tmbundle:
 | 
			
		||||
- source.alloy
 | 
			
		||||
vendor/grammars/AutoHotkey/:
 | 
			
		||||
vendor/grammars/AutoHotkey:
 | 
			
		||||
- source.ahk
 | 
			
		||||
vendor/grammars/BrightScript.tmbundle/:
 | 
			
		||||
vendor/grammars/BrightScript.tmbundle:
 | 
			
		||||
- source.brightauthorproject
 | 
			
		||||
- source.brightscript
 | 
			
		||||
vendor/grammars/ColdFusion:
 | 
			
		||||
@@ -34,11 +22,15 @@ vendor/grammars/ColdFusion:
 | 
			
		||||
- text.html.cfm
 | 
			
		||||
vendor/grammars/Docker.tmbundle:
 | 
			
		||||
- source.dockerfile
 | 
			
		||||
vendor/grammars/Elm/:
 | 
			
		||||
vendor/grammars/EBNF.tmbundle:
 | 
			
		||||
- source.ebnf
 | 
			
		||||
vendor/grammars/Elm/Syntaxes:
 | 
			
		||||
- source.elm
 | 
			
		||||
- text.html.mediawiki.elm-build-output
 | 
			
		||||
- text.html.mediawiki.elm-documentation
 | 
			
		||||
vendor/grammars/FreeMarker.tmbundle:
 | 
			
		||||
- text.html.ftl
 | 
			
		||||
vendor/grammars/G-Code/:
 | 
			
		||||
vendor/grammars/G-Code:
 | 
			
		||||
- source.LS
 | 
			
		||||
- source.MCPOST
 | 
			
		||||
- source.MOD
 | 
			
		||||
@@ -51,7 +43,7 @@ vendor/grammars/IDL-Syntax:
 | 
			
		||||
vendor/grammars/Isabelle.tmbundle:
 | 
			
		||||
- source.isabelle.root
 | 
			
		||||
- source.isabelle.theory
 | 
			
		||||
vendor/grammars/JSyntax/:
 | 
			
		||||
vendor/grammars/JSyntax:
 | 
			
		||||
- source.j
 | 
			
		||||
vendor/grammars/Julia.tmbundle:
 | 
			
		||||
- source.julia
 | 
			
		||||
@@ -59,10 +51,12 @@ vendor/grammars/Lean.tmbundle:
 | 
			
		||||
- source.lean
 | 
			
		||||
vendor/grammars/LiveScript.tmbundle:
 | 
			
		||||
- source.livescript
 | 
			
		||||
vendor/grammars/MQL5-sublime:
 | 
			
		||||
- source.mql5
 | 
			
		||||
vendor/grammars/MagicPython:
 | 
			
		||||
- source.python
 | 
			
		||||
- source.regexp.python
 | 
			
		||||
vendor/grammars/Modelica/:
 | 
			
		||||
vendor/grammars/Modelica:
 | 
			
		||||
- source.modelica
 | 
			
		||||
vendor/grammars/NSIS:
 | 
			
		||||
- source.nsis
 | 
			
		||||
@@ -72,7 +66,7 @@ vendor/grammars/NimLime:
 | 
			
		||||
- source.nimcfg
 | 
			
		||||
vendor/grammars/PHP-Twig.tmbundle:
 | 
			
		||||
- text.html.twig
 | 
			
		||||
vendor/grammars/PogoScript.tmbundle/:
 | 
			
		||||
vendor/grammars/PogoScript.tmbundle:
 | 
			
		||||
- source.pogoscript
 | 
			
		||||
vendor/grammars/RDoc.tmbundle:
 | 
			
		||||
- text.rdoc
 | 
			
		||||
@@ -87,10 +81,10 @@ vendor/grammars/Scalate.tmbundle:
 | 
			
		||||
- text.html.ssp
 | 
			
		||||
vendor/grammars/Slash.tmbundle:
 | 
			
		||||
- text.html.slash
 | 
			
		||||
vendor/grammars/Stata.tmbundle/:
 | 
			
		||||
vendor/grammars/Stata.tmbundle:
 | 
			
		||||
- source.mata
 | 
			
		||||
- source.stata
 | 
			
		||||
vendor/grammars/Stylus/:
 | 
			
		||||
vendor/grammars/Stylus:
 | 
			
		||||
- source.stylus
 | 
			
		||||
vendor/grammars/Sublime-Coq:
 | 
			
		||||
- source.coq
 | 
			
		||||
@@ -100,7 +94,7 @@ vendor/grammars/Sublime-Lasso:
 | 
			
		||||
- file.lasso
 | 
			
		||||
vendor/grammars/Sublime-Loom:
 | 
			
		||||
- source.loomscript
 | 
			
		||||
vendor/grammars/Sublime-Modula-2/:
 | 
			
		||||
vendor/grammars/Sublime-Modula-2:
 | 
			
		||||
- source.modula2
 | 
			
		||||
vendor/grammars/Sublime-Nit:
 | 
			
		||||
- source.nit
 | 
			
		||||
@@ -115,26 +109,24 @@ vendor/grammars/Sublime-SQF-Language:
 | 
			
		||||
vendor/grammars/Sublime-Text-2-OpenEdge-ABL:
 | 
			
		||||
- source.abl
 | 
			
		||||
- text.html.abl
 | 
			
		||||
vendor/grammars/Sublime-VimL:
 | 
			
		||||
- source.viml
 | 
			
		||||
vendor/grammars/SublimeBrainfuck:
 | 
			
		||||
- source.bf
 | 
			
		||||
vendor/grammars/SublimeClarion/:
 | 
			
		||||
vendor/grammars/SublimeClarion:
 | 
			
		||||
- source.clarion
 | 
			
		||||
vendor/grammars/SublimeGDB/:
 | 
			
		||||
vendor/grammars/SublimeGDB:
 | 
			
		||||
- source.disasm
 | 
			
		||||
- source.gdb
 | 
			
		||||
- source.gdb.session
 | 
			
		||||
- source.gdbregs
 | 
			
		||||
vendor/grammars/SublimePapyrus/:
 | 
			
		||||
vendor/grammars/SublimePapyrus:
 | 
			
		||||
- source.papyrus.skyrim
 | 
			
		||||
vendor/grammars/SublimePuppet/:
 | 
			
		||||
vendor/grammars/SublimePuppet:
 | 
			
		||||
- source.puppet
 | 
			
		||||
vendor/grammars/SublimeXtend:
 | 
			
		||||
- source.xtend
 | 
			
		||||
vendor/grammars/TLA:
 | 
			
		||||
- source.tla
 | 
			
		||||
vendor/grammars/TXL/:
 | 
			
		||||
vendor/grammars/TXL:
 | 
			
		||||
- source.txl
 | 
			
		||||
vendor/grammars/Textmate-Gosu-Bundle:
 | 
			
		||||
- source.gosu.2
 | 
			
		||||
@@ -148,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
 | 
			
		||||
@@ -163,36 +155,39 @@ vendor/grammars/antlr.tmbundle:
 | 
			
		||||
vendor/grammars/apache.tmbundle:
 | 
			
		||||
- source.apache-config
 | 
			
		||||
- source.apache-config.mod_perl
 | 
			
		||||
vendor/grammars/api-blueprint-sublime-plugin/:
 | 
			
		||||
vendor/grammars/api-blueprint-sublime-plugin:
 | 
			
		||||
- text.html.markdown.source.gfm.apib
 | 
			
		||||
- text.html.markdown.source.gfm.mson
 | 
			
		||||
vendor/grammars/applescript.tmbundle:
 | 
			
		||||
- source.applescript
 | 
			
		||||
vendor/grammars/asciidoc.tmbundle/:
 | 
			
		||||
vendor/grammars/asciidoc.tmbundle:
 | 
			
		||||
- text.html.asciidoc
 | 
			
		||||
vendor/grammars/asp.tmbundle:
 | 
			
		||||
- source.asp
 | 
			
		||||
- text.html.asp
 | 
			
		||||
vendor/grammars/assembly/:
 | 
			
		||||
vendor/grammars/assembly:
 | 
			
		||||
- objdump.x86asm
 | 
			
		||||
- source.x86asm
 | 
			
		||||
vendor/grammars/atom-fsharp/:
 | 
			
		||||
vendor/grammars/atom-fsharp:
 | 
			
		||||
- source.fsharp
 | 
			
		||||
- source.fsharp.fsi
 | 
			
		||||
- source.fsharp.fsl
 | 
			
		||||
- source.fsharp.fsx
 | 
			
		||||
vendor/grammars/atom-language-1c-bsl:
 | 
			
		||||
- source.bsl
 | 
			
		||||
- source.sdbl
 | 
			
		||||
vendor/grammars/atom-language-clean:
 | 
			
		||||
- source.clean
 | 
			
		||||
vendor/grammars/atom-language-purescript/:
 | 
			
		||||
vendor/grammars/atom-language-purescript:
 | 
			
		||||
- source.purescript
 | 
			
		||||
vendor/grammars/atom-language-srt:
 | 
			
		||||
- text.srt
 | 
			
		||||
vendor/grammars/atom-language-stan/:
 | 
			
		||||
vendor/grammars/atom-language-stan:
 | 
			
		||||
- source.stan
 | 
			
		||||
vendor/grammars/atom-salt:
 | 
			
		||||
- source.python.salt
 | 
			
		||||
- source.yaml.salt
 | 
			
		||||
vendor/grammars/atomic-dreams/:
 | 
			
		||||
vendor/grammars/atomic-dreams:
 | 
			
		||||
- source.dm
 | 
			
		||||
- source.dmf
 | 
			
		||||
vendor/grammars/ats:
 | 
			
		||||
@@ -201,7 +196,9 @@ vendor/grammars/awk-sublime:
 | 
			
		||||
- source.awk
 | 
			
		||||
vendor/grammars/bison.tmbundle:
 | 
			
		||||
- source.bison
 | 
			
		||||
vendor/grammars/boo/:
 | 
			
		||||
vendor/grammars/blitzmax:
 | 
			
		||||
- source.blitzmax
 | 
			
		||||
vendor/grammars/boo:
 | 
			
		||||
- source.boo
 | 
			
		||||
vendor/grammars/bro-sublime:
 | 
			
		||||
- source.bro
 | 
			
		||||
@@ -226,13 +223,15 @@ vendor/grammars/cool-tmbundle:
 | 
			
		||||
vendor/grammars/cpp-qt.tmbundle:
 | 
			
		||||
- source.c++.qt
 | 
			
		||||
- source.qmake
 | 
			
		||||
vendor/grammars/creole/:
 | 
			
		||||
vendor/grammars/creole:
 | 
			
		||||
- text.html.creole
 | 
			
		||||
vendor/grammars/css.tmbundle:
 | 
			
		||||
- source.css
 | 
			
		||||
vendor/grammars/cucumber-tmbundle:
 | 
			
		||||
- source.ruby.rspec.cucumber.steps
 | 
			
		||||
- text.gherkin.feature
 | 
			
		||||
vendor/grammars/cython:
 | 
			
		||||
- source.cython
 | 
			
		||||
vendor/grammars/d.tmbundle:
 | 
			
		||||
- source.d
 | 
			
		||||
vendor/grammars/dart-sublime-bundle:
 | 
			
		||||
@@ -248,9 +247,7 @@ vendor/grammars/dylan.tmbundle:
 | 
			
		||||
- source.dylan
 | 
			
		||||
- source.lid
 | 
			
		||||
- source.makegen
 | 
			
		||||
vendor/grammars/ebundles/Bundles/MSDOS batch file.tmbundle:
 | 
			
		||||
- source.dosbatch
 | 
			
		||||
vendor/grammars/ec.tmbundle/:
 | 
			
		||||
vendor/grammars/ec.tmbundle:
 | 
			
		||||
- source.c.ec
 | 
			
		||||
vendor/grammars/eiffel.tmbundle:
 | 
			
		||||
- source.eiffel
 | 
			
		||||
@@ -270,12 +267,14 @@ vendor/grammars/fancy-tmbundle:
 | 
			
		||||
- source.fancy
 | 
			
		||||
vendor/grammars/fish-tmbundle:
 | 
			
		||||
- source.fish
 | 
			
		||||
vendor/grammars/forth:
 | 
			
		||||
- source.forth
 | 
			
		||||
vendor/grammars/fortran.tmbundle:
 | 
			
		||||
- source.fortran
 | 
			
		||||
- source.fortran.modern
 | 
			
		||||
vendor/grammars/gap-tmbundle/:
 | 
			
		||||
vendor/grammars/gap-tmbundle:
 | 
			
		||||
- source.gap
 | 
			
		||||
vendor/grammars/gdscript/:
 | 
			
		||||
vendor/grammars/gdscript:
 | 
			
		||||
- source.gdscript
 | 
			
		||||
vendor/grammars/gettext.tmbundle:
 | 
			
		||||
- source.po
 | 
			
		||||
@@ -291,9 +290,6 @@ vendor/grammars/graphviz.tmbundle:
 | 
			
		||||
- source.dot
 | 
			
		||||
vendor/grammars/groovy.tmbundle:
 | 
			
		||||
- source.groovy
 | 
			
		||||
vendor/grammars/haskell.tmbundle:
 | 
			
		||||
- source.haskell
 | 
			
		||||
- text.tex.latex.haskell
 | 
			
		||||
vendor/grammars/haxe-sublime-bundle:
 | 
			
		||||
- source.erazor
 | 
			
		||||
- source.haxe.2
 | 
			
		||||
@@ -306,7 +302,7 @@ vendor/grammars/idl.tmbundle:
 | 
			
		||||
- source.idl
 | 
			
		||||
- source.idl-dlm
 | 
			
		||||
- text.idl-idldoc
 | 
			
		||||
vendor/grammars/idris/:
 | 
			
		||||
vendor/grammars/idris:
 | 
			
		||||
- source.idris
 | 
			
		||||
vendor/grammars/ini.tmbundle:
 | 
			
		||||
- source.ini
 | 
			
		||||
@@ -336,12 +332,16 @@ vendor/grammars/language-agc:
 | 
			
		||||
- source.agc
 | 
			
		||||
vendor/grammars/language-apl:
 | 
			
		||||
- source.apl
 | 
			
		||||
vendor/grammars/language-babel/:
 | 
			
		||||
vendor/grammars/language-asn1:
 | 
			
		||||
- source.asn
 | 
			
		||||
vendor/grammars/language-babel:
 | 
			
		||||
- source.js.jsx
 | 
			
		||||
- source.regexp.babel
 | 
			
		||||
vendor/grammars/language-blade/:
 | 
			
		||||
vendor/grammars/language-batchfile:
 | 
			
		||||
- source.batchfile
 | 
			
		||||
vendor/grammars/language-blade:
 | 
			
		||||
- text.html.php.blade
 | 
			
		||||
vendor/grammars/language-click/:
 | 
			
		||||
vendor/grammars/language-click:
 | 
			
		||||
- source.click
 | 
			
		||||
vendor/grammars/language-clojure:
 | 
			
		||||
- source.clojure
 | 
			
		||||
@@ -360,22 +360,34 @@ vendor/grammars/language-csound:
 | 
			
		||||
- source.csound
 | 
			
		||||
- source.csound-document
 | 
			
		||||
- source.csound-score
 | 
			
		||||
vendor/grammars/language-emacs-lisp:
 | 
			
		||||
- source.emacs.lisp
 | 
			
		||||
vendor/grammars/language-gfm:
 | 
			
		||||
- source.gfm
 | 
			
		||||
vendor/grammars/language-graphql:
 | 
			
		||||
- source.graphql
 | 
			
		||||
vendor/grammars/language-haskell:
 | 
			
		||||
- hint.haskell
 | 
			
		||||
- hint.message.haskell
 | 
			
		||||
- hint.type.haskell
 | 
			
		||||
- source.c2hs
 | 
			
		||||
- source.cabal
 | 
			
		||||
- source.haskell
 | 
			
		||||
- source.hsc2hs
 | 
			
		||||
- text.tex.latex.haskell
 | 
			
		||||
vendor/grammars/language-hy:
 | 
			
		||||
- source.hy
 | 
			
		||||
vendor/grammars/language-inform7:
 | 
			
		||||
- source.inform7
 | 
			
		||||
vendor/grammars/language-javascript:
 | 
			
		||||
- source.js
 | 
			
		||||
- source.js.embedded.html
 | 
			
		||||
- source.js.regexp
 | 
			
		||||
- source.js.regexp.replacement
 | 
			
		||||
vendor/grammars/language-jsoniq/:
 | 
			
		||||
vendor/grammars/language-jsoniq:
 | 
			
		||||
- source.jq
 | 
			
		||||
- source.xq
 | 
			
		||||
vendor/grammars/language-less/:
 | 
			
		||||
vendor/grammars/language-less:
 | 
			
		||||
- source.css.less
 | 
			
		||||
vendor/grammars/language-maxscript:
 | 
			
		||||
- source.maxscript
 | 
			
		||||
@@ -390,6 +402,14 @@ vendor/grammars/language-renpy:
 | 
			
		||||
- source.renpy
 | 
			
		||||
vendor/grammars/language-restructuredtext:
 | 
			
		||||
- text.restructuredtext
 | 
			
		||||
vendor/grammars/language-roff:
 | 
			
		||||
- source.ideal
 | 
			
		||||
- source.pic
 | 
			
		||||
- text.roff
 | 
			
		||||
- text.runoff
 | 
			
		||||
vendor/grammars/language-rpm-spec:
 | 
			
		||||
- source.changelogs.rpm-spec
 | 
			
		||||
- source.rpm-spec
 | 
			
		||||
vendor/grammars/language-shellscript:
 | 
			
		||||
- source.shell
 | 
			
		||||
- text.shell-session
 | 
			
		||||
@@ -399,6 +419,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
 | 
			
		||||
@@ -406,7 +428,7 @@ vendor/grammars/language-xbase:
 | 
			
		||||
- source.harbour
 | 
			
		||||
vendor/grammars/language-yaml:
 | 
			
		||||
- source.yaml
 | 
			
		||||
vendor/grammars/language-yang/:
 | 
			
		||||
vendor/grammars/language-yang:
 | 
			
		||||
- source.yang
 | 
			
		||||
vendor/grammars/latex.tmbundle:
 | 
			
		||||
- text.bibtex
 | 
			
		||||
@@ -440,11 +462,11 @@ vendor/grammars/matlab.tmbundle:
 | 
			
		||||
- source.octave
 | 
			
		||||
vendor/grammars/maven.tmbundle:
 | 
			
		||||
- text.xml.pom
 | 
			
		||||
vendor/grammars/mediawiki.tmbundle/:
 | 
			
		||||
vendor/grammars/mediawiki.tmbundle:
 | 
			
		||||
- text.html.mediawiki
 | 
			
		||||
vendor/grammars/mercury-tmlanguage:
 | 
			
		||||
- source.mercury
 | 
			
		||||
vendor/grammars/monkey/:
 | 
			
		||||
vendor/grammars/monkey:
 | 
			
		||||
- source.monkey
 | 
			
		||||
vendor/grammars/moonscript-tmbundle:
 | 
			
		||||
- source.moonscript
 | 
			
		||||
@@ -474,11 +496,13 @@ vendor/grammars/opa.tmbundle:
 | 
			
		||||
- source.opa
 | 
			
		||||
vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage:
 | 
			
		||||
- source.oz
 | 
			
		||||
vendor/grammars/parrot:
 | 
			
		||||
- source.parrot.pir
 | 
			
		||||
vendor/grammars/pascal.tmbundle:
 | 
			
		||||
- source.pascal
 | 
			
		||||
vendor/grammars/pawn-sublime-language/:
 | 
			
		||||
vendor/grammars/pawn-sublime-language:
 | 
			
		||||
- source.pawn
 | 
			
		||||
vendor/grammars/perl.tmbundle/:
 | 
			
		||||
vendor/grammars/perl.tmbundle:
 | 
			
		||||
- source.perl
 | 
			
		||||
- source.perl.6
 | 
			
		||||
vendor/grammars/perl6fe:
 | 
			
		||||
@@ -489,7 +513,7 @@ vendor/grammars/php-smarty.tmbundle:
 | 
			
		||||
- text.html.smarty
 | 
			
		||||
vendor/grammars/php.tmbundle:
 | 
			
		||||
- text.html.php
 | 
			
		||||
vendor/grammars/pig-latin/:
 | 
			
		||||
vendor/grammars/pig-latin:
 | 
			
		||||
- source.pig_latin
 | 
			
		||||
vendor/grammars/pike-textmate:
 | 
			
		||||
- source.pike
 | 
			
		||||
@@ -526,11 +550,13 @@ vendor/grammars/scheme.tmbundle:
 | 
			
		||||
- source.scheme
 | 
			
		||||
vendor/grammars/scilab.tmbundle:
 | 
			
		||||
- source.scilab
 | 
			
		||||
vendor/grammars/smali-sublime/smali.tmLanguage:
 | 
			
		||||
vendor/grammars/secondlife-lsl:
 | 
			
		||||
- source.lsl
 | 
			
		||||
vendor/grammars/smali-sublime:
 | 
			
		||||
- source.smali
 | 
			
		||||
vendor/grammars/smalltalk-tmbundle:
 | 
			
		||||
- source.smalltalk
 | 
			
		||||
vendor/grammars/sourcepawn/:
 | 
			
		||||
vendor/grammars/sourcepawn:
 | 
			
		||||
- source.sp
 | 
			
		||||
vendor/grammars/sql.tmbundle:
 | 
			
		||||
- source.sql
 | 
			
		||||
@@ -541,9 +567,9 @@ vendor/grammars/standard-ml.tmbundle:
 | 
			
		||||
- source.ml
 | 
			
		||||
vendor/grammars/sublime-MuPAD:
 | 
			
		||||
- source.mupad
 | 
			
		||||
vendor/grammars/sublime-aspectj/:
 | 
			
		||||
vendor/grammars/sublime-aspectj:
 | 
			
		||||
- source.aspectj
 | 
			
		||||
vendor/grammars/sublime-autoit/:
 | 
			
		||||
vendor/grammars/sublime-autoit:
 | 
			
		||||
- source.autoit
 | 
			
		||||
vendor/grammars/sublime-befunge:
 | 
			
		||||
- source.befunge
 | 
			
		||||
@@ -551,12 +577,12 @@ vendor/grammars/sublime-bsv:
 | 
			
		||||
- source.bsv
 | 
			
		||||
vendor/grammars/sublime-cirru:
 | 
			
		||||
- source.cirru
 | 
			
		||||
vendor/grammars/sublime-clips/:
 | 
			
		||||
vendor/grammars/sublime-clips:
 | 
			
		||||
- source.clips
 | 
			
		||||
vendor/grammars/sublime-glsl:
 | 
			
		||||
- source.essl
 | 
			
		||||
- source.glsl
 | 
			
		||||
vendor/grammars/sublime-golo/:
 | 
			
		||||
vendor/grammars/sublime-golo:
 | 
			
		||||
- source.golo
 | 
			
		||||
vendor/grammars/sublime-mask:
 | 
			
		||||
- source.mask
 | 
			
		||||
@@ -565,27 +591,31 @@ vendor/grammars/sublime-netlinx:
 | 
			
		||||
- source.netlinx.erb
 | 
			
		||||
vendor/grammars/sublime-nginx:
 | 
			
		||||
- source.nginx
 | 
			
		||||
vendor/grammars/sublime-opal/:
 | 
			
		||||
vendor/grammars/sublime-opal:
 | 
			
		||||
- source.opal
 | 
			
		||||
- source.opalsysdefs
 | 
			
		||||
vendor/grammars/sublime-pony:
 | 
			
		||||
- source.pony
 | 
			
		||||
vendor/grammars/sublime-rexx:
 | 
			
		||||
- source.rexx
 | 
			
		||||
vendor/grammars/sublime-robot-plugin:
 | 
			
		||||
- text.robot
 | 
			
		||||
vendor/grammars/sublime-rust:
 | 
			
		||||
- source.rust
 | 
			
		||||
vendor/grammars/sublime-spintools/:
 | 
			
		||||
vendor/grammars/sublime-spintools:
 | 
			
		||||
- source.regexp.spin
 | 
			
		||||
- source.spin
 | 
			
		||||
vendor/grammars/sublime-tea:
 | 
			
		||||
- source.tea
 | 
			
		||||
vendor/grammars/sublime-terra:
 | 
			
		||||
- source.terra
 | 
			
		||||
vendor/grammars/sublime-text-ox/:
 | 
			
		||||
vendor/grammars/sublime-text-ox:
 | 
			
		||||
- source.ox
 | 
			
		||||
vendor/grammars/sublime-typescript/:
 | 
			
		||||
vendor/grammars/sublime-typescript:
 | 
			
		||||
- source.ts
 | 
			
		||||
- source.tsx
 | 
			
		||||
- text.error-list
 | 
			
		||||
- text.find-refs
 | 
			
		||||
vendor/grammars/sublime-varnish:
 | 
			
		||||
- source.varnish.vcl
 | 
			
		||||
vendor/grammars/sublime_cobol:
 | 
			
		||||
@@ -593,12 +623,9 @@ vendor/grammars/sublime_cobol:
 | 
			
		||||
- source.cobol
 | 
			
		||||
- source.jcl
 | 
			
		||||
- source.opencobol
 | 
			
		||||
vendor/grammars/sublime_man_page_support:
 | 
			
		||||
- source.man
 | 
			
		||||
- text.groff
 | 
			
		||||
vendor/grammars/sublimeassembly/:
 | 
			
		||||
vendor/grammars/sublimeassembly:
 | 
			
		||||
- source.assembly
 | 
			
		||||
vendor/grammars/sublimeprolog/:
 | 
			
		||||
vendor/grammars/sublimeprolog:
 | 
			
		||||
- source.prolog
 | 
			
		||||
- source.prolog.eclipse
 | 
			
		||||
vendor/grammars/sublimetext-cuda-cpp:
 | 
			
		||||
@@ -617,12 +644,16 @@ vendor/grammars/turtle.tmbundle:
 | 
			
		||||
- source.turtle
 | 
			
		||||
vendor/grammars/verilog.tmbundle:
 | 
			
		||||
- source.verilog
 | 
			
		||||
vendor/grammars/vhdl:
 | 
			
		||||
- source.vhdl
 | 
			
		||||
vendor/grammars/vue-syntax-highlight:
 | 
			
		||||
- text.html.vue
 | 
			
		||||
vendor/grammars/xc.tmbundle/:
 | 
			
		||||
vendor/grammars/xc.tmbundle:
 | 
			
		||||
- source.xc
 | 
			
		||||
vendor/grammars/xml.tmbundle:
 | 
			
		||||
- text.xml
 | 
			
		||||
- text.xml.xsl
 | 
			
		||||
vendor/grammars/xquery:
 | 
			
		||||
- source.xquery
 | 
			
		||||
vendor/grammars/zephir-sublime:
 | 
			
		||||
- source.php.zephir
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,7 @@ module Linguist
 | 
			
		||||
      generated_net_specflow_feature_file? ||
 | 
			
		||||
      composer_lock? ||
 | 
			
		||||
      node_modules? ||
 | 
			
		||||
      go_vendor? ||
 | 
			
		||||
      npm_shrinkwrap? ||
 | 
			
		||||
      godeps? ||
 | 
			
		||||
      generated_by_zephir? ||
 | 
			
		||||
@@ -304,6 +305,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.
 | 
			
		||||
 
 | 
			
		||||
@@ -144,10 +144,22 @@ module Linguist
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".for", ".f" do |data|
 | 
			
		||||
    fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end|data)\s|\s*!)/i
 | 
			
		||||
 | 
			
		||||
    disambiguate ".f" do |data|
 | 
			
		||||
      if /^: /.match(data)
 | 
			
		||||
        Language["Forth"]
 | 
			
		||||
      elsif /^([c*][^abd-z]|      (subroutine|program|end)\s|\s*!)/i.match(data)
 | 
			
		||||
      elsif data.include?("flowop")
 | 
			
		||||
        Language["Filebench WML"]
 | 
			
		||||
      elsif fortran_rx.match(data)
 | 
			
		||||
        Language["FORTRAN"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".for" do |data|
 | 
			
		||||
      if /^: /.match(data)
 | 
			
		||||
        Language["Forth"]
 | 
			
		||||
      elsif fortran_rx.match(data)
 | 
			
		||||
        Language["FORTRAN"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
@@ -190,6 +202,8 @@ module Linguist
 | 
			
		||||
    disambiguate ".inc" do |data|
 | 
			
		||||
      if /^<\?(?:php)?/.match(data)
 | 
			
		||||
        Language["PHP"]
 | 
			
		||||
      elsif /^\s*#(declare|local|macro|while)\s/.match(data)
 | 
			
		||||
        Language["POV-Ray SDL"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -230,7 +244,7 @@ module Linguist
 | 
			
		||||
        Language["MUF"]
 | 
			
		||||
      elsif /^\s*;/.match(data)
 | 
			
		||||
        Language["M"]
 | 
			
		||||
      elsif /^\s*\(\*/.match(data)
 | 
			
		||||
      elsif /\*\)$/.match(data)
 | 
			
		||||
        Language["Mathematica"]
 | 
			
		||||
      elsif /^\s*%/.match(data)
 | 
			
		||||
        Language["Matlab"]
 | 
			
		||||
@@ -240,7 +254,7 @@ module Linguist
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".md" do |data|
 | 
			
		||||
      if /^[-a-z0-9=#!\*\[|]/i.match(data)
 | 
			
		||||
      if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty?
 | 
			
		||||
        Language["Markdown"]
 | 
			
		||||
      elsif /^(;;|\(define_)/.match(data)
 | 
			
		||||
        Language["GCC machine description"]
 | 
			
		||||
@@ -354,11 +368,19 @@ module Linguist
 | 
			
		||||
    disambiguate ".r" do |data|
 | 
			
		||||
      if /\bRebol\b/i.match(data)
 | 
			
		||||
        Language["Rebol"]
 | 
			
		||||
      elsif data.include?("<-")
 | 
			
		||||
      elsif /<-|^\s*#/.match(data)
 | 
			
		||||
        Language["R"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".rno" do |data|
 | 
			
		||||
      if /^\.!|^\.end lit(?:eral)?\b/i.match(data)
 | 
			
		||||
        Language["RUNOFF"]
 | 
			
		||||
      elsif /^\.\\" /.match(data)
 | 
			
		||||
        Language["Groff"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".rpy" do |data|
 | 
			
		||||
      if /(^(import|from|class|def)\s)/m.match(data)
 | 
			
		||||
        Language["Python"]
 | 
			
		||||
@@ -422,7 +444,7 @@ module Linguist
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    disambiguate ".ts" do |data|
 | 
			
		||||
      if data.include?("</TS>")
 | 
			
		||||
      if data.include?("<TS")
 | 
			
		||||
        Language["XML"]
 | 
			
		||||
      else
 | 
			
		||||
        Language["TypeScript"]
 | 
			
		||||
 
 | 
			
		||||
@@ -20,10 +20,11 @@ module Linguist
 | 
			
		||||
  #
 | 
			
		||||
  # Languages are defined in `lib/linguist/languages.yml`.
 | 
			
		||||
  class Language
 | 
			
		||||
    @languages       = []
 | 
			
		||||
    @index           = {}
 | 
			
		||||
    @name_index      = {}
 | 
			
		||||
    @alias_index     = {}
 | 
			
		||||
    @languages          = []
 | 
			
		||||
    @index              = {}
 | 
			
		||||
    @name_index         = {}
 | 
			
		||||
    @alias_index        = {}
 | 
			
		||||
    @language_id_index  = {}
 | 
			
		||||
 | 
			
		||||
    @extension_index          = Hash.new { |h,k| h[k] = [] }
 | 
			
		||||
    @interpreter_index        = Hash.new { |h,k| h[k] = [] }
 | 
			
		||||
@@ -84,6 +85,8 @@ module Linguist
 | 
			
		||||
        @filename_index[filename] << language
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @language_id_index[language.language_id] = language
 | 
			
		||||
 | 
			
		||||
      language
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -193,6 +196,19 @@ module Linguist
 | 
			
		||||
      @interpreter_index[interpreter]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Public: Look up Languages by its language_id.
 | 
			
		||||
    #
 | 
			
		||||
    # language_id - Integer of language_id
 | 
			
		||||
    #
 | 
			
		||||
    # Examples
 | 
			
		||||
    #
 | 
			
		||||
    #   Language.find_by_id(100)
 | 
			
		||||
    #   # => [#<Language name="Elixir">]
 | 
			
		||||
    #
 | 
			
		||||
    # Returns the matching Language
 | 
			
		||||
    def self.find_by_id(language_id)
 | 
			
		||||
      @language_id_index[language_id.to_i]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Public: Look up Language by its name.
 | 
			
		||||
    #
 | 
			
		||||
@@ -251,6 +267,7 @@ module Linguist
 | 
			
		||||
    # Returns an Array of Languages.
 | 
			
		||||
    def self.ace_modes
 | 
			
		||||
      warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set."
 | 
			
		||||
      warn caller
 | 
			
		||||
      @ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -284,11 +301,16 @@ module Linguist
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @ace_mode = attributes[:ace_mode]
 | 
			
		||||
      @codemirror_mode = attributes[:codemirror_mode]
 | 
			
		||||
      @codemirror_mime_type = attributes[:codemirror_mime_type]
 | 
			
		||||
      @wrap = attributes[:wrap] || false
 | 
			
		||||
 | 
			
		||||
      # Set legacy search term
 | 
			
		||||
      @search_term = attributes[:search_term] || default_alias_name
 | 
			
		||||
 | 
			
		||||
      # Set the language_id
 | 
			
		||||
      @language_id = attributes[:language_id]
 | 
			
		||||
 | 
			
		||||
      # Set extensions or default to [].
 | 
			
		||||
      @extensions = attributes[:extensions] || []
 | 
			
		||||
      @interpreters = attributes[:interpreters]   || []
 | 
			
		||||
@@ -351,6 +373,17 @@ module Linguist
 | 
			
		||||
    # Returns the name String
 | 
			
		||||
    attr_reader :search_term
 | 
			
		||||
 | 
			
		||||
    # Public: Get language_id (used in GitHub search)
 | 
			
		||||
    #
 | 
			
		||||
    # Examples
 | 
			
		||||
    #
 | 
			
		||||
    #   # => "1"
 | 
			
		||||
    #   # => "2"
 | 
			
		||||
    #   # => "3"
 | 
			
		||||
    #
 | 
			
		||||
    # Returns the integer language_id
 | 
			
		||||
    attr_reader :language_id
 | 
			
		||||
 | 
			
		||||
    # Public: Get the name of a TextMate-compatible scope
 | 
			
		||||
    #
 | 
			
		||||
    # Returns the scope
 | 
			
		||||
@@ -367,6 +400,31 @@ module Linguist
 | 
			
		||||
    # Returns a String name or nil
 | 
			
		||||
    attr_reader :ace_mode
 | 
			
		||||
 | 
			
		||||
    # Public: Get CodeMirror mode
 | 
			
		||||
    #
 | 
			
		||||
    # Maps to a directory in the `mode/` source code.
 | 
			
		||||
    #   https://github.com/codemirror/CodeMirror/tree/master/mode
 | 
			
		||||
    #
 | 
			
		||||
    # Examples
 | 
			
		||||
    #
 | 
			
		||||
    #  # => "nil"
 | 
			
		||||
    #  # => "javascript"
 | 
			
		||||
    #  # => "clike"
 | 
			
		||||
    #
 | 
			
		||||
    # Returns a String name or nil
 | 
			
		||||
    attr_reader :codemirror_mode
 | 
			
		||||
 | 
			
		||||
    # Public: Get CodeMirror MIME type mode
 | 
			
		||||
    #
 | 
			
		||||
    # Examples
 | 
			
		||||
    #
 | 
			
		||||
    #  # => "nil"
 | 
			
		||||
    #  # => "text/x-javascript"
 | 
			
		||||
    #  # => "text/x-csrc"
 | 
			
		||||
    #
 | 
			
		||||
    # Returns a String name or nil
 | 
			
		||||
    attr_reader :codemirror_mime_type
 | 
			
		||||
 | 
			
		||||
    # Public: Should language lines be wrapped
 | 
			
		||||
    #
 | 
			
		||||
    # Returns true or false
 | 
			
		||||
@@ -543,10 +601,13 @@ module Linguist
 | 
			
		||||
      :aliases           => options['aliases'],
 | 
			
		||||
      :tm_scope          => options['tm_scope'],
 | 
			
		||||
      :ace_mode          => options['ace_mode'],
 | 
			
		||||
      :codemirror_mode   => options['codemirror_mode'],
 | 
			
		||||
      :codemirror_mime_type => options['codemirror_mime_type'],
 | 
			
		||||
      :wrap              => options['wrap'],
 | 
			
		||||
      :group_name        => options['group'],
 | 
			
		||||
      :searchable        => options.fetch('searchable', true),
 | 
			
		||||
      :search_term       => options['search_term'],
 | 
			
		||||
      :language_id       => options['language_id'],
 | 
			
		||||
      :extensions        => Array(options['extensions']),
 | 
			
		||||
      :interpreters      => options['interpreters'].sort,
 | 
			
		||||
      :filenames         => options['filenames'],
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,19 +1,98 @@
 | 
			
		||||
module Linguist
 | 
			
		||||
  module Strategy
 | 
			
		||||
    class Modeline
 | 
			
		||||
      EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
 | 
			
		||||
      EMACS_MODELINE = /
 | 
			
		||||
        -\*-
 | 
			
		||||
        (?:
 | 
			
		||||
          # Short form: `-*- ruby -*-`
 | 
			
		||||
          \s* (?= [^:;\s]+ \s* -\*-)
 | 
			
		||||
          |
 | 
			
		||||
          # Longer form: `-*- foo:bar; mode: ruby; -*-`
 | 
			
		||||
          (?:
 | 
			
		||||
            .*?       # Preceding variables: `-*- foo:bar bar:baz;`
 | 
			
		||||
            [;\s]     # Which are delimited by spaces or semicolons
 | 
			
		||||
            |
 | 
			
		||||
            (?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-`
 | 
			
		||||
          )
 | 
			
		||||
          mode        # Major mode indicator
 | 
			
		||||
          \s*:\s*     # Allow whitespace around colon: `mode : ruby`
 | 
			
		||||
        )
 | 
			
		||||
        ([^:;\s]+)    # Name of mode
 | 
			
		||||
 | 
			
		||||
      # First form vim modeline
 | 
			
		||||
      # [text]{white}{vi:|vim:|ex:}[white]{options}
 | 
			
		||||
      # ex: 'vim: syntax=ruby'
 | 
			
		||||
      VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
 | 
			
		||||
        # Ensure the mode is terminated correctly
 | 
			
		||||
        (?=
 | 
			
		||||
          # Followed by semicolon or whitespace
 | 
			
		||||
          [\s;]
 | 
			
		||||
          |
 | 
			
		||||
          # Touching the ending sequence: `ruby-*-`
 | 
			
		||||
          (?<![-*])   # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode
 | 
			
		||||
          -\*-        # Emacs has no problems reading `ruby --*-`, however.
 | 
			
		||||
        )
 | 
			
		||||
        .*?           # Anything between a cleanly-terminated mode and the ending -*-
 | 
			
		||||
        -\*-
 | 
			
		||||
      /xi
 | 
			
		||||
 | 
			
		||||
      # Second form vim modeline (compatible with some versions of Vi)
 | 
			
		||||
      # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
 | 
			
		||||
      # ex: 'vim set syntax=ruby:'
 | 
			
		||||
      VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
 | 
			
		||||
      VIM_MODELINE   = /
 | 
			
		||||
 | 
			
		||||
      MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]
 | 
			
		||||
        # Start modeline. Could be `vim:`, `vi:` or `ex:`
 | 
			
		||||
        (?:
 | 
			
		||||
          (?:\s|^)
 | 
			
		||||
          vi
 | 
			
		||||
          (?:m[<=>]?\d+|m)? # Version-specific modeline
 | 
			
		||||
          |
 | 
			
		||||
          [\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:"
 | 
			
		||||
          ex
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # If the option-list begins with `set ` or `se `, it indicates an alternative
 | 
			
		||||
        # modeline syntax partly-compatible with older versions of Vi. Here, the colon
 | 
			
		||||
        # serves as a terminator for an option sequence, delimited by whitespace.
 | 
			
		||||
        (?=
 | 
			
		||||
          # So we have to ensure the modeline ends with a colon
 | 
			
		||||
          : (?=\s* set? \s [^\n:]+ :) |
 | 
			
		||||
 | 
			
		||||
          # Otherwise, it isn't valid syntax and should be ignored
 | 
			
		||||
          : (?!\s* set? \s)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # Possible (unrelated) `option=value` pairs to skip past
 | 
			
		||||
        (?:
 | 
			
		||||
          # Option separator. Vim uses whitespace or colons to separate options (except if
 | 
			
		||||
          # the alternate "vim: set " form is used, where only whitespace is used)
 | 
			
		||||
          (?:
 | 
			
		||||
            \s
 | 
			
		||||
            |
 | 
			
		||||
            \s* : \s* # Note that whitespace around colons is accepted too:
 | 
			
		||||
          )           # vim: noai :  ft=ruby:noexpandtab
 | 
			
		||||
 | 
			
		||||
          # Option's name. All recognised Vim options have an alphanumeric form.
 | 
			
		||||
          \w*
 | 
			
		||||
 | 
			
		||||
          # Possible value. Not every option takes an argument.
 | 
			
		||||
          (?:
 | 
			
		||||
            # Whitespace between name and value is allowed: `vim: ft   =ruby`
 | 
			
		||||
            \s*=
 | 
			
		||||
 | 
			
		||||
            # Option's value. Might be blank; `vim: ft= ` says "use no filetype".
 | 
			
		||||
            (?:
 | 
			
		||||
              [^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby
 | 
			
		||||
              |       # will be read by Vim as { titlestring: " ft=ruby" }.
 | 
			
		||||
              \\.
 | 
			
		||||
            )*
 | 
			
		||||
          )?
 | 
			
		||||
        )*
 | 
			
		||||
 | 
			
		||||
        # The actual filetype declaration
 | 
			
		||||
        [\s:] (?:filetype|ft|syntax) \s*=
 | 
			
		||||
 | 
			
		||||
        # Language's name
 | 
			
		||||
        (\w+)
 | 
			
		||||
 | 
			
		||||
        # Ensure it's followed by a legal separator
 | 
			
		||||
        (?=\s|:|$)
 | 
			
		||||
      /xi
 | 
			
		||||
 | 
			
		||||
      MODELINES = [EMACS_MODELINE, VIM_MODELINE]
 | 
			
		||||
 | 
			
		||||
      # Scope of the search for modelines
 | 
			
		||||
      # Number of lines to check at the beginning and at the end of the file
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,9 @@
 | 
			
		||||
# Dependencies
 | 
			
		||||
- ^[Dd]ependencies/
 | 
			
		||||
 | 
			
		||||
# Distributions
 | 
			
		||||
- (^|/)dist/
 | 
			
		||||
 | 
			
		||||
# C deps
 | 
			
		||||
#  https://github.com/joyent/node
 | 
			
		||||
- ^deps/
 | 
			
		||||
@@ -165,7 +168,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 +232,9 @@
 | 
			
		||||
# Fabric
 | 
			
		||||
- Fabric.framework/
 | 
			
		||||
 | 
			
		||||
# BuddyBuild
 | 
			
		||||
- BuddyBuildSDK.framework/
 | 
			
		||||
 | 
			
		||||
# git config files
 | 
			
		||||
- gitattributes$
 | 
			
		||||
- gitignore$
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
module Linguist
 | 
			
		||||
  VERSION = "4.8.8"
 | 
			
		||||
  VERSION = "4.8.16"
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "repository": "https://github.com/github/linguist",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "season": "~>5.0"
 | 
			
		||||
    "season": "~>5.4"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "MIT"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,265 @@
 | 
			
		||||
&НаСервереБезКонтекста
 | 
			
		||||
Функция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта)
 | 
			
		||||
	Запрос = Новый Запрос;
 | 
			
		||||
	Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта";
 | 
			
		||||
	Запрос.Параметры.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта));
 | 
			
		||||
	Выборка = Запрос.Выполнить().Выбрать();
 | 
			
		||||
	КонтактноеЛицо = "";
 | 
			
		||||
	Если Выборка.Следующий() Тогда
 | 
			
		||||
		КонтактноеЛицо = Выборка.КонтактноеЛицо;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Возврат КонтактноеЛицо;
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
&НаСервереБезКонтекста
 | 
			
		||||
Функция ПолучитьКонтактноеЛицоПоПолучателю(Получатель)
 | 
			
		||||
	Запрос = Новый Запрос;
 | 
			
		||||
	Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель";
 | 
			
		||||
	Запрос.Параметры.Вставить("Получатель", Получатель);
 | 
			
		||||
	Выборка = Запрос.Выполнить().Выбрать();
 | 
			
		||||
	КонтактноеЛицо = "";
 | 
			
		||||
	Если Выборка.Следующий() Тогда
 | 
			
		||||
		КонтактноеЛицо = Выборка.КонтактноеЛицо;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Возврат КонтактноеЛицо;
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
&НаСервереБезКонтекста
 | 
			
		||||
Процедура ДобавитьПолучателей(Получатель, Получатели)	
 | 
			
		||||
	Запрос = Новый Запрос;
 | 
			
		||||
	Запрос.Текст = "ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка ";
 | 
			
		||||
	Если ТипЗнч(Получатели) = Тип("Массив") Тогда
 | 
			
		||||
		Запрос.Текст = Запрос.Текст + "В (&Получатели)";
 | 
			
		||||
	Иначе
 | 
			
		||||
		Запрос.Текст = Запрос.Текст + "= &Получатели";
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Запрос.Параметры.Вставить("Получатели", Получатели);
 | 
			
		||||
	Выборка = Запрос.Выполнить().Выбрать();
 | 
			
		||||
	Пока Выборка.Следующий() Цикл
 | 
			
		||||
		Если Получатель <> "" Тогда
 | 
			
		||||
			Получатель = Получатель + "; ";
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Получатель = Получатель + Выборка.ЭлектроннаяПочта;
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаСервере
 | 
			
		||||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 | 
			
		||||
	Если Параметры.Ключ.Пустая() Тогда
 | 
			
		||||
		Заголовок = "Исходящее письмо (Создание)";
 | 
			
		||||
		Объект.Дата = ТекущаяДата();
 | 
			
		||||
		ПоШаблону = Параметры.Свойство("ПоШаблону");
 | 
			
		||||
		ВходящееПисьмо = Параметры.ВходящееПисьмо;
 | 
			
		||||
		Если ПоШаблону = Истина Тогда
 | 
			
		||||
			Элементы.ЗаполнитьПоШаблону.Видимость = Истина;
 | 
			
		||||
			РаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое);
 | 
			
		||||
		ИначеЕсли Не ВходящееПисьмо.Пустая() Тогда
 | 
			
		||||
			РаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое);
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Адресаты = Параметры.Адресаты;
 | 
			
		||||
		Если Адресаты <> Неопределено Тогда
 | 
			
		||||
			Запрос = Новый Запрос;
 | 
			
		||||
			Запрос.Текст = "ВЫБРАТЬ
 | 
			
		||||
			               |	Контрагенты.ЭлектроннаяПочта
 | 
			
		||||
			               |ИЗ
 | 
			
		||||
			               |	Справочник.Контрагенты КАК Контрагенты
 | 
			
		||||
			               |ГДЕ
 | 
			
		||||
			               |	Контрагенты.Ссылка В(&Адресаты)
 | 
			
		||||
			               |	И Контрагенты.ЭлектроннаяПочта <> """"";
 | 
			
		||||
			Запрос.УстановитьПараметр("Адресаты", Адресаты);			   
 | 
			
		||||
			Получатель = "";
 | 
			
		||||
			Выборка = Запрос.Выполнить().Выбрать();
 | 
			
		||||
			Пока Выборка.Следующий() Цикл
 | 
			
		||||
				Если Получатель <> "" Тогда
 | 
			
		||||
					Получатель = Получатель + "; ";
 | 
			
		||||
				КонецЕсли;
 | 
			
		||||
				Получатель = Получатель + Выборка.ЭлектроннаяПочта;
 | 
			
		||||
			КонецЦикла;
 | 
			
		||||
			Объект.Получатель = Получатель;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаСервере
 | 
			
		||||
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
 | 
			
		||||
	Содержимое = ТекущийОбъект.Содержимое.Получить();
 | 
			
		||||
	Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)";
 | 
			
		||||
	Если  РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда
 | 
			
		||||
		Заголовок = Заголовок + " - Отправлено";
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаСервере
 | 
			
		||||
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
 | 
			
		||||
	ТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных());
 | 
			
		||||
	ТекущийОбъект.Текст = Содержимое.ПолучитьТекст();
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаСервере
 | 
			
		||||
Функция ОтправитьПисьмо(Ошибка)
 | 
			
		||||
	Если Не Записать() Тогда
 | 
			
		||||
		Ошибка = "ОшибкаЗаписи";
 | 
			
		||||
		Возврат Ложь;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Если Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда
 | 
			
		||||
		Ошибка = "ОшибкаОтправки";
 | 
			
		||||
		Возврат Ложь;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Заголовок = Заголовок + " - Отправлено";
 | 
			
		||||
	Возврат Истина;
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Функция ОтправитьПисьмоКлиент()
 | 
			
		||||
	Ошибка = "";
 | 
			
		||||
	Если Не ОтправитьПисьмо(Ошибка) Тогда
 | 
			
		||||
		Если Ошибка = "ОшибкаОтправки" Тогда
 | 
			
		||||
			Кнопки = Новый СписокЗначений;
 | 
			
		||||
			Кнопки.Добавить(1, "Настроить почту");
 | 
			
		||||
			Кнопки.Добавить(2, "Закрыть");
 | 
			
		||||
			
 | 
			
		||||
			Оп = Новый ОписаниеОповещения(
 | 
			
		||||
				"ОтправитьПисьмоКлиентВопросЗавершение",
 | 
			
		||||
				ЭтотОбъект);
 | 
			
		||||
			ПоказатьВопрос(Оп,
 | 
			
		||||
				"Не указаны настройки интернет почты!", 
 | 
			
		||||
				Кнопки, , 1);
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Возврат Ложь;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	
 | 
			
		||||
	НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);
 | 
			
		||||
	ПоказатьОповещениеПользователя("Письмо отправлено", НавигационнаяСсылка, Объект.Наименование);
 | 
			
		||||
	ОповеститьОбИзменении(Объект.Ссылка);
 | 
			
		||||
	Возврат Истина;
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт
 | 
			
		||||
	Если Результат = 1 Тогда
 | 
			
		||||
		ОткрытьФорму("ОбщаяФорма.НастройкаПочты");
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура Отправить(Команда)
 | 
			
		||||
	ОтправитьПисьмоКлиент();
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ОтправитьИЗакрыть(Команда)
 | 
			
		||||
	Если Не ОтправитьПисьмоКлиент() Тогда
 | 
			
		||||
		Возврат;
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	Закрыть();
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка)
 | 
			
		||||
	Перем Начало, Конец;
 | 
			
		||||
	Поле.ПолучитьГраницыВыделения(Начало, Конец);
 | 
			
		||||
	Позиция = Документ.ПолучитьПозициюПоЗакладке(Начало);
 | 
			
		||||
	Документ.Удалить(Начало, Конец);
 | 
			
		||||
	Начало = Документ.ПолучитьЗакладкуПоПозиции(Позиция);
 | 
			
		||||
	Документ.Вставить(Начало, Строка);
 | 
			
		||||
	Позиция = Позиция + СтрДлина(Строка);
 | 
			
		||||
	Закладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция);
 | 
			
		||||
	Поле.УстановитьГраницыВыделения(Закладка, Закладка);
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ВставитьКонтактноеЛицо(Команда)
 | 
			
		||||
	Если Объект.Контрагент.Пустая() Тогда
 | 
			
		||||
		Сообщить("Выберите контрагента");
 | 
			
		||||
	Иначе
 | 
			
		||||
		КонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент);
 | 
			
		||||
		ВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + " ");
 | 
			
		||||
	КонецЕсли;	
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаСервере
 | 
			
		||||
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
 | 
			
		||||
	Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)";
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура КонтрагентПриИзменении(Элемент)
 | 
			
		||||
	ДобавитьПолучателей(Объект.Получатель, Объект.Контрагент);
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ВыделитьВажное(Команда)
 | 
			
		||||
	Перем Начало, Конец;
 | 
			
		||||
    ВсеВажное = Истина;
 | 
			
		||||
    Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец);
 | 
			
		||||
    Если Начало = Конец Тогда
 | 
			
		||||
        Возврат;
 | 
			
		||||
    КонецЕсли;
 | 
			
		||||
    
 | 
			
		||||
    НаборТекстовыхЭлементов = Новый Массив();
 | 
			
		||||
    Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл
 | 
			
		||||
        Если Тип(ТекстовыйЭлемент) = Тип("ТекстФорматированногоДокумента") Тогда
 | 
			
		||||
            НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент);    
 | 
			
		||||
        КонецЕсли;    
 | 
			
		||||
    КонецЦикла;
 | 
			
		||||
    
 | 
			
		||||
    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл
 | 
			
		||||
        Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И
 | 
			
		||||
            ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда
 | 
			
		||||
            ВсеВажное = Ложь;
 | 
			
		||||
            Прервать;
 | 
			
		||||
        КонецЕсли;
 | 
			
		||||
    КонецЦикла;
 | 
			
		||||
    
 | 
			
		||||
    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл
 | 
			
		||||
        ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное);
 | 
			
		||||
        ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0);
 | 
			
		||||
    КонецЦикла;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ЗаполнитьПоШаблону(Команда)
 | 
			
		||||
	Если Объект.Контрагент.Пустая() Тогда
 | 
			
		||||
		Сообщить("Выберите контрагента");
 | 
			
		||||
	Иначе
 | 
			
		||||
		НайтиИЗаменить("[Контрагент]", Объект.Контрагент);
 | 
			
		||||
		НайтиИЗаменить("[КонтактноеЛицо]", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент));
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	НайтиИЗаменить("[ДатаПисьма]", Объект.Дата);
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены)
 | 
			
		||||
	Перем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления;
 | 
			
		||||
	РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска);
 | 
			
		||||
	Пока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл
 | 
			
		||||
		ПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены);
 | 
			
		||||
		МассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);
 | 
			
		||||
		Для Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл
 | 
			
		||||
			Если Тип(ЭлементДляОформления) = Тип("ТекстФорматированногоДокумента") Тогда
 | 
			
		||||
				ШрифтОформления = ЭлементДляОформления.Шрифт;
 | 
			
		||||
				ЦветТекстаОформления = ЭлементДляОформления.ЦветТекста;
 | 
			
		||||
				ЦветФонаОформления = ЭлементДляОформления.ЦветФона;
 | 
			
		||||
				НавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка;
 | 
			
		||||
				Прервать;
 | 
			
		||||
			КонецЕсли;
 | 
			
		||||
		КонецЦикла;	
 | 
			
		||||
		Содержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);
 | 
			
		||||
		ВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены);
 | 
			
		||||
		Если ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда
 | 
			
		||||
			ВставленныйТекст.Шрифт = ШрифтОформления;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Если ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда
 | 
			
		||||
			ВставленныйТекст.ЦветТекста = ЦветТекстаОформления;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Если ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда
 | 
			
		||||
			ВставленныйТекст.ЦветФона = ЦветФонаОформления;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		Если ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда
 | 
			
		||||
			ВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		
 | 
			
		||||
		РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска));
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,85 @@
 | 
			
		||||
&НаСервере
 | 
			
		||||
Функция ПечатнаяФорма(ПараметрКоманды)
 | 
			
		||||
	ТабличныйДокумент = Новый ТабличныйДокумент;
 | 
			
		||||
	ТабличныйДокумент.ОтображатьСетку = Истина;
 | 
			
		||||
	ТабличныйДокумент.ОтображатьЗаголовки = Истина;
 | 
			
		||||
	
 | 
			
		||||
	Сформирован = Ложь;
 | 
			
		||||
	ТабМакет = Справочники.Товары.ПолучитьМакет("МакетПрайсЛиста"); 
 | 
			
		||||
 | 
			
		||||
	Шапка = ТабМакет.ПолучитьОбласть("Шапка");
 | 
			
		||||
	ТабличныйДокумент.Вывести(Шапка);
 | 
			
		||||
 | 
			
		||||
	ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("ОбластьНоменклатура");
 | 
			
		||||
	
 | 
			
		||||
	Запрос = Новый Запрос;
 | 
			
		||||
    Запрос.Текст =  "ВЫБРАТЬ
 | 
			
		||||
                    |    Товары.Код КАК Код,
 | 
			
		||||
                    |    Товары.Наименование КАК Наименование,
 | 
			
		||||
                    |    Товары.Артикул КАК Артикул,
 | 
			
		||||
                    |    Товары.ФайлКартинки КАК Картинка,
 | 
			
		||||
                    |    Товары.Описание КАК Описание,
 | 
			
		||||
                    |    Товары.Вид КАК Вид,
 | 
			
		||||
                    |    ЦеныТоваров.Цена КАК Цена
 | 
			
		||||
                    |ИЗ
 | 
			
		||||
                    |    РегистрСведений.ЦеныТоваров КАК ЦеныТоваров
 | 
			
		||||
                    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары
 | 
			
		||||
                    |        ПО ЦеныТоваров.Товар = Товары.Ссылка
 | 
			
		||||
                    |ГДЕ
 | 
			
		||||
                    |    Товары.ЭтоГруппа = ЛОЖЬ
 | 
			
		||||
                    |    И ЦеныТоваров.ВидЦен = &ВидЦен
 | 
			
		||||
                    |
 | 
			
		||||
                    |УПОРЯДОЧИТЬ ПО
 | 
			
		||||
                    |    Вид,
 | 
			
		||||
                    |    Товары.Родитель.Код,
 | 
			
		||||
                    |    Код";
 | 
			
		||||
 | 
			
		||||
    Запрос.УстановитьПараметр("ВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
 | 
			
		||||
						
 | 
			
		||||
	Выборка = Запрос.Выполнить().Выбрать();
 | 
			
		||||
	Пока Выборка.Следующий() Цикл
 | 
			
		||||
		ОбластьНоменклатура.Параметры.Заполнить(Выборка);
 | 
			
		||||
		
 | 
			
		||||
		Описание = "";
 | 
			
		||||
		
 | 
			
		||||
		Чтение = Новый ЧтениеHTML();
 | 
			
		||||
		Чтение.УстановитьСтроку(Выборка.Описание);
 | 
			
		||||
		
 | 
			
		||||
		ДокDOM = Новый ПостроительDOM();
 | 
			
		||||
		HTML = ДокDOM.Прочитать(Чтение);
 | 
			
		||||
		
 | 
			
		||||
		Если Не HTML.ЭлементДокумента = Неопределено Тогда
 | 
			
		||||
			Для Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл 
 | 
			
		||||
				Если Узел.ИмяУзла = "body" Тогда
 | 
			
		||||
					Для Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл 
 | 
			
		||||
						Описание = Описание + ЭлементОписания.ТекстовоеСодержимое;
 | 
			
		||||
					КонецЦикла;
 | 
			
		||||
				КонецЕсли;
 | 
			
		||||
			КонецЦикла;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		ОбластьНоменклатура.Параметры.Описание = Описание;
 | 
			
		||||
		
 | 
			
		||||
		Если (Выборка.Картинка <> Null) Тогда 
 | 
			
		||||
			ОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить());
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
		
 | 
			
		||||
		ТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень());
 | 
			
		||||
		Сформирован = Истина;
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
	
 | 
			
		||||
	Если Сформирован Тогда
 | 
			
		||||
		Возврат ТабличныйДокумент;
 | 
			
		||||
	Иначе 	
 | 
			
		||||
		Возврат Неопределено;
 | 
			
		||||
	КонецЕсли;	
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
&НаКлиенте
 | 
			
		||||
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
 | 
			
		||||
	ТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды);
 | 
			
		||||
	
 | 
			
		||||
	Если ТабличныйДокумент <> Неопределено Тогда
 | 
			
		||||
		ТабличныйДокумент.Показать();
 | 
			
		||||
	КонецЕсли;	
 | 
			
		||||
	
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
@@ -0,0 +1,109 @@
 | 
			
		||||
// Процедура на основании анализа типа данных заменяет их на данные, удаляющие
 | 
			
		||||
// информацию из узла в котором их не должно быть
 | 
			
		||||
//
 | 
			
		||||
// Параметры:
 | 
			
		||||
//  Данные	– Объект, набор записей,... который нужно преобразовать
 | 
			
		||||
//
 | 
			
		||||
Процедура УдалениеДанных(Данные) 
 | 
			
		||||
	
 | 
			
		||||
	// Получаем объект описания метаданного, соответствующий данным
 | 
			
		||||
	ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбъекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные());
 | 
			
		||||
    // Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе
 | 
			
		||||
	Если Метаданные.Справочники.Содержит(ОбъектМетаданных)
 | 
			
		||||
	 	ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
 | 
			
		||||
		
 | 
			
		||||
		// Перенос удаления объекта для объектных
 | 
			
		||||
		Данные = Новый УдалениеОбъекта(Данные.Ссылка);
 | 
			
		||||
		
 | 
			
		||||
	ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)
 | 
			
		||||
		ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)
 | 
			
		||||
		ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда
 | 
			
		||||
		
 | 
			
		||||
		// Очищаем данные
 | 
			
		||||
		Данные.Очистить();
 | 
			
		||||
		
 | 
			
		||||
	КонецЕсли;	
 | 
			
		||||
	
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
// Функция формирует пакет обмена, который будет отправлен узлу "УзелОбмена" 
 | 
			
		||||
//
 | 
			
		||||
// Параметры:
 | 
			
		||||
//  УзелОбмена	– узел плана обмена "мобильные", с которым осуществляется обмен
 | 
			
		||||
//
 | 
			
		||||
// Возвращаемое значение:
 | 
			
		||||
//  сформированный пакет, помещенный в хранилище значения
 | 
			
		||||
Функция СформироватьПакетОбмена(УзелОбмена) Экспорт
 | 
			
		||||
    
 | 
			
		||||
	ЗаписьXML = Новый ЗаписьXML;
 | 
			
		||||
	
 | 
			
		||||
	ЗаписьXML.УстановитьСтроку("UTF-8");
 | 
			
		||||
	ЗаписьXML.ЗаписатьОбъявлениеXML();
 | 
			
		||||
    
 | 
			
		||||
	ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
 | 
			
		||||
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);					
 | 
			
		||||
    
 | 
			
		||||
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
 | 
			
		||||
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data");
 | 
			
		||||
    
 | 
			
		||||
	ТипДанныхУдаления = Тип("УдалениеОбъекта");
 | 
			
		||||
    
 | 
			
		||||
	ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения);
 | 
			
		||||
	Пока ВыборкаИзменений.Следующий() Цикл
 | 
			
		||||
		
 | 
			
		||||
		Данные = ВыборкаИзменений.Получить();
 | 
			
		||||
        
 | 
			
		||||
		// Если перенос данных не нужен, то, возможно, необходимо записать удаление данных
 | 
			
		||||
		Если Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда
 | 
			
		||||
			
 | 
			
		||||
			// Получаем значение с возможным удалением данных
 | 
			
		||||
			УдалениеДанных(Данные); 
 | 
			
		||||
            
 | 
			
		||||
		КонецЕсли;	
 | 
			
		||||
		
 | 
			
		||||
		// Записываем данные в сообщение
 | 
			
		||||
		ОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные);
 | 
			
		||||
        
 | 
			
		||||
    КонецЦикла;
 | 
			
		||||
    
 | 
			
		||||
	ЗаписьСообщения.ЗакончитьЗапись();
 | 
			
		||||
    
 | 
			
		||||
	Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));
 | 
			
		||||
    
 | 
			
		||||
КонецФункции
 | 
			
		||||
 | 
			
		||||
// Процедура вносит в информационную базу данные, которые присланы из узла "УзелОбмена" 
 | 
			
		||||
//
 | 
			
		||||
// Параметры:
 | 
			
		||||
//  УзелОбмена	– узел плана обмена "мобильные", с которым осуществляется обмен
 | 
			
		||||
//  ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения
 | 
			
		||||
//
 | 
			
		||||
Процедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт
 | 
			
		||||
    
 | 
			
		||||
	ЧтениеXML = Новый ЧтениеXML;
 | 
			
		||||
	ЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить());
 | 
			
		||||
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
 | 
			
		||||
	ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
 | 
			
		||||
    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
 | 
			
		||||
 | 
			
		||||
    НачатьТранзакцию();
 | 
			
		||||
    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
 | 
			
		||||
        
 | 
			
		||||
		Данные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML);
 | 
			
		||||
        
 | 
			
		||||
		Если Не Данные = Неопределено Тогда
 | 
			
		||||
			
 | 
			
		||||
            Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
 | 
			
		||||
            Данные.ОбменДанными.Загрузка = Истина;
 | 
			
		||||
            
 | 
			
		||||
            Данные.Записать();
 | 
			
		||||
        
 | 
			
		||||
        КонецЕсли;
 | 
			
		||||
        
 | 
			
		||||
    КонецЦикла;
 | 
			
		||||
    ЗафиксироватьТранзакцию();
 | 
			
		||||
    
 | 
			
		||||
    ЧтениеСообщения.ЗакончитьЧтение();
 | 
			
		||||
    ЧтениеXML.Закрыть();
 | 
			
		||||
    
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
							
								
								
									
										302
									
								
								samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,302 @@
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////// 
 | 
			
		||||
 | 
			
		||||
// ПРОЦЕДУРЫ И ФУНКЦИИ
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Формирование печатной формы документа
 | 
			
		||||
 | 
			
		||||
// 
 | 
			
		||||
 | 
			
		||||
// Параметры: 
 | 
			
		||||
 | 
			
		||||
//  Нет. 
 | 
			
		||||
 | 
			
		||||
// 
 | 
			
		||||
 | 
			
		||||
// Возвращаемое значение: 
 | 
			
		||||
 | 
			
		||||
//  ТабличныйДокумент - Сформированный табличный документ.
 | 
			
		||||
 | 
			
		||||
Процедура ПечатнаяФорма(ТабличныйДокумент) Экспорт
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	Макет = Документы.РасходТовара.ПолучитьМакет("МакетПечати");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// Заголовок
 | 
			
		||||
 | 
			
		||||
	Область = Макет.ПолучитьОбласть("Заголовок");
 | 
			
		||||
 | 
			
		||||
	ТабличныйДокумент.Вывести(Область);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// Шапка
 | 
			
		||||
 | 
			
		||||
	Шапка = Макет.ПолучитьОбласть("Шапка");
 | 
			
		||||
 | 
			
		||||
	Шапка.Параметры.Заполнить(ЭтотОбъект);
 | 
			
		||||
 | 
			
		||||
	ТабличныйДокумент.Вывести(Шапка);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// Товары
 | 
			
		||||
 | 
			
		||||
	Область = Макет.ПолучитьОбласть("ТоварыШапка");
 | 
			
		||||
 | 
			
		||||
	ТабличныйДокумент.Вывести(Область);
 | 
			
		||||
 | 
			
		||||
	ОбластьТовары = Макет.ПолучитьОбласть("Товары");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	Для каждого ТекСтрокаТовары Из Товары Цикл
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		ОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары);
 | 
			
		||||
 | 
			
		||||
		ТабличныйДокумент.Вывести(ОбластьТовары);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Формирование печатной формы документа
 | 
			
		||||
// 
 | 
			
		||||
// Параметры: 
 | 
			
		||||
//  Нет. 
 | 
			
		||||
// 
 | 
			
		||||
// Возвращаемое значение: 
 | 
			
		||||
//  ТабличныйДокумент - Сформированный табличный документ.
 | 
			
		||||
Процедура Пересчитать() Экспорт
 | 
			
		||||
 | 
			
		||||
	Для каждого ТекСтрокаТовары Из Товары Цикл
 | 
			
		||||
 | 
			
		||||
		ТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена;
 | 
			
		||||
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Процедура ОбработкаПроведения(Отказ, Режим)
 | 
			
		||||
 | 
			
		||||
	// Формирование движений регистров накопления ТоварныеЗапасы и Продажи.
 | 
			
		||||
	Движения.ТоварныеЗапасы.Записывать = Истина;
 | 
			
		||||
	Движения.Продажи.Записывать = Истина;
 | 
			
		||||
	Если Режим = РежимПроведенияДокумента.Оперативный Тогда
 | 
			
		||||
		Движения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина;
 | 
			
		||||
	КонецЕсли;	
 | 
			
		||||
 | 
			
		||||
	// Создадим запрос, чтобы получать информацию об услугах
 | 
			
		||||
	Запрос = Новый Запрос("ВЫБРАТЬ
 | 
			
		||||
						  |    ТоварыВДокументе.НомерСтроки КАК НомерСтроки
 | 
			
		||||
						  |ИЗ
 | 
			
		||||
						  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе
 | 
			
		||||
						  |ГДЕ
 | 
			
		||||
						  |    ТоварыВДокументе.Ссылка = &Ссылка
 | 
			
		||||
						  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)");
 | 
			
		||||
 | 
			
		||||
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
 | 
			
		||||
	РезультатУслуги = Запрос.Выполнить().Выгрузить();
 | 
			
		||||
	РезультатУслуги.Индексы.Добавить("НомерСтроки");
 | 
			
		||||
 | 
			
		||||
	Для каждого ТекСтрокаТовары Из Товары Цикл
 | 
			
		||||
 | 
			
		||||
		Строка = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, "НомерСтроки");
 | 
			
		||||
		Если Строка = Неопределено Тогда
 | 
			
		||||
			
 | 
			
		||||
			// Не услуга
 | 
			
		||||
			Движение = Движения.ТоварныеЗапасы.Добавить();
 | 
			
		||||
			Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
 | 
			
		||||
			Движение.Период = Дата;
 | 
			
		||||
			Движение.Товар = ТекСтрокаТовары.Товар;
 | 
			
		||||
			Движение.Склад = Склад;
 | 
			
		||||
			Движение.Количество = ТекСтрокаТовары.Количество;
 | 
			
		||||
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
 | 
			
		||||
		Движение = Движения.Продажи.Добавить();
 | 
			
		||||
		Движение.Период = Дата;
 | 
			
		||||
		Движение.Товар = ТекСтрокаТовары.Товар;
 | 
			
		||||
		Движение.Покупатель = Покупатель;
 | 
			
		||||
		Движение.Количество = ТекСтрокаТовары.Количество;
 | 
			
		||||
		Движение.Сумма = ТекСтрокаТовары.Сумма;
 | 
			
		||||
 | 
			
		||||
	КонецЦикла;
 | 
			
		||||
 | 
			
		||||
	// Формирование движения регистра накопления Взаиморасчеты.
 | 
			
		||||
	Движения.Взаиморасчеты.Записывать = Истина;
 | 
			
		||||
	Движение = Движения.Взаиморасчеты.Добавить();
 | 
			
		||||
	Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
 | 
			
		||||
	Движение.Период = Дата;
 | 
			
		||||
	Движение.Контрагент = Покупатель;
 | 
			
		||||
	Движение.Валюта = Валюта;
 | 
			
		||||
 | 
			
		||||
	Если Валюта.Пустая() Тогда
 | 
			
		||||
		Движение.Сумма = Товары.Итог("Сумма");
 | 
			
		||||
	Иначе
 | 
			
		||||
 | 
			
		||||
		Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта)).Курс;
 | 
			
		||||
 | 
			
		||||
		Если Курс = 0 Тогда
 | 
			
		||||
			Движение.Сумма = Товары.Итог("Сумма");
 | 
			
		||||
		Иначе
 | 
			
		||||
			Движение.Сумма = Товары.Итог("Сумма") / Курс;
 | 
			
		||||
		КонецЕсли;
 | 
			
		||||
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
 | 
			
		||||
	//Запишем движения
 | 
			
		||||
	Движения.Записать();
 | 
			
		||||
	
 | 
			
		||||
	//Контроль остатков при оперативном проведении
 | 
			
		||||
	Если Режим = РежимПроведенияДокумента.Оперативный Тогда
 | 
			
		||||
		// Создадим запрос, чтобы контролировать остатки по товарам
 | 
			
		||||
		Запрос = Новый Запрос("ВЫБРАТЬ
 | 
			
		||||
							  |    ТоварыВДокументе.Товар КАК Товар,
 | 
			
		||||
							  |    СУММА(ТоварыВДокументе.Количество) КАК Количество,
 | 
			
		||||
							  |    МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки
 | 
			
		||||
							  |
 | 
			
		||||
							  |ПОМЕСТИТЬ ТребуетсяТовара
 | 
			
		||||
							  |
 | 
			
		||||
							  |ИЗ
 | 
			
		||||
							  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе
 | 
			
		||||
							  |
 | 
			
		||||
							  |ГДЕ
 | 
			
		||||
							  |    ТоварыВДокументе.Ссылка = &Ссылка
 | 
			
		||||
							  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)
 | 
			
		||||
							  |
 | 
			
		||||
							  |СГРУППИРОВАТЬ ПО
 | 
			
		||||
							  |    ТоварыВДокументе.Товар
 | 
			
		||||
							  |
 | 
			
		||||
							  |ИНДЕКСИРОВАТЬ ПО
 | 
			
		||||
							  |    Товар
 | 
			
		||||
							  |;
 | 
			
		||||
							  |
 | 
			
		||||
							  |////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
							  |ВЫБРАТЬ
 | 
			
		||||
							  |    ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление,
 | 
			
		||||
							  |    ВЫБОР
 | 
			
		||||
							  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
 | 
			
		||||
							  |            ТОГДА ТоварыВДокументе.Количество
 | 
			
		||||
							  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
 | 
			
		||||
							  |    КОНЕЦ КАК Нехватка,
 | 
			
		||||
							  |    ТоварыВДокументе.Количество - ВЫБОР
 | 
			
		||||
							  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
 | 
			
		||||
							  |            ТОГДА ТоварыВДокументе.Количество
 | 
			
		||||
							  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
 | 
			
		||||
							  |    КОНЕЦ КАК МаксимальноеКоличество,
 | 
			
		||||
							  |    ТребуетсяТовара.НомерСтроки КАК НомерСтроки
 | 
			
		||||
							  |
 | 
			
		||||
							  |ИЗ
 | 
			
		||||
							  |    ТребуетсяТовара КАК ТребуетсяТовара
 | 
			
		||||
							  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(
 | 
			
		||||
							  |                ,
 | 
			
		||||
							  |                Товар В
 | 
			
		||||
							  |                        (ВЫБРАТЬ
 | 
			
		||||
							  |                            ТребуетсяТовара.Товар
 | 
			
		||||
							  |                        ИЗ
 | 
			
		||||
							  |                            ТребуетсяТовара)
 | 
			
		||||
							  |                    И Склад = &Склад) КАК ТоварныеЗапасыОстатки
 | 
			
		||||
							  |        ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар
 | 
			
		||||
							  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе
 | 
			
		||||
							  |        ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар
 | 
			
		||||
							  |            И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки
 | 
			
		||||
							  |
 | 
			
		||||
							  |ГДЕ
 | 
			
		||||
							  |    ТоварыВДокументе.Ссылка = &Ссылка И
 | 
			
		||||
							  |    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
 | 
			
		||||
							  |
 | 
			
		||||
							  |УПОРЯДОЧИТЬ ПО
 | 
			
		||||
							  |    НомерСтроки");
 | 
			
		||||
 | 
			
		||||
		Запрос.УстановитьПараметр("Склад", Склад);
 | 
			
		||||
		Запрос.УстановитьПараметр("Ссылка", Ссылка);
 | 
			
		||||
		РезультатСНехваткой = Запрос.Выполнить();
 | 
			
		||||
 | 
			
		||||
		ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();
 | 
			
		||||
 | 
			
		||||
		// Выдадим ошибки для строк, в которых не хватает остатка
 | 
			
		||||
		Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл
 | 
			
		||||
 | 
			
		||||
			Сообщение = Новый СообщениеПользователю();
 | 
			
		||||
			Сообщение.Текст = НСтр("ru = 'Не хватает '", "ru") 
 | 
			
		||||
				+ ВыборкаРезультатаСНехваткой.Нехватка 
 | 
			
		||||
				+ НСтр("ru = ' единиц товара'", "ru") + """" 
 | 
			
		||||
				+ ВыборкаРезультатаСНехваткой.ТоварПредставление 
 | 
			
		||||
				+ """" 
 | 
			
		||||
				+ НСтр("ru = ' на складе'", "ru") 
 | 
			
		||||
				+ """" 
 | 
			
		||||
				+ Склад 
 | 
			
		||||
				+ """." 
 | 
			
		||||
				+ НСтр("ru = 'Максимальное количество: '", "ru") 
 | 
			
		||||
				+ ВыборкаРезультатаСНехваткой.МаксимальноеКоличество 
 | 
			
		||||
				+ ".";
 | 
			
		||||
			Сообщение.Поле = НСтр("ru = 'Товары'", "ru") 
 | 
			
		||||
				+ "[" 
 | 
			
		||||
				+ (ВыборкаРезультатаСНехваткой.НомерСтроки - 1) 
 | 
			
		||||
				+ "]." 
 | 
			
		||||
				+ НСтр("ru = 'Количество'", "ru");
 | 
			
		||||
			Сообщение.УстановитьДанные(ЭтотОбъект);
 | 
			
		||||
			Сообщение.Сообщить();
 | 
			
		||||
			Отказ = Истина;
 | 
			
		||||
 | 
			
		||||
		КонецЦикла;
 | 
			
		||||
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
	
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)		
 | 
			
		||||
	// Проверим заполненность поля "Покупатель"
 | 
			
		||||
 | 
			
		||||
	Если Покупатель.Пустая() Тогда
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		// Если поле Покупатель не заполнено, сообщим об этом пользователю
 | 
			
		||||
 | 
			
		||||
		Сообщение = Новый СообщениеПользователю();
 | 
			
		||||
 | 
			
		||||
		Сообщение.Текст = НСтр("ru = 'Не указан Покупатель, для которого выписывается накладная!'", "ru");
 | 
			
		||||
 | 
			
		||||
		Сообщение.Поле = НСтр("ru = 'Покупатель'", "ru");
 | 
			
		||||
		Сообщение.УстановитьДанные(ЭтотОбъект);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Сообщение.Сообщить();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		// Сообщим платформе, что мы сами обработали проверку заполнения поля "Покупатель"
 | 
			
		||||
 | 
			
		||||
		ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель"));
 | 
			
		||||
 | 
			
		||||
		// Так как информация в документе не консистентна, то продолжать работу дальше смысла нет
 | 
			
		||||
 | 
			
		||||
		Отказ = Истина;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	КонецЕсли;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг
 | 
			
		||||
	Если Склад.Пустая() И Товары.Количество() > 0 Тогда
 | 
			
		||||
 | 
			
		||||
		// Создадим запрос, чтобы получать информацию об товарах
 | 
			
		||||
		Запрос = Новый Запрос("ВЫБРАТЬ
 | 
			
		||||
							  |    Количество(*) КАК Количество
 | 
			
		||||
							  |ИЗ
 | 
			
		||||
							  |    Справочник.Товары КАК Товары
 | 
			
		||||
							  |ГДЕ
 | 
			
		||||
							  |    Товары.Ссылка В (&ТоварыВДокументе)
 | 
			
		||||
							  |    И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)");
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								samples/1C Enterprise/ci_before_script.os
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/1C Enterprise/ci_before_script.os
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
Каталог = ОбъединитьПути(ТекущийКаталог(), "libs\oscript-library\src");
 | 
			
		||||
Загрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, "package-loader.os");
 | 
			
		||||
 | 
			
		||||
Файлы = НайтиФайлы(Каталог, , Ложь);
 | 
			
		||||
Для Каждого ВыбФайл Из Файлы Цикл
 | 
			
		||||
 | 
			
		||||
    Если ВыбФайл.ЭтоФайл() Тогда
 | 
			
		||||
        Продолжить;
 | 
			
		||||
    КонецЕсли;
 | 
			
		||||
 | 
			
		||||
    Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, "package-loader.os");
 | 
			
		||||
    Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла);
 | 
			
		||||
 | 
			
		||||
    Если Загрузчик_Файл.Существует() Тогда
 | 
			
		||||
        Продолжить;
 | 
			
		||||
    КонецЕсли;
 | 
			
		||||
 | 
			
		||||
    КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла);
 | 
			
		||||
 | 
			
		||||
КонецЦикла;
 | 
			
		||||
							
								
								
									
										42
									
								
								samples/1C Enterprise/test_canCompile.os
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/1C Enterprise/test_canCompile.os
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
#Использовать "../libs/oscript-library/src/v8runner"
 | 
			
		||||
#Использовать "../libs/oscript-library/src/tempfiles"
 | 
			
		||||
 | 
			
		||||
Перем Лог;
 | 
			
		||||
Перем КодВозврата;
 | 
			
		||||
 | 
			
		||||
Процедура Инициализация()
 | 
			
		||||
 | 
			
		||||
	Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-test_CanCompile");
 | 
			
		||||
	КодВозврата = 0;
 | 
			
		||||
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
Процедура ВыполнитьТест()
 | 
			
		||||
 | 
			
		||||
	Конфигуратор = Новый УправлениеКонфигуратором();
 | 
			
		||||
 | 
			
		||||
	ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
 | 
			
		||||
	КомандаЗапуска = "/LoadConfigFromFiles ""%1""";
 | 
			
		||||
	КомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + "\source\cf");
 | 
			
		||||
 | 
			
		||||
	Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска);
 | 
			
		||||
 | 
			
		||||
	ПараметрыЗапуска.Добавить(КомандаЗапуска);
 | 
			
		||||
 | 
			
		||||
	Попытка
 | 
			
		||||
	    Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
 | 
			
		||||
	Исключение
 | 
			
		||||
 | 
			
		||||
	    Лог.Ошибка(Конфигуратор.ВыводКоманды());
 | 
			
		||||
	    КодВозврата = 1;
 | 
			
		||||
 | 
			
		||||
	КонецПопытки;
 | 
			
		||||
 | 
			
		||||
	УдалитьФайлы(Конфигуратор.ПутьКВременнойБазе());
 | 
			
		||||
 | 
			
		||||
КонецПроцедуры
 | 
			
		||||
 | 
			
		||||
Инициализация();
 | 
			
		||||
ВыполнитьТест();
 | 
			
		||||
 | 
			
		||||
ЗавершитьРаботу(КодВозврата);
 | 
			
		||||
							
								
								
									
										190
									
								
								samples/ABNF/toml.abnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								samples/ABNF/toml.abnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,190 @@
 | 
			
		||||
; Source:  https://github.com/toml-lang/toml
 | 
			
		||||
; License: MIT
 | 
			
		||||
 | 
			
		||||
;; This is an attempt to define TOML in ABNF according to the grammar defined
 | 
			
		||||
;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt).
 | 
			
		||||
 | 
			
		||||
;; TOML
 | 
			
		||||
 | 
			
		||||
toml = expression *( newline expression )
 | 
			
		||||
expression = (
 | 
			
		||||
  ws /
 | 
			
		||||
  ws comment /
 | 
			
		||||
  ws keyval ws [ comment ] /
 | 
			
		||||
  ws table ws [ comment ]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
;; Newline
 | 
			
		||||
 | 
			
		||||
newline = (
 | 
			
		||||
  %x0A /              ; LF
 | 
			
		||||
  %x0D.0A             ; CRLF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
newlines = 1*newline
 | 
			
		||||
 | 
			
		||||
;; Whitespace
 | 
			
		||||
 | 
			
		||||
ws = *(
 | 
			
		||||
  %x20 /              ; Space
 | 
			
		||||
  %x09                ; Horizontal tab
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
;; Comment
 | 
			
		||||
 | 
			
		||||
comment-start-symbol = %x23 ; #
 | 
			
		||||
non-eol = %x09 / %x20-10FFFF
 | 
			
		||||
comment = comment-start-symbol *non-eol
 | 
			
		||||
 | 
			
		||||
;; Key-Value pairs
 | 
			
		||||
 | 
			
		||||
keyval-sep = ws %x3D ws ; =
 | 
			
		||||
keyval = key keyval-sep val
 | 
			
		||||
 | 
			
		||||
key = unquoted-key / quoted-key
 | 
			
		||||
unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
 | 
			
		||||
quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings
 | 
			
		||||
 | 
			
		||||
val = integer / float / string / boolean / date-time / array / inline-table
 | 
			
		||||
 | 
			
		||||
;; Table
 | 
			
		||||
 | 
			
		||||
table = std-table / array-table
 | 
			
		||||
 | 
			
		||||
;; Standard Table
 | 
			
		||||
 | 
			
		||||
std-table-open  = %x5B ws     ; [ Left square bracket
 | 
			
		||||
std-table-close = ws %x5D     ; ] Right square bracket
 | 
			
		||||
table-key-sep   = ws %x2E ws  ; . Period
 | 
			
		||||
 | 
			
		||||
std-table = std-table-open key *( table-key-sep key) std-table-close
 | 
			
		||||
 | 
			
		||||
;; Array Table
 | 
			
		||||
 | 
			
		||||
array-table-open  = %x5B.5B ws  ; [[ Double left square bracket
 | 
			
		||||
array-table-close = ws %x5D.5D  ; ]] Double right square bracket
 | 
			
		||||
 | 
			
		||||
array-table = array-table-open key *( table-key-sep key) array-table-close
 | 
			
		||||
 | 
			
		||||
;; Integer
 | 
			
		||||
 | 
			
		||||
integer = [ minus / plus ] int
 | 
			
		||||
minus = %x2D                       ; -
 | 
			
		||||
plus = %x2B                        ; +
 | 
			
		||||
digit1-9 = %x31-39                 ; 1-9
 | 
			
		||||
underscore = %x5F                  ; _
 | 
			
		||||
int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )
 | 
			
		||||
 | 
			
		||||
;; Float
 | 
			
		||||
 | 
			
		||||
float = integer ( frac / frac exp / exp )
 | 
			
		||||
zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
 | 
			
		||||
frac = decimal-point zero-prefixable-int
 | 
			
		||||
decimal-point = %x2E               ; .
 | 
			
		||||
exp = e integer
 | 
			
		||||
e = %x65 / %x45                    ; e E
 | 
			
		||||
 | 
			
		||||
;; String
 | 
			
		||||
 | 
			
		||||
string = basic-string / ml-basic-string / literal-string / ml-literal-string
 | 
			
		||||
 | 
			
		||||
;; Basic String
 | 
			
		||||
 | 
			
		||||
basic-string = quotation-mark *basic-char quotation-mark
 | 
			
		||||
 | 
			
		||||
quotation-mark = %x22            ; "
 | 
			
		||||
 | 
			
		||||
basic-char = basic-unescaped / escaped
 | 
			
		||||
escaped = escape ( %x22 /          ; "    quotation mark  U+0022
 | 
			
		||||
                   %x5C /          ; \    reverse solidus U+005C
 | 
			
		||||
                   %x2F /          ; /    solidus         U+002F
 | 
			
		||||
                   %x62 /          ; b    backspace       U+0008
 | 
			
		||||
                   %x66 /          ; f    form feed       U+000C
 | 
			
		||||
                   %x6E /          ; n    line feed       U+000A
 | 
			
		||||
                   %x72 /          ; r    carriage return U+000D
 | 
			
		||||
                   %x74 /          ; t    tab             U+0009
 | 
			
		||||
                   %x75 4HEXDIG /  ; uXXXX                U+XXXX
 | 
			
		||||
                   %x55 8HEXDIG )  ; UXXXXXXXX            U+XXXXXXXX
 | 
			
		||||
 | 
			
		||||
basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
 | 
			
		||||
 | 
			
		||||
escape = %x5C                    ; \
 | 
			
		||||
 | 
			
		||||
;; Multiline Basic String
 | 
			
		||||
 | 
			
		||||
ml-basic-string-delim = quotation-mark quotation-mark quotation-mark
 | 
			
		||||
ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim
 | 
			
		||||
ml-basic-body = *( ml-basic-char / newline / ( escape newline ))
 | 
			
		||||
 | 
			
		||||
ml-basic-char = ml-basic-unescaped / escaped
 | 
			
		||||
ml-basic-unescaped = %x20-5B / %x5D-10FFFF
 | 
			
		||||
 | 
			
		||||
;; Literal String
 | 
			
		||||
 | 
			
		||||
literal-string = apostraphe *literal-char apostraphe
 | 
			
		||||
 | 
			
		||||
apostraphe = %x27 ; ' Apostrophe
 | 
			
		||||
 | 
			
		||||
literal-char = %x09 / %x20-26 / %x28-10FFFF
 | 
			
		||||
 | 
			
		||||
;; Multiline Literal String
 | 
			
		||||
 | 
			
		||||
ml-literal-string-delim = apostraphe apostraphe apostraphe
 | 
			
		||||
ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim
 | 
			
		||||
 | 
			
		||||
ml-literal-body = *( ml-literal-char / newline )
 | 
			
		||||
ml-literal-char = %x09 / %x20-10FFFF
 | 
			
		||||
 | 
			
		||||
;; Boolean
 | 
			
		||||
 | 
			
		||||
boolean = true / false
 | 
			
		||||
true    = %x74.72.75.65     ; true
 | 
			
		||||
false   = %x66.61.6C.73.65  ; false
 | 
			
		||||
 | 
			
		||||
;; Datetime (as defined in RFC 3339)
 | 
			
		||||
 | 
			
		||||
date-fullyear  = 4DIGIT
 | 
			
		||||
date-month     = 2DIGIT  ; 01-12
 | 
			
		||||
date-mday      = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on month/year
 | 
			
		||||
time-hour      = 2DIGIT  ; 00-23
 | 
			
		||||
time-minute    = 2DIGIT  ; 00-59
 | 
			
		||||
time-second    = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap second rules
 | 
			
		||||
time-secfrac   = "." 1*DIGIT
 | 
			
		||||
time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
 | 
			
		||||
time-offset    = "Z" / time-numoffset
 | 
			
		||||
 | 
			
		||||
partial-time   = time-hour ":" time-minute ":" time-second [time-secfrac]
 | 
			
		||||
full-date      = date-fullyear "-" date-month "-" date-mday
 | 
			
		||||
full-time      = partial-time time-offset
 | 
			
		||||
 | 
			
		||||
date-time      = full-date "T" full-time
 | 
			
		||||
 | 
			
		||||
;; Array
 | 
			
		||||
 | 
			
		||||
array-open  = %x5B ws  ; [
 | 
			
		||||
array-close = ws %x5D  ; ]
 | 
			
		||||
 | 
			
		||||
array = array-open array-values array-close
 | 
			
		||||
 | 
			
		||||
array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] /
 | 
			
		||||
                 val array-sep [ ( comment newlines) / newlines ] array-values ]
 | 
			
		||||
 | 
			
		||||
array-sep = ws %x2C ws  ; , Comma
 | 
			
		||||
 | 
			
		||||
;; Inline Table
 | 
			
		||||
 | 
			
		||||
inline-table-open  = %x7B ws     ; {
 | 
			
		||||
inline-table-close = ws %x7D     ; }
 | 
			
		||||
inline-table-sep   = ws %x2C ws  ; , Comma
 | 
			
		||||
 | 
			
		||||
inline-table = inline-table-open inline-table-keyvals inline-table-close
 | 
			
		||||
 | 
			
		||||
inline-table-keyvals = [ inline-table-keyvals-non-empty ]
 | 
			
		||||
inline-table-keyvals-non-empty = key keyval-sep val /
 | 
			
		||||
                                 key keyval-sep val inline-table-sep inline-table-keyvals-non-empty
 | 
			
		||||
 | 
			
		||||
;; Built-in ABNF terms, reproduced here for clarity
 | 
			
		||||
 | 
			
		||||
; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
 | 
			
		||||
; DIGIT = %x30-39 ; 0-9
 | 
			
		||||
; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
 | 
			
		||||
							
								
								
									
										33
									
								
								samples/ASN.1/example.asn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								samples/ASN.1/example.asn
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
MyShopPurchaseOrders DEFINITIONS AUTOMATIC TAGS ::= BEGIN
 | 
			
		||||
 | 
			
		||||
PurchaseOrder ::= SEQUENCE {
 | 
			
		||||
dateOfOrder	DATE,
 | 
			
		||||
customer   	CustomerInfo,
 | 
			
		||||
items      	ListOfItems
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CustomerInfo ::= SEQUENCE {
 | 
			
		||||
companyName	   VisibleString (SIZE (3..50)),
 | 
			
		||||
billingAddress	Address,
 | 
			
		||||
contactPhone   NumericString (SIZE (7..12))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Address::= SEQUENCE {
 | 
			
		||||
street	 VisibleString (SIZE (5 .. 50)) OPTIONAL,
 | 
			
		||||
city	   VisibleString (SIZE (2..30)),
 | 
			
		||||
state	  VisibleString (SIZE(2) ^ FROM ("A".."Z")),
 | 
			
		||||
zipCode	NumericString (SIZE(5 | 9))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ListOfItems ::= SEQUENCE (SIZE (1..100)) OF Item
 | 
			
		||||
 | 
			
		||||
Item ::= SEQUENCE {
 | 
			
		||||
itemCode	       INTEGER (1..99999),
 | 
			
		||||
color          	VisibleString ("Black" | "Blue" | "Brown"),
 | 
			
		||||
power          	INTEGER (110 | 220),
 | 
			
		||||
deliveryTime   	INTEGER (8..12 | 14..19),
 | 
			
		||||
quantity	       INTEGER (1..1000),
 | 
			
		||||
unitPrice	      REAL (1.00 .. 9999.00),
 | 
			
		||||
isTaxable	      BOOLEAN
 | 
			
		||||
}
 | 
			
		||||
END
 | 
			
		||||
							
								
								
									
										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.
 | 
			
		||||
@@ -1,73 +0,0 @@
 | 
			
		||||
/* -*- Mode: dtrace-script; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | 
			
		||||
/* ***** BEGIN LICENSE BLOCK *****
 | 
			
		||||
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 | 
			
		||||
 *
 | 
			
		||||
 * The contents of this file are subject to the Mozilla Public License Version
 | 
			
		||||
 * 1.1 (the "License"); you may not use this file except in compliance with
 | 
			
		||||
 * the License. You may obtain a copy of the License at
 | 
			
		||||
 * http://www.mozilla.org/MPL/
 | 
			
		||||
 *
 | 
			
		||||
 * Software distributed under the License is distributed on an "AS IS" basis,
 | 
			
		||||
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 | 
			
		||||
 * for the specific language governing rights and limitations under the
 | 
			
		||||
 * License.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2007  Sun Microsystems, Inc. All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Alternatively, the contents of this file may be used under the terms of
 | 
			
		||||
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 | 
			
		||||
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 | 
			
		||||
 * in which case the provisions of the GPL or the LGPL are applicable instead
 | 
			
		||||
 * of those above. If you wish to allow use of your version of this file only
 | 
			
		||||
 * under the terms of either the GPL or the LGPL, and not to allow others to
 | 
			
		||||
 * use your version of this file under the terms of the MPL, indicate your
 | 
			
		||||
 * decision by deleting the provisions above and replace them with the notice
 | 
			
		||||
 * and other provisions required by the GPL or the LGPL. If you do not delete
 | 
			
		||||
 * the provisions above, a recipient may use your version of this file under
 | 
			
		||||
 * the terms of any one of the MPL, the GPL or the LGPL.
 | 
			
		||||
 *
 | 
			
		||||
 * ***** END LICENSE BLOCK ***** */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * javascript provider probes
 | 
			
		||||
 *
 | 
			
		||||
 * function-entry       (filename, classname, funcname)
 | 
			
		||||
 * function-info        (filename, classname, funcname, lineno,
 | 
			
		||||
 *                      runfilename, runlineno)
 | 
			
		||||
 * function-args        (filename, classname, funcname, argc, argv, argv0,
 | 
			
		||||
 *                      argv1, argv2, argv3, argv4)
 | 
			
		||||
 * function-rval        (filename, classname, funcname, lineno, rval, rval0)
 | 
			
		||||
 * function-return      (filename, classname, funcname)
 | 
			
		||||
 * object-create-start  (filename, classname)
 | 
			
		||||
 * object-create        (filename, classname, *object, rlineno)
 | 
			
		||||
 * object-create-done   (filename, classname)
 | 
			
		||||
 * object-finalize      (NULL, classname, *object)
 | 
			
		||||
 * execute-start        (filename, lineno)
 | 
			
		||||
 * execute-done         (filename, lineno)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
provider javascript {
 | 
			
		||||
 probe function__entry(char *, char *, char *);
 | 
			
		||||
 probe function__info(char *, char *, char *, int, char *, int);
 | 
			
		||||
 probe function__args(char *, char *, char *, int, void *, void *, void *,
 | 
			
		||||
     void *, void *, void *);
 | 
			
		||||
 probe function__rval(char *, char *, char *, int, void *, void *);
 | 
			
		||||
 probe function__return(char *, char *, char *);
 | 
			
		||||
 probe object__create__start(char *, char *);
 | 
			
		||||
 probe object__create__done(char *, char *);
 | 
			
		||||
 /* XXX must use unsigned longs here instead of uintptr_t for OS X 
 | 
			
		||||
    (Apple radar: 5194316 & 5565198) */
 | 
			
		||||
 probe object__create(char *, char *, unsigned long, int);
 | 
			
		||||
 probe object__finalize(char *, char *, unsigned long);
 | 
			
		||||
 probe execute__start(char *, int);
 | 
			
		||||
 probe execute__done(char *, int);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#pragma D attributes Unstable/Unstable/Common provider mozilla provider
 | 
			
		||||
#pragma D attributes Private/Private/Unknown provider mozilla module
 | 
			
		||||
#pragma D attributes Private/Private/Unknown provider mozilla function
 | 
			
		||||
#pragma D attributes Unstable/Unstable/Common provider mozilla name
 | 
			
		||||
#pragma D attributes Unstable/Unstable/Common provider mozilla args
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										184
									
								
								samples/DTrace/trace_futexes.d
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								samples/DTrace/trace_futexes.d
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,184 @@
 | 
			
		||||
#!/usr/sbin/dtrace -qs
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/bycn82/freebsd/blob/12a4a4a008eac3cfa71e496b33eaeaf426c374c1/sys/compat/linux/trace_futexes.d
 | 
			
		||||
 | 
			
		||||
/*-
 | 
			
		||||
 * Copyright (c) 2011-2012 Alexander Leidinger <netchild@FreeBSD.org>
 | 
			
		||||
 * All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer
 | 
			
		||||
 *    in this position and unchanged.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 | 
			
		||||
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * $FreeBSD$
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Trace futex operations:
 | 
			
		||||
 *  - internal locks
 | 
			
		||||
 *  - size of the futex list
 | 
			
		||||
 *  - report error conditions (emulation errors, kernel errors,
 | 
			
		||||
 *    programming errors)
 | 
			
		||||
 *  - execution time (wallclock) of futex related functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma D option specsize=32m
 | 
			
		||||
 | 
			
		||||
/* Error conditions */
 | 
			
		||||
linuxulator*:futex:futex_get:error,
 | 
			
		||||
linuxulator*:futex:futex_sleep:requeue_error,
 | 
			
		||||
linuxulator*:futex:futex_sleep:sleep_error,
 | 
			
		||||
linuxulator*:futex:futex_wait:copyin_error,
 | 
			
		||||
linuxulator*:futex:futex_wait:itimerfix_error,
 | 
			
		||||
linuxulator*:futex:futex_wait:sleep_error,
 | 
			
		||||
linuxulator*:futex:futex_atomic_op:missing_access_check,
 | 
			
		||||
linuxulator*:futex:futex_atomic_op:unimplemented_op,
 | 
			
		||||
linuxulator*:futex:futex_atomic_op:unimplemented_cmp,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_clockswitch,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:copyin_error,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unhandled_efault,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_lock_pi,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:unknown_operation,
 | 
			
		||||
linuxulator*:futex:linux_get_robust_list:copyout_error,
 | 
			
		||||
linuxulator*:futex:handle_futex_death:copyin_error,
 | 
			
		||||
linuxulator*:futex:fetch_robust_entry:copyin_error,
 | 
			
		||||
linuxulator*:futex:release_futexes:copyin_error
 | 
			
		||||
{
 | 
			
		||||
  printf("ERROR: %s in %s:%s:%s\n", probename, probeprov, probemod,
 | 
			
		||||
      probefunc);
 | 
			
		||||
  stack();
 | 
			
		||||
  ustack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use,
 | 
			
		||||
linuxulator*:futex:linux_sys_futex:deprecated_requeue,
 | 
			
		||||
linuxulator*:futex:linux_set_robust_list:size_error
 | 
			
		||||
{
 | 
			
		||||
  printf("WARNING: %s:%s:%s:%s in application %s, maybe an application error?\n",
 | 
			
		||||
      probename, probeprov, probemod, probefunc, execname);
 | 
			
		||||
  stack();
 | 
			
		||||
  ustack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Per futex checks/statistics */
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex:futex:create
 | 
			
		||||
{
 | 
			
		||||
  ++futex_count;
 | 
			
		||||
  @max_futexes = max(futex_count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex:futex:destroy
 | 
			
		||||
/futex_count == 0/
 | 
			
		||||
{
 | 
			
		||||
  printf("ERROR: Request to destroy a futex which was not created,\n");
 | 
			
		||||
  printf("       or this script was started after some futexes where\n");
 | 
			
		||||
  printf("       created. Stack trace:\n");
 | 
			
		||||
  stack();
 | 
			
		||||
  ustack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex:futex:destroy
 | 
			
		||||
{
 | 
			
		||||
  --futex_count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Internal locks */
 | 
			
		||||
 | 
			
		||||
linuxulator*:locks:futex_mtx:locked
 | 
			
		||||
{
 | 
			
		||||
  ++check[probefunc, arg0];
 | 
			
		||||
  @stats[probefunc] = count();
 | 
			
		||||
 | 
			
		||||
  ts[probefunc] = timestamp;
 | 
			
		||||
  spec[probefunc] = speculation();
 | 
			
		||||
  printf("Stacktrace of last lock operation of the %s:\n", probefunc);
 | 
			
		||||
  stack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:locks:futex_mtx:unlock
 | 
			
		||||
/check[probefunc, arg0] == 0/
 | 
			
		||||
{
 | 
			
		||||
  printf("ERROR: unlock attempt of unlocked %s (%p),", probefunc, arg0);
 | 
			
		||||
  printf("       missing SDT probe in kernel, or dtrace program started");
 | 
			
		||||
  printf("       while the %s was already held (race condition).", probefunc);
 | 
			
		||||
  printf("       Stack trace follows:");
 | 
			
		||||
  stack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:locks:futex_mtx:unlock
 | 
			
		||||
{
 | 
			
		||||
  discard(spec[probefunc]);
 | 
			
		||||
  spec[probefunc] = 0;
 | 
			
		||||
  --check[probefunc, arg0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Timeout handling for internal locks */
 | 
			
		||||
 | 
			
		||||
tick-10s
 | 
			
		||||
/spec["futex_mtx"] != 0 && timestamp - ts["futex_mtx"] >= 9999999000/
 | 
			
		||||
{
 | 
			
		||||
  commit(spec["futex_mtx"]);
 | 
			
		||||
  spec["futex_mtx"] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Timing statistings */
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex::entry
 | 
			
		||||
{
 | 
			
		||||
  self->time[probefunc] = timestamp;
 | 
			
		||||
  @calls[probeprov, execname, probefunc] = count();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
linuxulator*:futex::return
 | 
			
		||||
/self->time[probefunc] != 0/
 | 
			
		||||
{
 | 
			
		||||
  this->timediff = self->time[probefunc] - timestamp;
 | 
			
		||||
 | 
			
		||||
        @timestats[probeprov, execname, probefunc] = quantize(this->timediff);
 | 
			
		||||
        @longest[probeprov, probefunc] = max(this->timediff);
 | 
			
		||||
 | 
			
		||||
        self->time[probefunc] = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Statistics */
 | 
			
		||||
 | 
			
		||||
END
 | 
			
		||||
{
 | 
			
		||||
  printf("Number of locks per type:");
 | 
			
		||||
  printa(@stats);
 | 
			
		||||
  printf("Number of maximum number of futexes in the futex list:");
 | 
			
		||||
  printa(@max_futexes);
 | 
			
		||||
  printf("Number of futexes still existing: %d", futex_count);
 | 
			
		||||
  printf("Number of calls per provider/application/kernel function:");
 | 
			
		||||
  printa(@calls);
 | 
			
		||||
  printf("Wallclock-timing statistics per provider/application/kernel function (in ns):");
 | 
			
		||||
  printa(@timestats);
 | 
			
		||||
  printf("Longest running (wallclock!) functions per provider (in ns):");
 | 
			
		||||
  printa(@longest);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								samples/EBNF/grammar.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/EBNF/grammar.ebnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
(*
 | 
			
		||||
  Source:  https://github.com/sunjay/lion
 | 
			
		||||
  License: MIT
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
Statement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , "\n" ;
 | 
			
		||||
Expr = AnonymousFunction | Term | "(" , Expr , ")" ,
 | 
			
		||||
    { AnonymousFunction | Term | "(" , Expr , ")" } ;
 | 
			
		||||
 | 
			
		||||
Assignment = Symbol , "=" , Expr ;
 | 
			
		||||
 | 
			
		||||
AnonymousFunction = "\" , FunctionRHS ;
 | 
			
		||||
NamedFunction = Symbol , FunctionRHS ;
 | 
			
		||||
 | 
			
		||||
FunctionRHS = FunctionParams , "=" , FunctionBody ;
 | 
			
		||||
FunctionParams = FunctionParam , { FunctionParam } ;
 | 
			
		||||
FunctionParam = Term ;
 | 
			
		||||
FunctionBody = Expr ;
 | 
			
		||||
 | 
			
		||||
Term = Symbol | Number | SingleWordString ;
 | 
			
		||||
SingleWordString = '"' , Symbol , '"' ;
 | 
			
		||||
(* Symbol is a collection of valid symbol characters, not defined here *)
 | 
			
		||||
(* Number is a valid numeric literal *)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										40
									
								
								samples/EBNF/material.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								samples/EBNF/material.ebnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
(*
 | 
			
		||||
  Source:  https://github.com/io7m/jsom0
 | 
			
		||||
  License: ISC
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
name =
 | 
			
		||||
  "name" , string , ";" ;
 | 
			
		||||
 | 
			
		||||
diffuse =
 | 
			
		||||
  "diffuse" , real , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
ambient =
 | 
			
		||||
  "ambient" , real , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
specular =
 | 
			
		||||
  "specular" , real , real , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
shininess =
 | 
			
		||||
  "shininess" , real , ";" ;
 | 
			
		||||
 | 
			
		||||
alpha =
 | 
			
		||||
  "alpha" , real , ";" ;
 | 
			
		||||
 | 
			
		||||
mapping =
 | 
			
		||||
  "map_chrome" | "map_uv" ;
 | 
			
		||||
 | 
			
		||||
texture =
 | 
			
		||||
  "texture" , string , real , mapping , ";" ;
 | 
			
		||||
 | 
			
		||||
material =
 | 
			
		||||
  "material" , ";" ,
 | 
			
		||||
    name ,
 | 
			
		||||
    diffuse ,
 | 
			
		||||
    ambient ,
 | 
			
		||||
    specular ,
 | 
			
		||||
    shininess ,
 | 
			
		||||
    alpha ,
 | 
			
		||||
    [ texture ] ,
 | 
			
		||||
  "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										61
									
								
								samples/EBNF/object.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								samples/EBNF/object.ebnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
(*
 | 
			
		||||
  Source:  https://github.com/io7m/jsom0
 | 
			
		||||
  License: ISC
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
vertex_p3n3_name =
 | 
			
		||||
  "vertex_p3n3" ;
 | 
			
		||||
 | 
			
		||||
vertex_p3n3t2_name =
 | 
			
		||||
  "vertex_p3n3t2" ;
 | 
			
		||||
 | 
			
		||||
vertex_type =
 | 
			
		||||
  vertex_p3n3_name | vertex_p3n3t2_name ;
 | 
			
		||||
 | 
			
		||||
vertex_position =
 | 
			
		||||
  "position" , real , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
vertex_normal =
 | 
			
		||||
  "normal" , real , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
vertex_uv =
 | 
			
		||||
  "uv" , real , real , ";" ;
 | 
			
		||||
 | 
			
		||||
vertex_p3n3 =
 | 
			
		||||
  vertex_p3n3_name , vertex_position , vertex_normal , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
vertex_p3n3t2 =
 | 
			
		||||
  vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
vertex =
 | 
			
		||||
  vertex_p3n3 | vertex_p3n3t2 ;
 | 
			
		||||
 | 
			
		||||
vertex_array =
 | 
			
		||||
  "array" , positive , vertex_type , { vertex } , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
vertices =
 | 
			
		||||
  "vertices" , ";" , vertex_array , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
triangle =
 | 
			
		||||
  "triangle" , natural , natural , natural , ";" ;
 | 
			
		||||
 | 
			
		||||
triangle_array =
 | 
			
		||||
  "array" , positive, "triangle" , { triangle } , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
triangles =
 | 
			
		||||
  "triangles" , ";" , triangle_array , "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
name =
 | 
			
		||||
  "name" , string , ";" ;
 | 
			
		||||
 | 
			
		||||
material_name =
 | 
			
		||||
  "material_name" , string , ";" ;
 | 
			
		||||
 | 
			
		||||
object =
 | 
			
		||||
  "object" , ";" ,
 | 
			
		||||
    name ,
 | 
			
		||||
    material_name ,
 | 
			
		||||
    vertices ,
 | 
			
		||||
    triangles ,
 | 
			
		||||
  "end" , ";" ;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								samples/EBNF/types.ebnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/EBNF/types.ebnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
(*
 | 
			
		||||
  Source:  https://github.com/io7m/jsom0
 | 
			
		||||
  License: ISC
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
digit_without_zero =
 | 
			
		||||
  "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 | 
			
		||||
 | 
			
		||||
digit =
 | 
			
		||||
  "0" | digit_without_zero ;
 | 
			
		||||
 | 
			
		||||
positive =
 | 
			
		||||
  digit_without_zero , { digit } ;
 | 
			
		||||
 | 
			
		||||
natural =
 | 
			
		||||
  "0" | positive ;
 | 
			
		||||
 | 
			
		||||
real =
 | 
			
		||||
  [ "-" ] , digit , [ "." , { digit } ] ;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								samples/Emacs Lisp/filenames/.abbrev_defs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Emacs Lisp/filenames/.abbrev_defs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
(define-abbrev-table 'c-mode-abbrev-table '(
 | 
			
		||||
	))
 | 
			
		||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
 | 
			
		||||
	("TM" "™" nil 0)
 | 
			
		||||
	("(R)" "®" nil 0)
 | 
			
		||||
	("C=" "€" nil 0)))
 | 
			
		||||
							
								
								
									
										20
									
								
								samples/Emacs Lisp/filenames/.gnus
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								samples/Emacs Lisp/filenames/.gnus
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
(setq user-full-name "Alhadis")
 | 
			
		||||
(setq user-mail-address "fake.account@gmail.com")
 | 
			
		||||
 | 
			
		||||
(auto-image-file-mode)
 | 
			
		||||
(setq mm-inline-large-images t)
 | 
			
		||||
(add-to-list 'mm-attachment-override-types "image/*")
 | 
			
		||||
 | 
			
		||||
(setq gnus-select-method 
 | 
			
		||||
	  '(nnimap "gmail"
 | 
			
		||||
		(nnimap-address "imap.gmail.com")
 | 
			
		||||
		(nnimap-server-port 777)
 | 
			
		||||
		(nnimap-stream ssl)))
 | 
			
		||||
 | 
			
		||||
(setq message-send-mail-function 'smtpmail-send-it
 | 
			
		||||
	  smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil))
 | 
			
		||||
	  smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil))
 | 
			
		||||
	  smtpmail-default-smtp-server "smtp.gmail.com"
 | 
			
		||||
	  smtpmail-smtp-server "smtp.gmail.com"
 | 
			
		||||
	  smtpmail-smtp-service 800
 | 
			
		||||
	  setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks")
 | 
			
		||||
							
								
								
									
										197
									
								
								samples/Emacs Lisp/filenames/.spacemacs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								samples/Emacs Lisp/filenames/.spacemacs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,197 @@
 | 
			
		||||
;; -*- mode: emacs-lisp -*-
 | 
			
		||||
;; This file is loaded by Spacemacs at startup.
 | 
			
		||||
;; It must be stored in your home directory.
 | 
			
		||||
 | 
			
		||||
(defun dotspacemacs/layers ()
 | 
			
		||||
  "Configuration Layers declaration."
 | 
			
		||||
  (setq-default
 | 
			
		||||
   ;; List of additional paths where to look for configuration layers.
 | 
			
		||||
   ;; Paths must have a trailing slash (i.e. `~/.mycontribs/')
 | 
			
		||||
   dotspacemacs-configuration-layer-path '()
 | 
			
		||||
   ;; List of configuration layers to load. If it is the symbol `all' instead
 | 
			
		||||
   ;; of a list then all discovered layers will be installed.
 | 
			
		||||
   dotspacemacs-configuration-layers
 | 
			
		||||
   '(
 | 
			
		||||
     ;; ----------------------------------------------------------------
 | 
			
		||||
     ;; Example of useful layers you may want to use right away.
 | 
			
		||||
     ;; Uncomment some layer names and press <SPC f e R> (Vim style) or
 | 
			
		||||
     ;; <M-m f e R> (Emacs style) to install them.
 | 
			
		||||
     ;; ----------------------------------------------------------------
 | 
			
		||||
     emacs-lisp
 | 
			
		||||
     charlock_holmes
 | 
			
		||||
     escape_utils
 | 
			
		||||
     mime-types
 | 
			
		||||
     rugged
 | 
			
		||||
     minitest
 | 
			
		||||
     mocha
 | 
			
		||||
     plist
 | 
			
		||||
     pry
 | 
			
		||||
     rake
 | 
			
		||||
     yajl-ruby
 | 
			
		||||
     colour-proximity
 | 
			
		||||
     licensed
 | 
			
		||||
     licensee
 | 
			
		||||
   ;; List of additional packages that will be installed without being
 | 
			
		||||
   ;; wrapped in a layer. If you need some configuration for these
 | 
			
		||||
   ;; packages then consider to create a layer, you can also put the
 | 
			
		||||
   ;; configuration in `dotspacemacs/config'.
 | 
			
		||||
   dotspacemacs-additional-packages '()
 | 
			
		||||
   ;; A list of packages and/or extensions that will not be install and loaded.
 | 
			
		||||
   dotspacemacs-excluded-packages '()
 | 
			
		||||
   ;; If non-nil spacemacs will delete any orphan packages, i.e. packages that
 | 
			
		||||
   ;; are declared in a layer which is not a member of
 | 
			
		||||
   ;; the list `dotspacemacs-configuration-layers'
 | 
			
		||||
   dotspacemacs-delete-orphan-packages t))
 | 
			
		||||
 | 
			
		||||
(defun dotspacemacs/init ()
 | 
			
		||||
  "Initialization function.
 | 
			
		||||
This function is called at the very startup of Spacemacs initialization
 | 
			
		||||
before layers configuration."
 | 
			
		||||
  ;; This setq-default sexp is an exhaustive list of all the supported
 | 
			
		||||
  ;; spacemacs settings.
 | 
			
		||||
  (setq-default
 | 
			
		||||
   ;; Either `vim' or `emacs'. Evil is always enabled but if the variable
 | 
			
		||||
   ;; is `emacs' then the `holy-mode' is enabled at startup.
 | 
			
		||||
   dotspacemacs-editing-style 'vim
 | 
			
		||||
   ;; If non nil output loading progress in `*Messages*' buffer.
 | 
			
		||||
   dotspacemacs-verbose-loading nil
 | 
			
		||||
   ;; Specify the startup banner. Default value is `official', it displays
 | 
			
		||||
   ;; the official spacemacs logo. An integer value is the index of text
 | 
			
		||||
   ;; banner, `random' chooses a random text banner in `core/banners'
 | 
			
		||||
   ;; directory. A string value must be a path to an image format supported
 | 
			
		||||
   ;; by your Emacs build.
 | 
			
		||||
   ;; If the value is nil then no banner is displayed.
 | 
			
		||||
   dotspacemacs-startup-banner 'official
 | 
			
		||||
   ;; List of items to show in the startup buffer. If nil it is disabled.
 | 
			
		||||
   ;; Possible values are: `recents' `bookmarks' `projects'."
 | 
			
		||||
   dotspacemacs-startup-lists '(bookmarks projects recents)
 | 
			
		||||
   ;; List of themes, the first of the list is loaded when spacemacs starts.
 | 
			
		||||
   ;; Press <SPC> T n to cycle to the next theme in the list (works great
 | 
			
		||||
   ;; with 2 themes variants, one dark and one light)
 | 
			
		||||
   dotspacemacs-themes '(
 | 
			
		||||
                         spacemacs-dark
 | 
			
		||||
                         spacemacs-light
 | 
			
		||||
                         solarized-dark
 | 
			
		||||
                         solarized-light
 | 
			
		||||
                         atom-light-ui
 | 
			
		||||
                         atom-dark-ui
 | 
			
		||||
                         atom-material-ui
 | 
			
		||||
                         zenburn
 | 
			
		||||
   ;; If non nil the cursor colour matches the state colour.
 | 
			
		||||
   dotspacemacs-colorize-cursor-according-to-state t
 | 
			
		||||
   ;; Default font. `powerline-scale' allows to quickly tweak the mode-line
 | 
			
		||||
   ;; size to make separators look not too crappy.
 | 
			
		||||
   dotspacemacs-default-font '("Menloco"
 | 
			
		||||
                               :size 11
 | 
			
		||||
                               :weight normal
 | 
			
		||||
                               :width normal
 | 
			
		||||
                               :powerline-scale 1.1)
 | 
			
		||||
   ;; The leader key
 | 
			
		||||
   dotspacemacs-leader-key "SPC"
 | 
			
		||||
   ;; The leader key accessible in `emacs state' and `insert state'
 | 
			
		||||
   dotspacemacs-emacs-leader-key "M-m"
 | 
			
		||||
   ;; Major mode leader key is a shortcut key which is the equivalent of
 | 
			
		||||
   ;; pressing `<leader> m`. Set it to `nil` to disable it.
 | 
			
		||||
   dotspacemacs-major-mode-leader-key ","
 | 
			
		||||
   ;; Major mode leader key accessible in `emacs state' and `insert state'
 | 
			
		||||
   dotspacemacs-major-mode-emacs-leader-key "C-M-m"
 | 
			
		||||
   ;; The command key used for Evil commands (ex-commands) and
 | 
			
		||||
   ;; Emacs commands (M-x).
 | 
			
		||||
   ;; By default the command key is `:' so ex-commands are executed like in Vim
 | 
			
		||||
   ;; with `:' and Emacs commands are executed with `<leader> :'.
 | 
			
		||||
   dotspacemacs-command-key ":"
 | 
			
		||||
   ;; Location where to auto-save files. Possible values are `original' to
 | 
			
		||||
   ;; auto-save the file in-place, `cache' to auto-save the file to another
 | 
			
		||||
   ;; file stored in the cache directory and `nil' to disable auto-saving.
 | 
			
		||||
   ;; Default value is `cache'.
 | 
			
		||||
   dotspacemacs-auto-save-file-location 'cache
 | 
			
		||||
   ;; If non nil then `ido' replaces `helm' for some commands. For now only
 | 
			
		||||
   ;; `find-files' (SPC f f) is replaced.
 | 
			
		||||
   dotspacemacs-use-ido nil
 | 
			
		||||
   ;; If non nil the paste micro-state is enabled. When enabled pressing `p`
 | 
			
		||||
   ;; several times cycle between the kill ring content.
 | 
			
		||||
   dotspacemacs-enable-paste-micro-state nil
 | 
			
		||||
   ;; Guide-key delay in seconds. The Guide-key is the popup buffer listing
 | 
			
		||||
   ;; the commands bound to the current keystrokes.
 | 
			
		||||
   dotspacemacs-guide-key-delay 0.4
 | 
			
		||||
   ;; If non nil a progress bar is displayed when spacemacs is loading. This
 | 
			
		||||
   ;; may increase the boot time on some systems and emacs builds, set it to
 | 
			
		||||
   ;; nil ;; to boost the loading time.
 | 
			
		||||
   dotspacemacs-loading-progress-bar t
 | 
			
		||||
   ;; If non nil the frame is fullscreen when Emacs starts up.
 | 
			
		||||
   ;; (Emacs 24.4+ only)
 | 
			
		||||
   dotspacemacs-fullscreen-at-startup nil
 | 
			
		||||
   ;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen.
 | 
			
		||||
   ;; Use to disable fullscreen animations in OSX."
 | 
			
		||||
   dotspacemacs-fullscreen-use-non-native nil
 | 
			
		||||
   ;; If non nil the frame is maximized when Emacs starts up.
 | 
			
		||||
   ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.
 | 
			
		||||
   ;; (Emacs 24.4+ only)
 | 
			
		||||
   dotspacemacs-maximized-at-startup nil
 | 
			
		||||
   ;; A value from the range (0..100), in increasing opacity, which describes
 | 
			
		||||
   ;; the transparency level of a frame when it's active or selected.
 | 
			
		||||
   ;; Transparency can be toggled through `toggle-transparency'.
 | 
			
		||||
   dotspacemacs-active-transparency 90
 | 
			
		||||
   ;; A value from the range (0..100), in increasing opacity, which describes
 | 
			
		||||
   ;; the transparency level of a frame when it's inactive or deselected.
 | 
			
		||||
   ;; Transparency can be toggled through `toggle-transparency'.
 | 
			
		||||
   dotspacemacs-inactive-transparency 90
 | 
			
		||||
   ;; If non nil unicode symbols are displayed in the mode line.
 | 
			
		||||
   dotspacemacs-mode-line-unicode-symbols t
 | 
			
		||||
   ;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth
 | 
			
		||||
   ;; scrolling overrides the default behavior of Emacs which recenters the
 | 
			
		||||
   ;; point when it reaches the top or bottom of the screen.
 | 
			
		||||
   dotspacemacs-smooth-scrolling t
 | 
			
		||||
   ;; If non-nil smartparens-strict-mode will be enabled in programming modes.
 | 
			
		||||
   dotspacemacs-smartparens-strict-mode nil
 | 
			
		||||
   ;; Select a scope to highlight delimiters. Possible value is `all',
 | 
			
		||||
   ;; `current' or `nil'. Default is `all'
 | 
			
		||||
   dotspacemacs-highlight-delimiters 'all
 | 
			
		||||
   ;; If non nil advises quit functions to keep server open when quitting.
 | 
			
		||||
   dotspacemacs-persistent-server nil
 | 
			
		||||
   ;; List of search tool executable names. Spacemacs uses the first installed
 | 
			
		||||
   ;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'.
 | 
			
		||||
   dotspacemacs-search-tools '("ag" "pt" "ack" "grep")
 | 
			
		||||
   ;; The default package repository used if no explicit repository has been
 | 
			
		||||
   ;; specified with an installed package.
 | 
			
		||||
   ;; Not used for now.
 | 
			
		||||
   dotspacemacs-default-package-repository nil
 | 
			
		||||
 | 
			
		||||
   ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode'
 | 
			
		||||
   ;; derivatives. If set to `relative', also turns on relative line numbers.
 | 
			
		||||
   ;; (default nil)
 | 
			
		||||
   dotspacemacs-line-numbers 'relative
 | 
			
		||||
 | 
			
		||||
   ;; Delete whitespace while saving buffer. Possible values are `all',
 | 
			
		||||
   ;; `trailing', `changed' or `nil'. Default is `changed' (cleanup whitespace
 | 
			
		||||
   ;; on changed lines) (default 'changed)
 | 
			
		||||
   dotspacemacs-whitespace-cleanup 'changed
 | 
			
		||||
   )
 | 
			
		||||
  ;; User initialization goes here
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
(defun dotspacemacs/user-config ()
 | 
			
		||||
  "Configuration function.
 | 
			
		||||
 This function is called at the very end of Spacemacs initialization after
 | 
			
		||||
layers configuration."
 | 
			
		||||
  (add-hook 'alchemist-mode-hook 'company-mode)
 | 
			
		||||
 | 
			
		||||
  (add-hook 'projectile-mode-hook 'projectile-rails-on)
 | 
			
		||||
  (setq ruby-insert-encoding-magic-comment nil)
 | 
			
		||||
 | 
			
		||||
  (setq web-mode-markup-indent-offset 2)
 | 
			
		||||
  (setq web-mode-code-indent-offset 2)
 | 
			
		||||
 | 
			
		||||
  (spacemacs/toggle-golden-ratio-on)
 | 
			
		||||
  (spacemacs/toggle-indent-guide-globally-on)
 | 
			
		||||
  (spacemacs/toggle-centered-point-globally-on)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
;; Do not write anything past this comment. This is where Emacs will
 | 
			
		||||
;; auto-generate custom variable definitions.
 | 
			
		||||
(custom-set-variables
 | 
			
		||||
 ;; custom-set-variables was added by Custom.
 | 
			
		||||
 ;; If you edit it by hand, you could mess it up, so be careful.
 | 
			
		||||
 ;; Your init file should contain only one such instance.
 | 
			
		||||
 ;; If there is more than one, they won't work right.
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										10
									
								
								samples/Emacs Lisp/filenames/.viper
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/Emacs Lisp/filenames/.viper
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
(setq viper-inhibit-startup-message 't)
 | 
			
		||||
(setq viper-expert-level '5)
 | 
			
		||||
 | 
			
		||||
; Key bindings
 | 
			
		||||
(define-key viper-vi-global-user-map "\C-d" 'end-of-line)
 | 
			
		||||
 | 
			
		||||
; Return to top of window
 | 
			
		||||
(defun my-viper-return-to-top ()
 | 
			
		||||
  (interactive)
 | 
			
		||||
  (beginning-of-buffer))
 | 
			
		||||
							
								
								
									
										34
									
								
								samples/Emacs Lisp/filenames/Project.ede
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								samples/Emacs Lisp/filenames/Project.ede
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
;; Object EDE
 | 
			
		||||
(ede-proj-project "Linguist"
 | 
			
		||||
  :name "Linguist"
 | 
			
		||||
  :version "4.9"
 | 
			
		||||
  :file "Project.ede"
 | 
			
		||||
  :targets (list 
 | 
			
		||||
   (ede-proj-target-elisp-autoloads "autoloads"
 | 
			
		||||
    :name "autoloads"
 | 
			
		||||
    :path "test/samples/Emacs Lisp"
 | 
			
		||||
    :autoload-file "dude.el"
 | 
			
		||||
    )
 | 
			
		||||
   (ede-proj-target-elisp "init"
 | 
			
		||||
    :name "init"
 | 
			
		||||
    :path ""
 | 
			
		||||
    :source '("ede-load.el" "wait-what.el")
 | 
			
		||||
    :compiler 'ede-emacs-preload-compiler
 | 
			
		||||
    :pre-load-packages '("sample-names")
 | 
			
		||||
    )
 | 
			
		||||
   (ede-proj-target-elisp "what"
 | 
			
		||||
    :name "the"
 | 
			
		||||
    :path ""
 | 
			
		||||
    :source '("h.el" "am-i-writing.el")
 | 
			
		||||
    :versionsource '("hell.el")
 | 
			
		||||
    :compiler 'ede-emacs-preload-compiler
 | 
			
		||||
    :aux-packages '("what" "the" "hell-files" "am-i-writing")
 | 
			
		||||
    )
 | 
			
		||||
   )
 | 
			
		||||
  :web-site-url "https://github.com/github/linguist"
 | 
			
		||||
  :web-site-directory "../"
 | 
			
		||||
  :web-site-file "CONTRIBUTING.md"
 | 
			
		||||
  :ftp-upload-site "/ftp@git.hub.com:/madeup"
 | 
			
		||||
  :configuration-variables 'nil
 | 
			
		||||
  :metasubproject 't
 | 
			
		||||
  )
 | 
			
		||||
							
								
								
									
										70
									
								
								samples/Emacs Lisp/filenames/_emacs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								samples/Emacs Lisp/filenames/_emacs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
;; UTF-8 support
 | 
			
		||||
;; (set-language-environment "UTF-8")
 | 
			
		||||
(setenv "LANG" "en_AU.UTF-8")
 | 
			
		||||
(setenv "LC_ALL" "en_AU.UTF-8")
 | 
			
		||||
(setq default-tab-width 4)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;; Function to load all ".el" files in ~/.emacs.d/config
 | 
			
		||||
(defun load-directory (directory)
 | 
			
		||||
  "Recursively load all Emacs Lisp files in a directory."
 | 
			
		||||
  (dolist (element (directory-files-and-attributes directory nil nil nil))
 | 
			
		||||
    (let* ((path (car element))
 | 
			
		||||
           (fullpath (concat directory "/" path))
 | 
			
		||||
           (isdir (car (cdr element)))
 | 
			
		||||
           (ignore-dir (or (string= path ".") (string= path ".."))))
 | 
			
		||||
      (cond
 | 
			
		||||
       ((and (eq isdir t) (not ignore-dir))
 | 
			
		||||
        (load-directory fullpath))
 | 
			
		||||
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
 | 
			
		||||
        (load (file-name-sans-extension fullpath)))))))
 | 
			
		||||
 | 
			
		||||
;; Tell Emacs we'd like to use Hunspell for spell-checking
 | 
			
		||||
(setq ispell-program-name (executable-find "hunspell"))
 | 
			
		||||
 | 
			
		||||
;; Load Homebrew-installed packages
 | 
			
		||||
(let ((default-directory "/usr/local/share/emacs/site-lisp/"))
 | 
			
		||||
  (normal-top-level-add-subdirs-to-load-path))
 | 
			
		||||
(load "aggressive-indent")
 | 
			
		||||
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
 | 
			
		||||
(autoload 'rust-mode "rust-mode" nil t)
 | 
			
		||||
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
 | 
			
		||||
 | 
			
		||||
;; Load Git-related syntax highlighting
 | 
			
		||||
(add-to-list 'load-path "~/.emacs.d/lisp/")
 | 
			
		||||
(load "git-modes")
 | 
			
		||||
(load "git-commit")
 | 
			
		||||
 | 
			
		||||
;; Keybindings
 | 
			
		||||
(global-set-key (kbd "C-u") (lambda ()
 | 
			
		||||
                             (interactive)
 | 
			
		||||
                             (kill-line 0)))
 | 
			
		||||
 | 
			
		||||
;; Show cursor's current column number
 | 
			
		||||
(setq column-number-mode t)
 | 
			
		||||
 | 
			
		||||
;; Disable autosave
 | 
			
		||||
(setq auto-save-default nil)
 | 
			
		||||
 | 
			
		||||
;; Use a single directory for storing backup files
 | 
			
		||||
(setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list")))
 | 
			
		||||
(setq backup-by-copying t)
 | 
			
		||||
(setq delete-old-versions t
 | 
			
		||||
      kept-new-versions 6
 | 
			
		||||
      kept-old-versions 2
 | 
			
		||||
      version-control t)
 | 
			
		||||
 | 
			
		||||
(custom-set-variables
 | 
			
		||||
 ;; custom-set-variables was added by Custom.
 | 
			
		||||
 ;; If you edit it by hand, you could mess it up, so be careful.
 | 
			
		||||
 ;; Your init file should contain only one such instance.
 | 
			
		||||
 ;; If there is more than one, they won't work right.
 | 
			
		||||
 '(blink-cursor-mode nil)
 | 
			
		||||
 '(column-number-mode t)
 | 
			
		||||
 '(show-paren-mode t))
 | 
			
		||||
(custom-set-faces
 | 
			
		||||
 ;; custom-set-faces was added by Custom.
 | 
			
		||||
 ;; If you edit it by hand, you could mess it up, so be careful.
 | 
			
		||||
 ;; Your init file should contain only one such instance.
 | 
			
		||||
 ;; If there is more than one, they won't work right.
 | 
			
		||||
 )
 | 
			
		||||
							
								
								
									
										8
									
								
								samples/Emacs Lisp/filenames/abbrev_defs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Emacs Lisp/filenames/abbrev_defs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
(define-abbrev-table 'fundamental-mode-abbrev-table '(
 | 
			
		||||
	("cat" "Concatenate" nil 0)
 | 
			
		||||
	("WTF" "World Trade Federation " nil 0)
 | 
			
		||||
	("rtbtm" "Read that back to me" nil 0)))
 | 
			
		||||
 | 
			
		||||
(define-abbrev-table 'shell-script-mode-abbrev-table '(
 | 
			
		||||
	("brake", "bundle rake exec" nil 0)
 | 
			
		||||
	("pls", "warning: setting Encoding.default_external")))
 | 
			
		||||
							
								
								
									
										6
									
								
								samples/FORTRAN/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/FORTRAN/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/
 | 
			
		||||
      real onemu, twomu
 | 
			
		||||
      data onemu/0.0098/
 | 
			
		||||
      data twomu/1./
 | 
			
		||||
      data threemu/0.e9/
 | 
			
		||||
      end
 | 
			
		||||
							
								
								
									
										51
									
								
								samples/Filebench WML/copyfiles.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/Filebench WML/copyfiles.f
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#
 | 
			
		||||
# CDDL HEADER START
 | 
			
		||||
#
 | 
			
		||||
# The contents of this file are subject to the terms of the
 | 
			
		||||
# Common Development and Distribution License (the "License").
 | 
			
		||||
# You may not use this file except in compliance with the License.
 | 
			
		||||
#
 | 
			
		||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 | 
			
		||||
# or http://www.opensolaris.org/os/licensing.
 | 
			
		||||
# See the License for the specific language governing permissions
 | 
			
		||||
# and limitations under the License.
 | 
			
		||||
#
 | 
			
		||||
# When distributing Covered Code, include this CDDL HEADER in each
 | 
			
		||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 | 
			
		||||
# If applicable, add the following below this CDDL HEADER, with the
 | 
			
		||||
# fields enclosed by brackets "[]" replaced with your own identifying
 | 
			
		||||
# information: Portions Copyright [yyyy] [name of copyright owner]
 | 
			
		||||
#
 | 
			
		||||
# CDDL HEADER END
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 | 
			
		||||
# Use is subject to license terms.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
set $dir=/tmp
 | 
			
		||||
set $nfiles=1000
 | 
			
		||||
set $meandirwidth=20
 | 
			
		||||
set $meanfilesize=16k
 | 
			
		||||
set $iosize=1m
 | 
			
		||||
set $nthreads=1
 | 
			
		||||
 | 
			
		||||
set mode quit firstdone
 | 
			
		||||
 | 
			
		||||
define fileset name=bigfileset,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=100,paralloc
 | 
			
		||||
define fileset name=destfiles,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth
 | 
			
		||||
 | 
			
		||||
define process name=filereader,instances=1
 | 
			
		||||
{
 | 
			
		||||
  thread name=filereaderthread,memsize=10m,instances=$nthreads
 | 
			
		||||
  {
 | 
			
		||||
    flowop openfile name=openfile1,filesetname=bigfileset,fd=1
 | 
			
		||||
    flowop readwholefile name=readfile1,fd=1,iosize=$iosize
 | 
			
		||||
    flowop createfile name=createfile2,filesetname=destfiles,fd=2
 | 
			
		||||
    flowop writewholefile name=writefile2,fd=2,srcfd=1,iosize=$iosize
 | 
			
		||||
    flowop closefile name=closefile1,fd=1
 | 
			
		||||
    flowop closefile name=closefile2,fd=2
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo  "Copyfiles Version 3.0 personality successfully loaded"
 | 
			
		||||
							
								
								
									
										215
									
								
								samples/Groff/an-ext.tmac
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								samples/Groff/an-ext.tmac
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
			
		||||
.\" -*- nroff -*-
 | 
			
		||||
.\"
 | 
			
		||||
.\" an-ext.tmac
 | 
			
		||||
.\"
 | 
			
		||||
.\" Copyright (C) 2007-2014  Free Software Foundation, Inc.
 | 
			
		||||
.\"
 | 
			
		||||
.\" Written by Eric S. Raymond <esr@thyrsus.com>
 | 
			
		||||
.\"            Werner Lemberg <wl@gnu.org>
 | 
			
		||||
.\"
 | 
			
		||||
.\" You may freely use, modify and/or distribute this file.
 | 
			
		||||
.\"
 | 
			
		||||
.\" The code below provides extension macros for the `man' macro package.
 | 
			
		||||
.\" Care has been taken to make the code portable; groff extensions are
 | 
			
		||||
.\" properly hidden so that all troff implementations can use it without
 | 
			
		||||
.\" changes.
 | 
			
		||||
.\"
 | 
			
		||||
.\" With groff, this file is sourced by the `man' macro package itself.
 | 
			
		||||
.\" Man page authors who are concerned about portability might add the
 | 
			
		||||
.\" used macros directly to the prologue of the man page(s).
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Convention: Auxiliary macros and registers start with `m' followed
 | 
			
		||||
.\"             by an uppercase letter or digit.
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Protect against being sourced twice.
 | 
			
		||||
.nr mX +1
 | 
			
		||||
.if \n(mX>1 \
 | 
			
		||||
.  nx
 | 
			
		||||
.
 | 
			
		||||
.\" Check whether we are using grohtml.
 | 
			
		||||
.nr mH 0
 | 
			
		||||
.if \n(.g \
 | 
			
		||||
.  if '\*(.T'html' \
 | 
			
		||||
.    nr mH 1
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Map mono-width fonts to standard fonts for groff's TTY device.
 | 
			
		||||
.if n \{\
 | 
			
		||||
.  do ftr CR R
 | 
			
		||||
.  do ftr CI I
 | 
			
		||||
.  do ftr CB B
 | 
			
		||||
.\}
 | 
			
		||||
.
 | 
			
		||||
.\" groff has glyph entities for angle brackets.
 | 
			
		||||
.ie \n(.g \{\
 | 
			
		||||
.  ds la \(la\"
 | 
			
		||||
.  ds ra \(ra\"
 | 
			
		||||
.\}
 | 
			
		||||
.el \{\
 | 
			
		||||
.  ds la <\"
 | 
			
		||||
.  ds ra >\"
 | 
			
		||||
.  \" groff's man macros control hyphenation with this register.
 | 
			
		||||
.  nr HY 1
 | 
			
		||||
.\}
 | 
			
		||||
.
 | 
			
		||||
.nr mS 0
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Declare start of command synopsis.  Sets up hanging indentation.
 | 
			
		||||
.de SY
 | 
			
		||||
.  ie !\\n(mS \{\
 | 
			
		||||
.    nh
 | 
			
		||||
.    nr mS 1
 | 
			
		||||
.    nr mA \\n(.j
 | 
			
		||||
.    ad l
 | 
			
		||||
.    nr mI \\n(.i
 | 
			
		||||
.  \}
 | 
			
		||||
.  el \{\
 | 
			
		||||
.    br
 | 
			
		||||
.    ns
 | 
			
		||||
.  \}
 | 
			
		||||
.
 | 
			
		||||
.  nr mT \w'\fB\\$1\fP\ '
 | 
			
		||||
.  HP \\n(mTu
 | 
			
		||||
.  B "\\$1"
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" End of command synopsis.  Restores adjustment.
 | 
			
		||||
.de YS
 | 
			
		||||
.  in \\n(mIu
 | 
			
		||||
.  ad \\n(mA
 | 
			
		||||
.  hy \\n(HY
 | 
			
		||||
.  nr mS 0
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Declare optional option.
 | 
			
		||||
.de OP
 | 
			
		||||
.  ie \\n(.$-1 \
 | 
			
		||||
.    RI "[\fB\\$1\fP" "\ \\$2" "]"
 | 
			
		||||
.  el \
 | 
			
		||||
.    RB "[" "\\$1" "]"
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Start URL.
 | 
			
		||||
.de UR
 | 
			
		||||
.  ds m1 \\$1\"
 | 
			
		||||
.  nh
 | 
			
		||||
.  if \\n(mH \{\
 | 
			
		||||
.    \" Start diversion in a new environment.
 | 
			
		||||
.    do ev URL-div
 | 
			
		||||
.    do di URL-div
 | 
			
		||||
.  \}
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" End URL.
 | 
			
		||||
.de UE
 | 
			
		||||
.  ie \\n(mH \{\
 | 
			
		||||
.    br
 | 
			
		||||
.    di
 | 
			
		||||
.    ev
 | 
			
		||||
.
 | 
			
		||||
.    \" Has there been one or more input lines for the link text?
 | 
			
		||||
.    ie \\n(dn \{\
 | 
			
		||||
.      do HTML-NS "<a href=""\\*(m1"">"
 | 
			
		||||
.      \" Yes, strip off final newline of diversion and emit it.
 | 
			
		||||
.      do chop URL-div
 | 
			
		||||
.      do URL-div
 | 
			
		||||
\c
 | 
			
		||||
.      do HTML-NS </a>
 | 
			
		||||
.    \}
 | 
			
		||||
.    el \
 | 
			
		||||
.      do HTML-NS "<a href=""\\*(m1"">\\*(m1</a>"
 | 
			
		||||
\&\\$*\"
 | 
			
		||||
.  \}
 | 
			
		||||
.  el \
 | 
			
		||||
\\*(la\\*(m1\\*(ra\\$*\"
 | 
			
		||||
.
 | 
			
		||||
.  hy \\n(HY
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Start email address.
 | 
			
		||||
.de MT
 | 
			
		||||
.  ds m1 \\$1\"
 | 
			
		||||
.  nh
 | 
			
		||||
.  if \\n(mH \{\
 | 
			
		||||
.    \" Start diversion in a new environment.
 | 
			
		||||
.    do ev URL-div
 | 
			
		||||
.    do di URL-div
 | 
			
		||||
.  \}
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" End email address.
 | 
			
		||||
.de ME
 | 
			
		||||
.  ie \\n(mH \{\
 | 
			
		||||
.    br
 | 
			
		||||
.    di
 | 
			
		||||
.    ev
 | 
			
		||||
.
 | 
			
		||||
.    \" Has there been one or more input lines for the link text?
 | 
			
		||||
.    ie \\n(dn \{\
 | 
			
		||||
.      do HTML-NS "<a href=""mailto:\\*(m1"">"
 | 
			
		||||
.      \" Yes, strip off final newline of diversion and emit it.
 | 
			
		||||
.      do chop URL-div
 | 
			
		||||
.      do URL-div
 | 
			
		||||
\c
 | 
			
		||||
.      do HTML-NS </a>
 | 
			
		||||
.    \}
 | 
			
		||||
.    el \
 | 
			
		||||
.      do HTML-NS "<a href=""mailto:\\*(m1"">\\*(m1</a>"
 | 
			
		||||
\&\\$*\"
 | 
			
		||||
.  \}
 | 
			
		||||
.  el \
 | 
			
		||||
\\*(la\\*(m1\\*(ra\\$*\"
 | 
			
		||||
.
 | 
			
		||||
.  hy \\n(HY
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Continuation line for .TP header.
 | 
			
		||||
.de TQ
 | 
			
		||||
.  br
 | 
			
		||||
.  ns
 | 
			
		||||
.  TP \\$1\" no doublequotes around argument!
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Start example.
 | 
			
		||||
.de EX
 | 
			
		||||
.  do ds mF \\n[.fam]
 | 
			
		||||
.  nr mE \\n(.f
 | 
			
		||||
.  nf
 | 
			
		||||
.  nh
 | 
			
		||||
.  do fam C
 | 
			
		||||
.  ft CW
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" End example.
 | 
			
		||||
.de EE
 | 
			
		||||
.  do fam \\*(mF
 | 
			
		||||
.  ft \\n(mE
 | 
			
		||||
.  fi
 | 
			
		||||
.  hy \\n(HY
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" Start display.
 | 
			
		||||
.de DS
 | 
			
		||||
.  \" XXX to be written
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.
 | 
			
		||||
.\" End display.
 | 
			
		||||
.de DE
 | 
			
		||||
.  \" XXX to be written
 | 
			
		||||
..
 | 
			
		||||
.
 | 
			
		||||
.\" EOF
 | 
			
		||||
							
								
								
									
										35
									
								
								samples/Groff/refs.rno
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								samples/Groff/refs.rno
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
.\" Copyright (c) 1980 Regents of the University of California.
 | 
			
		||||
.\" All rights reserved.  The Berkeley software License Agreement
 | 
			
		||||
.\" specifies the terms and conditions for redistribution.
 | 
			
		||||
.\"
 | 
			
		||||
.\"	@(#)refs.rno	6.1 (Berkeley) 4/29/86
 | 
			
		||||
.\"
 | 
			
		||||
.NS 1 "References"
 | 
			
		||||
.sp
 | 
			
		||||
.ip "[Bac78]"
 | 
			
		||||
John Backus, \*(lqCan Programming Be Liberated from the von Neumann Style?
 | 
			
		||||
A Functional Style and Its Algebra of Programs,\*(rq \fICACM\fP, Turing
 | 
			
		||||
Award Lecture,  21, 8 (August 1978), 613-641.
 | 
			
		||||
.sp 6p
 | 
			
		||||
.ip "[Fod80]"
 | 
			
		||||
John K. Foderaro, \*(lqThe \s-2FRANZ LISP\s+2
 | 
			
		||||
Manual,\*(rq University of California,
 | 
			
		||||
Berkeley, California, 1980.
 | 
			
		||||
.sp 6p
 | 
			
		||||
.ip "[Joy79]"
 | 
			
		||||
W.N. Joy, O. Babaoglu, \*(lqUNIX Programmer's Manual,\*(rq November 7,
 | 
			
		||||
1979, Computer Science Division, University of California, Berkeley,
 | 
			
		||||
California.
 | 
			
		||||
.sp 6p
 | 
			
		||||
.ip "[Mc60]"
 | 
			
		||||
J. McCarthy, \*(lqRecursive Functions of Symbolic expressions and their
 | 
			
		||||
Computation by Machine,\*(rq Part I, \fICACM\fP 3, 4 (April 1960), 184-195.
 | 
			
		||||
.sp 6p
 | 
			
		||||
.ip "[Pat80]"
 | 
			
		||||
Dorab Ratan Patel, \*(lqA System Organization for Applicative Programming,\*(rq
 | 
			
		||||
M.S Thesis, University of California, Los Angeles, California, 1980.
 | 
			
		||||
.sp 6p
 | 
			
		||||
.ip "[Pat81]"
 | 
			
		||||
Dorab Patel, \*(lqFunctional Language Interpreter User Manual,\*(rq
 | 
			
		||||
University of California, Los Angeles, California, 1981.
 | 
			
		||||
.bp
 | 
			
		||||
							
								
								
									
										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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
							
								
								
									
										42
									
								
								samples/PowerBuilder/TestPBT.pbt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/PowerBuilder/TestPBT.pbt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 dario ureña
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/c7f167b4852c75d3da2f7b024bda7d7dda241a00/resources/advanced/real/myproject/myproject.pbt
 | 
			
		||||
 | 
			
		||||
Save Format v3.0(19990112)
 | 
			
		||||
@begin Libraries
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\ScsApex1.pbl" "";
 | 
			
		||||
@end;
 | 
			
		||||
@begin Objects
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_apbe.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_envio.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_inp_bolsa.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_imput.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_inp_conce.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_rete.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_info_noti.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_concsani.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_expe.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_proc_expe.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_mant_soli.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
 "Scs\\Lib\\ScsApex1\\m_proc_soli.srm" "Scs\\Lib\\ScsApex1\\ScsApex1.pbl";
 | 
			
		||||
@end;
 | 
			
		||||
							
								
								
									
										174
									
								
								samples/PowerBuilder/ginpix7.sra
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								samples/PowerBuilder/ginpix7.sra
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 dario ureña
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/07bf527194b73e133943221dc2199a9442d463eb/resources/inventoryModel/nivel0/ginpix7.sra
 | 
			
		||||
 | 
			
		||||
HA$PBExportHeader$ginpix7.sra
 | 
			
		||||
$PBExportComments$Aplicaci$$HEX1$$f300$$ENDHEX$$n Ginpix7
 | 
			
		||||
forward
 | 
			
		||||
global type ginpix7 from application
 | 
			
		||||
end type
 | 
			
		||||
global n_tr_apli sqlca
 | 
			
		||||
global dynamicdescriptionarea sqlda
 | 
			
		||||
global dynamicstagingarea sqlsa
 | 
			
		||||
global error error
 | 
			
		||||
global message message
 | 
			
		||||
end forward
 | 
			
		||||
 | 
			
		||||
global variables
 | 
			
		||||
n_appmanager  gnv_app
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// Satxa - 02-Jun-2009.27760 No tenemos constancia del uso de esta ayuda, asi que la eliminamos.
 | 
			
		||||
//n_help     gn_help
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
//----------------------------------------------------------
 | 
			
		||||
// Satxa - 17-Jun-2010.42351 No se usa.
 | 
			
		||||
//n_help2  gn_help2
 | 
			
		||||
//----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// Satxa - 15-Jun-2009.27760
 | 
			
		||||
//Para el modulo de contratos.
 | 
			
		||||
String	gs_enlacemacros, gs_office2000 // Posibles de Pulir.(en estudio).
 | 
			
		||||
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
end variables
 | 
			
		||||
global type ginpix7 from application
 | 
			
		||||
string appname = "ginpix7"
 | 
			
		||||
string toolbarframetitle = "ginpix7"
 | 
			
		||||
boolean toolbarusercontrol = false
 | 
			
		||||
end type
 | 
			
		||||
global ginpix7 ginpix7
 | 
			
		||||
 | 
			
		||||
type prototypes
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// Satxa - 15-Jun-2009.27760 Copio la llamada a la API del objeto aplicaci$$HEX1$$f300$$ENDHEX$$n de LCS.
 | 
			
		||||
// Satxa - 25-Oct-2005.25577 Viene de LCS y RCS, abre un archivo independientemente del tipo ejecutando el programa asociado en WINDOWS
 | 
			
		||||
Public Function long ShellExecuteA(long hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, long nShowCmd) Library "SHELL32.DLL" alias for "ShellExecuteA;Ansi"
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Fernando Baldellou.14/05/2009. Ginpix7.// Funciones Externas Globales para el Proyecto de Mensajer$$HEX1$$ed00$$ENDHEX$$a.
 | 
			
		||||
//
 | 
			
		||||
Public Function Long GetWindowRect (Long hWnd, Ref mensajeria lpRect) Library "user32" alias for "GetWindowRect;Ansi"
 | 
			
		||||
Public Function Long GetClientRect (Long hWnd, Ref mensajeria lpRect) Library "user32" alias for "GetClientRect;Ansi"
 | 
			
		||||
Public Function Long SetWindowPos (Long hWnd, Long hWndInsertAfter, Long x, Long y, Long cx, Long cy, Long wFlags) Library "user32"
 | 
			
		||||
Public Function Boolean sndPlaySoundA (String SoundName, uint Flags)Library "winmm.dll" alias for "sndPlaySoundA;Ansi" 
 | 
			
		||||
// Fin de la anotaci$$HEX1$$f300$$ENDHEX$$n anterior.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end prototypes
 | 
			
		||||
 | 
			
		||||
type variables
 | 
			
		||||
 | 
			
		||||
end variables
 | 
			
		||||
 | 
			
		||||
on ginpix7.create
 | 
			
		||||
appname="ginpix7"
 | 
			
		||||
message=create message
 | 
			
		||||
sqlca=create n_tr_apli
 | 
			
		||||
sqlda=create dynamicdescriptionarea
 | 
			
		||||
sqlsa=create dynamicstagingarea
 | 
			
		||||
error=create error
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
on ginpix7.destroy
 | 
			
		||||
destroy(sqlca)
 | 
			
		||||
destroy(sqlda)
 | 
			
		||||
destroy(sqlsa)
 | 
			
		||||
destroy(error)
 | 
			
		||||
destroy(message)
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
event open;// Inicializa propiedades del objeto aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
This.MicroHelpDefault = "SAVIA"		
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------
 | 
			
		||||
// Satxa - 17-Jun-2010.42351 No se usa.
 | 
			
		||||
// Crea el servicio de ayuda nivel2:
 | 
			
		||||
//IF NOT IsValid(gn_help2) THEN
 | 
			
		||||
//   gn_help2 = CREATE n_help2
 | 
			
		||||
//END IF
 | 
			
		||||
//----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Presenta la aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
OpenWithParm(w_ini_ginpix7,commandline)
 | 
			
		||||
//OpenWithParm(w_logontab,commandline)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// PORQU$$HEX2$$c9002000$$ENDHEX$$RETRASAMOS LA INSTANCIACI$$HEX1$$d300$$ENDHEX$$N DEL MANEJADOR DE LA APLICACI$$HEX1$$d300$$ENDHEX$$N "n_appmanager" ???
 | 
			
		||||
//
 | 
			
		||||
// El CNVUO n_appmanager conlleva consigo el proceso de apertura de la ventana w_logon de
 | 
			
		||||
// conexi$$HEX1$$f300$$ENDHEX$$n a la base de datos. Nosotros sin embargo, deseamos presentar previamente 
 | 
			
		||||
// nuestra ventana de presentaci$$HEX1$$f300$$ENDHEX$$n "w_ini".
 | 
			
		||||
//
 | 
			
		||||
// Si instanciamos n_appmanager aqu$$HEX1$$ed00$$ENDHEX$$, abre "w_ini" pero pasa de largo y no se "queda" en la
 | 
			
		||||
// ventana esperando que pulsemos <CONTINUAR> o bien <SALIR>, ll$$HEX1$$e900$$ENDHEX$$ndose directamente a la 
 | 
			
		||||
// apertura de "w_logon" y requirimientos de datos para la conexi$$HEX1$$f300$$ENDHEX$$n a la base de datos.
 | 
			
		||||
//
 | 
			
		||||
// Por eso instanciamos el CNVUO n_appmanager en el evento w_ini::cb_ini_con::clicked, para
 | 
			
		||||
// retrasar este proceso de conexi$$HEX1$$f300$$ENDHEX$$n a base de datos.
 | 
			
		||||
//
 | 
			
		||||
//gnv_app = CREATE n_appmanager
 | 
			
		||||
//gnv_app.Event pfc_Open(commandline)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
event close;//----------------------------------------------------------
 | 
			
		||||
// Satxa - 17-Jun-2010.42351 No se usa.
 | 
			
		||||
// Destruye el servicio de ayuda nivel2:
 | 
			
		||||
//IF IsValid(gn_help2) THEN
 | 
			
		||||
//   DESTROY n_help2
 | 
			
		||||
//END IF
 | 
			
		||||
//----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Destruye el manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
IF IsValid(gnv_app) THEN
 | 
			
		||||
   DESTROY gnv_app
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
IF IsValid(gnv_app) THEN
 | 
			
		||||
   gnv_app.Event pfc_Close()
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
event connectionbegin;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
RETURN gnv_app.Event pfc_ConnectionBegin(userid,password,connectstring)
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
event connectionend;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
gnv_app.Event pfc_ConnectionEnd()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
event idle;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
gnv_app.Event pfc_Idle()
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
event systemerror;// Redirige el evento al manejador de aplicaci$$HEX1$$f300$$ENDHEX$$n:
 | 
			
		||||
gnv_app.Event pfc_SystemError()
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										32
									
								
								samples/PowerBuilder/myproject.pbt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								samples/PowerBuilder/myproject.pbt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 dario ureña
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/173c3949d5684150c34f7405f0689310eade0362/resources/basics/TestPBT.pbt
 | 
			
		||||
 | 
			
		||||
Save Format v3.0(19990112)
 | 
			
		||||
@begin Projects
 | 
			
		||||
 0 "myproject\\myprojectlib.pbl";
 | 
			
		||||
@end;
 | 
			
		||||
appname "myproject";
 | 
			
		||||
applib "myproject\\myproject.pbl";
 | 
			
		||||
LibList "myproject\\myproject.pbl;myproject\\lib\\logger\\logger.pbl;myproject\\lib\\payroll\\payroll.pbl;myproject\\lib\\contract\\contract.pbl;myproject\\lib\\common\\common.pbl;";
 | 
			
		||||
type "pb";
 | 
			
		||||
							
								
								
									
										765
									
								
								samples/PowerBuilder/n_cst_buttonlistbar_gradient.sru
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										765
									
								
								samples/PowerBuilder/n_cst_buttonlistbar_gradient.sru
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,765 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 dario ureña
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/07bf527194b73e133943221dc2199a9442d463eb/resources/inventoryModel/nivel0/nivel1/n_cst_buttonlistbar_gradient.sru
 | 
			
		||||
 | 
			
		||||
HA$PBExportHeader$n_cst_buttonlistbar_gradient.sru
 | 
			
		||||
forward
 | 
			
		||||
global type n_cst_buttonlistbar_gradient from nonvisualobject
 | 
			
		||||
end type
 | 
			
		||||
type gradient_rect from structure within n_cst_buttonlistbar_gradient
 | 
			
		||||
end type
 | 
			
		||||
type gradient_triangle from structure within n_cst_buttonlistbar_gradient
 | 
			
		||||
end type
 | 
			
		||||
type rect from structure within n_cst_buttonlistbar_gradient
 | 
			
		||||
end type
 | 
			
		||||
type trivertex from structure within n_cst_buttonlistbar_gradient
 | 
			
		||||
end type
 | 
			
		||||
type logfont from structure within n_cst_buttonlistbar_gradient
 | 
			
		||||
end type
 | 
			
		||||
end forward
 | 
			
		||||
 | 
			
		||||
type gradient_rect from structure
 | 
			
		||||
	unsignedlong		upperleft
 | 
			
		||||
	unsignedlong		lowerright
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type gradient_triangle from structure
 | 
			
		||||
	unsignedlong		vertex1
 | 
			
		||||
	unsignedlong		vertex2
 | 
			
		||||
	unsignedlong		vertex3
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type rect from structure
 | 
			
		||||
	long		left
 | 
			
		||||
	long		top
 | 
			
		||||
	long		right
 | 
			
		||||
	long		bottom
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type trivertex from structure
 | 
			
		||||
	long		x
 | 
			
		||||
	long		y
 | 
			
		||||
	integer		red
 | 
			
		||||
	integer		green
 | 
			
		||||
	integer		blue
 | 
			
		||||
	integer		alpha
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type logfont from structure
 | 
			
		||||
	long		lfheight
 | 
			
		||||
	long		lfwidth
 | 
			
		||||
	long		lfescapement
 | 
			
		||||
	long		lforientation
 | 
			
		||||
	long		lfweight
 | 
			
		||||
	character		lfitalic
 | 
			
		||||
	character		lfunderline
 | 
			
		||||
	character		lfstrikeout
 | 
			
		||||
	character		lfcharset
 | 
			
		||||
	character		lfoutprecision
 | 
			
		||||
	character		lfclipprecision
 | 
			
		||||
	character		lfquality
 | 
			
		||||
	character		lfpitchandfamily
 | 
			
		||||
	character		lffacename[32]
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
global type n_cst_buttonlistbar_gradient from nonvisualobject autoinstantiate
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type prototypes
 | 
			
		||||
FUNCTION ulong SetBkMode(ulong lhdc,ulong nBkMode) LIBRARY "gdi32.dll"
 | 
			
		||||
Function Long GetDC (Long hwnd) Library 'user32'
 | 
			
		||||
Function Long GetClientRect (Long hwnd, REF RECT lpRect) Library 'user32' alias for "GetClientRect;Ansi"
 | 
			
		||||
Function Long ReleaseDC (Long hwnd, Long hdc1) Library 'user32'
 | 
			
		||||
Function Boolean GradientRectangle (Long hdc2, TRIVERTEX pVert[], ULong numVert, GRADIENT_RECT pMesh [], ULong numMesh, ULong dMode) Library 'msimg32' Alias For 'GradientFill;Ansi'
 | 
			
		||||
Function Boolean GradientTriangle (Long hdc3, TRIVERTEX pVert[], ULong numVert, GRADIENT_TRIANGLE pMesh [], ULong numMesh, ULong dMode) Library 'msimg32' Alias For 'GradientFill;Ansi'
 | 
			
		||||
 | 
			
		||||
Function ulong Rectangle (ulong hwnd, ulong X1, ulong Y1, ulong X2, ulong Y2) library "gdi32" 
 | 
			
		||||
Function ulong CreatePen  (ulong nPenStyle, ulong nWidth, ulong crColor) LIBRARY "Gdi32.dll"
 | 
			
		||||
Function ULONG	SelectObject (uLong hdc4, uLong hObject ) LIBRARY "Gdi32.dll"
 | 
			
		||||
function boolean DeleteObject(ulong hgdiobject) library "gdi32.dll" 
 | 
			
		||||
 | 
			
		||||
FUNCTION ulong DrawText(ulong lhdc,ref string lpStr,ulong nCount,ref RECT lpRect,ulong wFormat) LIBRARY "user32.dll" ALIAS FOR "DrawTextA;Ansi"
 | 
			
		||||
FUNCTION ulong SetTextColor(ulong lhdc,ulong crColor) LIBRARY "gdi32.dll"
 | 
			
		||||
FUNCTION ulong CreateFontIndirect(ref LOGFONT lpLogFont) LIBRARY "gdi32.dll" ALIAS FOR "CreateFontIndirectA;ANSI"
 | 
			
		||||
 | 
			
		||||
Function ulong RoundRect (uLong hdc5 , uLong X1, ulong Y1 , ulong X2 , ulong Y2 , ulong X3 , ulong Y3 ) LIBRARY "Gdi32.dll"
 | 
			
		||||
Function ULONG FillRgn (Long hdc6, Long hRgn , Long hBrush ) LIBRARY "Gdi32.dll"
 | 
			
		||||
Function ulong CreateRectRgn (Long X1, Long Y1 , Long X2 , Long Y2 ) LIBRARY "Gdi32.dll"
 | 
			
		||||
Function ulong CreateRoundRectRgn (long X1 , long Y1 , long X2 , long Y2 , long X3 , long Y3 ) LIBRARY "Gdi32.dll"
 | 
			
		||||
 | 
			
		||||
Function ULONG PolyBezier (Long hdc7, REF RECT lpRect, long cPoints ) LIBRARY "Gdi32.dll"
 | 
			
		||||
Function ULONG Polyline( Long hdc8, GRADIENT_RECT lppt[], int cPoints) LIBRARY "Gdi32.dll"
 | 
			
		||||
 | 
			
		||||
FUNCTION boolean Ellipse(ulong hwnd,long x1,long y1,long x2,long y2) LIBRARY "Gdi32.dll"
 | 
			
		||||
 | 
			
		||||
FUNCTION ulong CreatePolygonRgn(ref POINT ppoint[], int count, int fillMode) Library "GDI32.DLL"
 | 
			
		||||
FUNCTION long SelectClipRgn(ulong lhdc, ulong lhrgn) Library "GDI32.DLL"
 | 
			
		||||
 | 
			
		||||
FUNCTION long PtInRegion(ulong hrgn, int x, int y) LIBRARY "GDI32.dll"
 | 
			
		||||
 | 
			
		||||
Function boolean ImageList_Draw(long himl, long i, long hdcDst, long lx, long ly, ulong fStyle) Library "comctl32.dll"
 | 
			
		||||
Function boolean ImageList_DrawEx(long himl, long i, long hdcDst, long lx, long ly, long lwidth, long lheight, long lback, long lfore , ulong fStyle) Library "comctl32.dll"
 | 
			
		||||
 | 
			
		||||
end prototypes
 | 
			
		||||
 | 
			
		||||
type variables
 | 
			
		||||
// MS Windows enumerations
 | 
			
		||||
CONSTANT ULong GRADIENT_FILL_RECT_H = 0
 | 
			
		||||
CONSTANT ULong GRADIENT_FILL_RECT_V = 1
 | 
			
		||||
CONSTANT ULong GRADIENT_FILL_TRIANGLE = 2
 | 
			
		||||
CONSTANT ULong GRADIENT_FILL_OP_FLAG = 255
 | 
			
		||||
 | 
			
		||||
CONSTANT Long ILD_TRANSPARENT = 1
 | 
			
		||||
CONSTANT Long LVM_GETIMAGELIST = 4098
 | 
			
		||||
CONSTANT Long LVSIL_NORMAL = 0
 | 
			
		||||
CONSTANT Long ILD_BLEND50 = 4
 | 
			
		||||
CONSTANT Long ILD_BLEND25 = 2
 | 
			
		||||
 | 
			
		||||
// User object enumerations
 | 
			
		||||
CONSTANT String TOPLEFT = "TOPLEFT"
 | 
			
		||||
CONSTANT String TOPRIGHT = "TOPRIGHT"
 | 
			
		||||
CONSTANT String BOTTOMRIGHT = "BOTTOMRIGHT"
 | 
			
		||||
CONSTANT String BOTTOMLEFT = "BOTTOMLEFT"
 | 
			
		||||
 | 
			
		||||
BOOLEAN	ib_displayborder
 | 
			
		||||
 | 
			
		||||
CONSTANT LONG ALIGN_LEFT = 0
 | 
			
		||||
CONSTANT LONG ALIGN_CENTER = 1
 | 
			
		||||
CONSTANT LONG ALIGN_RIGHT = 2
 | 
			
		||||
 | 
			
		||||
CONSTANT LONG DT_WORD_ELLIPSIS = 262144
 | 
			
		||||
CONSTANT LONG DT_CALCRECT = 1024
 | 
			
		||||
CONSTANT LONG DT_WORDBREAK = 16
 | 
			
		||||
 | 
			
		||||
Long	il_HDC
 | 
			
		||||
 | 
			
		||||
Long il_newHeight
 | 
			
		||||
Long il_newWidth
 | 
			
		||||
 | 
			
		||||
PRIVATE:
 | 
			
		||||
// Object Handle
 | 
			
		||||
Long	HDC
 | 
			
		||||
 | 
			
		||||
Long	il_ShadowBackColor
 | 
			
		||||
 | 
			
		||||
ULong iul_font
 | 
			
		||||
ULong iul_fontbold
 | 
			
		||||
 | 
			
		||||
// Dimensions
 | 
			
		||||
RECT DC_Rect
 | 
			
		||||
 | 
			
		||||
// Vertices
 | 
			
		||||
TRIVERTEX Corner[4]
 | 
			
		||||
TRIVERTEX BorderCorner[2]
 | 
			
		||||
TRIVERTEX VistaCorner1[4]
 | 
			
		||||
TRIVERTEX VistaCorner2[4]
 | 
			
		||||
TRIVERTEX VistaCorner3[4]
 | 
			
		||||
end variables
 | 
			
		||||
 | 
			
		||||
forward prototypes
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2)
 | 
			
		||||
public subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue)
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette)
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette)
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style)
 | 
			
		||||
public subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor)
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border)
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow)
 | 
			
		||||
public function integer of_sethdc (long al_hdc)
 | 
			
		||||
public function boolean of_getbit (long al_decimal, integer ai_bit)
 | 
			
		||||
public function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline)
 | 
			
		||||
public function long of_bitwiseand (long al_value1, long al_value2)
 | 
			
		||||
public function long of_bitwiseor (long al_value1, long al_value2)
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap)
 | 
			
		||||
public function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height)
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2)
 | 
			
		||||
public subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue)
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette)
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette)
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style)
 | 
			
		||||
public subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor)
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border)
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow)
 | 
			
		||||
public function integer of_sethdc (long al_hdc)
 | 
			
		||||
public function boolean of_getbit (long al_decimal, integer ai_bit)
 | 
			
		||||
public function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline)
 | 
			
		||||
public function long of_bitwiseand (long al_value1, long al_value2)
 | 
			
		||||
public function long of_bitwiseor (long al_value1, long al_value2)
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap)
 | 
			
		||||
public function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height)
 | 
			
		||||
end prototypes
 | 
			
		||||
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2);Long	ll_Red, &
 | 
			
		||||
		ll_Green, &
 | 
			
		||||
		ll_Blue, &
 | 
			
		||||
		ll_DC
 | 
			
		||||
GRADIENT_RECT l_Gradient[1]
 | 
			
		||||
 | 
			
		||||
LONG hRPen
 | 
			
		||||
 | 
			
		||||
// Set the colors in the first corner (top left)
 | 
			
		||||
of_SplitRGB (al_Color1, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
Corner[1].Red = ll_Red
 | 
			
		||||
Corner[1].Green = ll_Green
 | 
			
		||||
Corner[1].Blue = ll_Blue
 | 
			
		||||
 | 
			
		||||
// Set the colors in the third corner (bottom right)
 | 
			
		||||
of_SplitRGB (al_Color2, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
Corner[3].Red = ll_Red
 | 
			
		||||
Corner[3].Green = ll_Green
 | 
			
		||||
Corner[3].Blue = ll_Blue
 | 
			
		||||
 | 
			
		||||
l_Gradient[1].UpperLeft = 0 // First corner, top left
 | 
			
		||||
l_Gradient[1].LowerRight = 2 // Third corner, bottom right
 | 
			
		||||
 | 
			
		||||
ll_DC = il_HDC//GetDC (HDC)
 | 
			
		||||
 | 
			
		||||
// Create a border if ib_displayborder is true
 | 
			
		||||
IF 	ib_displayborder THEN
 | 
			
		||||
	hRPen = CreatePen(0,0,1090519039)
 | 
			
		||||
	SelectObject(ll_DC, hRPen)
 | 
			
		||||
	Rectangle(ll_DC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X +1, Corner[3].Y +1)
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
GradientRectangle (ll_DC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)
 | 
			
		||||
 | 
			
		||||
//ReleaseDC (HDC, ll_DC)
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public subroutine of_splitrgb (long al_color, ref long red, ref long green, ref long blue);Red = Mod (al_Color, 256)
 | 
			
		||||
Red *= 256
 | 
			
		||||
 | 
			
		||||
al_Color /= 256
 | 
			
		||||
Green	= Mod (al_Color, 256)
 | 
			
		||||
Green *= 256
 | 
			
		||||
 | 
			
		||||
Blue = al_Color / 256
 | 
			
		||||
Blue *= 256
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette);IF NOT IsValid (ado_Palette) THEN RETURN FALSE
 | 
			
		||||
 | 
			
		||||
// Get the object's handle
 | 
			
		||||
HDC = Handle (ado_Palette)
 | 
			
		||||
 | 
			
		||||
// Get the object's dimensions
 | 
			
		||||
GetClientRect (HDC, DC_RECT)
 | 
			
		||||
 | 
			
		||||
// let's resize the grandient rectangle if border is displayed
 | 
			
		||||
IF ib_displayborder THEN
 | 
			
		||||
	// Initialize the vertices
 | 
			
		||||
	Corner[1].X = DC_RECT.Left +1 
 | 
			
		||||
	Corner[1].Y = DC_RECT.Top +1 
 | 
			
		||||
	Corner[2].X = DC_RECT.Right -1
 | 
			
		||||
	Corner[2].Y = DC_RECT.Top +1
 | 
			
		||||
	Corner[3].X = DC_RECT.Right -1
 | 
			
		||||
	Corner[3].Y = DC_RECT.Bottom - 1
 | 
			
		||||
	Corner[4].X = DC_RECT.Left +1
 | 
			
		||||
	Corner[4].Y = DC_RECT.Bottom - 1
 | 
			
		||||
	
 | 
			
		||||
	VistaCorner1[1].X = DC_RECT.Left + 1 
 | 
			
		||||
	VistaCorner1[1].Y = DC_RECT.Top + 1
 | 
			
		||||
	VistaCorner1[2].X = DC_RECT.Right -1
 | 
			
		||||
	VistaCorner1[2].Y = DC_RECT.Top + 1
 | 
			
		||||
	VistaCorner1[3].X = DC_RECT.Right -1
 | 
			
		||||
	VistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)//20
 | 
			
		||||
	VistaCorner1[4].X = DC_RECT.Left +1
 | 
			
		||||
	VistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)//20
 | 
			
		||||
	
 | 
			
		||||
	VistaCorner3[1].X = DC_RECT.Left + 1 
 | 
			
		||||
	VistaCorner3[1].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2)//10
 | 
			
		||||
	VistaCorner3[2].X = DC_RECT.Right -1
 | 
			
		||||
	VistaCorner3[2].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2)//10
 | 
			
		||||
	VistaCorner3[3].X = DC_RECT.Right -1
 | 
			
		||||
	VistaCorner3[3].Y = DC_RECT.Bottom - 1
 | 
			
		||||
	VistaCorner3[4].X = DC_RECT.Left +1
 | 
			
		||||
	VistaCorner3[4].Y = DC_RECT.Bottom - 1
 | 
			
		||||
 | 
			
		||||
ELSE
 | 
			
		||||
	Corner[1].X = DC_RECT.Left
 | 
			
		||||
	Corner[1].Y = DC_RECT.Top 
 | 
			
		||||
	Corner[2].X = DC_RECT.Right
 | 
			
		||||
	Corner[2].Y = DC_RECT.Top
 | 
			
		||||
	Corner[3].X = DC_RECT.Right
 | 
			
		||||
	Corner[3].Y = DC_RECT.Bottom 
 | 
			
		||||
	Corner[4].X = DC_RECT.Left
 | 
			
		||||
	Corner[4].Y = DC_RECT.Bottom
 | 
			
		||||
	
 | 
			
		||||
	VistaCorner1[1].X = DC_RECT.Left 
 | 
			
		||||
	VistaCorner1[1].Y = DC_RECT.Top
 | 
			
		||||
	VistaCorner1[2].X = DC_RECT.Right
 | 
			
		||||
	VistaCorner1[2].Y = DC_RECT.Top
 | 
			
		||||
	VistaCorner1[3].X = DC_RECT.Right
 | 
			
		||||
	VistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)// - 19
 | 
			
		||||
	VistaCorner1[4].X = DC_RECT.Left
 | 
			
		||||
	VistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .65)// - 19
 | 
			
		||||
	
 | 
			
		||||
	VistaCorner3[1].X = DC_RECT.Left 
 | 
			
		||||
	VistaCorner3[1].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2) - 1// + 9//12 
 | 
			
		||||
	VistaCorner3[2].X = DC_RECT.Right
 | 
			
		||||
	VistaCorner3[2].Y = DC_RECT.Top + ((DC_RECT.Bottom * .65) / 2) - 1// + 9//12
 | 
			
		||||
	VistaCorner3[3].X = DC_RECT.Right
 | 
			
		||||
	VistaCorner3[3].Y = DC_RECT.Bottom
 | 
			
		||||
	VistaCorner3[4].X = DC_RECT.Left
 | 
			
		||||
	VistaCorner3[4].Y = DC_RECT.Bottom
 | 
			
		||||
END IF	
 | 
			
		||||
 | 
			
		||||
RETURN TRUE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette);IF NOT of_SetDeviceContext (ado_Palette) THEN RETURN
 | 
			
		||||
 | 
			
		||||
of_VerticalGradient (al_Color1, al_Color2)
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public subroutine of_verticalgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor, integer ai_style);CHOOSE CASE ai_STYLE
 | 
			
		||||
	CASE 0
 | 
			
		||||
		of_XPGradient (al_color1, al_color2, ado_palette,ab_displayborder,al_bordercolor)
 | 
			
		||||
END CHOOSE
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public subroutine of_xpgradient (long al_color1, long al_color2, graphicobject ado_palette, boolean ab_displayborder, long al_bordercolor);Long	ll_Red, &
 | 
			
		||||
		ll_Green, &
 | 
			
		||||
		ll_Blue, &
 | 
			
		||||
		ll_DC
 | 
			
		||||
GRADIENT_RECT l_Gradient[1]
 | 
			
		||||
 | 
			
		||||
LONG hRPen
 | 
			
		||||
 | 
			
		||||
ib_displayborder = ab_displayborder
 | 
			
		||||
 | 
			
		||||
IF NOT of_SetDeviceContext (ado_Palette) THEN RETURN
 | 
			
		||||
 | 
			
		||||
//of_VerticalGradient (al_Color1, al_Color2)
 | 
			
		||||
 | 
			
		||||
// Set the colors in the first corner (top left)
 | 
			
		||||
of_SplitRGB (al_Color1, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
Corner[1].Red = ll_Red
 | 
			
		||||
Corner[1].Green = ll_Green
 | 
			
		||||
Corner[1].Blue = ll_Blue
 | 
			
		||||
 | 
			
		||||
// Set the colors in the third corner (bottom right)
 | 
			
		||||
of_SplitRGB (al_Color2, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
Corner[3].Red = ll_Red
 | 
			
		||||
Corner[3].Green = ll_Green
 | 
			
		||||
Corner[3].Blue = ll_Blue
 | 
			
		||||
 | 
			
		||||
l_Gradient[1].UpperLeft = 0 // First corner, top left
 | 
			
		||||
l_Gradient[1].LowerRight = 2 // Third corner, bottom right
 | 
			
		||||
 | 
			
		||||
ll_DC = il_HDC//GetDC (HDC)
 | 
			
		||||
 | 
			
		||||
// Create a border if ib_displayborder is true
 | 
			
		||||
IF 	ab_displayborder THEN
 | 
			
		||||
	hRPen = CreatePen(0,0,al_bordercolor)
 | 
			
		||||
	SelectObject(ll_DC, hRPen)
 | 
			
		||||
	Rectangle(ll_DC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X +1, Corner[3].Y +1)
 | 
			
		||||
	DeleteObject(hRPen)
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
GradientRectangle (ll_DC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)
 | 
			
		||||
 | 
			
		||||
//ReleaseDC (HDC, ll_DC)
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public function boolean of_setdevicecontext (graphicobject ado_palette, integer ai_style, boolean ab_border);IF NOT IsValid (ado_Palette) THEN RETURN FALSE
 | 
			
		||||
 | 
			
		||||
// Get the object's handle
 | 
			
		||||
HDC = Handle (ado_Palette)
 | 
			
		||||
 | 
			
		||||
// Get the object's dimensions
 | 
			
		||||
GetClientRect (HDC, DC_RECT)
 | 
			
		||||
 | 
			
		||||
// let's resize the grandient rectangle if border is displayed
 | 
			
		||||
choose case ai_style
 | 
			
		||||
	case 2
 | 
			
		||||
	IF ab_border THEN
 | 
			
		||||
		// Initialize the vertices
 | 
			
		||||
		Corner[1].X = DC_RECT.Left +1 
 | 
			
		||||
		Corner[1].Y = DC_RECT.Top +1 
 | 
			
		||||
		Corner[2].X = DC_RECT.Right -1
 | 
			
		||||
		Corner[2].Y = DC_RECT.Top +1
 | 
			
		||||
		Corner[3].X = DC_RECT.Right -1
 | 
			
		||||
		Corner[3].Y = DC_RECT.Bottom - 1
 | 
			
		||||
		Corner[4].X = DC_RECT.Left +1
 | 
			
		||||
		Corner[4].Y = DC_RECT.Bottom - 1
 | 
			
		||||
	
 | 
			
		||||
		VistaCorner1[1].X = DC_RECT.Left + 2 
 | 
			
		||||
		VistaCorner1[1].Y = DC_RECT.Top + 2
 | 
			
		||||
		VistaCorner1[2].X = DC_RECT.Right - 1
 | 
			
		||||
		VistaCorner1[2].Y = DC_RECT.Top + 2
 | 
			
		||||
		VistaCorner1[3].X = DC_RECT.Right -2
 | 
			
		||||
		VistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14
 | 
			
		||||
		VistaCorner1[4].X = DC_RECT.Left +1
 | 
			
		||||
		VistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14
 | 
			
		||||
	
 | 
			
		||||
		VistaCorner3[1].X = DC_RECT.Left + 2
 | 
			
		||||
		VistaCorner3[1].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16
 | 
			
		||||
		VistaCorner3[2].X = DC_RECT.Right //-1
 | 
			
		||||
		VistaCorner3[2].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16 
 | 
			
		||||
		VistaCorner3[3].X = DC_RECT.Right - 2
 | 
			
		||||
		VistaCorner3[3].Y = DC_RECT.Bottom - 2
 | 
			
		||||
		VistaCorner3[4].X = DC_RECT.Left 
 | 
			
		||||
		VistaCorner3[4].Y = DC_RECT.Bottom - 2
 | 
			
		||||
	ELSE
 | 
			
		||||
		Corner[1].X = DC_RECT.Left +1 
 | 
			
		||||
		Corner[1].Y = DC_RECT.Top +1 
 | 
			
		||||
		Corner[2].X = DC_RECT.Right -1
 | 
			
		||||
		Corner[2].Y = DC_RECT.Top +1
 | 
			
		||||
		Corner[3].X = DC_RECT.Right -1
 | 
			
		||||
		Corner[3].Y = DC_RECT.Bottom - 1
 | 
			
		||||
		Corner[4].X = DC_RECT.Left +1
 | 
			
		||||
		Corner[4].Y = DC_RECT.Bottom - 1
 | 
			
		||||
	
 | 
			
		||||
		VistaCorner1[1].X = DC_RECT.Left
 | 
			
		||||
		VistaCorner1[1].Y = DC_RECT.Top 
 | 
			
		||||
		VistaCorner1[2].X = DC_RECT.Right
 | 
			
		||||
		VistaCorner1[2].Y = DC_RECT.Top 
 | 
			
		||||
		VistaCorner1[3].X = DC_RECT.Right
 | 
			
		||||
		VistaCorner1[3].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14
 | 
			
		||||
		VistaCorner1[4].X = DC_RECT.Left
 | 
			
		||||
		VistaCorner1[4].Y = DC_RECT.Bottom - (DC_RECT.Bottom * .48)//14
 | 
			
		||||
	
 | 
			
		||||
		VistaCorner3[1].X = DC_RECT.Left
 | 
			
		||||
		VistaCorner3[1].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16
 | 
			
		||||
		VistaCorner3[2].X = DC_RECT.Right 
 | 
			
		||||
		VistaCorner3[2].Y = DC_RECT.Top + (DC_RECT.Bottom * .53)//16 
 | 
			
		||||
		VistaCorner3[3].X = DC_RECT.Right
 | 
			
		||||
		VistaCorner3[3].Y = DC_RECT.Bottom
 | 
			
		||||
		VistaCorner3[4].X = DC_RECT.Left 
 | 
			
		||||
		VistaCorner3[4].Y = DC_RECT.Bottom
 | 
			
		||||
	END IF
 | 
			
		||||
end choose
 | 
			
		||||
 | 
			
		||||
RETURN TRUE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow);RETURN of_DrawText (ado_palette, as_text, al_color, as_font, al_size, ab_bold, al_align, al_x, al_y, al_width, al_height, ab_displayshadow, FALSE, FALSE, FALSE)
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function integer of_sethdc (long al_hdc);il_HDC = al_hdc
 | 
			
		||||
 | 
			
		||||
RETURN 1
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function boolean of_getbit (long al_decimal, integer ai_bit);Boolean lb_null
 | 
			
		||||
 | 
			
		||||
//Check parameters
 | 
			
		||||
If IsNull(al_decimal) or IsNull(ai_bit) then
 | 
			
		||||
	SetNull(lb_null)
 | 
			
		||||
	Return lb_null
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
//Assumption ai_bit is the nth bit counting right to left with
 | 
			
		||||
//the leftmost bit being bit one.
 | 
			
		||||
//al_decimal is a binary number as a base 10 long.
 | 
			
		||||
If Int(Mod(al_decimal / (2 ^(ai_bit - 1)), 2)) > 0 Then
 | 
			
		||||
	Return True
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
Return False
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function unsignedlong of_createfont (string as_name, long al_size, boolean ab_underline);LogFont lstr_Lf
 | 
			
		||||
uLong lul_Font
 | 
			
		||||
 | 
			
		||||
lstr_Lf.lffacename = as_name
 | 
			
		||||
lstr_Lf.lfweight = 400
 | 
			
		||||
lstr_Lf.lfheight = al_size * -1
 | 
			
		||||
lstr_Lf.lfPitchAndFamily = '1'
 | 
			
		||||
lstr_Lf.lfClipPrecision = Char(2)
 | 
			
		||||
lstr_Lf.lfOutPrecision = Char(1)
 | 
			
		||||
lstr_Lf.lfQuality = Char(1)
 | 
			
		||||
lstr_Lf.lfCharset = Char(1)
 | 
			
		||||
 | 
			
		||||
IF ab_underline THEN
 | 
			
		||||
	lstr_Lf.lfunderline = Char(1)
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
iul_font = CreateFontIndirect( lstr_Lf )
 | 
			
		||||
lstr_Lf.lfweight = 700
 | 
			
		||||
iul_fontbold = CreateFontIndirect( lstr_Lf )
 | 
			
		||||
 | 
			
		||||
RETURN 1
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function long of_bitwiseand (long al_value1, long al_value2);Integer		li_Cnt
 | 
			
		||||
Long			ll_Result
 | 
			
		||||
Boolean		lb_Value1[32], lb_Value2[32]
 | 
			
		||||
 | 
			
		||||
// Check for nulls
 | 
			
		||||
If IsNull(al_Value1) Or IsNull(al_Value2) Then
 | 
			
		||||
	SetNull(ll_Result)
 | 
			
		||||
	Return ll_Result
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
// Get all bits for both values
 | 
			
		||||
For li_Cnt = 1 To 32
 | 
			
		||||
	lb_Value1[li_Cnt] = of_getbit(al_Value1, li_Cnt)
 | 
			
		||||
	lb_Value2[li_Cnt] = of_getbit(al_Value2, li_Cnt)
 | 
			
		||||
Next
 | 
			
		||||
 | 
			
		||||
// And them together
 | 
			
		||||
For li_Cnt = 1 To 32
 | 
			
		||||
	If lb_Value1[li_Cnt] And lb_Value2[li_Cnt] Then
 | 
			
		||||
		ll_Result = ll_Result + (2^(li_Cnt - 1))
 | 
			
		||||
	End If
 | 
			
		||||
Next
 | 
			
		||||
 | 
			
		||||
Return ll_Result
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function long of_bitwiseor (long al_value1, long al_value2);Integer		li_Cnt
 | 
			
		||||
Long			ll_Result
 | 
			
		||||
Boolean		lb_Value1[32], lb_Value2[32]
 | 
			
		||||
 | 
			
		||||
// Check for nulls
 | 
			
		||||
If IsNull(al_Value1) Or IsNull(al_Value2) Then
 | 
			
		||||
	SetNull(ll_Result)
 | 
			
		||||
	Return ll_Result
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
// Get all bits for both values
 | 
			
		||||
For li_Cnt = 1 To 32
 | 
			
		||||
	lb_Value1[li_Cnt] = of_getbit(al_Value1, li_Cnt)
 | 
			
		||||
	lb_Value2[li_Cnt] = of_getbit(al_Value2, li_Cnt)
 | 
			
		||||
Next
 | 
			
		||||
 | 
			
		||||
// Or them together
 | 
			
		||||
For li_Cnt = 1 To 32
 | 
			
		||||
	If lb_Value1[li_Cnt] Or lb_Value2[li_Cnt] Then
 | 
			
		||||
		ll_Result = ll_Result + (2^(li_Cnt - 1))
 | 
			
		||||
	End If
 | 
			
		||||
Next
 | 
			
		||||
 | 
			
		||||
Return ll_Result
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function integer of_drawtext (graphicobject ado_palette, string as_text, long al_color, string as_font, long al_size, boolean ab_bold, long al_align, long al_x, long al_y, long al_width, long al_height, boolean ab_displayshadow, boolean ab_elipse, boolean ab_underline, boolean ab_wordwrap);Long	ll_Red, &
 | 
			
		||||
		ll_Green, &
 | 
			
		||||
		ll_Blue, &
 | 
			
		||||
		ll_DC, ll_parm, ll_sizeparm
 | 
			
		||||
GRADIENT_RECT l_Gradient[1]
 | 
			
		||||
RECT l_Rect, l_Rectback
 | 
			
		||||
 | 
			
		||||
LONG hRPen
 | 
			
		||||
 | 
			
		||||
IF Len(Trim(as_text)) = 0 THEN
 | 
			
		||||
	il_newWidth = 1
 | 
			
		||||
	il_NewHeight = al_height
 | 
			
		||||
	RETURN 0
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
IF NOT of_SetDeviceContext (ado_Palette) THEN RETURN 0
 | 
			
		||||
 | 
			
		||||
ll_DC = il_HDC//GetDC (HDC)
 | 
			
		||||
 | 
			
		||||
of_CreateFont(as_font, al_size, ab_underline)
 | 
			
		||||
 | 
			
		||||
IF ab_bold THEN
 | 
			
		||||
	SelectObject(ll_DC, iul_fontbold)
 | 
			
		||||
ELSE
 | 
			
		||||
	SelectObject(ll_DC, iul_font)
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
IF ab_elipse THEN
 | 
			
		||||
	ll_sizeparm = of_BitWiseOr(al_align, DT_WORD_ELLIPSIS)
 | 
			
		||||
ELSE
 | 
			
		||||
	IF ab_wordwrap THEN
 | 
			
		||||
		ll_sizeparm = of_BitWiseOr(al_align, DT_WORDBREAK)
 | 
			
		||||
	END IF
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
IF ab_wordwrap THEN
 | 
			
		||||
	ll_parm = of_BitWiseOr(DT_CALCRECT, DT_WORDBREAK)
 | 
			
		||||
ELSE
 | 
			
		||||
	ll_parm = DT_CALCRECT
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
SetBkMode(ll_DC, 1)
 | 
			
		||||
 | 
			
		||||
/*-------------------------------------------------------------------
 | 
			
		||||
	Normal text
 | 
			
		||||
-------------------------------------------------------------------*/
 | 
			
		||||
// Position
 | 
			
		||||
l_Rect.Left = al_x
 | 
			
		||||
l_Rect.Top = al_y
 | 
			
		||||
l_Rect.Right = al_width
 | 
			
		||||
l_Rect.Bottom = al_height
 | 
			
		||||
 | 
			
		||||
//SetBkMode(ll_DC, 1)
 | 
			
		||||
SetTextColor(ll_DC, al_color)
 | 
			
		||||
 | 
			
		||||
IF NOT ab_elipse THEN
 | 
			
		||||
	Drawtext(ll_DC, as_text, LEN(as_text), l_Rect, ll_parm)
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
IF al_align = ALIGN_RIGHT OR &
 | 
			
		||||
   al_align = ALIGN_CENTER THEN
 | 
			
		||||
	l_Rect.Right = al_width
 | 
			
		||||
END IF
 | 
			
		||||
 | 
			
		||||
Drawtext(ll_DC, as_text, LEN(as_text), l_Rect, ll_sizeparm)
 | 
			
		||||
 | 
			
		||||
il_NewHeight = l_Rect.Bottom
 | 
			
		||||
il_newWidth = l_Rect.RIGHT
 | 
			
		||||
 | 
			
		||||
DeleteObject(iul_font)
 | 
			
		||||
DeleteObject(iul_fontbold)
 | 
			
		||||
 | 
			
		||||
//ReleaseDC (HDC, ll_DC)
 | 
			
		||||
 | 
			
		||||
RETURN 1
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function integer of_drawbuttons (dragobject ado_palette, buttons ast_buttons[], long al_bordercolor, long al_imagelist, boolean ab_boldselected, long il_imagesize, long al_height);point lp[], lp_line[]
 | 
			
		||||
point lp_empty[]
 | 
			
		||||
gradient_rect l_Gradient[1]
 | 
			
		||||
GRADIENT_RECT l_Line[]
 | 
			
		||||
rect rc
 | 
			
		||||
Long	ll_Red, &
 | 
			
		||||
		ll_Green, &
 | 
			
		||||
		ll_Blue
 | 
			
		||||
long hRgn, hRPen, ll_index, ll_count, ll_textcolor, ll_parm
 | 
			
		||||
Long ll_inner, ll_innercount
 | 
			
		||||
Long ll_textx, ll_texty, ll_textwidth, ll_y
 | 
			
		||||
Boolean lb_bold
 | 
			
		||||
 | 
			
		||||
ll_count = UpperBound(ast_buttons)
 | 
			
		||||
 | 
			
		||||
FOR ll_index = 1 TO ll_count
 | 
			
		||||
	lp = lp_empty
 | 
			
		||||
	
 | 
			
		||||
	lp = ast_buttons[ll_index].ast_point
 | 
			
		||||
	
 | 
			
		||||
	IF lp[4].py < 0 OR lp[1].py > al_height THEN
 | 
			
		||||
		CONTINUE
 | 
			
		||||
	END IF
 | 
			
		||||
	
 | 
			
		||||
	l_Gradient[1].UpperLeft = 0
 | 
			
		||||
	l_Gradient[1].LowerRight = 2
 | 
			
		||||
	
 | 
			
		||||
	IF ast_buttons[ll_index].ab_selected OR &
 | 
			
		||||
	   ast_buttons[ll_index].ab_mouseover THEN
 | 
			
		||||
		Corner[1].X = lp[1].px 
 | 
			
		||||
		Corner[1].Y = lp[1].py
 | 
			
		||||
		Corner[2].X = lp[2].px 
 | 
			
		||||
		Corner[2].Y = lp[2].py
 | 
			
		||||
		Corner[3].X = lp[3].px 
 | 
			
		||||
		Corner[3].Y = lp[3].py
 | 
			
		||||
		Corner[4].X = lp[4].px 
 | 
			
		||||
		Corner[4].Y = lp[4].py
 | 
			
		||||
		
 | 
			
		||||
		// Set the colors in the first corner (top left)
 | 
			
		||||
		of_SplitRGB (ast_buttons[ll_index].al_backcolor1, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
		Corner[1].Red = ll_Red
 | 
			
		||||
		Corner[1].Green = ll_Green
 | 
			
		||||
		Corner[1].Blue = ll_Blue
 | 
			
		||||
		
 | 
			
		||||
		// Set the colors in the third corner (bottom right)
 | 
			
		||||
		of_SplitRGB (ast_buttons[ll_index].al_backcolor2, ll_Red, ll_Green, ll_Blue)
 | 
			
		||||
		Corner[3].Red = ll_Red
 | 
			
		||||
		Corner[3].Green = ll_Green
 | 
			
		||||
		Corner[3].Blue = ll_Blue
 | 
			
		||||
		
 | 
			
		||||
		//Create Polygon
 | 
			
		||||
		hRPen = CreatePen(0,0,al_bordercolor)
 | 
			
		||||
		SelectObject(il_HDC, hRPen)
 | 
			
		||||
		hRgn = CreateRoundRectRgn( Corner[1].X, Corner[1].Y, Corner[3].X, Corner[3].Y,7,7)
 | 
			
		||||
		RoundRect( il_HDC, Corner[1].X - 1, Corner[1].Y - 1, Corner[3].X, Corner[3].Y,10,10)
 | 
			
		||||
		
 | 
			
		||||
		SelectClipRgn(il_HDC, hRgn)
 | 
			
		||||
		
 | 
			
		||||
		//Gradient Fill
 | 
			
		||||
		GradientRectangle (il_HDC, Corner, 4, l_Gradient, 1, GRADIENT_FILL_RECT_V)
 | 
			
		||||
		
 | 
			
		||||
		SelectClipRgn(il_HDC, 0)
 | 
			
		||||
		
 | 
			
		||||
		DeleteObject(hRPen)
 | 
			
		||||
		DeleteObject(hRgn)
 | 
			
		||||
	END IF
 | 
			
		||||
	
 | 
			
		||||
	IF ast_buttons[ll_index].ab_enabled THEN
 | 
			
		||||
		ll_textcolor = 0
 | 
			
		||||
	ELSE
 | 
			
		||||
		ll_textcolor = RGB(100,100,100)
 | 
			
		||||
	END IF
 | 
			
		||||
	
 | 
			
		||||
	IF ab_boldselected AND ast_buttons[ll_index].ab_selected THEN
 | 
			
		||||
		lb_bold = TRUE
 | 
			
		||||
	ELSE
 | 
			
		||||
		lb_bold = FALSE
 | 
			
		||||
	END IF
 | 
			
		||||
	
 | 
			
		||||
	of_DrawText(ado_palette, &
 | 
			
		||||
	            ast_buttons[ll_index].as_text, &
 | 
			
		||||
					ll_textcolor, &
 | 
			
		||||
					'tahoma', &
 | 
			
		||||
					11, lb_bold, ALIGN_CENTER, &
 | 
			
		||||
					ast_buttons[ll_index].ast_point[1].px, &
 | 
			
		||||
					ast_buttons[ll_index].ast_point[1].py + il_imagesize + 6, &
 | 
			
		||||
					ast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px + 10, &
 | 
			
		||||
					ast_buttons[ll_index].al_textheight, &
 | 
			
		||||
					FALSE, FALSE, FALSE, TRUE)
 | 
			
		||||
	
 | 
			
		||||
	//----------------------------------------
 | 
			
		||||
	
 | 
			
		||||
	IF ast_buttons[ll_index].ab_enabled THEN
 | 
			
		||||
		ImageList_DrawEx(al_imagelist, &
 | 
			
		||||
		                 ast_buttons[ll_index].al_image - 1, &
 | 
			
		||||
							  il_HDC, &
 | 
			
		||||
							  ast_buttons[ll_index].ast_point[1].px + (ast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px) / 2 - (il_imagesize / 2) , &
 | 
			
		||||
							  ast_buttons[ll_index].ast_point[1].py + 4, &
 | 
			
		||||
							  il_imagesize,il_imagesize, &
 | 
			
		||||
							  0, 0, ILD_TRANSPARENT )
 | 
			
		||||
	ELSE
 | 
			
		||||
		ll_parm = of_BitWiseOR(ILD_TRANSPARENT, ILD_BLEND50)
 | 
			
		||||
		ImageList_DrawEx(al_imagelist, &
 | 
			
		||||
		                 ast_buttons[ll_index].al_image - 1, &
 | 
			
		||||
							  il_HDC, &
 | 
			
		||||
							  ast_buttons[ll_index].ast_point[1].px + (ast_buttons[ll_index].ast_point[2].px - ast_buttons[ll_index].ast_point[1].px) / 2 - (il_imagesize / 2) , &
 | 
			
		||||
							  ast_buttons[ll_index].ast_point[1].py + 4, &
 | 
			
		||||
							  il_imagesize,il_imagesize, &
 | 
			
		||||
							  4294967295, RGB(128,128,128), ll_parm )
 | 
			
		||||
	END IF
 | 
			
		||||
	
 | 
			
		||||
NEXT
 | 
			
		||||
 | 
			
		||||
RETURN 1
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
on n_cst_buttonlistbar_gradient.create
 | 
			
		||||
call super::create
 | 
			
		||||
TriggerEvent( this, "constructor" )
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
on n_cst_buttonlistbar_gradient.destroy
 | 
			
		||||
TriggerEvent( this, "destructor" )
 | 
			
		||||
call super::destroy
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										46
									
								
								samples/PowerBuilder/part1.srw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/PowerBuilder/part1.srw
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 dario ureña
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source - https://github.com/darioaxel/PowerScriptToKDMTransformer/blob/62083e4cd4f9ead9975427ee9f558d6adef67bbe/resources/advanced/w_mant_seg/part1.srw
 | 
			
		||||
 | 
			
		||||
forward
 | 
			
		||||
global type w_mant_seg_scs from w_mant
 | 
			
		||||
end type
 | 
			
		||||
type sle_anio from singlelineedit within w_mant_seg_scs
 | 
			
		||||
end type
 | 
			
		||||
type st_1 from statictext within w_mant_seg_scs
 | 
			
		||||
end type
 | 
			
		||||
end forward
 | 
			
		||||
 | 
			
		||||
global type w_mant_seg_scs from w_mant
 | 
			
		||||
integer height = 952
 | 
			
		||||
sle_anio sle_anio
 | 
			
		||||
st_1 st_1
 | 
			
		||||
end type
 | 
			
		||||
global w_mant_seg_scs w_mant_seg_scs
 | 
			
		||||
 | 
			
		||||
type variables
 | 
			
		||||
//------------------------------------------------------------------------------------------
 | 
			
		||||
// Satxa - 26-Ene-2005.19417 
 | 
			
		||||
String	is_anio
 | 
			
		||||
//------------------------------------------------------------------------------------------
 | 
			
		||||
end variables
 | 
			
		||||
							
								
								
									
										399
									
								
								samples/PowerBuilder/w_export.srw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										399
									
								
								samples/PowerBuilder/w_export.srw
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,399 @@
 | 
			
		||||
// The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2016 Sébastien Kirche
 | 
			
		||||
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
// copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
// SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// Source: https://github.com/sebkirche/libexport/blob/c2459a5399ff87f29344b3b0472b041ebb6f9246/sources/115/w_export.srw
 | 
			
		||||
 | 
			
		||||
HA$PBExportHeader$w_export.srw
 | 
			
		||||
forward
 | 
			
		||||
global type w_export from window
 | 
			
		||||
end type
 | 
			
		||||
type st_2 from statictext within w_export
 | 
			
		||||
end type
 | 
			
		||||
type sle_destdir from singlelineedit within w_export
 | 
			
		||||
end type
 | 
			
		||||
type cb_browse_dest from commandbutton within w_export
 | 
			
		||||
end type
 | 
			
		||||
type cb_export_some from commandbutton within w_export
 | 
			
		||||
end type
 | 
			
		||||
type cb_export_all from commandbutton within w_export
 | 
			
		||||
end type
 | 
			
		||||
type dw_objects from datawindow within w_export
 | 
			
		||||
end type
 | 
			
		||||
type cb_browse from commandbutton within w_export
 | 
			
		||||
end type
 | 
			
		||||
type sle_pbl from singlelineedit within w_export
 | 
			
		||||
end type
 | 
			
		||||
type st_1 from statictext within w_export
 | 
			
		||||
end type
 | 
			
		||||
end forward
 | 
			
		||||
 | 
			
		||||
global type w_export from window
 | 
			
		||||
integer width = 3209
 | 
			
		||||
integer height = 1600
 | 
			
		||||
boolean titlebar = true
 | 
			
		||||
string title = "Export"
 | 
			
		||||
boolean controlmenu = true
 | 
			
		||||
boolean minbox = true
 | 
			
		||||
boolean maxbox = true
 | 
			
		||||
boolean resizable = true
 | 
			
		||||
long backcolor = 67108864
 | 
			
		||||
string icon = "AppIcon!"
 | 
			
		||||
boolean center = true
 | 
			
		||||
st_2 st_2
 | 
			
		||||
sle_destdir sle_destdir
 | 
			
		||||
cb_browse_dest cb_browse_dest
 | 
			
		||||
cb_export_some cb_export_some
 | 
			
		||||
cb_export_all cb_export_all
 | 
			
		||||
dw_objects dw_objects
 | 
			
		||||
cb_browse cb_browse
 | 
			
		||||
sle_pbl sle_pbl
 | 
			
		||||
st_1 st_1
 | 
			
		||||
end type
 | 
			
		||||
global w_export w_export
 | 
			
		||||
 | 
			
		||||
forward prototypes
 | 
			
		||||
public subroutine get_objects (string as_pbl)
 | 
			
		||||
public function boolean export_object (string as_lib, string as_object, string as_type, string as_comment)
 | 
			
		||||
public function string get_object_suffix (string as_type)
 | 
			
		||||
public function libexporttype get_object_libtype (string as_type)
 | 
			
		||||
public subroutine export_object_at_row (long al_row, string as_lib)
 | 
			
		||||
end prototypes
 | 
			
		||||
 | 
			
		||||
public subroutine get_objects (string as_pbl);
 | 
			
		||||
if not fileexists(as_pbl) then return
 | 
			
		||||
 | 
			
		||||
int i, p = 1
 | 
			
		||||
string ls_entries, ls_entry
 | 
			
		||||
ls_entries = LibraryDirectoryEx(as_pbl, DirAll!)
 | 
			
		||||
debug_message('get_objects()', ls_entries)
 | 
			
		||||
 | 
			
		||||
dw_objects.reset()
 | 
			
		||||
dw_objects.importstring(ls_entries)
 | 
			
		||||
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
public function boolean export_object (string as_lib, string as_object, string as_type, string as_comment);
 | 
			
		||||
LibExportType l_ot
 | 
			
		||||
string ls_syntax, ls_filename, ls_dir
 | 
			
		||||
int li_file
 | 
			
		||||
 | 
			
		||||
ls_dir = sle_destdir.text
 | 
			
		||||
l_ot = get_object_libtype(as_type)
 | 
			
		||||
ls_syntax = libraryexport(as_lib, as_object, l_ot)
 | 
			
		||||
 | 
			
		||||
ls_filename = as_object + '.' + get_object_suffix(as_type)
 | 
			
		||||
li_file = FileOpen(ls_dir + '\' + ls_filename, streammode!, write!, LockReadWrite!, Replace!, EncodingUTF16LE!)
 | 
			
		||||
if li_file = -1 then return false
 | 
			
		||||
 | 
			
		||||
FileWrite(li_file, "$PBExportHeader$" + ls_filename + "~r~n")
 | 
			
		||||
if as_comment <> "" then
 | 
			
		||||
	FileWrite(li_file, "$PBExportComments$" + as_comment + "~r~n")
 | 
			
		||||
end if
 | 
			
		||||
FileWrite(li_file, ls_syntax)
 | 
			
		||||
FileClose(li_file)
 | 
			
		||||
 | 
			
		||||
return true
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function string get_object_suffix (string as_type);
 | 
			
		||||
string ls_suf = ""
 | 
			
		||||
 | 
			
		||||
choose case as_type
 | 
			
		||||
	case 'Application'; ls_suf = 'sra'
 | 
			
		||||
	case 'DataWindow';  ls_suf = 'srd'
 | 
			
		||||
	case 'Function';    ls_suf = 'srf'
 | 
			
		||||
	case 'Menu';        ls_suf = 'srm'
 | 
			
		||||
	case 'Pipeline';    ls_suf = 'srp'
 | 
			
		||||
	case 'Project';     ls_suf = 'srj'
 | 
			
		||||
	case 'Query';       ls_suf = 'srq'
 | 
			
		||||
	case 'Structure';   ls_suf = 'srs'
 | 
			
		||||
	case 'UserObject';  ls_suf = 'sru'
 | 
			
		||||
	case 'Window';      ls_suf = 'srw'
 | 
			
		||||
end choose
 | 
			
		||||
 | 
			
		||||
return ls_suf
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public function libexporttype get_object_libtype (string as_type);
 | 
			
		||||
libexporttype l_ot
 | 
			
		||||
 | 
			
		||||
choose case as_type
 | 
			
		||||
	case 'Application'; l_ot = ExportApplication!
 | 
			
		||||
	case 'DataWindow';  l_ot = ExportDataWindow!
 | 
			
		||||
	case 'Function';    l_ot = ExportFunction!
 | 
			
		||||
	case 'Menu';        l_ot = ExportMenu!
 | 
			
		||||
	case 'Pipeline';    l_ot = ExportPipeline!
 | 
			
		||||
	case 'Project';     l_ot = ExportProject!
 | 
			
		||||
	case 'Query';       l_ot = ExportQuery!
 | 
			
		||||
	case 'Structure';   l_ot = ExportStructure!
 | 
			
		||||
	case 'UserObject';  l_ot = ExportUserObject!
 | 
			
		||||
	case 'Window';      l_ot = ExportWindow!
 | 
			
		||||
end choose
 | 
			
		||||
 | 
			
		||||
return l_ot
 | 
			
		||||
 | 
			
		||||
end function
 | 
			
		||||
 | 
			
		||||
public subroutine export_object_at_row (long al_row, string as_lib);
 | 
			
		||||
string ls_obj, ls_type, ls_comment
 | 
			
		||||
 | 
			
		||||
ls_obj = dw_objects.getitemstring(al_row, "obj_name")
 | 
			
		||||
ls_type = dw_objects.getitemstring(al_row, "obj_type")
 | 
			
		||||
ls_comment = dw_objects.getitemstring(al_row, "comment")
 | 
			
		||||
export_object(as_lib, ls_obj, ls_type, ls_comment)
 | 
			
		||||
 | 
			
		||||
end subroutine
 | 
			
		||||
 | 
			
		||||
on w_export.create
 | 
			
		||||
this.st_2=create st_2
 | 
			
		||||
this.sle_destdir=create sle_destdir
 | 
			
		||||
this.cb_browse_dest=create cb_browse_dest
 | 
			
		||||
this.cb_export_some=create cb_export_some
 | 
			
		||||
this.cb_export_all=create cb_export_all
 | 
			
		||||
this.dw_objects=create dw_objects
 | 
			
		||||
this.cb_browse=create cb_browse
 | 
			
		||||
this.sle_pbl=create sle_pbl
 | 
			
		||||
this.st_1=create st_1
 | 
			
		||||
this.Control[]={this.st_2,&
 | 
			
		||||
this.sle_destdir,&
 | 
			
		||||
this.cb_browse_dest,&
 | 
			
		||||
this.cb_export_some,&
 | 
			
		||||
this.cb_export_all,&
 | 
			
		||||
this.dw_objects,&
 | 
			
		||||
this.cb_browse,&
 | 
			
		||||
this.sle_pbl,&
 | 
			
		||||
this.st_1}
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
on w_export.destroy
 | 
			
		||||
destroy(this.st_2)
 | 
			
		||||
destroy(this.sle_destdir)
 | 
			
		||||
destroy(this.cb_browse_dest)
 | 
			
		||||
destroy(this.cb_export_some)
 | 
			
		||||
destroy(this.cb_export_all)
 | 
			
		||||
destroy(this.dw_objects)
 | 
			
		||||
destroy(this.cb_browse)
 | 
			
		||||
destroy(this.sle_pbl)
 | 
			
		||||
destroy(this.st_1)
 | 
			
		||||
end on
 | 
			
		||||
 | 
			
		||||
type st_2 from statictext within w_export
 | 
			
		||||
integer x = 32
 | 
			
		||||
integer y = 1208
 | 
			
		||||
integer width = 251
 | 
			
		||||
integer height = 76
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
long textcolor = 33554432
 | 
			
		||||
long backcolor = 67108864
 | 
			
		||||
string text = "Export into"
 | 
			
		||||
boolean focusrectangle = false
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type sle_destdir from singlelineedit within w_export
 | 
			
		||||
integer x = 325
 | 
			
		||||
integer y = 1204
 | 
			
		||||
integer width = 2619
 | 
			
		||||
integer height = 80
 | 
			
		||||
integer taborder = 30
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
long textcolor = 33554432
 | 
			
		||||
string text = "none"
 | 
			
		||||
borderstyle borderstyle = stylelowered!
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type cb_browse_dest from commandbutton within w_export
 | 
			
		||||
integer x = 2985
 | 
			
		||||
integer y = 1204
 | 
			
		||||
integer width = 169
 | 
			
		||||
integer height = 80
 | 
			
		||||
integer taborder = 30
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
string text = "..."
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
event clicked;
 | 
			
		||||
string ls_dir
 | 
			
		||||
 | 
			
		||||
ls_dir = getfolder("Select the directory where you want to export")
 | 
			
		||||
if ls_dir <> "" then
 | 
			
		||||
	sle_destdir.text = ls_dir
 | 
			
		||||
end if
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
type cb_export_some from commandbutton within w_export
 | 
			
		||||
integer x = 398
 | 
			
		||||
integer y = 1344
 | 
			
		||||
integer width = 457
 | 
			
		||||
integer height = 100
 | 
			
		||||
integer taborder = 50
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
string text = "Export selected"
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
event clicked;
 | 
			
		||||
string ls_lib
 | 
			
		||||
int r
 | 
			
		||||
 | 
			
		||||
ls_lib = sle_pbl.text
 | 
			
		||||
if not fileexists(ls_lib) then return
 | 
			
		||||
 | 
			
		||||
r = dw_objects.getselectedrow(0)
 | 
			
		||||
do while r > 0
 | 
			
		||||
	export_object_at_row(r, ls_lib)
 | 
			
		||||
	r = dw_objects.getselectedrow(r)
 | 
			
		||||
loop
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
type cb_export_all from commandbutton within w_export
 | 
			
		||||
integer x = 37
 | 
			
		||||
integer y = 1344
 | 
			
		||||
integer width = 338
 | 
			
		||||
integer height = 100
 | 
			
		||||
integer taborder = 40
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
string text = "Export all"
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
event clicked;
 | 
			
		||||
string ls_lib
 | 
			
		||||
int i, li_max
 | 
			
		||||
 | 
			
		||||
ls_lib = sle_pbl.text
 | 
			
		||||
if not fileexists(ls_lib) then return
 | 
			
		||||
 | 
			
		||||
li_max = dw_objects.rowcount()
 | 
			
		||||
for i = 1 to li_max
 | 
			
		||||
	export_object_at_row(i, ls_lib)
 | 
			
		||||
next
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
type dw_objects from datawindow within w_export
 | 
			
		||||
integer x = 32
 | 
			
		||||
integer y = 212
 | 
			
		||||
integer width = 2912
 | 
			
		||||
integer height = 876
 | 
			
		||||
integer taborder = 30
 | 
			
		||||
string title = "none"
 | 
			
		||||
string dataobject = "dw_objects"
 | 
			
		||||
boolean hscrollbar = true
 | 
			
		||||
boolean vscrollbar = true
 | 
			
		||||
boolean livescroll = true
 | 
			
		||||
borderstyle borderstyle = stylelowered!
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
event clicked;
 | 
			
		||||
boolean lb_sel
 | 
			
		||||
 | 
			
		||||
lb_sel = dw_objects.isselected(row)
 | 
			
		||||
dw_objects.selectrow(row, not lb_sel)
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
type cb_browse from commandbutton within w_export
 | 
			
		||||
integer x = 2985
 | 
			
		||||
integer y = 64
 | 
			
		||||
integer width = 169
 | 
			
		||||
integer height = 80
 | 
			
		||||
integer taborder = 20
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
string text = "..."
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
event clicked;
 | 
			
		||||
string ls_dir, ls_file, ls_path
 | 
			
		||||
 | 
			
		||||
if 1 = getfileopenname("Choose a library to export", ls_dir, ls_file, "pbl", "Libraries (*.PBL),*.PBL") then
 | 
			
		||||
	ls_path = ls_dir
 | 
			
		||||
	sle_pbl.text = ls_path
 | 
			
		||||
	get_objects(ls_path)
 | 
			
		||||
end if
 | 
			
		||||
 | 
			
		||||
end event
 | 
			
		||||
 | 
			
		||||
type sle_pbl from singlelineedit within w_export
 | 
			
		||||
integer x = 256
 | 
			
		||||
integer y = 64
 | 
			
		||||
integer width = 2688
 | 
			
		||||
integer height = 80
 | 
			
		||||
integer taborder = 10
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
long textcolor = 33554432
 | 
			
		||||
string text = "none"
 | 
			
		||||
borderstyle borderstyle = stylelowered!
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
type st_1 from statictext within w_export
 | 
			
		||||
integer x = 32
 | 
			
		||||
integer y = 72
 | 
			
		||||
integer width = 215
 | 
			
		||||
integer height = 76
 | 
			
		||||
integer textsize = -8
 | 
			
		||||
integer weight = 400
 | 
			
		||||
fontcharset fontcharset = ansi!
 | 
			
		||||
fontpitch fontpitch = variable!
 | 
			
		||||
fontfamily fontfamily = swiss!
 | 
			
		||||
string facename = "Tahoma"
 | 
			
		||||
long textcolor = 33554432
 | 
			
		||||
long backcolor = 67108864
 | 
			
		||||
string text = "Library"
 | 
			
		||||
boolean focusrectangle = false
 | 
			
		||||
end type
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								samples/Python/spec.linux.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Python/spec.linux.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
a = Analysis(['portablizer.pyqt4.py'],
 | 
			
		||||
             hiddenimports=[],
 | 
			
		||||
             hookspath=None,
 | 
			
		||||
             runtime_hooks=None)
 | 
			
		||||
pyz = PYZ(a.pure)
 | 
			
		||||
exe = EXE(pyz,
 | 
			
		||||
          a.scripts,
 | 
			
		||||
          exclude_binaries=True,
 | 
			
		||||
          name='Portablizer',
 | 
			
		||||
          debug=False,
 | 
			
		||||
          strip=None,
 | 
			
		||||
          upx=True,
 | 
			
		||||
          console=False)
 | 
			
		||||
node = Tree('node', prefix='node')
 | 
			
		||||
collect = COLLECT(exe,
 | 
			
		||||
                  a.binaries,
 | 
			
		||||
                  a.zipfiles,
 | 
			
		||||
                  a.datas,
 | 
			
		||||
                  node,
 | 
			
		||||
                  strip=None,
 | 
			
		||||
                  upx=True,
 | 
			
		||||
                  name='Portablizer')
 | 
			
		||||
							
								
								
									
										174
									
								
								samples/REXX/BatchRemapBrushes.pprx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								samples/REXX/BatchRemapBrushes.pprx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
/* Ga igenom lador med IFF-filer rekursivt och skapa:
 | 
			
		||||
   1: Spritekartor om 320x256 med alla spritar
 | 
			
		||||
   2: En tabell med enumererade spritenummer
 | 
			
		||||
   Aterstar:
 | 
			
		||||
   *: Att skriva shapesfiler direkt
 | 
			
		||||
   $VER: 1.0
 | 
			
		||||
*/
 | 
			
		||||
SIGNAL ON BREAK_C
 | 
			
		||||
PARSE ARG argument
 | 
			
		||||
template = 'START/N COLOURS/N REMAP/S RECURSIVE/S PALETTE/K DIRECTORY/A'
 | 
			
		||||
CALL Init
 | 
			
		||||
 | 
			
		||||
ADDRESS 'PPAINT'
 | 
			
		||||
OPTIONS RESULTS
 | 
			
		||||
GetBestVideoMode WIDTH 320 HEIGHT 256 COLORS args.colours
 | 
			
		||||
modeid=Word(RESULT,1)
 | 
			
		||||
say modeid
 | 
			
		||||
Set 'FORCE "DISPLAY=' || modeid || '"'
 | 
			
		||||
IF RC~=0 THEN EXIT 20
 | 
			
		||||
Set 'FORCE "IMAGEW=320" "IMAGEH=256" "COLORS='args.colours'"'
 | 
			
		||||
ClearImage
 | 
			
		||||
LockGUI
 | 
			
		||||
ScreenToFront
 | 
			
		||||
x=0 ; y=0 ; maxhoejd=0 ; fil#=0 ; blad#=0
 | 
			
		||||
CALL WriteLn konstfil, ';Blad' blad#
 | 
			
		||||
DO UNTIL Lines()==0 & fillista==''
 | 
			
		||||
   DO WHILE fillista~=''
 | 
			
		||||
      PARSE VAR fillista filnamn 'y' fillista
 | 
			
		||||
      IF Right(filnamn,5)=='.info' THEN ITERATE
 | 
			
		||||
      IF Word(StateF(dir||filnamn),1)=='DIR' THEN DO
 | 
			
		||||
         PUSH fillista
 | 
			
		||||
         PUSH dir
 | 
			
		||||
         dir=dir||filnamn||'/'
 | 
			
		||||
         SAY 'Entering directory' dir'...'
 | 
			
		||||
         fillista=ShowDir(dir,'ALL','y')
 | 
			
		||||
         ITERATE
 | 
			
		||||
         END
 | 
			
		||||
      LoadBrush FILE dir || filnamn NOPROGRESS
 | 
			
		||||
      IF RC~==0 THEN DO
 | 
			
		||||
         SAY 'Skipping file:' dir || filnamn
 | 
			
		||||
         ITERATE
 | 
			
		||||
         END
 | 
			
		||||
      IF args.remap THEN RemapBrush NOPROGRESS
 | 
			
		||||
      GetBrushAttributes WIDTH  ; bredd=RESULT
 | 
			
		||||
      GetBrushAttributes HEIGHT ; hoejd=RESULT
 | 
			
		||||
      GetBrushAttributes COLORS ; djup=RESULT
 | 
			
		||||
      IF bredd//16==0 THEN ebwidth=bredd
 | 
			
		||||
      ELSE ebwidth=bredd+(16-(bredd//16))
 | 
			
		||||
      maxhoejd=Max(maxhoejd,hoejd)
 | 
			
		||||
      SAY 'File:' Left(filnamn,29) 'Width:' bredd ' Height:' hoejd ' Depth:' djup ' ebwidth:' ebwidth
 | 
			
		||||
      SetCurrentBrush RECTANGULAR WIDTH 1 HEIGHT 1
 | 
			
		||||
      DrawRectangle x y x+ebwidth y+hoejd
 | 
			
		||||
      Text fil# 'X' x+2 'Y' y+2
 | 
			
		||||
      SetCurrentBrush 1 ; SetBrushHandle 0 0
 | 
			
		||||
      PutBrush x y
 | 
			
		||||
      CALL WriteLn(konstfil,'; '||fil# ||': '|| filnamn ||' ('||ebwidth||'x'||hoejd||'x'||djup||')')
 | 
			
		||||
      CALL WriteLn(konstfil,'#'||Upper(Left(filnamn,Min(Length(filnamn),Max(LastPos('.',filnamn)-1,0))))||'='fil#)
 | 
			
		||||
      x=x+ebwidth
 | 
			
		||||
      IF x+ebwidth>319 THEN DO
 | 
			
		||||
         x=0
 | 
			
		||||
         y=y+maxhoejd
 | 
			
		||||
         IF y+maxhoejd>255 THEN DO
 | 
			
		||||
            SaveImage FILE 'Spritesheet' || blad# || '.ilbm' FORCE
 | 
			
		||||
            IF RC==0 THEN SAY 'Saved sheet' blad#
 | 
			
		||||
            ELSE SAY "Couldn't save spritesheet"
 | 
			
		||||
            ClearImage
 | 
			
		||||
            y=0
 | 
			
		||||
            blad#=blad#+1
 | 
			
		||||
            CALL WriteLn konstfil, ';Blad' blad#
 | 
			
		||||
            END
 | 
			
		||||
         maxhoejd=0
 | 
			
		||||
         END
 | 
			
		||||
      fil#=fil#+1
 | 
			
		||||
      END /* WHILE fillista */
 | 
			
		||||
   IF Lines()>0 THEN DO
 | 
			
		||||
      PARSE PULL dir
 | 
			
		||||
      PARSE PULL fillista
 | 
			
		||||
      SAY 'Going back to' dir'...'
 | 
			
		||||
      END
 | 
			
		||||
END /* UNTIL Lines() */
 | 
			
		||||
 | 
			
		||||
BREAK_C:
 | 
			
		||||
FreeBrush FORCE
 | 
			
		||||
UnLockGUI
 | 
			
		||||
medd=fil# 'files processed in' blad#+1 'sheets'
 | 
			
		||||
SAY medd
 | 
			
		||||
RequestNotify 'TITLE SpriteSheet.pprx PROMPT "'medd'"'
 | 
			
		||||
ScreenToBack
 | 
			
		||||
CALL Close(konstfil)
 | 
			
		||||
DO WHILE Lines()>0; PULL .; END
 | 
			
		||||
EXIT 0
 | 
			
		||||
 | 
			
		||||
Init:
 | 
			
		||||
   IF argument = '' | argument = '?' THEN DO
 | 
			
		||||
      SAY template
 | 
			
		||||
      EXIT 0
 | 
			
		||||
      END
 | 
			
		||||
 | 
			
		||||
   CALL ReadArgs()
 | 
			
		||||
 | 
			
		||||
   IF ~Show('L',"rexxsupport.library") THEN DO
 | 
			
		||||
      IF ~AddLib("rexxsupport.library",0,-30,0) THEN DO
 | 
			
		||||
         SAY 'Hittade inte rexxsupport.library'
 | 
			
		||||
         EXIT 20
 | 
			
		||||
         END
 | 
			
		||||
      END
 | 
			
		||||
   IF ~Open(konstfil,'SpriteConstants.txt','WRITE') THEN EXIT 10
 | 
			
		||||
 | 
			
		||||
   IF ~SHOW('P', 'PPAINT') THEN DO
 | 
			
		||||
      SAY "Couldn't find PPaint. Please start the program first."
 | 
			
		||||
      EXIT 5
 | 
			
		||||
      END
 | 
			
		||||
   dir=args.directory
 | 
			
		||||
   IF dir='""' THEN dir=Pragma('DIRECTORY')
 | 
			
		||||
   IF dir='' THEN dir='Ram:Megamanv6/Graphics/'
 | 
			
		||||
   IF Right(dir,1)~=='/' THEN dir=dir || '/'
 | 
			
		||||
   fillista=ShowDir(dir,'FILES','y')
 | 
			
		||||
   fillista=ShowDir(dir,'ALL','y')
 | 
			
		||||
   IF fillista="" THEN DO
 | 
			
		||||
      SAY "Found no files"
 | 
			
		||||
      EXIT 5
 | 
			
		||||
      END
 | 
			
		||||
   IF args.colours==0 THEN args.colours=16
 | 
			
		||||
   ADDRESS 'PPAINT'
 | 
			
		||||
   OPTIONS RESULTS
 | 
			
		||||
   IF args.palette~='' THEN LoadPalette args.palette
 | 
			
		||||
RETURN
 | 
			
		||||
 | 
			
		||||
ReadArgs:
 | 
			
		||||
/* ReadArgs()-like evaluation of command line arguments */
 | 
			
		||||
SAY 'ReadArgs'
 | 
			
		||||
DO key# = 1 TO Words(Template)
 | 
			
		||||
   key=Word(template,key#)
 | 
			
		||||
   PARSE VAR key key "/" keytype
 | 
			
		||||
   SELECT
 | 
			
		||||
      WHEN keytype='S'|keytype='N' THEN args.key=0
 | 
			
		||||
      WHEN keytype='K'|keytype='A' THEN args.key=''
 | 
			
		||||
      OTHERWISE NOP     /* Error in template */
 | 
			
		||||
      END
 | 
			
		||||
   END
 | 
			
		||||
 | 
			
		||||
DO WHILE argument ~= ''
 | 
			
		||||
   PARSE VAR argument arg1 argument
 | 
			
		||||
   arg2=''
 | 
			
		||||
   DO key# = 1 TO Words(template)
 | 
			
		||||
      key = Word(template,key#)
 | 
			
		||||
      PARSE VAR key key '/' keytype
 | 
			
		||||
      IF Upper(Left(arg1,Length(key))) = key THEN DO
 | 
			
		||||
         SELECT
 | 
			
		||||
            WHEN keytype='S' THEN DO
 | 
			
		||||
               args.key=1
 | 
			
		||||
               END
 | 
			
		||||
            WHEN keytype='K' | keytype='N' | keytype='A' THEN DO
 | 
			
		||||
               IF Index(arg1,'=')>0
 | 
			
		||||
                  THEN DO
 | 
			
		||||
                     SAY 'Innehaller ='
 | 
			
		||||
                     PARSE VAR arg1 '=' arg2
 | 
			
		||||
                     SAY 'arg2:' arg2
 | 
			
		||||
                     END
 | 
			
		||||
                  ELSE PARSE VAR argument arg2 argument
 | 
			
		||||
               args.key=arg2
 | 
			
		||||
               IF keytype='N' & DataType(arg2)~==NUM THEN DO
 | 
			
		||||
                  SAY 'Illegal numerical argument' key arg2
 | 
			
		||||
                  EXIT 10
 | 
			
		||||
                  END
 | 
			
		||||
               END
 | 
			
		||||
            END
 | 
			
		||||
            arg1=''
 | 
			
		||||
            LEAVE key#
 | 
			
		||||
         END
 | 
			
		||||
      END
 | 
			
		||||
      IF arg1~='' THEN args.directory=arg1
 | 
			
		||||
   END
 | 
			
		||||
RETURN
 | 
			
		||||
							
								
								
									
										135
									
								
								samples/REXX/ShapesInfo.rexx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								samples/REXX/ShapesInfo.rexx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
			
		||||
/* Display information about Blitz Basic .shapes file,
 | 
			
		||||
   optionally displaying the shape's cookiecut
 | 
			
		||||
$AUTHOR: Iggy Drougge 2016
 | 
			
		||||
$VER: 1.1
 | 
			
		||||
*/
 | 
			
		||||
PARSE ARG argument
 | 
			
		||||
template = 'FROM/N TO/N SHOW/S FILE/A'
 | 
			
		||||
IF argument = '' | argument = '?' THEN DO
 | 
			
		||||
   SAY 'ShapesInfo' template
 | 
			
		||||
   EXIT 0
 | 
			
		||||
   END
 | 
			
		||||
 | 
			
		||||
CALL ReadArgs()
 | 
			
		||||
 | 
			
		||||
IF ~Open(fh,args.file,READ) then DO
 | 
			
		||||
   SAY "Couldn't Open file:" args.file
 | 
			
		||||
   EXIT 10
 | 
			
		||||
   END
 | 
			
		||||
 | 
			
		||||
shape#=0
 | 
			
		||||
filebad=0
 | 
			
		||||
IF args.to=0 THEN args.to=9999
 | 
			
		||||
 | 
			
		||||
IF args.from>1 THEN SAY 'Seeking...'
 | 
			
		||||
DO WHILE ~EOF(fh)
 | 
			
		||||
   header=ReadCh(fh,32)
 | 
			
		||||
   IF EOF(fh) THEN DO
 | 
			
		||||
      SAY 'Reached end of file.'
 | 
			
		||||
      EXIT 0
 | 
			
		||||
      END
 | 
			
		||||
   PARSE VALUE header WITH pixwidth +2 pixheight +2 depth +2 ebwidth +2 bltsize +2 xhandle +2 yhandle +2 . +4 . +4 onebpmem +2 onebpmemx +2 allbpmem +2 allbpmemx +2 .
 | 
			
		||||
   CALL CheckHeader
 | 
			
		||||
   IF filebad THEN DO
 | 
			
		||||
      SAY 'Not a valid shapes file.'
 | 
			
		||||
      SAY C2X(header)
 | 
			
		||||
      EXIT 10
 | 
			
		||||
      END
 | 
			
		||||
   shape#=shape#+1
 | 
			
		||||
   bitplanesize = C2D(ebwidth) * C2D(pixheight)
 | 
			
		||||
   bitmapsize = bitplanesize * C2D(depth)
 | 
			
		||||
   IF shape# < args.from THEN DO
 | 
			
		||||
      CALL Seek(fh,bitmapsize,CURRENT)
 | 
			
		||||
      ITERATE
 | 
			
		||||
      END
 | 
			
		||||
   IF shape# > args.to THEN LEAVE
 | 
			
		||||
   CALL PrintHeader
 | 
			
		||||
   IF args.show THEN CALL ShowCookiecut
 | 
			
		||||
   ELSE CALL Seek(fh,bitmapsize,CURRENT)
 | 
			
		||||
   END
 | 
			
		||||
EXIT 0
 | 
			
		||||
 | 
			
		||||
CheckHeader:
 | 
			
		||||
   IF C2D(pixwidth)>C2D(ebwidth)*8 THEN filebad=1
 | 
			
		||||
   IF Left(C2B(bltsize),10)~=C2B(pixheight) THEN filebad=1
 | 
			
		||||
RETURN
 | 
			
		||||
 | 
			
		||||
PrintHeader:
 | 
			
		||||
   SAY 'Shape #' || shape# || ':'
 | 
			
		||||
   SAY '  Width:    ' C2D(pixwidth) 'pixels' '('C2D(ebwidth) 'bytes)'
 | 
			
		||||
   SAY '  Height:   ' C2D(pixheight) 'pixels'
 | 
			
		||||
   SAY '  Depth:    ' C2D(depth) 'bitplanes'
 | 
			
		||||
   SAY '  BLTSIZE:  ' '$'C2X(bltsize) '('||,
 | 
			
		||||
       C2D(B2C(Left(C2B(bltsize),10))) 'x',
 | 
			
		||||
       C2D(B2C(Right(C2B(bltsize),6)))')'
 | 
			
		||||
   SAY '  Handle:   ' C2D(xhandle)','C2D(yhandle)
 | 
			
		||||
/*
 | 
			
		||||
   SAY 'Onebpmem: ' C2D(onebpmem)
 | 
			
		||||
   SAY 'OnebpmemX:' C2D(onebpmemx)
 | 
			
		||||
   SAY 'Allbpmem: ' C2D(allbpmem)
 | 
			
		||||
   SAY 'AllbpmemX:' C2D(allbpmemx)
 | 
			
		||||
*/
 | 
			
		||||
RETURN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ShowCookiecut:
 | 
			
		||||
   depth=C2D(depth)
 | 
			
		||||
   bmap=Copies('00'x,bitplanesize)
 | 
			
		||||
   DO FOR depth
 | 
			
		||||
      bmap=BitOr(bmap,readch(fh,bitplanesize))
 | 
			
		||||
      END
 | 
			
		||||
   ln=1 ; pixheight=C2D(pixheight) ; ebwidth=C2D(ebwidth)
 | 
			
		||||
   DO FOR pixheight
 | 
			
		||||
      SAY C2B(SubStr(bmap,ln,ebwidth))
 | 
			
		||||
      ln=ln+ebwidth
 | 
			
		||||
      END
 | 
			
		||||
RETURN
 | 
			
		||||
 | 
			
		||||
EXIT 0
 | 
			
		||||
 | 
			
		||||
ReadArgs:
 | 
			
		||||
/* ReadArgs()-like evaluation of command line arguments */
 | 
			
		||||
DO key# = 1 TO Words(Template) /* Initialise the keywords */
 | 
			
		||||
   key=Word(template,key#)
 | 
			
		||||
   PARSE VAR key key "/" keytype
 | 
			
		||||
   SELECT
 | 
			
		||||
      WHEN keytype='S'|keytype='N' THEN args.key=0
 | 
			
		||||
      WHEN keytype='K'|keytype='A' THEN args.key=''
 | 
			
		||||
      OTHERWISE NOP     /* Error in template */
 | 
			
		||||
      END
 | 
			
		||||
   END
 | 
			
		||||
 | 
			
		||||
DO WHILE argument ~= ''
 | 
			
		||||
   PARSE VAR argument arg1 argument
 | 
			
		||||
   arg2=''
 | 
			
		||||
   DO key# = 1 TO Words(template)
 | 
			
		||||
      key = Word(template,key#)
 | 
			
		||||
      PARSE VAR key key '/' keytype
 | 
			
		||||
      IF Upper(Left(arg1,Length(key))) = key THEN DO
 | 
			
		||||
         SELECT
 | 
			
		||||
            WHEN keytype='S' THEN DO
 | 
			
		||||
               args.key=1
 | 
			
		||||
               END
 | 
			
		||||
            WHEN keytype='K' | keytype='N' | keytype='A' THEN DO
 | 
			
		||||
               IF Index(arg1,'=')>0
 | 
			
		||||
                  THEN DO
 | 
			
		||||
                     SAY 'Innehaller ='
 | 
			
		||||
                     PARSE VAR arg1 '=' arg2
 | 
			
		||||
                     SAY 'arg2:' arg2
 | 
			
		||||
                     END
 | 
			
		||||
                  ELSE PARSE VAR argument arg2 argument
 | 
			
		||||
               args.key=arg2
 | 
			
		||||
               IF keytype='N' & DataType(arg2)~==NUM THEN DO
 | 
			
		||||
                  SAY 'Illegal numerical argument' key arg2
 | 
			
		||||
                  EXIT 10
 | 
			
		||||
                  END
 | 
			
		||||
               END
 | 
			
		||||
            END
 | 
			
		||||
            arg1=''
 | 
			
		||||
            LEAVE key#
 | 
			
		||||
         END
 | 
			
		||||
      END
 | 
			
		||||
      IF arg1~='' THEN args.file=arg1
 | 
			
		||||
   END
 | 
			
		||||
RETURN
 | 
			
		||||
							
								
								
									
										54
									
								
								samples/REXX/SkrivShape.rexx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/REXX/SkrivShape.rexx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
/* rexx */
 | 
			
		||||
PARSE ARG filnamn
 | 
			
		||||
IF filnamn='' THEN DO
 | 
			
		||||
   filnamn='raw'
 | 
			
		||||
   filnamn='font.shapes'
 | 
			
		||||
   end
 | 
			
		||||
IF ~open(fil,filnamn,r) THEN EXIT 10
 | 
			
		||||
pixwidth=48
 | 
			
		||||
ebwidth=pixwidth/8
 | 
			
		||||
pixheight=48
 | 
			
		||||
depth=4
 | 
			
		||||
SAY "Skriver utfil..."
 | 
			
		||||
CALL open utfil,"RAM:utfil",W
 | 
			
		||||
CALL skriv pixwidth,2
 | 
			
		||||
CALL skriv pixheight,2
 | 
			
		||||
CALL skriv depth,2
 | 
			
		||||
CALL skriv ebwidth,2
 | 
			
		||||
bltsize=Right(C2B(D2C(pixheight)),10,"00")
 | 
			
		||||
bltsize=bltsize || Right(C2B(D2C(ebwidth)),6,"00")
 | 
			
		||||
/* SAY bltsize */
 | 
			
		||||
CALL skriv C2D(B2C(bltsize)),2
 | 
			
		||||
CALL skriv 0,4 /* xhandle, yhandle*/
 | 
			
		||||
CALL skriv 0,4 /* datapekare */
 | 
			
		||||
CALL skriv 0,4 /* cookiepekare */
 | 
			
		||||
CALL skriv ebwidth*pixheight,2 /* onebpmem */
 | 
			
		||||
CALL skriv ebwidth*pixheight+pixheight*2,2 /* onebpmemx */
 | 
			
		||||
CALL skriv ebwidth*pixheight*depth,2 /* allbpmem */
 | 
			
		||||
CALL skriv ebwidth*pixheight*depth+pixheight*2*depth,2 /* allbpmemx */
 | 
			
		||||
CALL skriv 0,2 /* padding */
 | 
			
		||||
CALL Close utfil
 | 
			
		||||
EXIT
 | 
			
		||||
 | 
			
		||||
skriv:
 | 
			
		||||
say "Skriver $"D2X(arg(1)) "("arg(2) "byte)"
 | 
			
		||||
call writech utfil,right(D2C(ARG(1)),ARG(2),"00"x)
 | 
			
		||||
return
 | 
			
		||||
 | 
			
		||||
visacookie:
 | 
			
		||||
   rad=copies('00'x,pixheight*ebwidth)
 | 
			
		||||
   say "Initierar bitmap till" pixheight*ebwidth*depth
 | 
			
		||||
   say "Ett bitplan =" pixheight*ebwidth
 | 
			
		||||
   bmap.=''
 | 
			
		||||
   say "laser in"
 | 
			
		||||
   do bitplan=1 to depth
 | 
			
		||||
      say "laser plan" bitplan
 | 
			
		||||
      rad=bitor(rad,readch(fil,pixheight*ebwidth))
 | 
			
		||||
      end
 | 
			
		||||
   ln=1
 | 
			
		||||
   say "skriver ut"
 | 
			
		||||
   do for pixheight
 | 
			
		||||
      say c2b(substr(rad,ln,bredd/8))
 | 
			
		||||
      ln=ln+bredd/8
 | 
			
		||||
      end
 | 
			
		||||
return
 | 
			
		||||
							
								
								
									
										106
									
								
								samples/REXX/ag2xml.rexx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								samples/REXX/ag2xml.rexx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
/* Las en Amigaguidefil och omvandla till nan slags XML */
 | 
			
		||||
/* $VER: 2 */
 | 
			
		||||
options AREXX_BIFS
 | 
			
		||||
options AREXX_SEMANTICS
 | 
			
		||||
if ~open(infil,'Blitz2_V1.3.guide',R) then exit 10
 | 
			
		||||
if ~open(utfil,'bb2.xml',W) then exit 10
 | 
			
		||||
 | 
			
		||||
call writeln utfil,'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
 | 
			
		||||
call writeln utfil,'<root>'
 | 
			
		||||
radnr=1
 | 
			
		||||
inrad=readln(infil)
 | 
			
		||||
 | 
			
		||||
do while ~eof(infil)
 | 
			
		||||
	och=1
 | 
			
		||||
	do while index(inrad,'&',och)>0
 | 
			
		||||
		och=index(inrad,'&',och)
 | 
			
		||||
		if index(inrad,';',och)=0 then do
 | 
			
		||||
			parse value inrad with prefix =(och) +1 suffix
 | 
			
		||||
			inrad=prefix'&'suffix
 | 
			
		||||
			och=index(inrad,';',och)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	do while index(inrad,'<')>0
 | 
			
		||||
		parse var inrad prefix '<' suffix
 | 
			
		||||
		inrad = prefix'<'suffix
 | 
			
		||||
	end
 | 
			
		||||
	do while index(inrad,'>')>0
 | 
			
		||||
		parse var inrad prefix '>' suffix
 | 
			
		||||
		inrad = prefix'>'suffix
 | 
			
		||||
	end
 | 
			
		||||
	inrad=behandlarad(inrad)
 | 
			
		||||
	if right(inrad,1)~='>' & strip(inrad)~='' then inrad=inrad || ' '
 | 
			
		||||
	testrad=inrad
 | 
			
		||||
	do while index(testrad,'>') > 0
 | 
			
		||||
		parse var testrad prefix '<' . '>' suffix
 | 
			
		||||
		testrad = prefix || suffix
 | 
			
		||||
	end
 | 
			
		||||
	if length(testrad)<65 then inrad = inrad || '0d'x
 | 
			
		||||
	call writech utfil,inrad
 | 
			
		||||
	inrad=readln(infil)
 | 
			
		||||
	radnr=radnr+1
 | 
			
		||||
end
 | 
			
		||||
call close(infil)
 | 
			
		||||
call writeln utfil,'</root>'
 | 
			
		||||
call close(utfil)
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
behandlarad: procedure
 | 
			
		||||
parse arg inrad
 | 
			
		||||
do forever
 | 
			
		||||
	if abbrev(inrad,'@NODE') then do
 | 
			
		||||
		parse var inrad '@NODE ' nod inrad
 | 
			
		||||
		/* say 'Hittade nod:' nod */
 | 
			
		||||
		inrad='<story id="' || nod || '">' || inrad
 | 
			
		||||
	end
 | 
			
		||||
	if inrad='@ENDNODE' then inrad='</story>' || '0d'x
 | 
			
		||||
	/* say inrad */
 | 
			
		||||
	if abbrev(inrad,'-----') then inrad='<streck>	</streck>'
 | 
			
		||||
	if abbrev(inrad,'Command'), 
 | 
			
		||||
	| abbrev(inrad,'Function'),
 | 
			
		||||
	| abbrev(inrad,'Statement') then do
 | 
			
		||||
		parse var inrad kommandotyp ':' inrad
 | 
			
		||||
		/* if index(inrad,'@{')>0 then */
 | 
			
		||||
		parse var inrad inrad '@{' rest
 | 
			
		||||
		if rest~='' then rest='@{' || rest
 | 
			
		||||
		/* say 'rest:' rest */
 | 
			
		||||
		inrad='<commandheadline>'||strip(kommandotyp)||'	</commandheadline><commandname>'||behandlarad(inrad)||'</commandname>'||behandlarad(rest)
 | 
			
		||||
	end
 | 
			
		||||
	if index(inrad,'@{')>0 then do
 | 
			
		||||
		parse var inrad inrad '@{' tagg '}' rest
 | 
			
		||||
		select
 | 
			
		||||
			when tagg='fg shine' then tagg='<fgshine>'
 | 
			
		||||
			when tagg='fg text'  then tagg='</fgshine>'
 | 
			
		||||
			when tagg='b'		 then tagg='<bold>'
 | 
			
		||||
			when tagg='ub'		 then tagg='</bold>'
 | 
			
		||||
			/* @{" SpriteMode " link BUM_SPRITEMODE} */
 | 
			
		||||
			when abbrev(tagg,'"') then do
 | 
			
		||||
				parse var tagg '"' besk '"' . 'link' dest
 | 
			
		||||
				tagg='<link dest="' || dest || '">' || besk || '</link>'
 | 
			
		||||
			end
 | 
			
		||||
			otherwise tagg='<okand>'
 | 
			
		||||
		end
 | 
			
		||||
		rest=behandlarad(rest)
 | 
			
		||||
		/*
 | 
			
		||||
			if index(rest,'@{')>0 then rest=behandlarad(left(rest,index(rest,'@{'))) || substr(rest,index(rest,'@{'))		
 | 
			
		||||
		*/
 | 
			
		||||
			inrad=inrad || tagg || rest
 | 
			
		||||
		/* iterate */
 | 
			
		||||
	end
 | 
			
		||||
	if abbrev(inrad,'@') then do
 | 
			
		||||
		say 'Hittade okand tagg:' inrad
 | 
			
		||||
		/* inrad='<okand>' inrad '</okand>' */
 | 
			
		||||
		parse var inrad '@' tagg inrad
 | 
			
		||||
		if abbrev(tagg,'$') then parse var tagg '$' tagg ':'
 | 
			
		||||
		inrad='<'tagg'>'inrad'</'tagg'>'
 | 
			
		||||
	end
 | 
			
		||||
	if abbrev(inrad,'Modes') then do
 | 
			
		||||
		parse var inrad . ':' inrad
 | 
			
		||||
		inrad='<modeheadline>Modes:	</modeheadline><modename>' || strip(inrad) || '</modename>'
 | 
			
		||||
	end
 | 
			
		||||
	if abbrev(inrad,'Syntax') then do
 | 
			
		||||
		parse var inrad . ':' inrad
 | 
			
		||||
		inrad='<syntaxheadline>Syntax:	</syntaxheadline><syntax>' || strip(inrad) || '</syntax>'
 | 
			
		||||
	end
 | 
			
		||||
	return inrad
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										673
									
								
								samples/RPM Spec/apache.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										673
									
								
								samples/RPM Spec/apache.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,673 @@
 | 
			
		||||
%define _prefix /usr/local
 | 
			
		||||
%define _mandir /usr/local/man
 | 
			
		||||
%define _sysconfdir /etc
 | 
			
		||||
 | 
			
		||||
%define apache_ver      1.3.42
 | 
			
		||||
%define mod_ssl_ver     2.8.31
 | 
			
		||||
%define	mod_perl_ver    1.31
 | 
			
		||||
%define	libapreq_ver    1.34
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%define aname           apache
 | 
			
		||||
%define pname           httpd13
 | 
			
		||||
%define contentdir      %{_var}/www
 | 
			
		||||
%define suexec_caller   apache
 | 
			
		||||
 | 
			
		||||
Summary:       The 1.x Apache webserver (with static mod_perl, mod_ssl)
 | 
			
		||||
Name:          apache
 | 
			
		||||
Version:       %{apache_ver}
 | 
			
		||||
Release:       4%{?dist}
 | 
			
		||||
License:       Apache Software License 2.0
 | 
			
		||||
URL:           http://httpd.apache.org/
 | 
			
		||||
Group:         System Environment/Daemons
 | 
			
		||||
 | 
			
		||||
Requires:      initscripts >= 3.25
 | 
			
		||||
Requires:      openssl >= 0.9.6
 | 
			
		||||
 | 
			
		||||
BuildRequires: openssl-devel mm-devel krb5-devel pkgconfig 
 | 
			
		||||
BuildRequires: perl-ExtUtils-MakeMaker perl-libwww-perl perl-HTML-Parser perl-ExtUtils-Embed
 | 
			
		||||
BuildRequires: gdbm-devel flex 
 | 
			
		||||
Requires:      /sbin/chkconfig /bin/mktemp /usr/sbin/useradd
 | 
			
		||||
Requires:      findutils procps
 | 
			
		||||
 | 
			
		||||
Provides:      webserver
 | 
			
		||||
Provides:      mod_perl = %{mod_perl_ver}
 | 
			
		||||
Provides:      perl(mod_perl) = %{mod_perl_ver}
 | 
			
		||||
Provides:      mod_ssl = %{mod_ssl_ver}
 | 
			
		||||
Provides:      apache = %{apache_ver}
 | 
			
		||||
 | 
			
		||||
Source0:       http://httpd.apache.org/dist/apache_%{apache_ver}.tar.bz2
 | 
			
		||||
Source1:       http://www.modssl.org/source/mod_ssl-%{mod_ssl_ver}-%{apache_ver}.tar.gz
 | 
			
		||||
Source2:       http://perl.apache.org/dist/mod_perl-%{mod_perl_ver}.tar.gz
 | 
			
		||||
Source3:       httpd.init
 | 
			
		||||
Source4:       apache.logrotate
 | 
			
		||||
Source5:       SSL-Certificate-Creation
 | 
			
		||||
Source6:       ftp://ftp.cpan.org/authors/id/J/JO/JOESUF/libapreq-%{libapreq_ver}.tar.gz
 | 
			
		||||
 | 
			
		||||
Patch0:        sslcfg.patch
 | 
			
		||||
Patch1:        apache_1.3.39-config.patch
 | 
			
		||||
Patch3:        apache_1.3.39-Makefile.patch
 | 
			
		||||
Patch5:        apache_1.3.20-apachectl-init.patch
 | 
			
		||||
Patch11:       mod_ssl-2.8.4-openssl.patch
 | 
			
		||||
Patch12:       apache_1.3.42-db.patch
 | 
			
		||||
Patch13:       apache-1.3.39-gcc44.patch
 | 
			
		||||
Patch14:       mod_ssl-2.8.31-STACK.patch
 | 
			
		||||
Patch15:       apache_1.3.39-ap_getline.patch
 | 
			
		||||
Patch16:       mod_ssl-openssl-x86_64.patch
 | 
			
		||||
Patch17:       mp1+perl5.14.diff
 | 
			
		||||
Patch18:       apache_1.3.42-64bits.patch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
This package contains a powerful, full-featured, efficient, and
 | 
			
		||||
freely-available Web server based on work done by the Apache Software
 | 
			
		||||
Foundation. It is also the most popular Web server on the Internet.
 | 
			
		||||
 | 
			
		||||
------------------------------------------------------------------------------
 | 
			
		||||
This package is a custom release containing the httpd server (v%{apache_ver})
 | 
			
		||||
bundled with: mod_perl v.%{mod_ssl_ver},
 | 
			
		||||
and mod_ssl v%{mod_ssl_ver}, all BUILT-IN.
 | 
			
		||||
------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	The Apache/Perl integration project brings together the full power
 | 
			
		||||
of the Perl programming language and the Apache HTTP server.
 | 
			
		||||
	With mod_perl it is possible to write Apache modules entirely in Perl.
 | 
			
		||||
In addition, the persistent interpreter embedded in the server avoids the
 | 
			
		||||
overhead of starting an external interpreter and the penalty of Perl
 | 
			
		||||
start-up time.
 | 
			
		||||
	Mod_SSL provides strong cryptography for the Apache 1.3 webserver
 | 
			
		||||
via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security
 | 
			
		||||
(TLSv1) protocols by the help of the Open Source SSL/TLS toolkit OpenSSL.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%package devel
 | 
			
		||||
Group:         Development/Libraries
 | 
			
		||||
Summary:       Module development tools for apache-mod_ssl
 | 
			
		||||
Provides:      eapi = %{mod_ssl_ver}
 | 
			
		||||
Requires:      %{name} = %{version}
 | 
			
		||||
Provides:      mod_perl-devel = %{mod_perl_ver}
 | 
			
		||||
Provides:      mod_ssl-devel = %{mod_ssl_ver}
 | 
			
		||||
Provides:      apache-devel = %{apache_ver}
 | 
			
		||||
 | 
			
		||||
%description devel
 | 
			
		||||
The apache-devel package contains the APXS binary and other files
 | 
			
		||||
that you need to build Dynamic Shared Objects (DSOs) for Apache.
 | 
			
		||||
If you are installing the Apache Web server and you want to be able
 | 
			
		||||
to compile or develop additional modules for Apache, you need to install
 | 
			
		||||
this package.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%package manual
 | 
			
		||||
Group:         Documentation
 | 
			
		||||
Summary:       Documentation for the Apache Web server
 | 
			
		||||
 | 
			
		||||
%description manual
 | 
			
		||||
The apache-manual package contains the complete manual and reference
 | 
			
		||||
guide for the Apache Web server.
 | 
			
		||||
It also contains the basic web content (icons, default welcome messages,
 | 
			
		||||
etc) provided with Apache's HTTPD distribution.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%prep 
 | 
			
		||||
%setup -q -c -T -n %{name}-%{version} -a 0
 | 
			
		||||
%setup -q -c -T -D -n %{name}-%{version} -a 1
 | 
			
		||||
%setup -q -c -T -D -n %{name}-%{version} -a 2
 | 
			
		||||
%setup -q -c -T -D -n %{name}-%{version} -a 6
 | 
			
		||||
 | 
			
		||||
pushd %{aname}_%{apache_ver}
 | 
			
		||||
%patch0 -p0 -b .sslcfg
 | 
			
		||||
%patch1 -p1 -b .config
 | 
			
		||||
%patch3 -p0 -b .make
 | 
			
		||||
%patch5 -p1 -b .apachectl-init
 | 
			
		||||
%ifarch x86_64
 | 
			
		||||
%patch18 -p1 -b .apache-x86_64
 | 
			
		||||
%endif
 | 
			
		||||
 | 
			
		||||
#patch12 -p1 -b .dbmdb
 | 
			
		||||
%patch13 -p1 -b .compile
 | 
			
		||||
%patch15 -p0 -b .ap_getline
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
patch -p0 < ../libapreq-%{libapreq_ver}/patches/apache-1.3+apreq.patch
 | 
			
		||||
cp ../libapreq-%{libapreq_ver}/c/*.[ch] src/lib/apreq/
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
pushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}
 | 
			
		||||
%patch11 -p1 -b .openssl
 | 
			
		||||
%patch14 -p0 -b .stack
 | 
			
		||||
%ifarch x86_64
 | 
			
		||||
%patch16 -p1 -b .openssl-x86_64
 | 
			
		||||
%endif
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
pushd mod_perl-%{mod_perl_ver}
 | 
			
		||||
%patch17 -p1 -b .mp1+perl5.14.diff
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
# Substitute values to match the configuration.  The first two are
 | 
			
		||||
# for the default httpd.conf file, the rest is for the mod_ssl
 | 
			
		||||
# additions.
 | 
			
		||||
pushd %{aname}_%{apache_ver}
 | 
			
		||||
sed -e 's,@@ServerRoot@@,%{_sysconfdir}/%{pname},g' \
 | 
			
		||||
    -e 's,@@ContentRoot@@,%{contentdir},g' \
 | 
			
		||||
    -e 's,^DocumentRoot "@@ContentRoot@@",#DocumentRoot "%{_sysconfdir}/%{pname}/htdocs",g' \
 | 
			
		||||
    -e 's,^<Directory "@@ContentRoot@@/cgi-bin">,<Directory "%{contentdir}/cgi-bin">,g' \
 | 
			
		||||
    -e 's,^ServerName new.host.name,#ServerName new.host.name,g' \
 | 
			
		||||
    -e 's,^ServerAdmin you@your.address,#ServerAdmin you@your.address,g' \
 | 
			
		||||
    -e 's,^SSLCipherSuite,#SSLCipherSuite,g' \
 | 
			
		||||
    -e 's,^SSLLogLevel info,SSLLogLevel error,g' \
 | 
			
		||||
    -e 's,^SSLSessionCache         dbm:logs/ssl_scache,SSLSessionCache         shm:logs/ssl_scache(512000),g' \
 | 
			
		||||
    conf/httpd.conf-dist > conf/httpd.conf
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
cp %{SOURCE5} .
 | 
			
		||||
 | 
			
		||||
#cp %{_tmppath}/rpm-tmp* /tmp/01prep.sh
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
export CFLAGS="$RPM_OPT_FLAGS -fPIC $(pkg-config --cflags openssl)"
 | 
			
		||||
export LIBS="-lpthread"
 | 
			
		||||
export EAPI_MM=SYSTEM
 | 
			
		||||
 | 
			
		||||
###############################################
 | 
			
		||||
echo mod_perl ...
 | 
			
		||||
pushd mod_perl-%{mod_perl_ver}
 | 
			
		||||
  perl Makefile.PL CCFLAGS="$RPM_OPT_FLAGS -fPIC" \
 | 
			
		||||
    APACHE_SRC=../%{aname}_%{apache_ver}/src \
 | 
			
		||||
    DO_HTTPD=1 USE_APACI=1 PREP_HTTPD=1 EVERYTHING=1
 | 
			
		||||
  make %{?_smp_mflags}
 | 
			
		||||
  ## put mod_perl docs in a safe place ;-]~
 | 
			
		||||
  mkdir mod_perl-doc
 | 
			
		||||
  cp -a eg/ faq/ mod_perl-doc/
 | 
			
		||||
  cp {CREDITS,LICENSE,README,SUPPORT,STATUS,Changes,INSTALL*} mod_perl-doc/
 | 
			
		||||
  cp *.{pod,html,gif} mod_perl-doc/
 | 
			
		||||
  find mod_perl-doc -type f -exec chmod 644 {} \;
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
###############################################
 | 
			
		||||
echo mod_ssl ...
 | 
			
		||||
export SSL_COMPAT=yes
 | 
			
		||||
export SSL_EXPERIMENTAL=yes
 | 
			
		||||
pushd mod_ssl-%{mod_ssl_ver}-%{apache_ver}
 | 
			
		||||
  ./configure --with-apache=../apache_%{apache_ver} \
 | 
			
		||||
    --with-mm=SYSTEM --force
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
###############################################
 | 
			
		||||
echo apache ...
 | 
			
		||||
pushd %{aname}_%{apache_ver}
 | 
			
		||||
  ./configure \
 | 
			
		||||
 	--prefix=%{_prefix} \
 | 
			
		||||
 	--exec-prefix=%{_prefix} \
 | 
			
		||||
 	--bindir=%{_bindir} \
 | 
			
		||||
 	--sbindir=%{_sbindir} \
 | 
			
		||||
 	--mandir=%{_mandir} \
 | 
			
		||||
	--sysconfdir=%{_sysconfdir}/%{pname}/conf \
 | 
			
		||||
	--libexecdir=%{_libdir}/apache \
 | 
			
		||||
	--datadir=%{contentdir} \
 | 
			
		||||
	--iconsdir=%{contentdir}/icons \
 | 
			
		||||
	--htdocsdir=%{contentdir}/html \
 | 
			
		||||
	--manualdir=%{contentdir}/html/manual \
 | 
			
		||||
	--cgidir=%{contentdir}/cgi-bin \
 | 
			
		||||
 	--localstatedir=%{_localstatedir} \
 | 
			
		||||
	--runtimedir=%{_sysconfdir}/%{pname}/run \
 | 
			
		||||
	--logfiledir=logs \
 | 
			
		||||
	--proxycachedir=%{_localstatedir}/cache/%{pname} \
 | 
			
		||||
	--with-perl=%{__perl} \
 | 
			
		||||
	--enable-rule=EAPI \
 | 
			
		||||
	--enable-rule=SSL_COMPAT \
 | 
			
		||||
	--enable-rule=SSL_EXPERIMENTAL \
 | 
			
		||||
	--disable-rule=SSL_VENDOR \
 | 
			
		||||
	--disable-rule=WANTHSREGEX \
 | 
			
		||||
	--disable-rule=EXPAT \
 | 
			
		||||
	%{?_with_backtrace:--activate-module=src/modules/experimental/mod_backtrace.c} \
 | 
			
		||||
	%{?_with_whatkilledus:--activate-module=src/modules/experimental/mod_whatkilledus.c} \
 | 
			
		||||
	--activate-module=src/modules/perl/libperl.a \
 | 
			
		||||
	--enable-module=auth_dbm \
 | 
			
		||||
	--enable-module=ssl \
 | 
			
		||||
	--enable-module=all \
 | 
			
		||||
	--enable-shared=max \
 | 
			
		||||
	--disable-shared=perl \
 | 
			
		||||
	--disable-shared=ssl \
 | 
			
		||||
	--disable-module=example \
 | 
			
		||||
	--disable-module=auth_db \
 | 
			
		||||
	--without-execstrip \
 | 
			
		||||
	%{?_with_suexec:--enable-suexec --suexec-docroot=%{contentdir}} \
 | 
			
		||||
	%{?_with_suexec:--suexec-uidmin=300 --suexec-gidmin=300} \
 | 
			
		||||
	%{?_with_suexec:--suexec-umask=022 --suexec-caller=%{suexec_caller}}
 | 
			
		||||
 | 
			
		||||
  make %{?_smp_mflags}
 | 
			
		||||
 | 
			
		||||
popd
 | 
			
		||||
#cp %{_tmppath}/rpm-tmp* /tmp/02build.sh
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
###############################################################################
 | 
			
		||||
### install basic apache stuff
 | 
			
		||||
pushd apache_%{apache_ver}
 | 
			
		||||
  make install root="$RPM_BUILD_ROOT"
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
### rename 
 | 
			
		||||
mv $RPM_BUILD_ROOT%{_sbindir}/httpd $RPM_BUILD_ROOT%{_sbindir}/%{pname}
 | 
			
		||||
 | 
			
		||||
### install SYSV init stuff
 | 
			
		||||
mkdir -p $RPM_BUILD_ROOT%{_initrddir}
 | 
			
		||||
install -m755 %{SOURCE3} $RPM_BUILD_ROOT%{_initrddir}/%{pname}
 | 
			
		||||
 | 
			
		||||
### install log rotation stuff
 | 
			
		||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
 | 
			
		||||
install -m644 %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/apache
 | 
			
		||||
 | 
			
		||||
### default rootdir links
 | 
			
		||||
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/%{pname}
 | 
			
		||||
pushd $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}
 | 
			
		||||
	ln -s %{_localstatedir}/log/%{pname} logs
 | 
			
		||||
	ln -s %{_libdir}/%{aname} modules
 | 
			
		||||
	ln -s %{_localstatedir}/run run
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
### replace Apache's default config file with our patched version
 | 
			
		||||
install -m644 apache_%{apache_ver}/conf/httpd.conf \
 | 
			
		||||
	$RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf/httpd.conf
 | 
			
		||||
 | 
			
		||||
# fix up apxs so that it doesn't think it's in the build root
 | 
			
		||||
perl -pi -e "s^$RPM_BUILD_ROOT^^g" $RPM_BUILD_ROOT%{_sbindir}/apxs
 | 
			
		||||
 | 
			
		||||
# fixup the documentation file naming
 | 
			
		||||
find $RPM_BUILD_ROOT%{contentdir} -name "*.html.html" | xargs rename .html.html .html
 | 
			
		||||
 | 
			
		||||
###############################################################################
 | 
			
		||||
### install mod_perl files
 | 
			
		||||
pushd mod_perl-%{mod_perl_ver}
 | 
			
		||||
  export PERL_INSTALL_ROOT=$RPM_BUILD_ROOT 
 | 
			
		||||
  make pure_install PREFIX=/usr INSTALLDIRS=vendor
 | 
			
		||||
 | 
			
		||||
  # convert man pages to UTF-8
 | 
			
		||||
  recode() {
 | 
			
		||||
    iconv -f "$2" -t utf-8 < "$1" > "${1}_"
 | 
			
		||||
    %{__mv} -f "${1}_" "$1"
 | 
			
		||||
  }
 | 
			
		||||
  pushd $RPM_BUILD_ROOT/usr/share/man/man3/
 | 
			
		||||
	for i in * ; do
 | 
			
		||||
		recode "${i}" iso-8859-1
 | 
			
		||||
	done
 | 
			
		||||
  popd
 | 
			
		||||
 | 
			
		||||
  # fix files mod
 | 
			
		||||
  find $RPM_BUILD_ROOT%{perl_vendorarch} -iname '*.pm' -exec chmod 0644 {} \;
 | 
			
		||||
 | 
			
		||||
  # bake web docs...
 | 
			
		||||
  mkdir -p $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl
 | 
			
		||||
  install -c -m 644 htdocs/manual/mod/mod_perl.html \
 | 
			
		||||
        $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/
 | 
			
		||||
  make -C faq
 | 
			
		||||
  rm -f faq/pod2htm*
 | 
			
		||||
  install -m644 faq/*.html \
 | 
			
		||||
    $RPM_BUILD_ROOT%{contentdir}/html/manual/mod/mod_perl/
 | 
			
		||||
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
# remove special perl files this is specific for rpms , already have in own .packlist
 | 
			
		||||
find $RPM_BUILD_ROOT%{perl_vendorarch}/.. -name perllocal.pod -o -name .packlist \
 | 
			
		||||
    -o -name '*.bs' | xargs -r -i rm -f {}
 | 
			
		||||
 | 
			
		||||
### ssl leftovers
 | 
			
		||||
# point to the right makefile.
 | 
			
		||||
ln -sf ../../../etc/pki/tls/certs/Makefile $RPM_BUILD_ROOT%{_sysconfdir}/%{pname}/conf
 | 
			
		||||
# create a prototype session cache
 | 
			
		||||
touch $RPM_BUILD_ROOT%{_localstatedir}/cache/ssl_gcache_data.{dir,pag,sem}
 | 
			
		||||
 | 
			
		||||
# drop shellbang from .exp files
 | 
			
		||||
for exp in $RPM_BUILD_ROOT%{perl_vendorarch}/auto/Apache/mod_perl.exp $RPM_BUILD_ROOT%{_libdir}/%{aname}/httpd.exp
 | 
			
		||||
do
 | 
			
		||||
	sed -i '/^#!/ d' $exp
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
#cp %{_tmppath}/rpm-tmp* /tmp/03install.sh
 | 
			
		||||
 | 
			
		||||
%post
 | 
			
		||||
/sbin/chkconfig --add %{pname}
 | 
			
		||||
/sbin/ldconfig
 | 
			
		||||
 | 
			
		||||
# safely build a test certificate
 | 
			
		||||
umask 077
 | 
			
		||||
if [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.key/server.key ] ; then
 | 
			
		||||
openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 1024 > %{_sysconfdir}/%{pname}/conf/ssl.key/server.key 2> /dev/null
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -f %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt ] ; then
 | 
			
		||||
cat << EOF | openssl req -new -key %{_sysconfdir}/%{pname}/conf/ssl.key/server.key -x509 -days 365 -out %{_sysconfdir}/%{pname}/conf/ssl.crt/server.crt 2>/dev/null
 | 
			
		||||
--
 | 
			
		||||
SomeState
 | 
			
		||||
SomeCity
 | 
			
		||||
SomeOrganization
 | 
			
		||||
SomeOrganizationalUnit
 | 
			
		||||
localhost.localdomain
 | 
			
		||||
root@localhost.localdomain
 | 
			
		||||
EOF
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# safely add .htm to mime types if it is not already there
 | 
			
		||||
[ -f %{_sysconfdir}/mime.types ] || exit 0
 | 
			
		||||
TEMPTYPES=`/bin/mktemp /tmp/mimetypes.XXXXXX`
 | 
			
		||||
[ -z "$TEMPTYPES" ] && {
 | 
			
		||||
  echo "could not make temporary file, htm not added to %{_sysconfdir}/mime.types" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
( grep -v "^text/html"  %{_sysconfdir}/mime.types
 | 
			
		||||
  types=$(grep "^text/html" %{_sysconfdir}/mime.types | cut -f2-)
 | 
			
		||||
  echo -en "text/html\t\t\t"
 | 
			
		||||
  for val in $types ; do
 | 
			
		||||
      if [ "$val" = "htm" ] ; then
 | 
			
		||||
          continue
 | 
			
		||||
      fi
 | 
			
		||||
      echo -n "$val "
 | 
			
		||||
  done
 | 
			
		||||
  echo "htm"
 | 
			
		||||
) > $TEMPTYPES
 | 
			
		||||
cat $TEMPTYPES > %{_sysconfdir}/mime.types && /bin/rm -f $TEMPTYPES
 | 
			
		||||
 | 
			
		||||
cp %{_tmppath}/rpm-tmp* /tmp/04post.sh
 | 
			
		||||
 | 
			
		||||
%pre
 | 
			
		||||
# Add the "apache" user
 | 
			
		||||
/usr/sbin/useradd -c "Apache" -u 48 \
 | 
			
		||||
	-s /sbin/nologin -r -d "%{contentdir}" apache 2> /dev/null || :
 | 
			
		||||
 | 
			
		||||
%preun
 | 
			
		||||
if [ $1 = 0 ]; then
 | 
			
		||||
	if [ -f /var/lock/subsys/%{pname} ]; then
 | 
			
		||||
		%{_initrddir}/%{pname} stop
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -f %{_initrddir}/%{pname} ]; then
 | 
			
		||||
		/sbin/chkconfig --del %{pname}
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
%dir %{_sysconfdir}/%{pname}
 | 
			
		||||
%dir %{_sysconfdir}/%{pname}/conf
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/*.conf
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/Makefile
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/magic
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/mime.types
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/logrotate.d/*
 | 
			
		||||
%config(noreplace) %{_sysconfdir}/%{pname}/conf/ssl.*
 | 
			
		||||
%doc %{_sysconfdir}/%{pname}/conf/*.default
 | 
			
		||||
%attr(755,root,root) %{_initrddir}/*
 | 
			
		||||
%{_sysconfdir}/%{pname}/logs
 | 
			
		||||
%{_sysconfdir}/%{pname}/modules
 | 
			
		||||
%{_sysconfdir}/%{pname}/run
 | 
			
		||||
%{_libdir}/%{aname}
 | 
			
		||||
%{perl_vendorarch}/Apache
 | 
			
		||||
%{perl_vendorarch}/Bundle
 | 
			
		||||
%{perl_vendorarch}/*.pm
 | 
			
		||||
%{perl_vendorarch}/*.PL
 | 
			
		||||
%dir %{perl_vendorarch}/auto/Apache
 | 
			
		||||
%{perl_vendorarch}/auto/Apache/Leak
 | 
			
		||||
%{perl_vendorarch}/auto/Apache/Symbol
 | 
			
		||||
%{perl_vendorarch}/auto/Apache/mod_perl.exp
 | 
			
		||||
%{perl_vendorarch}/auto/Apache/typemap
 | 
			
		||||
%attr(0755,root,root) %{_bindir}/*
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/ab
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/apachectl
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/httpd13
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/logresolve
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/rotatelogs
 | 
			
		||||
%{?_with_suexec:%attr(4710,root,%{suexec_caller}) %{_sbindir}/suexec}
 | 
			
		||||
%{_mandir}/man1*/*
 | 
			
		||||
%{_mandir}/man8/ab.8*
 | 
			
		||||
%{_mandir}/man8/apachectl.8*
 | 
			
		||||
%{_mandir}/man8/httpd.8*
 | 
			
		||||
%{_mandir}/man8/logresolve.8*
 | 
			
		||||
%{_mandir}/man8/rotatelogs.8*
 | 
			
		||||
%{?_with_suexec:%{_mandir}/man8/suexec.8*}
 | 
			
		||||
%attr(0755,apache,root) %dir %{_localstatedir}/cache/%{pname}
 | 
			
		||||
%attr(0640,apache,root) %{_localstatedir}/cache/ssl_*
 | 
			
		||||
%attr(0750,root,apache) %dir %{_localstatedir}/log/%{pname}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%files devel
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
%{_includedir}
 | 
			
		||||
%attr(0755,root,root) %{_sbindir}/apxs
 | 
			
		||||
%{_mandir}/man8/apxs.8*
 | 
			
		||||
%doc %{perl_vendorarch}/*.pod
 | 
			
		||||
%{perl_vendorarch}/auto/Apache/include
 | 
			
		||||
 | 
			
		||||
%files manual
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
%doc apache_%{apache_ver}/cgi-bin
 | 
			
		||||
%dir %{contentdir}
 | 
			
		||||
%dir %{contentdir}/cgi-bin
 | 
			
		||||
%config(noreplace) %{contentdir}/cgi-bin/*
 | 
			
		||||
%dir %{contentdir}/html
 | 
			
		||||
%config(noreplace) %{contentdir}/html/*.html*
 | 
			
		||||
%config(noreplace) %{contentdir}/html/*.gif
 | 
			
		||||
%dir %{contentdir}/icons
 | 
			
		||||
%dir %{contentdir}/icons/small
 | 
			
		||||
%config(noreplace) %{contentdir}/icons/*.*
 | 
			
		||||
%config(noreplace) %{contentdir}/icons/small/*.*
 | 
			
		||||
%doc %{contentdir}/icons/README
 | 
			
		||||
 | 
			
		||||
%doc apache_%{apache_ver}/{ABOUT_APACHE,LICENSE*,NOTICE,README*,cgi-bin}
 | 
			
		||||
%doc apache_%{apache_ver}/src/{CHANGES,README}*
 | 
			
		||||
%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/README.*
 | 
			
		||||
%doc mod_ssl-%{mod_ssl_ver}-%{apache_ver}/NEWS
 | 
			
		||||
%doc mod_perl-%{mod_perl_ver}/mod_perl-doc
 | 
			
		||||
%doc SSL-Certificate-Creation
 | 
			
		||||
 | 
			
		||||
%doc %{contentdir}/html/manual
 | 
			
		||||
%exclude %{contentdir}/html/manual/mod/mod_ssl/ssl_cover.wml
 | 
			
		||||
#man3 conflicts with mod_perl2
 | 
			
		||||
/usr/share/man/man3*/*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Sun May 13 2012 Sérgio Basto <sergio@serjux.com> - 1.3.42-4
 | 
			
		||||
- Many improvements on defaults directories 
 | 
			
		||||
- Separate libapreq in other package, to compile libapreq is need other sources installed. 
 | 
			
		||||
- more cleanups.
 | 
			
		||||
 | 
			
		||||
* Wed Nov 16 2011 Sérgio Basto <sergio@serjux.com>
 | 
			
		||||
- build for F16
 | 
			
		||||
- mp1+perl5.14.diff (mod_perl1 + perl5.14)
 | 
			
		||||
- many improvents.
 | 
			
		||||
 | 
			
		||||
* Sat Oct 29 2011 Sérgio Basto <sergio@serjux.com>
 | 
			
		||||
- mock build add many buildrequires
 | 
			
		||||
- many improvemts on confs 
 | 
			
		||||
 | 
			
		||||
* Tue Oct 16 2007 Sérgio Basto <sergio@serjux.com>
 | 
			
		||||
- UNDROPPED CONFIGURATION COMPLETELY: rpm it suposed do all alone.
 | 
			
		||||
- rename httpd to http13 to work independently of apache 2.2
 | 
			
		||||
- add patch to Makefile.tmp, resolve all problems at once
 | 
			
		||||
- change server port number to run out of the box.
 | 
			
		||||
- Update link to certs/Makefile.
 | 
			
		||||
 | 
			
		||||
* Tue Sep 11 2007 Marius FERARU <altblue@n0i.net> - 1.3.39-1.n0i.23.MPSSL
 | 
			
		||||
- apache 1.3.39
 | 
			
		||||
- mod_ssl 2.8.29
 | 
			
		||||
 | 
			
		||||
* Mon Apr 02 2007 Marius FERARU <altblue@n0i.net> - 1.3.37-3.n0i.22.MPSSL
 | 
			
		||||
- mod_perl 1.30
 | 
			
		||||
- initscript: use a "$pidfile" variable for all operations
 | 
			
		||||
- initscript: added a dummy "alias" for "reload" (will do a 'restart'!)
 | 
			
		||||
- initscript: added missing "fullstatus" option (will run through "apachectl")
 | 
			
		||||
- dropped shellbang from .exp files
 | 
			
		||||
- dropped 2 explicit provides (mod_perl and Apache::Constants)
 | 
			
		||||
 | 
			
		||||
* Fri Sep 08 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-2.n0i.21.MPSSL
 | 
			
		||||
- BR: gdbm-devel, db4-devel
 | 
			
		||||
 | 
			
		||||
* Mon Aug 21 2006 Marius FERARU <altblue@n0i.net> - 1.3.37-1.n0i.20.MPSSL
 | 
			
		||||
- apache 1.3.37
 | 
			
		||||
- mod_ssl 2.8.28
 | 
			
		||||
- Dist macro
 | 
			
		||||
- URL update
 | 
			
		||||
- updated description
 | 
			
		||||
- spec cleanups
 | 
			
		||||
- use "--with backtrace" to activate "mod_backtrace"
 | 
			
		||||
- use "--with whatkilledus" to activate "mod_whatkilledus"
 | 
			
		||||
- use "--with suexec" to activate suexec functionality
 | 
			
		||||
- moved default web content into documentation package
 | 
			
		||||
 | 
			
		||||
* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-2.n0i.19.MPSSL
 | 
			
		||||
- changed "runtimedir" and "logfiledir" to relative paths,
 | 
			
		||||
  letting users run apache on their own
 | 
			
		||||
 | 
			
		||||
* Tue Jun 06 2006 Marius FERARU <altblue@n0i.net> - 1.3.36-1.n0i.19.MPSSL
 | 
			
		||||
- apache 1.3.36
 | 
			
		||||
- mod_ssl version 2.8.27
 | 
			
		||||
- spec cleanups
 | 
			
		||||
 | 
			
		||||
* Mon Mar 13 2006 Marius FERARU <altblue@n0i.net> - 1.3.34-2.n0i.18.MPSSL
 | 
			
		||||
- rebuild
 | 
			
		||||
 | 
			
		||||
* Thu Nov 24 2005 Marius FERARU <altblue@n0i.net> 1.3.34-1.n0i.17.MPSSL
 | 
			
		||||
- apache 1.3.34
 | 
			
		||||
- mod_ssl version 2.8.25
 | 
			
		||||
 | 
			
		||||
* Tue Sep 20 2005 Marius FERARU <altblue@n0i.net> 1.3.33-5.n0i.16.MPSSL
 | 
			
		||||
- mod_ssl version 2.8.24
 | 
			
		||||
 | 
			
		||||
* Fri Sep 02 2005 Marius FERARU <altblue@n0i.net> 1.3.33-4.n0i.15.MPSSL
 | 
			
		||||
- rebuild
 | 
			
		||||
- dropped more requirements (which Fedora considers to "always have")
 | 
			
		||||
 | 
			
		||||
* Sat Jul 23 2005 Marius FERARU <altblue@n0i.net> 1.3.33-3.n0i.14.MPSSL
 | 
			
		||||
- dropped Epoch
 | 
			
		||||
- changed Summary and Description
 | 
			
		||||
- rebuild (perl 5.8.7)
 | 
			
		||||
 | 
			
		||||
* Tue Jan 04 2005 Marius FERARU <altblue@n0i.net> 1.3.33-2.n0i.13.MPSSL
 | 
			
		||||
- libapreq version 1.33
 | 
			
		||||
 | 
			
		||||
* Mon Dec 06 2004 Marius FERARU <altblue@n0i.net> 1.3.33-1.n0i.12.MPSSL
 | 
			
		||||
- apache version 1.3.33
 | 
			
		||||
- mod_ssl version 2.8.22
 | 
			
		||||
- description update
 | 
			
		||||
 | 
			
		||||
* Tue Aug 17 2004 Marius FERARU <altblue@n0i.net> 1.3.31-5.n0i.11.MPSSL
 | 
			
		||||
- mod_ssl version 2.8.19
 | 
			
		||||
 | 
			
		||||
* Thu Jul 15 2004 Marius FERARU <altblue@n0i.net> 1.3.31-4.n0i.10.MPSSL
 | 
			
		||||
- mod_ssl version 2.8.18
 | 
			
		||||
 | 
			
		||||
* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-3.n0i.9.MPSSL
 | 
			
		||||
- tweaked rotatelog's build: drop linking with apache libs
 | 
			
		||||
 | 
			
		||||
* Tue Jul 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-2.n0i.8.MPSSL
 | 
			
		||||
- applied some fixing patches from current CVS version
 | 
			
		||||
 | 
			
		||||
* Thu May 13 2004 Marius FERARU <altblue@n0i.net> 1.3.31-1.n0i.7.MPSSL
 | 
			
		||||
- apache version 1.3.31
 | 
			
		||||
- mod_ssl version 2.8.17
 | 
			
		||||
- updated apxs patch
 | 
			
		||||
- slight spec tweaks
 | 
			
		||||
- enabled backtrace experimental module
 | 
			
		||||
- updated config patch
 | 
			
		||||
 | 
			
		||||
* Fri Apr 30 2004 Marius Feraru <altblue@n0i.net> 1.3.29-6.n0i.6.MPSSL
 | 
			
		||||
- automatic rebuild
 | 
			
		||||
 | 
			
		||||
* Thu Apr 22 2004 Marius FERARU <altblue@n0i.net> 1.3.29-5.n0i.5.MPSSL
 | 
			
		||||
- rebuild (perl 5.8.4)
 | 
			
		||||
 | 
			
		||||
* Tue Feb 10 2004 Marius FERARU <altblue@n0i.net> 1.3.29-4.n0i.4.MPSSL
 | 
			
		||||
- fixed the shameful bugs from my httpd.init script
 | 
			
		||||
 | 
			
		||||
* Fri Jan 23 2004 Marius FERARU <altblue@n0i.net> 1.3.29-3.n0i.3.MPSSL
 | 
			
		||||
- rebuild (perl 5.8.3)
 | 
			
		||||
 | 
			
		||||
* Fri Jan 16 2004 Marius FERARU <altblue@n0i.net> 1.3.29-2.n0i.2.MPSSL
 | 
			
		||||
- rebuilt on perl 5.8.2 / Fedora 1 Devel (tobe FC2)
 | 
			
		||||
- finally clearly enabled modperl.c in apache_1.3.23-config.patch
 | 
			
		||||
as many helpless people seem to use this dumb default configuration file :(
 | 
			
		||||
- also updated the same patch to properly define SSL too :)
 | 
			
		||||
- added a lame "MPSSL" extra tag in release to make people understand this
 | 
			
		||||
is a !SPECIAL! apache + mod_perl + mod_ssl + libapreq package suite!!!
 | 
			
		||||
- updated init script to do "real" server shutdown (in squid style) and to NOT
 | 
			
		||||
shutdown all the apache servers, just the one started with /var/run/httpd.pid
 | 
			
		||||
- added USE_MODULEARGS=[yes/no] and SHUTDOWN_TIMEOUT=[seconds] configuration
 | 
			
		||||
parameters to init script
 | 
			
		||||
 | 
			
		||||
* Thu Nov 13 2003 Marius FERARU <altblue@n0i.net> 1.3.29-1.n0i.1
 | 
			
		||||
- apache 1.3.29
 | 
			
		||||
- modssl 2.8.16
 | 
			
		||||
- dropped zombie patch
 | 
			
		||||
- dropped fderr patch
 | 
			
		||||
- dropped for good thttpd conflict note as THERE IS NO CONFLICT!!! In fact
 | 
			
		||||
we really use them both for long time without a problem :))
 | 
			
		||||
- added more Prereq stuff
 | 
			
		||||
- more Fedora style spec updates
 | 
			
		||||
 | 
			
		||||
* Thu Oct 16 2003 Marius FERARU <altblue@n0i.net> 1.3.28-2.n0i
 | 
			
		||||
- mod_perl 1.29
 | 
			
		||||
- libapreq 1.3
 | 
			
		||||
- replaced ALL direct 'etc' occurences to macros (some for other stuff)
 | 
			
		||||
- perl %%files are now more properly quested.
 | 
			
		||||
- switched krb5-config to pkg-config
 | 
			
		||||
- switched textutils to coreutils
 | 
			
		||||
- using mm 1.3
 | 
			
		||||
- disabled internal expat linking
 | 
			
		||||
- added the 'zombie' patch
 | 
			
		||||
- added the 'file descriptors are erroneously closed' patch
 | 
			
		||||
 | 
			
		||||
* Mon Jul 28 2003 Marius FERARU <altblue.net> 1.3.28-1.n0i
 | 
			
		||||
- mod_perl 1.28
 | 
			
		||||
- added builtin libapreq
 | 
			
		||||
 | 
			
		||||
* Fri Jul 25 2003 Marius FERARU <altblue@n0i.net> 1.3.28-0.n0i
 | 
			
		||||
- apache version 1.3.28
 | 
			
		||||
- mod_ssl version 2.8.15
 | 
			
		||||
- switched the old dbm-gdbm patch with a more elegant one (apache_1.3.27-db);
 | 
			
		||||
yet, more tests are to be done on other systems before dropping the old one
 | 
			
		||||
from our src.rpm
 | 
			
		||||
- disabled suexec SSL env support patch as Apache ppl changed their code heavily
 | 
			
		||||
and I do not yet have time to update this patch
 | 
			
		||||
- moved mod_perl header files into apache-devel (are they needed by someone?!)
 | 
			
		||||
- dropped using RPM_SOURCE_DIR/<filename> stuff.
 | 
			
		||||
- disabled auth_db module (db4 API changes?!)
 | 
			
		||||
 | 
			
		||||
* Mon Apr 21 2003 Marius FERARU <altblue@n0i.net> 1.3.27-2.n0i
 | 
			
		||||
- automatic rebuild on RHL9
 | 
			
		||||
 | 
			
		||||
* Wed Mar 26 2003 Marius FERARU <altblue@n0i.net> 1.3.27-1.n0i
 | 
			
		||||
- mod_ssl version 2.8.14
 | 
			
		||||
- dropped thttpd conflict note as THERE IS NO CONFLICT!!! In fact we really
 | 
			
		||||
use them both :))
 | 
			
		||||
 | 
			
		||||
* Fri Oct 18 2002 Marius Feraru <altblue@n0i.net>
 | 
			
		||||
- apache version 1.3.27
 | 
			
		||||
- mod_ssl version 2.8.11
 | 
			
		||||
- eliminated db4 patch
 | 
			
		||||
- disabled thttpd conflict flag
 | 
			
		||||
 | 
			
		||||
* Tue Sep 24 2002 Marius Feraru <altblue@n0i.net>
 | 
			
		||||
- automatic rebuild (to conform with the openssl update)
 | 
			
		||||
 | 
			
		||||
* Wed Sep  4 2002 Marius Feraru <altblue@n0i.net>
 | 
			
		||||
- some spec cleanups (rpm 4.1.x compatibility)
 | 
			
		||||
 | 
			
		||||
* Tue Jul 23 2002 Marius FERARU <altblue@n0i.net>
 | 
			
		||||
- apache 1.3.26
 | 
			
		||||
- mod_perl 1.27
 | 
			
		||||
- mod_ssl 2.8.10
 | 
			
		||||
- lots of new tweaks to the spec file (hopefully it will be easier now for others to
 | 
			
		||||
rebuild this package =] )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>
 | 
			
		||||
- updated apache to 1.3.22
 | 
			
		||||
- reparsed and tweaked all RedHat patches
 | 
			
		||||
- lots of spec file tweaks: optimisations,
 | 
			
		||||
  file location/integration/modes fixes...
 | 
			
		||||
 | 
			
		||||
* Sat Sep 1 2001 Marius FERARU <altblue@n0i.net>
 | 
			
		||||
- updated mod_perl to version 1.26
 | 
			
		||||
- based on apache-1.3.20-15.src.rpm from Red Hat RawHide
 | 
			
		||||
- used apache_modperl-1.3.19-1.24-1.src.rpm from
 | 
			
		||||
  perl.apache.org as example spec.
 | 
			
		||||
							
								
								
									
										62
									
								
								samples/RPM Spec/erlang-erlydtl.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								samples/RPM Spec/erlang-erlydtl.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
%global debug_package %{nil}
 | 
			
		||||
 | 
			
		||||
Name:           erlang-erlydtl
 | 
			
		||||
Version:        0.6.0
 | 
			
		||||
Release:        1%{?dist}
 | 
			
		||||
Summary:        Erlang implementation of the Django Template Language.
 | 
			
		||||
 | 
			
		||||
Group:          Development/Libraries
 | 
			
		||||
License:        MIT
 | 
			
		||||
URL:            http://code.google.com/p/erlydtl/
 | 
			
		||||
Source0:        http://erlydtl.googlecode.com/files/erlydtl-0.6.0.tar.gz
 | 
			
		||||
Patch0:         erlang-erlydtl-0.6.0-tests.patch
 | 
			
		||||
Patch1:         erlang-erlydtl-0.6.0-r14a.patch
 | 
			
		||||
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 | 
			
		||||
 | 
			
		||||
Provides:       ErlyDTL = %{version}-%{release}
 | 
			
		||||
BuildRequires:  erlang
 | 
			
		||||
Requires:       erlang
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
ErlyDTL is an Erlang implementation of the Django Template Language. The
 | 
			
		||||
erlydtl module compiles Django Template source code into Erlang bytecode. The
 | 
			
		||||
compiled template has a "render" function that takes a list of variables and
 | 
			
		||||
returns a fully rendered document
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup -q -n erlydtl-%{version}
 | 
			
		||||
find examples/ -type f -executable -exec chmod -x {} \;
 | 
			
		||||
 | 
			
		||||
%patch0 -p0
 | 
			
		||||
%patch1 -p0
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
make %{?_smp_mflags}
 | 
			
		||||
 | 
			
		||||
%check
 | 
			
		||||
make test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
rm -rf %{buildroot}
 | 
			
		||||
mkdir -p %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
 | 
			
		||||
cp -r ebin     %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
 | 
			
		||||
cp -r bin      %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
 | 
			
		||||
cp -r priv     %{buildroot}/%{_libdir}/erlang/lib/erlydtl-%{version}/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%clean
 | 
			
		||||
rm -rf %{buildroot}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%defattr(-,root,root,-)
 | 
			
		||||
%dir %{_libdir}/erlang/lib/erlydtl-%{version}  
 | 
			
		||||
%{_libdir}/erlang/lib/erlydtl-%{version}/*
 | 
			
		||||
%doc README
 | 
			
		||||
%doc examples
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Sun Aug 1 2010 Ilia Cheishvili <ilia.cheishvili@gmail.com> - 0.6.0-1
 | 
			
		||||
- Initial Package
 | 
			
		||||
							
								
								
									
										46
									
								
								samples/RPM Spec/manos.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/RPM Spec/manos.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#
 | 
			
		||||
# spec file for package manos
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2010 Jackson Harper (jackson@novell.com)
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
Name:           manos-devel
 | 
			
		||||
Version:        0.1.1
 | 
			
		||||
Release:        1
 | 
			
		||||
License:        MIT/X11
 | 
			
		||||
BuildRoot:      %{_tmppath}/manos-%{version}-build
 | 
			
		||||
BuildRequires:  mono-devel >= 2.6
 | 
			
		||||
BuildRequires:  mono-nunit >= 2.6
 | 
			
		||||
Source0:        manos-%{version}.tar.bz2
 | 
			
		||||
Source1:        rpmlintrc
 | 
			
		||||
Summary:        The Manos Web Application Framework
 | 
			
		||||
Group:          Development/Web/Servers
 | 
			
		||||
BuildArch:      noarch
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
Manos is an easy to use, easy to test, high performance web application framework that stays out of your way and makes your life ridiculously simple.
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%defattr(-, root, root)
 | 
			
		||||
%{_prefix}/lib/manos
 | 
			
		||||
%{_bindir}/manos
 | 
			
		||||
%{_datadir}/manos
 | 
			
		||||
%{_prefix}/lib/pkgconfig/manos.pc
 | 
			
		||||
%{_datadir}/man/man1/manos.1.gz
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup -q -n manos-%{version}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
./configure --prefix=%{buildroot}%{_prefix} --install-prefix=%{_prefix}
 | 
			
		||||
make
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
make install
 | 
			
		||||
 | 
			
		||||
%clean
 | 
			
		||||
rm -rf %{buildroot}
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
							
								
								
									
										1467
									
								
								samples/RUNOFF/VMS_ZIP.RNH
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1467
									
								
								samples/RUNOFF/VMS_ZIP.RNH
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										324
									
								
								samples/RUNOFF/contributing.rnh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								samples/RUNOFF/contributing.rnh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,324 @@
 | 
			
		||||
.na
 | 
			
		||||
.ll 72
 | 
			
		||||
.pl 90
 | 
			
		||||
.m1 4
 | 
			
		||||
.m2 4
 | 
			
		||||
.m3 6
 | 
			
		||||
.m4 6
 | 
			
		||||
.sp 8
 | 
			
		||||
.ds
 | 
			
		||||
.ce
 | 
			
		||||
CONTRIBUTING TO LINGUIST
 | 
			
		||||
.sp
 | 
			
		||||
.ce
 | 
			
		||||
by
 | 
			
		||||
.ce
 | 
			
		||||
GITHUB
 | 
			
		||||
.sp
 | 
			
		||||
.ce
 | 
			
		||||
and the
 | 
			
		||||
.sp
 | 
			
		||||
.ce
 | 
			
		||||
OPEN SOURCE COMMUNITY
 | 
			
		||||
.sp
 | 
			
		||||
.bp
 | 
			
		||||
.sp 5
 | 
			
		||||
.ce
 | 
			
		||||
_I_N_T_R_O_D_U_C_T_I_O_N:
 | 
			
		||||
.sp
 | 
			
		||||
     Hi there! We're thrilled that you'd like to contribute to this
 | 
			
		||||
project. Your help is  essential for keeping it great. This project
 | 
			
		||||
adheres to the Contributor Covenant Code of Conduct. By participating,
 | 
			
		||||
you are expected to uphold this code.
 | 
			
		||||
.br
 | 
			
		||||
The majority of contributions won't need to touch any Ruby code at all.
 | 
			
		||||
.sp 5
 | 
			
		||||
.ce
 | 
			
		||||
_A_d_d_i_n_g _a_n _e_x_t_e_n_s_i_o_n _t_o _a
 | 
			
		||||
_l_a_n_g_u_a_g_e
 | 
			
		||||
.sp
 | 
			
		||||
     We try only to add new extensions once they have some usage on
 | 
			
		||||
GitHub. In most cases we prefer that extensions be in use in hundreds of
 | 
			
		||||
repositories before supporting them in Linguist.
 | 
			
		||||
.sp
 | 
			
		||||
To add support for a new extension:
 | 
			
		||||
.sp
 | 
			
		||||
.in 5
 | 
			
		||||
.un 5
 | 
			
		||||
1.   Add your extension to the language entry in
 | 
			
		||||
_l_a_n_g_u_a_g_e_s_._y_m_l, keeping the extensions in
 | 
			
		||||
alphabetical order.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
2.   Add at least one sample for your extension to the samples directory
 | 
			
		||||
in the correct subdirectory.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
3.   Open a pull request, linking to a GitHub search result showing
 | 
			
		||||
in-the-wild usage.
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
In addition, if this extension is already listed in
 | 
			
		||||
_l_a_n_g_u_a_g_e_s_._y_m_l then sometimes a few more steps
 | 
			
		||||
will need to be taken:
 | 
			
		||||
.sp
 | 
			
		||||
.in 5
 | 
			
		||||
.un 5
 | 
			
		||||
1.   Make sure that example .yourextension files are present in the
 | 
			
		||||
samples directory for each language that uses .yourextension.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
2.   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.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
3.   If the Bayesian classifier does a bad job with the sample files
 | 
			
		||||
then a heuristic may need to be written to help.
 | 
			
		||||
.in 0
 | 
			
		||||
.sp 5
 | 
			
		||||
.ce
 | 
			
		||||
_A_d_d_i_n_g _a _l_a_n_g_u_a_g_e
 | 
			
		||||
.sp
 | 
			
		||||
     We try only to add languages once they have some usage on GitHub.
 | 
			
		||||
In most cases we prefer that each new extension be in use in hundreds of
 | 
			
		||||
repositories before supporting them in Linguist.
 | 
			
		||||
.sp
 | 
			
		||||
To add support for a new language:
 | 
			
		||||
.in 5
 | 
			
		||||
.un 5
 | 
			
		||||
1.   Add an entry for your language to
 | 
			
		||||
_l_a_n_g_u_a_g_e_s_._y_m_l.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
2.   Add a grammar for your language. Please only add grammars that have
 | 
			
		||||
a license that permits redistribution.
 | 
			
		||||
.br
 | 
			
		||||
.in +5
 | 
			
		||||
.un 5
 | 
			
		||||
i.   Add your grammar as a submodule:
 | 
			
		||||
.br
 | 
			
		||||
.in +4
 | 
			
		||||
git submodule add
 | 
			
		||||
https://github.com/Alhadis/language-roff
 | 
			
		||||
vendor/grammars/language-roff
 | 
			
		||||
.in -4
 | 
			
		||||
.un 5
 | 
			
		||||
ii.  Add your grammar to grammars.yml:
 | 
			
		||||
.br
 | 
			
		||||
.in +4
 | 
			
		||||
script/convert-grammars --add vendor/grammars/MyGrammar
 | 
			
		||||
.in -4
 | 
			
		||||
.un 5
 | 
			
		||||
iii. Download the license for the grammar by running script/licensed.
 | 
			
		||||
Be careful to only commit the file for the new grammar, as this script
 | 
			
		||||
may update licenses for other grammars as well.
 | 
			
		||||
.br
 | 
			
		||||
.in -5
 | 
			
		||||
.un 5
 | 
			
		||||
3.   Add samples for your language to the samples directory in the
 | 
			
		||||
correct subdirectory.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
4.   Open a pull request, linking to a GitHub search result showing
 | 
			
		||||
in-the-wild usage.
 | 
			
		||||
.br
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
In addition, if your new language defines an extension that's already
 | 
			
		||||
listed in _l_a_n_g_u_a_g_e_s_._y_m_l (such as `.foo`) then
 | 
			
		||||
sometimes a few more steps will need to be taken:
 | 
			
		||||
.sp
 | 
			
		||||
.in +5
 | 
			
		||||
.un 5
 | 
			
		||||
1.   Make sure that example .foo files are present in the samples
 | 
			
		||||
directory for each language that uses .foo.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
2.   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.
 | 
			
		||||
.br
 | 
			
		||||
.un 5
 | 
			
		||||
3.   If the Bayesian classifier does a bad job with the sample .foo
 | 
			
		||||
files then a heuristic may need to be written to help.
 | 
			
		||||
.br
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
Remember, the goal here is to try and avoid false positives!
 | 
			
		||||
.sp 2
 | 
			
		||||
.ce
 | 
			
		||||
_F_i_x_i_n_g _a _m_i_s_c_l_a_s_s_i_f_i_e_d
 | 
			
		||||
_l_a_n_g_u_a_g_e
 | 
			
		||||
.br
 | 
			
		||||
     Most languages are detected by their file extension defined in
 | 
			
		||||
_l_a_n_g_u_a_g_e_s_._y_m_l.  For disambiguating between
 | 
			
		||||
files with common extensions, linguist applies some heuristics and a
 | 
			
		||||
statistical classifier.   This process can help differentiate between,
 | 
			
		||||
for example, .h files which could be either C, C++, or Obj-C.
 | 
			
		||||
.sp
 | 
			
		||||
     Misclassifications can often be solved by either adding a new
 | 
			
		||||
filename or extension for the language or adding more samples to make
 | 
			
		||||
the classifier smarter.
 | 
			
		||||
.sp
 | 
			
		||||
.m4 -2
 | 
			
		||||
.ce
 | 
			
		||||
_F_i_x_i_n_g _s_y_n_t_a_x
 | 
			
		||||
_h_i_g_h_l_i_g_h_t_i_n_g
 | 
			
		||||
.br
 | 
			
		||||
     Syntax highlighting in GitHub is performed using
 | 
			
		||||
TextMate-compatible grammars. These are the same grammars that TextMate,
 | 
			
		||||
Sublime Text and Atom use. Every language in languages.yml is mapped to
 | 
			
		||||
its corresponding TM `scope`. This scope will be used when picking up a
 | 
			
		||||
grammar for highlighting.
 | 
			
		||||
.sp
 | 
			
		||||
     Assuming your code is being detected as the right language, in most
 | 
			
		||||
cases this is due to a bug in the language grammar rather than a bug in
 | 
			
		||||
Linguist. _g_r_a_m_m_a_r_s_._y_m_l lists all the grammars
 | 
			
		||||
we use for syntax highlighting on github.com. Find the one corresponding
 | 
			
		||||
to your code's programming language and submit a bug report upstream.
 | 
			
		||||
.sp
 | 
			
		||||
If you can, try to reproduce the highlighting problem in the text editor
 | 
			
		||||
that the grammar is designed for (TextMate, Sublime Text, or Atom) and
 | 
			
		||||
include that information in your bug report.
 | 
			
		||||
.sp
 | 
			
		||||
     You can also try to fix the bug yourself and submit a Pull Request.
 | 
			
		||||
TextMate's documentation offers a good introduction on how to work with
 | 
			
		||||
TextMate-compatible grammars. You can test grammars using Lightshow.
 | 
			
		||||
.sp
 | 
			
		||||
     Once the bug has been fixed upstream, we'll pick it up for GitHub
 | 
			
		||||
in the next release of Linguist.
 | 
			
		||||
.sp 2
 | 
			
		||||
.ce
 | 
			
		||||
_T_e_s_t_i_n_g
 | 
			
		||||
.br
 | 
			
		||||
     For development you are going to want to checkout out the source.
 | 
			
		||||
To get it, clone the repo and run Bundler to install its dependencies.
 | 
			
		||||
.sp
 | 
			
		||||
.in 4
 | 
			
		||||
git clone https://github.com/github/linguist.git
 | 
			
		||||
.br
 | 
			
		||||
cd linguist/
 | 
			
		||||
.br
 | 
			
		||||
script/bootstrap
 | 
			
		||||
.br
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
To run the tests:
 | 
			
		||||
.sp
 | 
			
		||||
.in 4
 | 
			
		||||
    bundle exec rake test
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
    Sometimes getting the tests running can be too much work, especially
 | 
			
		||||
if you don't have much Ruby experience.  It's okay:  be lazy and let our
 | 
			
		||||
build bot Travis run the tests for you. Just open a pull request and the
 | 
			
		||||
bot will start cranking away.
 | 
			
		||||
.sp
 | 
			
		||||
.ce
 | 
			
		||||
_M_a_i_n_t_a_i_n_e_r_s
 | 
			
		||||
.br
 | 
			
		||||
Linguist is maintained with love by:
 | 
			
		||||
.sp
 | 
			
		||||
.in -2
 | 
			
		||||
- @arfon (GitHub Staff)
 | 
			
		||||
.br
 | 
			
		||||
- @larsbrinkhoff
 | 
			
		||||
.br
 | 
			
		||||
- @pchaigno
 | 
			
		||||
.in 0
 | 
			
		||||
.br
 | 
			
		||||
.sp
 | 
			
		||||
As Linguist is a production dependency for GitHub we have a couple of
 | 
			
		||||
workflow restrictions:
 | 
			
		||||
.sp
 | 
			
		||||
.in -2
 | 
			
		||||
- Anyone with commit rights can merge Pull Requests provided that there
 | 
			
		||||
is a :+1: from a GitHub member of staff
 | 
			
		||||
.br
 | 
			
		||||
- Releases are performed by GitHub staff so we can ensure GitHub.com
 | 
			
		||||
always stays up to date with the latest release of Linguist and there
 | 
			
		||||
are no regressions in production.
 | 
			
		||||
.in 0
 | 
			
		||||
.sp
 | 
			
		||||
.ce
 | 
			
		||||
_R_e_l_e_a_s_i_n_g
 | 
			
		||||
.sp
 | 
			
		||||
If you are the current maintainer of this gem:
 | 
			
		||||
.sp
 | 
			
		||||
.in 5
 | 
			
		||||
.ul 5
 | 
			
		||||
1.   Create a branch for the release:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
git checkout -b cut-release-vxx.xx.xx
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
2.   Make sure your local dependencies are up to date:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
script/bootstrap
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
3.   If grammar submodules have not been updated recently, update them:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
git submodule update --remote _&_& git commit -a
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
4.   Ensure that samples are updated:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
bundle exec rake samples
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
5.   Ensure that tests are green:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
bundle exec rake test
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
6.   Bump gem version in lib/linguist/version.rb
 | 
			
		||||
.br
 | 
			
		||||
.ul 5
 | 
			
		||||
7.   Make a PR to github/linguist
 | 
			
		||||
.br
 | 
			
		||||
.ul 5
 | 
			
		||||
8.   Build a local gem: `bundle exec rake build_gem`
 | 
			
		||||
.br
 | 
			
		||||
.ul 5
 | 
			
		||||
9.   Test the gem:
 | 
			
		||||
.sp
 | 
			
		||||
.in +5
 | 
			
		||||
.un 5
 | 
			
		||||
i.   Bump the Gemfile and Gemfile.lock versions for an app which relies
 | 
			
		||||
on this gem
 | 
			
		||||
.un 5
 | 
			
		||||
ii.  Install the new gem locally
 | 
			
		||||
.un 5
 | 
			
		||||
iii. Test behaviour locally, branch deploy, whatever needs to happen.
 | 
			
		||||
.br
 | 
			
		||||
.in -5
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
10. Merge github/linguist PR
 | 
			
		||||
.sp
 | 
			
		||||
.ul 5
 | 
			
		||||
11. Tag and push:
 | 
			
		||||
.sp
 | 
			
		||||
.in +2
 | 
			
		||||
git tag vx.xx.xx;
 | 
			
		||||
.br
 | 
			
		||||
git push --tags
 | 
			
		||||
.in -2
 | 
			
		||||
.sp
 | 
			
		||||
12. Push to rubygems.org
 | 
			
		||||
.br
 | 
			
		||||
.in +2
 | 
			
		||||
gem push github-linguist-3.0.0.gem
 | 
			
		||||
.in -2
 | 
			
		||||
.sp 2
 | 
			
		||||
							
								
								
									
										8644
									
								
								samples/RUNOFF/longlib.rno
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8644
									
								
								samples/RUNOFF/longlib.rno
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1773
									
								
								samples/RUNOFF/mcp_help.rnh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1773
									
								
								samples/RUNOFF/mcp_help.rnh
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										44
									
								
								samples/Ruby/any.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/Ruby/any.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
require File.dirname(File.expand_path(__FILE__)) + '/../spec_helper'
 | 
			
		||||
 | 
			
		||||
describe Spira::Types::Any do
 | 
			
		||||
 | 
			
		||||
  before :all do
 | 
			
		||||
    @uri = RDF::URI('http://example.org')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # this spec is going to be necessarily loose.  The 'Any' type is defined to
 | 
			
		||||
  # use RDF.rb's automatic RDF Literal boxing and unboxing, which may or may
 | 
			
		||||
  # not change between verions.
 | 
			
		||||
  #
 | 
			
		||||
  context "when serializing" do
 | 
			
		||||
    it "should serialize literals to RDF Literals" do
 | 
			
		||||
      serialized = Spira::Types::Any.serialize(15)
 | 
			
		||||
      serialized.should be_a RDF::Literal
 | 
			
		||||
      serialized = Spira::Types::Any.serialize("test")
 | 
			
		||||
      serialized.should be_a RDF::Literal
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "should keep RDF::URIs as URIs" do
 | 
			
		||||
      Spira::Types::Any.serialize(@uri).should == @uri
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "should fail to serialize collections" do
 | 
			
		||||
      lambda { Spira::Types::Any.serialize([]) }.should raise_error TypeError
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context "when unserializing" do
 | 
			
		||||
    it "should unserialize to ruby types" do
 | 
			
		||||
      value = Spira::Types::Any.unserialize(RDF::Literal.new(5, :datatype => RDF::XSD.integer))
 | 
			
		||||
      value.should == 5
 | 
			
		||||
      value = Spira::Types::Any.unserialize(RDF::Literal.new("a string"))
 | 
			
		||||
      value.should == "a string"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "should unserialize URIs to URIs" do
 | 
			
		||||
      Spira::Types::Any.unserialize(@uri).should == @uri
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										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" }]
 | 
			
		||||
	}
 | 
			
		||||
]
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user