mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			299 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | a4d12cc8e4 | ||
|  | a1165b74b1 | ||
|  | 0fa1fa5581 | ||
|  | d8b91bd5c4 | ||
|  | 9b941a34f0 | ||
|  | 9d8392dab8 | ||
|  | 2c78dd2c66 | ||
|  | 3988f3e7a7 | ||
|  | d9a4e831b4 | ||
|  | 45c27f26a2 | ||
|  | 0fbc29bf68 | ||
|  | 5569d2056d | ||
|  | be262d0b4f | ||
|  | 33ce2d7264 | ||
|  | c486f56204 | ||
|  | 9f3b7d0ba5 | ||
|  | 79f20e8057 | ||
|  | cd30c7613c | ||
|  | 5aa53c0711 | ||
|  | c17cdca896 | ||
|  | ecdae83364 | ||
|  | 31aafa2c78 | ||
|  | 8a911b8ff3 | ||
|  | 9233f1d17f | ||
|  | 77eb36a982 | ||
|  | 4e6e58a099 | ||
|  | c87976330f | ||
|  | 0e9109c3fc | ||
|  | 12f9295dd7 | ||
|  | 581723748b | ||
|  | 0980e304b1 | ||
|  | d46a529b6a | ||
|  | 1d2ec4dbc3 | ||
|  | 829eea0139 | ||
|  | 78b2853d70 | ||
|  | 202f3c08cd | ||
|  | b958779e3d | ||
|  | 00dc775daf | ||
|  | 009a4e67b6 | ||
|  | faaa4470af | ||
|  | 2a320cb988 | ||
|  | 74931d1bd5 | ||
|  | 3ca93a84b9 | ||
|  | aa27f18ea6 | ||
|  | d3e2ea3f71 | ||
|  | 53aa1209ab | ||
|  | b2a486fed2 | ||
|  | 4f1e5c34b1 | ||
|  | 85c9833081 | ||
|  | 33899b9d6b | ||
|  | 417239004a | ||
|  | 6a1423d28f | ||
|  | 96a23ce388 | ||
|  | e8d7eed3aa | ||
|  | 9d419c4ab9 | ||
|  | 4eefc1f58e | ||
|  | 0b94b9cda7 | ||
|  | c736038d94 | ||
|  | ec562138f8 | ||
|  | 50013e8dd7 | ||
|  | 416c5d1185 | ||
|  | 8869912d31 | ||
|  | 43fa563b77 | ||
|  | 41c6aee8c3 | ||
|  | 8cf575c37d | ||
|  | 4e20928e04 | ||
|  | 3e37bd2680 | ||
|  | a29f5b2d46 | ||
|  | 4efc6f8c95 | ||
|  | 359699c454 | ||
|  | 346aa99fcf | ||
|  | d147778677 | ||
|  | e520209e49 | ||
|  | 338cc16239 | ||
|  | 67ea35094b | ||
|  | 6f0393fcbd | ||
|  | 2923d50d7e | ||
|  | 4e26f609ef | ||
|  | e86d6e8dd2 | ||
|  | 5fa02ad1fb | ||
|  | 5a06240f69 | ||
|  | d6e0f74c80 | ||
|  | a5c08bb203 | ||
|  | c6dc29abb1 | ||
|  | ffd984bb7e | ||
|  | dc5473559b | ||
|  | 8e9c224952 | ||
|  | d43f111723 | ||
|  | de9ff713a4 | ||
|  | 98783560ec | ||
|  | 8f31fbbd55 | ||
|  | e4cdbd2b2b | ||
|  | ba52e48ceb | ||
|  | a44ebe493b | ||
|  | eb0e75e11e | ||
|  | 22c2cf4967 | ||
|  | 39e3688fb8 | ||
|  | 6b83e5fb7b | ||
|  | dd2e5ffe07 | ||
|  | f6b6c4e165 | ||
|  | 608ed60b5c | ||
|  | 2ce2945058 | ||
|  | c8d376754e | ||
|  | ecaef91fa1 | ||
|  | d265b78e7e | ||
|  | 5a5bf7d5e5 | ||
|  | e46781b903 | ||
|  | 9543a8c8e9 | ||
|  | 6ac1ac9232 | ||
|  | 1bbb919fef | ||
|  | 71dfed0e45 | ||
|  | a2db058ce4 | ||
|  | 12695fee2f | ||
|  | 4a775dca37 | ||
|  | d7c689fd6b | ||
|  | 20b8188384 | ||
|  | 26310d9515 | ||
|  | e38cc75da5 | ||
|  | 8d55fc1bd5 | ||
|  | 7e63399196 | ||
|  | 520e5a5cfe | ||
|  | 5d85692c24 | ||
|  | 676861fff3 | ||
|  | 6589bd9dc7 | ||
|  | e32a4f13ef | ||
|  | 4e4d851f71 | ||
|  | a3628f86da | ||
|  | fe70965906 | ||
|  | c863435c84 | ||
|  | eeec48198a | ||
|  | 82167063da | ||
|  | 3ae89b48ba | ||
|  | cd9401c424 | ||
|  | e7e8a7d835 | ||
|  | 7654032d2e | ||
|  | 05b536fc61 | ||
|  | ebe85788ab | ||
|  | 524337d07b | ||
|  | f8ce42e169 | ||
|  | 71032cd252 | ||
|  | 41593b3ea7 | ||
|  | bed8add2f5 | ||
|  | e424e8e88c | ||
|  | 07d4f218a3 | ||
|  | 67ed060d37 | ||
|  | 3abe081560 | ||
|  | d3f3c0345c | ||
|  | 855f1a1f86 | ||
|  | 0406a5b326 | ||
|  | 0108ef4386 | ||
|  | daefff86ff | ||
|  | fdb962518f | ||
|  | 6564078061 | ||
|  | 39ea9be5f8 | ||
|  | 152b5ade5e | ||
|  | c525e3fbef | ||
|  | 88c74fa9c2 | ||
|  | 6a54ee767f | ||
|  | 2ea1ff2736 | ||
|  | a1901fceff | ||
|  | b4035a3804 | ||
|  | fc67fc525c | ||
|  | f0659d3aa5 | ||
|  | a7a123a8db | ||
|  | 0e5327a77a | ||
|  | ecd4ae3bda | ||
|  | 7a8bd628e1 | ||
|  | 8e19aea39e | ||
|  | 6fcba83f3e | ||
|  | d6d7d38eb8 | ||
|  | c8094d3775 | ||
|  | de478d2f2d | ||
|  | 991dcef18b | ||
|  | f30e9270f1 | ||
|  | 1d7ba18b15 | ||
|  | 35a06d6cb8 | ||
|  | 4cf7feb275 | ||
|  | 30298a9ef8 | ||
|  | cc5f1c57ca | ||
|  | 82af10e3fd | ||
|  | 63c8d2284c | ||
|  | 697380336c | ||
|  | 5fd8d71858 | ||
|  | 5bc88814e2 | ||
|  | 00efd6a463 | ||
|  | 81ca6e7766 | ||
|  | cd288a8ee4 | ||
|  | a8d84f3d55 | ||
|  | 600115afed | ||
|  | e57273c839 | ||
|  | 65491d460e | ||
|  | 8dc4a1308f | ||
|  | 6841b4d259 | ||
|  | a53423b6e0 | ||
|  | 02f3ba1840 | ||
|  | e1216ea4ee | ||
|  | a3227c2c27 | ||
|  | 9f1c950a1f | ||
|  | c7a0d7b83d | ||
|  | 53c9b2b435 | ||
|  | b4a77abd82 | ||
|  | 8a622823b0 | ||
|  | 3310d925b6 | ||
|  | 65201b322a | ||
|  | b71bf19e37 | ||
|  | 1f43664a51 | ||
|  | 7cda13afcb | ||
|  | e0d890240b | ||
|  | abf7bee464 | ||
|  | e73a4ecd0e | ||
|  | 70779c9986 | ||
|  | 1fc4c9fdc6 | ||
|  | fdec52c89a | ||
|  | 6e40de47da | ||
|  | 28be72892e | ||
|  | 6df0e4591d | ||
|  | 879c63a25e | ||
|  | ab2e640759 | ||
|  | b61fe90d12 | ||
|  | e6c849d92c | ||
|  | 5e4e38b39a | ||
|  | 22d4865c52 | ||
|  | 3247d46e81 | ||
|  | dad3191238 | ||
|  | 35a13b3633 | ||
|  | 56fb48ea96 | ||
|  | 983ff20d3c | ||
|  | 2d51a5dba4 | ||
|  | df98c86acd | ||
|  | 98118eb70b | ||
|  | 1ec84da277 | ||
|  | 3112e6deda | ||
|  | be316c2943 | ||
|  | 68c45be47d | ||
|  | 4584963dd2 | ||
|  | f382abc2f3 | ||
|  | 9d57e1e1b5 | ||
|  | 2a4150b104 | ||
|  | 09612ae42e | ||
|  | 49e9ee48d0 | ||
|  | a8719f3e82 | ||
|  | 04e1cc6d0a | ||
|  | dd7b125869 | ||
|  | 426818120c | ||
|  | 50bd2cc3c8 | ||
|  | 00647be113 | ||
|  | e930ee1a8e | ||
|  | 48b64c2d31 | ||
|  | f95365946c | ||
|  | 5ddccaac83 | ||
|  | 51d7c8f905 | ||
|  | ed71855612 | ||
|  | 742faebd8b | ||
|  | 6763b73d9c | ||
|  | 5c3744dfd6 | ||
|  | cb5bc91fe3 | ||
|  | 9171ee602b | ||
|  | 4da0463768 | ||
|  | 8d0a2d9dc1 | ||
|  | 6a2cebea7d | ||
|  | ae10395b3a | ||
|  | 510abc7cee | ||
|  | e8a700e4e3 | ||
|  | c13e384e18 | ||
|  | 4204078b19 | ||
|  | 17fc3d0640 | ||
|  | 7715254212 | ||
|  | 2f50aa460a | ||
|  | 6adec161fa | ||
|  | c802ba3a1d | ||
|  | 06e80f3889 | ||
|  | 216d63f575 | ||
|  | ff042a87a4 | ||
|  | 56f0f93bbb | ||
|  | 99a3a5b85b | ||
|  | 1868d1d190 | ||
|  | 705e234044 | ||
|  | 0dd78704f7 | ||
|  | 257425141d | ||
|  | 6482a60c6e | ||
|  | 1466b70f10 | ||
|  | b87146056b | ||
|  | b29696d684 | ||
|  | 514a8d54db | ||
|  | abfe89d8ff | ||
|  | 22609dc297 | ||
|  | 93341be396 | ||
|  | f2ae3b6223 | ||
|  | e84204a274 | ||
|  | 7024c7cb37 | ||
|  | 91e0823b04 | ||
|  | b056df06f4 | ||
|  | 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 | ||||
|   | ||||
							
								
								
									
										113
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										113
									
								
								.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 | ||||
| @@ -334,9 +325,6 @@ | ||||
| [submodule "vendor/grammars/nemerle.tmbundle"] | ||||
| 	path = vendor/grammars/nemerle.tmbundle | ||||
| 	url = https://github.com/textmate/nemerle.tmbundle | ||||
| [submodule "vendor/grammars/ninja.tmbundle"] | ||||
| 	path = vendor/grammars/ninja.tmbundle | ||||
| 	url = https://github.com/textmate/ninja.tmbundle | ||||
| [submodule "vendor/grammars/objective-c.tmbundle"] | ||||
| 	path = vendor/grammars/objective-c.tmbundle | ||||
| 	url = https://github.com/textmate/objective-c.tmbundle | ||||
| @@ -364,9 +352,6 @@ | ||||
| [submodule "vendor/grammars/r.tmbundle"] | ||||
| 	path = vendor/grammars/r.tmbundle | ||||
| 	url = https://github.com/textmate/r.tmbundle | ||||
| [submodule "vendor/grammars/ruby-haml.tmbundle"] | ||||
| 	path = vendor/grammars/ruby-haml.tmbundle | ||||
| 	url = https://github.com/textmate/ruby-haml.tmbundle | ||||
| [submodule "vendor/grammars/scheme.tmbundle"] | ||||
| 	path = vendor/grammars/scheme.tmbundle | ||||
| 	url = https://github.com/textmate/scheme.tmbundle | ||||
| @@ -418,9 +403,9 @@ | ||||
| [submodule "vendor/grammars/oz-tmbundle"] | ||||
| 	path = vendor/grammars/oz-tmbundle | ||||
| 	url = https://github.com/eregon/oz-tmbundle | ||||
| [submodule "vendor/grammars/ebundles"] | ||||
| 	path = vendor/grammars/ebundles | ||||
| 	url = https://github.com/ericzou/ebundles | ||||
| [submodule "vendor/grammars/language-batchfile"] | ||||
| 	path = vendor/grammars/language-batchfile | ||||
| 	url = https://github.com/mmims/language-batchfile | ||||
| [submodule "vendor/grammars/sublime-mask"] | ||||
| 	path = vendor/grammars/sublime-mask | ||||
| 	url = https://github.com/tenbits/sublime-mask | ||||
| @@ -565,7 +550,7 @@ | ||||
| 	url = https://github.com/ShaneWilton/sublime-smali | ||||
| [submodule "vendor/grammars/language-jsoniq"] | ||||
| 	path = vendor/grammars/language-jsoniq | ||||
| 	url = http://github.com/wcandillon/language-jsoniq | ||||
| 	url = https://github.com/wcandillon/language-jsoniq | ||||
| [submodule "vendor/grammars/atom-fsharp"] | ||||
| 	path = vendor/grammars/atom-fsharp | ||||
| 	url = https://github.com/fsprojects/atom-fsharp | ||||
| @@ -608,9 +593,6 @@ | ||||
| [submodule "vendor/grammars/X10"] | ||||
| 	path = vendor/grammars/X10 | ||||
| 	url = https://github.com/x10-lang/x10-highlighting | ||||
| [submodule "vendor/grammars/language-babel"] | ||||
| 	path = vendor/grammars/language-babel | ||||
| 	url = https://github.com/gandm/language-babel | ||||
| [submodule "vendor/grammars/UrWeb-Language-Definition"] | ||||
| 	path = vendor/grammars/UrWeb-Language-Definition | ||||
| 	url = https://github.com/gwalborn/UrWeb-Language-Definition.git | ||||
| @@ -675,8 +657,8 @@ | ||||
| 	path = vendor/grammars/pig-latin | ||||
| 	url = https://github.com/goblindegook/sublime-text-pig-latin | ||||
| [submodule "vendor/grammars/sourcepawn"] | ||||
| path = vendor/grammars/sourcepawn | ||||
| url = https://github.com/austinwagner/sublime-sourcepawn | ||||
| 	path = vendor/grammars/sourcepawn | ||||
| 	url = https://github.com/github-linguist/sublime-sourcepawn | ||||
| [submodule "vendor/grammars/gdscript"] | ||||
| 	path = vendor/grammars/gdscript | ||||
| 	url = https://github.com/beefsack/GDScript-sublime | ||||
| @@ -755,3 +737,76 @@ 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/language-rpm-spec"] | ||||
| 	path = vendor/grammars/language-rpm-spec | ||||
| 	url = https://github.com/waveclaw/language-rpm-spec | ||||
| [submodule "vendor/grammars/language-emacs-lisp"] | ||||
| 	path = vendor/grammars/language-emacs-lisp | ||||
| 	url = https://github.com/Alhadis/language-emacs-lisp | ||||
| [submodule "vendor/grammars/language-babel"] | ||||
| 	path = vendor/grammars/language-babel | ||||
| 	url = https://github.com/github-linguist/language-babel | ||||
| [submodule "vendor/CodeMirror"] | ||||
| 	path = vendor/CodeMirror | ||||
| 	url = https://github.com/codemirror/CodeMirror | ||||
| [submodule "vendor/grammars/MQL5-sublime"] | ||||
| 	path = vendor/grammars/MQL5-sublime | ||||
| 	url = https://github.com/mqsoft/MQL5-sublime | ||||
| [submodule "vendor/grammars/actionscript3-tmbundle"] | ||||
| 	path = vendor/grammars/actionscript3-tmbundle | ||||
| 	url = https://github.com/simongregory/actionscript3-tmbundle | ||||
| [submodule "vendor/grammars/ABNF.tmbundle"] | ||||
| 	path = vendor/grammars/ABNF.tmbundle | ||||
| 	url = https://github.com/sanssecours/ABNF.tmbundle | ||||
| [submodule "vendor/grammars/EBNF.tmbundle"] | ||||
| 	path = vendor/grammars/EBNF.tmbundle | ||||
| 	url = https://github.com/sanssecours/EBNF.tmbundle | ||||
| [submodule "vendor/grammars/language-haml"] | ||||
| 	path = vendor/grammars/language-haml | ||||
| 	url = https://github.com/ezekg/language-haml | ||||
| [submodule "vendor/grammars/language-ninja"] | ||||
| 	path = vendor/grammars/language-ninja | ||||
| 	url = https://github.com/khyo/language-ninja | ||||
| [submodule "vendor/grammars/language-fontforge"] | ||||
| 	path = vendor/grammars/language-fontforge | ||||
| 	url = https://github.com/Alhadis/language-fontforge | ||||
| [submodule "vendor/grammars/language-gn"] | ||||
| 	path = vendor/grammars/language-gn | ||||
| 	url = https://github.com/devoncarew/language-gn | ||||
| [submodule "vendor/grammars/rascal-syntax-highlighting"] | ||||
| 	path = vendor/grammars/rascal-syntax-highlighting | ||||
| 	url = https://github.com/usethesource/rascal-syntax-highlighting | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,7 @@ To add support for a new extension: | ||||
| In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken: | ||||
|  | ||||
| 0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping @arfon or @bkeepers to help with this) to ensure we're not misclassifying files. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. | ||||
|  | ||||
|  | ||||
| @@ -27,18 +27,16 @@ We try only to add languages once they have some usage on GitHub. In most cases | ||||
|  | ||||
| To add support for a new language: | ||||
|  | ||||
| 0. Add an entry for your language to [`languages.yml`][languages]. | ||||
| 0. Add a grammar for your language. Please only add grammars that have 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,9 +79,14 @@ Here's our current build status: [ | ||||
| - @larsbrinkhoff | ||||
| - @pchaigno | ||||
| - **@Alhadis** | ||||
| - **@arfon** | ||||
| - **@brandonblack** (GitHub staff) | ||||
| - **@larsbrinkhoff** | ||||
| - **@lildude** (GitHub staff) | ||||
| - **@lizzhale** (GitHub staff) | ||||
| - **@mikemcquaid** (GitHub staff) | ||||
| - **@pchaigno** | ||||
|  | ||||
| As Linguist is a production dependency for GitHub we have a couple of workflow restrictions: | ||||
|  | ||||
| @@ -112,5 +115,6 @@ If you are the current maintainer of this gem: | ||||
|  | ||||
| [grammars]: /grammars.yml | ||||
| [languages]: /lib/linguist/languages.yml | ||||
| [licenses]: https://github.com/github/linguist/blob/257425141d4e2a5232786bf0b13c901ada075f93/vendor/licenses/config.yml#L2-L11 | ||||
| [samples]: /samples | ||||
| [new-issue]: https://github.com/github/linguist/issues/new | ||||
|   | ||||
| @@ -20,6 +20,12 @@ The Language stats bar displays languages percentages for the files in the repos | ||||
| 0. If the files are being misclassified, search for [open issues][issues] to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful. | ||||
| 0. If there are no reported issues of this misclassification, [open an issue][new-issue] and include a link to the repository or a sample of the code that is being misclassified. | ||||
|  | ||||
| ### There's a problem with the syntax highlighting of a file | ||||
|  | ||||
| Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [and may be found here](https://github.com/github/linguist/blob/master/vendor/README.md). | ||||
|  | ||||
| If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem and so upstream bug fixes are automatically incorporated as they are fixed. | ||||
|  | ||||
| ## Overrides | ||||
|  | ||||
| Linguist supports a number of different custom overrides strategies for language definitions and vendored paths. | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class GitLinguist | ||||
|     if @incremental && stats = load_language_stats | ||||
|       old_commit_oid, old_stats = stats | ||||
|  | ||||
|       # A cache with NULL oid means that we want to froze | ||||
|       # A cache with NULL oid means that we want to freeze | ||||
|       # these language stats in place and stop computing | ||||
|       # them (for performance reasons) | ||||
|       return old_stats if old_commit_oid == NULL_OID | ||||
| @@ -111,7 +111,7 @@ def git_linguist(args) | ||||
|   parser.parse!(args) | ||||
|  | ||||
|   git_dir = `git rev-parse --git-dir`.strip | ||||
|   raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success? | ||||
|   raise "git-linguist must be run in a Git repository (#{Dir.pwd})" unless $?.success? | ||||
|   wrapper = GitLinguist.new(git_dir, commit, incremental) | ||||
|  | ||||
|   case args.pop | ||||
|   | ||||
| @@ -26,6 +26,5 @@ Gem::Specification.new do |s| | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
|   s.add_development_dependency 'color-proximity', '~> 0.2.1' | ||||
|   s.add_development_dependency 'licensed' | ||||
|   s.add_development_dependency 'licensee', '>= 8.3.0' | ||||
|  | ||||
|   s.add_development_dependency 'licensee', '>= 8.6.0' | ||||
| end | ||||
|   | ||||
							
								
								
									
										199
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										199
									
								
								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,10 +360,30 @@ vendor/grammars/language-csound: | ||||
| - source.csound | ||||
| - source.csound-document | ||||
| - source.csound-score | ||||
| vendor/grammars/language-emacs-lisp: | ||||
| - source.emacs.lisp | ||||
| vendor/grammars/language-fontforge: | ||||
| - source.fontforge | ||||
| - source.opentype | ||||
| - text.sfd | ||||
| vendor/grammars/language-gfm: | ||||
| - source.gfm | ||||
| vendor/grammars/language-gn: | ||||
| - source.gn | ||||
| vendor/grammars/language-graphql: | ||||
| - source.graphql | ||||
| vendor/grammars/language-haml: | ||||
| - text.haml | ||||
| - text.hamlc | ||||
| vendor/grammars/language-haskell: | ||||
| - hint.haskell | ||||
| - hint.message.haskell | ||||
| - 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: | ||||
| @@ -372,15 +392,17 @@ vendor/grammars/language-javascript: | ||||
| - source.js | ||||
| - source.js.regexp | ||||
| - source.js.regexp.replacement | ||||
| vendor/grammars/language-jsoniq/: | ||||
| vendor/grammars/language-jsoniq: | ||||
| - source.jq | ||||
| - source.xq | ||||
| vendor/grammars/language-less/: | ||||
| vendor/grammars/language-less: | ||||
| - source.css.less | ||||
| vendor/grammars/language-maxscript: | ||||
| - source.maxscript | ||||
| vendor/grammars/language-ncl: | ||||
| - source.ncl | ||||
| vendor/grammars/language-ninja: | ||||
| - source.ninja | ||||
| vendor/grammars/language-povray: | ||||
| - source.pov-ray sdl | ||||
| vendor/grammars/language-python: | ||||
| @@ -390,6 +412,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 +429,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 +438,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 +472,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 | ||||
| @@ -452,8 +484,6 @@ vendor/grammars/nemerle.tmbundle: | ||||
| - source.nemerle | ||||
| vendor/grammars/nesC: | ||||
| - source.nesc | ||||
| vendor/grammars/ninja.tmbundle: | ||||
| - source.ninja | ||||
| vendor/grammars/nix: | ||||
| - source.nix | ||||
| vendor/grammars/nu.tmbundle: | ||||
| @@ -474,11 +504,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 +521,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 | ||||
| @@ -507,8 +539,8 @@ vendor/grammars/python-django.tmbundle: | ||||
| vendor/grammars/r.tmbundle: | ||||
| - source.r | ||||
| - text.tex.latex.rd | ||||
| vendor/grammars/ruby-haml.tmbundle: | ||||
| - text.haml | ||||
| vendor/grammars/rascal-syntax-highlighting: | ||||
| - source.rascal | ||||
| vendor/grammars/ruby-slim.tmbundle: | ||||
| - text.slim | ||||
| vendor/grammars/ruby.tmbundle: | ||||
| @@ -526,11 +558,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 +575,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 +585,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 +599,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 +631,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,9 +652,11 @@ 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 | ||||
|   | ||||
| @@ -59,8 +59,9 @@ class << Linguist | ||||
|   # Strategies are called in turn until a single Language is returned. | ||||
|   STRATEGIES = [ | ||||
|     Linguist::Strategy::Modeline, | ||||
|     Linguist::Shebang, | ||||
|     Linguist::Strategy::Filename, | ||||
|     Linguist::Shebang, | ||||
|     Linguist::Strategy::Extension, | ||||
|     Linguist::Heuristics, | ||||
|     Linguist::Classifier | ||||
|   ] | ||||
|   | ||||
| @@ -63,7 +63,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns an Array | ||||
|     def extensions | ||||
|       _, *segments = name.downcase.split(".") | ||||
|       _, *segments = name.downcase.split(".", -1) | ||||
|  | ||||
|       segments.map.with_index do |segment, index| | ||||
|         "." + segments[index..-1].join(".") | ||||
|   | ||||
| @@ -56,6 +56,7 @@ module Linguist | ||||
|       generated_net_specflow_feature_file? || | ||||
|       composer_lock? || | ||||
|       node_modules? || | ||||
|       go_vendor? || | ||||
|       npm_shrinkwrap? || | ||||
|       godeps? || | ||||
|       generated_by_zephir? || | ||||
| @@ -274,16 +275,14 @@ module Linguist | ||||
|       return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!") | ||||
|     end | ||||
|  | ||||
|     APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'] | ||||
|     APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php'] | ||||
|  | ||||
|     # Internal: Is the blob generated by Apache Thrift compiler? | ||||
|     # | ||||
|     # Returns true or false | ||||
|     def generated_apache_thrift? | ||||
|       return false unless APACHE_THRIFT_EXTENSIONS.include?(extname) | ||||
|       return false unless lines.count > 1 | ||||
|  | ||||
|       return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler") | ||||
|       return lines.first(6).any? { |l| l.include?("Autogenerated by Thrift Compiler") } | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a C/C++ header generated by the Java JNI tool javah? | ||||
| @@ -304,6 +303,14 @@ module Linguist | ||||
|       !!name.match(/node_modules\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob part of the Go vendor/ tree, | ||||
|     # not meant for humans in pull requests. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def go_vendor? | ||||
|       !!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated npm shrinkwrap file. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|   | ||||
| @@ -110,6 +110,12 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".cls" do |data| | ||||
|       if /\\\w+{/.match(data) | ||||
|         Language["TeX"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".cs" do |data| | ||||
|       if /![\w\s]+methodsFor: /.match(data) | ||||
|         Language["Smalltalk"] | ||||
| @@ -144,10 +150,22 @@ module Linguist | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".for", ".f" do |data| | ||||
|     fortran_rx = /^([c*][^abd-z]|      (subroutine|program|end|data)\s|\s*!)/i | ||||
|  | ||||
|     disambiguate ".f" do |data| | ||||
|       if /^: /.match(data) | ||||
|         Language["Forth"] | ||||
|       elsif /^([c*][^abd-z]|      (subroutine|program|end)\s|\s*!)/i.match(data) | ||||
|       elsif data.include?("flowop") | ||||
|         Language["Filebench WML"] | ||||
|       elsif fortran_rx.match(data) | ||||
|         Language["FORTRAN"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".for" do |data| | ||||
|       if /^: /.match(data) | ||||
|         Language["Forth"] | ||||
|       elsif fortran_rx.match(data) | ||||
|         Language["FORTRAN"] | ||||
|       end | ||||
|     end | ||||
| @@ -190,6 +208,8 @@ module Linguist | ||||
|     disambiguate ".inc" do |data| | ||||
|       if /^<\?(?:php)?/.match(data) | ||||
|         Language["PHP"] | ||||
|       elsif /^\s*#(declare|local|macro|while)\s/.match(data) | ||||
|         Language["POV-Ray SDL"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -230,7 +250,7 @@ module Linguist | ||||
|         Language["MUF"] | ||||
|       elsif /^\s*;/.match(data) | ||||
|         Language["M"] | ||||
|       elsif /^\s*\(\*/.match(data) | ||||
|       elsif /\*\)$/.match(data) | ||||
|         Language["Mathematica"] | ||||
|       elsif /^\s*%/.match(data) | ||||
|         Language["Matlab"] | ||||
| @@ -240,7 +260,7 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".md" do |data| | ||||
|       if /^[-a-z0-9=#!\*\[|]/i.match(data) | ||||
|       if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty? | ||||
|         Language["Markdown"] | ||||
|       elsif /^(;;|\(define_)/.match(data) | ||||
|         Language["GCC machine description"] | ||||
| @@ -354,11 +374,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 +450,7 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".ts" do |data| | ||||
|       if data.include?("</TS>") | ||||
|       if data.include?("<TS") | ||||
|         Language["XML"] | ||||
|       else | ||||
|         Language["TypeScript"] | ||||
|   | ||||
| @@ -11,6 +11,7 @@ require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/strategy/filename' | ||||
| require 'linguist/strategy/extension' | ||||
| require 'linguist/strategy/modeline' | ||||
| require 'linguist/shebang' | ||||
|  | ||||
| @@ -24,6 +25,7 @@ module Linguist | ||||
|     @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,18 +86,9 @@ module Linguist | ||||
|         @filename_index[filename] << language | ||||
|       end | ||||
|  | ||||
|       language | ||||
|     end | ||||
|       @language_id_index[language.language_id] = language | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that includes the Linguist `BlobHelper` interface; | ||||
|     #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|     # | ||||
|     # Returns Language or nil. | ||||
|     def self.detect(blob) | ||||
|       warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}" | ||||
|       Linguist.detect(blob) | ||||
|       language | ||||
|     end | ||||
|  | ||||
|     # Public: Get all Languages | ||||
| @@ -137,46 +130,46 @@ module Linguist | ||||
|  | ||||
|     # Public: Look up Languages by filename. | ||||
|     # | ||||
|     # The behaviour of this method recently changed. | ||||
|     # See the second example below. | ||||
|     # | ||||
|     # filename - The path String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_filename('Cakefile') | ||||
|     #   # => [#<Language name="CoffeeScript">] | ||||
|     #   Language.find_by_filename('foo.rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     #   # => [] | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename = File.basename(filename) | ||||
|  | ||||
|       # find the first extension with language definitions | ||||
|       extname = FileBlob.new(filename).extensions.detect do |e| | ||||
|         !@extension_index[e].empty? | ||||
|       end | ||||
|  | ||||
|       (@filename_index[basename] + @extension_index[extname]).compact.uniq | ||||
|       @filename_index[basename] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by file extension. | ||||
|     # | ||||
|     # extname - The extension String. | ||||
|     # The behaviour of this method recently changed. | ||||
|     # See the second example below. | ||||
|     # | ||||
|     # filename - The path String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_extension('.rb') | ||||
|     #   Language.find_by_extension('dummy.rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     # | ||||
|     #   Language.find_by_extension('rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     #   # => [] | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_extension(extname) | ||||
|       extname = ".#{extname}" unless extname.start_with?(".") | ||||
|       @extension_index[extname.downcase] | ||||
|     def self.find_by_extension(filename) | ||||
|       # find the first extension with language definitions | ||||
|       extname = FileBlob.new(filename.downcase).extensions.detect do |e| | ||||
|         !@extension_index[e].empty? | ||||
|       end | ||||
|  | ||||
|     # DEPRECATED | ||||
|     def self.find_by_shebang(data) | ||||
|       @interpreter_index[Shebang.interpreter(data)] | ||||
|       @extension_index[extname] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by interpreter. | ||||
| @@ -193,6 +186,19 @@ module Linguist | ||||
|       @interpreter_index[interpreter] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by its language_id. | ||||
|     # | ||||
|     # language_id - Integer of language_id | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_id(100) | ||||
|     #   # => [#<Language name="Elixir">] | ||||
|     # | ||||
|     # Returns the matching Language | ||||
|     def self.find_by_id(language_id) | ||||
|       @language_id_index[language_id.to_i] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by its name. | ||||
|     # | ||||
| @@ -243,17 +249,6 @@ module Linguist | ||||
|       @colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase } | ||||
|     end | ||||
|  | ||||
|     # Public: A List of languages compatible with Ace. | ||||
|     # | ||||
|     # TODO: Remove this method in a 5.x release. Every language now needs an ace_mode | ||||
|     # key, so this function isn't doing anything unique anymore. | ||||
|     # | ||||
|     # Returns an Array of Languages. | ||||
|     def self.ace_modes | ||||
|       warn "This method will be deprecated in a future 5.x release. Every language now has an `ace_mode` set." | ||||
|       @ace_modes ||= all.select(&:ace_mode).sort_by { |lang| lang.name.downcase } | ||||
|     end | ||||
|  | ||||
|     # Internal: Initialize a new Language | ||||
|     # | ||||
|     # attributes - A hash of attributes | ||||
| @@ -284,11 +279,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]   || [] | ||||
| @@ -340,16 +340,16 @@ module Linguist | ||||
|     # Returns an Array of String names | ||||
|     attr_reader :aliases | ||||
|  | ||||
|     # Deprecated: Get code search term | ||||
|     # Public: Get language_id (used in GitHub search) | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   # => "ruby" | ||||
|     #   # => "python" | ||||
|     #   # => "perl" | ||||
|     #   # => "1" | ||||
|     #   # => "2" | ||||
|     #   # => "3" | ||||
|     # | ||||
|     # Returns the name String | ||||
|     attr_reader :search_term | ||||
|     # Returns the integer language_id | ||||
|     attr_reader :language_id | ||||
|  | ||||
|     # Public: Get the name of a TextMate-compatible scope | ||||
|     # | ||||
| @@ -367,6 +367,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 | ||||
| @@ -399,22 +424,6 @@ module Linguist | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :filenames | ||||
|  | ||||
|     # Deprecated: Get primary extension | ||||
|     # | ||||
|     # Defaults to the first extension but can be overridden | ||||
|     # in the languages.yml. | ||||
|     # | ||||
|     # The primary extension can not be nil. Tests should verify this. | ||||
|     # | ||||
|     # This method is only used by app/helpers/gists_helper.rb for creating | ||||
|     # the language dropdown. It really should be using `name` instead. | ||||
|     # Would like to drop primary extension. | ||||
|     # | ||||
|     # Returns the extension String. | ||||
|     def primary_extension | ||||
|       extensions.first | ||||
|     end | ||||
|  | ||||
|     # Public: Get URL escaped name. | ||||
|     # | ||||
|     # Examples | ||||
| @@ -543,10 +552,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
											
										
									
								
							| @@ -26,4 +26,4 @@ | ||||
| - Shell | ||||
| - Swift | ||||
| - TeX | ||||
| - VimL | ||||
| - Vim script | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/linguist/strategy/extension.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								lib/linguist/strategy/extension.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     # Detects language based on extension | ||||
|     class Extension | ||||
|       def self.call(blob, _) | ||||
|         Language.find_by_extension(blob.name.to_s) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @@ -1,9 +1,10 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     # Detects language based on filename and/or extension | ||||
|     # Detects language based on filename | ||||
|     class Filename | ||||
|       def self.call(blob, _) | ||||
|         Language.find_by_filename(blob.name.to_s) | ||||
|         name = blob.name.to_s | ||||
|         Language.find_by_filename(name) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   | ||||
| @@ -1,19 +1,98 @@ | ||||
| module Linguist | ||||
|   module Strategy | ||||
|     class Modeline | ||||
|       EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i | ||||
|       EMACS_MODELINE = / | ||||
|         -\*- | ||||
|         (?: | ||||
|           # Short form: `-*- ruby -*-` | ||||
|           \s* (?= [^:;\s]+ \s* -\*-) | ||||
|           | | ||||
|           # Longer form: `-*- foo:bar; mode: ruby; -*-` | ||||
|           (?: | ||||
|             .*?       # Preceding variables: `-*- foo:bar bar:baz;` | ||||
|             [;\s]     # Which are delimited by spaces or semicolons | ||||
|             | | ||||
|             (?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-` | ||||
|           ) | ||||
|           mode        # Major mode indicator | ||||
|           \s*:\s*     # Allow whitespace around colon: `mode : ruby` | ||||
|         ) | ||||
|         ([^:;\s]+)    # Name of mode | ||||
|  | ||||
|       # First form vim modeline | ||||
|       # [text]{white}{vi:|vim:|ex:}[white]{options} | ||||
|       # ex: 'vim: syntax=ruby' | ||||
|       VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i | ||||
|         # Ensure the mode is terminated correctly | ||||
|         (?= | ||||
|           # Followed by semicolon or whitespace | ||||
|           [\s;] | ||||
|           | | ||||
|           # Touching the ending sequence: `ruby-*-` | ||||
|           (?<![-*])   # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode | ||||
|           -\*-        # Emacs has no problems reading `ruby --*-`, however. | ||||
|         ) | ||||
|         .*?           # Anything between a cleanly-terminated mode and the ending -*- | ||||
|         -\*- | ||||
|       /xi | ||||
|  | ||||
|       # Second form vim modeline (compatible with some versions of Vi) | ||||
|       # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] | ||||
|       # ex: 'vim set syntax=ruby:' | ||||
|       VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i | ||||
|       VIM_MODELINE   = / | ||||
|  | ||||
|       MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] | ||||
|         # Start modeline. Could be `vim:`, `vi:` or `ex:` | ||||
|         (?: | ||||
|           (?:\s|^) | ||||
|           vi | ||||
|           (?:m[<=>]?\d+|m)? # Version-specific modeline | ||||
|           | | ||||
|           [\t\x20] # `ex:` requires whitespace, because "ex:" might be short for "example:" | ||||
|           ex | ||||
|         ) | ||||
|  | ||||
|         # If the option-list begins with `set ` or `se `, it indicates an alternative | ||||
|         # modeline syntax partly-compatible with older versions of Vi. Here, the colon | ||||
|         # serves as a terminator for an option sequence, delimited by whitespace. | ||||
|         (?= | ||||
|           # So we have to ensure the modeline ends with a colon | ||||
|           : (?=\s* set? \s [^\n:]+ :) | | ||||
|  | ||||
|           # Otherwise, it isn't valid syntax and should be ignored | ||||
|           : (?!\s* set? \s) | ||||
|         ) | ||||
|  | ||||
|         # Possible (unrelated) `option=value` pairs to skip past | ||||
|         (?: | ||||
|           # Option separator. Vim uses whitespace or colons to separate options (except if | ||||
|           # the alternate "vim: set " form is used, where only whitespace is used) | ||||
|           (?: | ||||
|             \s | ||||
|             | | ||||
|             \s* : \s* # Note that whitespace around colons is accepted too: | ||||
|           )           # vim: noai :  ft=ruby:noexpandtab | ||||
|  | ||||
|           # Option's name. All recognised Vim options have an alphanumeric form. | ||||
|           \w* | ||||
|  | ||||
|           # Possible value. Not every option takes an argument. | ||||
|           (?: | ||||
|             # Whitespace between name and value is allowed: `vim: ft   =ruby` | ||||
|             \s*= | ||||
|  | ||||
|             # Option's value. Might be blank; `vim: ft= ` says "use no filetype". | ||||
|             (?: | ||||
|               [^\\\s] # Beware of escaped characters: titlestring=\ ft=ruby | ||||
|               |       # will be read by Vim as { titlestring: " ft=ruby" }. | ||||
|               \\. | ||||
|             )* | ||||
|           )? | ||||
|         )* | ||||
|  | ||||
|         # The actual filetype declaration | ||||
|         [\s:] (?:filetype|ft|syntax) \s*= | ||||
|  | ||||
|         # Language's name | ||||
|         (\w+) | ||||
|  | ||||
|         # Ensure it's followed by a legal separator | ||||
|         (?=\s|:|$) | ||||
|       /xi | ||||
|  | ||||
|       MODELINES = [EMACS_MODELINE, VIM_MODELINE] | ||||
|  | ||||
|       # Scope of the search for modelines | ||||
|       # Number of lines to check at the beginning and at the end of the file | ||||
|   | ||||
| @@ -15,6 +15,9 @@ | ||||
| # Dependencies | ||||
| - ^[Dd]ependencies/ | ||||
|  | ||||
| # Distributions | ||||
| - (^|/)dist/ | ||||
|  | ||||
| # C deps | ||||
| #  https://github.com/joyent/node | ||||
| - ^deps/ | ||||
| @@ -47,6 +50,9 @@ | ||||
| # Go dependencies | ||||
| - Godeps/_workspace/ | ||||
|  | ||||
| # GNU indent profiles | ||||
| - .indent.pro | ||||
|  | ||||
| # Minified JavaScript and CSS | ||||
| - (\.|-)min\.(js|css)$ | ||||
|  | ||||
| @@ -165,7 +171,7 @@ | ||||
| # Chart.js | ||||
| - (^|/)Chart\.js$ | ||||
|  | ||||
| # Codemirror | ||||
| # CodeMirror | ||||
| - (^|/)[Cc]ode[Mm]irror/(\d+\.\d+/)?(lib|mode|theme|addon|keymap|demo) | ||||
|  | ||||
| # SyntaxHighlighter - http://alexgorbatchev.com/ | ||||
| @@ -229,6 +235,9 @@ | ||||
| # Fabric | ||||
| - Fabric.framework/ | ||||
|  | ||||
| # BuddyBuild | ||||
| - BuddyBuildSDK.framework/ | ||||
|  | ||||
| # git config files | ||||
| - gitattributes$ | ||||
| - gitignore$ | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "4.8.8" | ||||
|   VERSION = "5.0.0" | ||||
| 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"))) | ||||
							
								
								
									
										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" | ||||
							
								
								
									
										6
									
								
								samples/Fortran/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Fortran/bug-185631.f
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| ! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/ | ||||
|       real onemu, twomu | ||||
|       data onemu/0.0098/ | ||||
|       data twomu/1./ | ||||
|       data threemu/0.e9/ | ||||
|       end | ||||
							
								
								
									
										59
									
								
								samples/GN/BUILD.2.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/GN/BUILD.2.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| # Copyright 2016 the V8 project authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("../gni/isolate.gni") | ||||
|  | ||||
| group("gn_all") { | ||||
|   testonly = true | ||||
|  | ||||
|   if (v8_test_isolation_mode != "noop") { | ||||
|     deps = [ | ||||
|       ":check-static-initializers_run", | ||||
|       ":jsfunfuzz_run", | ||||
|       ":run-deopt-fuzzer_run", | ||||
|       ":run-gcmole_run", | ||||
|       ":run-valgrind_run", | ||||
|     ] | ||||
|   } | ||||
| } | ||||
|  | ||||
| v8_isolate_run("check-static-initializers") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "check-static-initializers.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("jsfunfuzz") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "jsfunfuzz/jsfunfuzz.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-deopt-fuzzer") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "run-deopt-fuzzer.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-gcmole") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "gcmole/run-gcmole.isolate" | ||||
| } | ||||
|  | ||||
| v8_isolate_run("run-valgrind") { | ||||
|   deps = [ | ||||
|     "..:d8_run", | ||||
|   ] | ||||
|  | ||||
|   isolate = "run-valgrind.isolate" | ||||
| } | ||||
							
								
								
									
										1646
									
								
								samples/GN/BUILD.3.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1646
									
								
								samples/GN/BUILD.3.gn
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2583
									
								
								samples/GN/BUILD.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2583
									
								
								samples/GN/BUILD.gn
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2781
									
								
								samples/GN/android-rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2781
									
								
								samples/GN/android-rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								samples/GN/clang.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/GN/clang.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # Copyright 2014 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/toolchain/toolchain.gni") | ||||
|  | ||||
| declare_args() { | ||||
|   # Indicates if the build should use the Chrome-specific plugins for enforcing | ||||
|   # coding guidelines, etc. Only used when compiling with Clang. | ||||
|   clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang | ||||
|  | ||||
|   clang_base_path = "//third_party/llvm-build/Release+Asserts" | ||||
| } | ||||
							
								
								
									
										25
									
								
								samples/GN/filenames/.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/GN/filenames/.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| # This file is used by the GN meta build system to find the root of the source | ||||
| # tree and to set startup options. For documentation on the values set in this | ||||
| # file, run "gn help dotfile" at the command line. | ||||
|  | ||||
| import("//build/dotfile_settings.gni") | ||||
|  | ||||
| # The location of the build configuration file. | ||||
| buildconfig = "//build/config/BUILDCONFIG.gn" | ||||
|  | ||||
| # The secondary source root is a parallel directory tree where | ||||
| # GN build files are placed when they can not be placed directly | ||||
| # in the source tree, e.g. for third party source trees. | ||||
| secondary_source = "//build/secondary/" | ||||
|  | ||||
| # These are the targets to check headers for by default. The files in targets | ||||
| # matching these patterns (see "gn help label_pattern" for format) will have | ||||
| # their includes checked for proper dependencies when you run either | ||||
| # "gn check" or "gn gen --check". | ||||
| check_targets = [] | ||||
|  | ||||
| # These are the list of GN files that run exec_script. This whitelist exists | ||||
| # to force additional review for new uses of exec_script, which is strongly | ||||
| # discouraged except for gypi_to_gn calls. | ||||
| exec_script_whitelist = | ||||
|     build_dotfile_settings.exec_script_whitelist + [ "//test/test262/BUILD.gn" ] | ||||
							
								
								
									
										503
									
								
								samples/GN/gcc_toolchain.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										503
									
								
								samples/GN/gcc_toolchain.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,503 @@ | ||||
| # Copyright (c) 2013 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/android/config.gni") | ||||
| import("//build/config/clang/clang.gni") | ||||
| import("//build/config/nacl/config.gni") | ||||
| import("//build/config/sanitizers/sanitizers.gni") | ||||
| import("//build/config/v8_target_cpu.gni") | ||||
| import("//build/toolchain/cc_wrapper.gni") | ||||
| import("//build/toolchain/goma.gni") | ||||
| import("//build/toolchain/toolchain.gni") | ||||
|  | ||||
| # This template defines a toolchain for something that works like gcc | ||||
| # (including clang). | ||||
| # | ||||
| # It requires the following variables specifying the executables to run: | ||||
| #  - ar | ||||
| #  - cc | ||||
| #  - cxx | ||||
| #  - ld | ||||
| # | ||||
| # Optional parameters that control the tools: | ||||
| # | ||||
| #  - extra_cflags | ||||
| #      Extra flags to be appended when compiling C files (but not C++ files). | ||||
| #  - extra_cppflags | ||||
| #      Extra flags to be appended when compiling both C and C++ files. "CPP" | ||||
| #      stands for "C PreProcessor" in this context, although it can be | ||||
| #      used for non-preprocessor flags as well. Not to be confused with | ||||
| #      "CXX" (which follows). | ||||
| #  - extra_cxxflags | ||||
| #      Extra flags to be appended when compiling C++ files (but not C files). | ||||
| #  - extra_ldflags | ||||
| #      Extra flags to be appended when linking | ||||
| # | ||||
| #  - libs_section_prefix | ||||
| #  - libs_section_postfix | ||||
| #      The contents of these strings, if specified, will be placed around | ||||
| #      the libs section of the linker line. It allows one to inject libraries | ||||
| #      at the beginning and end for all targets in a toolchain. | ||||
| #  - solink_libs_section_prefix | ||||
| #  - solink_libs_section_postfix | ||||
| #      Same as libs_section_{pre,post}fix except used for solink instead of link. | ||||
| #  - link_outputs | ||||
| #      The content of this array, if specified, will be added to the list of | ||||
| #      outputs from the link command. This can be useful in conjunction with | ||||
| #      the post_link parameter. | ||||
| #  - post_link | ||||
| #      The content of this string, if specified, will be run as a separate | ||||
| #      command following the the link command. | ||||
| #  - deps | ||||
| #      Just forwarded to the toolchain definition. | ||||
| #  - executable_extension | ||||
| #      If this string is specified it will be used for the file extension | ||||
| #      for an executable, rather than using no extension; targets will | ||||
| #      still be able to override the extension using the output_extension | ||||
| #      variable. | ||||
| #  - rebuild_define | ||||
| #      The contents of this string, if specified, will be passed as a #define | ||||
| #      to the toolchain. It can be used to force recompiles whenever a | ||||
| #      toolchain is updated. | ||||
| #  - shlib_extension | ||||
| #      If this string is specified it will be used for the file extension | ||||
| #      for a shared library, rather than default value specified in | ||||
| #      toolchain.gni | ||||
| #  - strip | ||||
| #      Location of the strip executable. When specified, strip will be run on | ||||
| #      all shared libraries and executables as they are built. The pre-stripped | ||||
| #      artifacts will be put in lib.unstripped/ and exe.unstripped/. | ||||
| template("gcc_toolchain") { | ||||
|   toolchain(target_name) { | ||||
|     assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") | ||||
|     assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") | ||||
|     assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") | ||||
|     assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") | ||||
|  | ||||
|     # This define changes when the toolchain changes, forcing a rebuild. | ||||
|     # Nothing should ever use this define. | ||||
|     if (defined(invoker.rebuild_define)) { | ||||
|       rebuild_string = "-D" + invoker.rebuild_define + " " | ||||
|     } else { | ||||
|       rebuild_string = "" | ||||
|     } | ||||
|  | ||||
|     # GN's syntax can't handle more than one scope dereference at once, like | ||||
|     # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain | ||||
|     # args so we can do "invoker_toolchain_args.foo". | ||||
|     assert(defined(invoker.toolchain_args), | ||||
|            "Toolchains must specify toolchain_args") | ||||
|     invoker_toolchain_args = invoker.toolchain_args | ||||
|     assert(defined(invoker_toolchain_args.current_cpu), | ||||
|            "toolchain_args must specify a current_cpu") | ||||
|     assert(defined(invoker_toolchain_args.current_os), | ||||
|            "toolchain_args must specify a current_os") | ||||
|  | ||||
|     # When invoking this toolchain not as the default one, these args will be | ||||
|     # passed to the build. They are ignored when this is the default toolchain. | ||||
|     toolchain_args = { | ||||
|       # Populate toolchain args from the invoker. | ||||
|       forward_variables_from(invoker_toolchain_args, "*") | ||||
|  | ||||
|       # The host toolchain value computed by the default toolchain's setup | ||||
|       # needs to be passed through unchanged to all secondary toolchains to | ||||
|       # ensure that it's always the same, regardless of the values that may be | ||||
|       # set on those toolchains. | ||||
|       host_toolchain = host_toolchain | ||||
|  | ||||
|       if (!defined(invoker_toolchain_args.v8_current_cpu)) { | ||||
|         v8_current_cpu = invoker_toolchain_args.current_cpu | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # When the invoker has explicitly overridden use_goma or cc_wrapper in the | ||||
|     # toolchain args, use those values, otherwise default to the global one. | ||||
|     # This works because the only reasonable override that toolchains might | ||||
|     # supply for these values are to force-disable them. | ||||
|     if (defined(toolchain_args.use_goma)) { | ||||
|       toolchain_uses_goma = toolchain_args.use_goma | ||||
|     } else { | ||||
|       toolchain_uses_goma = use_goma | ||||
|     } | ||||
|     if (defined(toolchain_args.cc_wrapper)) { | ||||
|       toolchain_cc_wrapper = toolchain_args.cc_wrapper | ||||
|     } else { | ||||
|       toolchain_cc_wrapper = cc_wrapper | ||||
|     } | ||||
|  | ||||
|     # Compute the compiler prefix. | ||||
|     if (toolchain_uses_goma) { | ||||
|       assert(toolchain_cc_wrapper == "", | ||||
|              "Goma and cc_wrapper can't be used together.") | ||||
|       compiler_prefix = "$goma_dir/gomacc " | ||||
|     } else if (toolchain_cc_wrapper != "") { | ||||
|       compiler_prefix = toolchain_cc_wrapper + " " | ||||
|     } else { | ||||
|       compiler_prefix = "" | ||||
|     } | ||||
|  | ||||
|     cc = compiler_prefix + invoker.cc | ||||
|     cxx = compiler_prefix + invoker.cxx | ||||
|     ar = invoker.ar | ||||
|     ld = invoker.ld | ||||
|     if (defined(invoker.readelf)) { | ||||
|       readelf = invoker.readelf | ||||
|     } else { | ||||
|       readelf = "readelf" | ||||
|     } | ||||
|     if (defined(invoker.nm)) { | ||||
|       nm = invoker.nm | ||||
|     } else { | ||||
|       nm = "nm" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.shlib_extension)) { | ||||
|       default_shlib_extension = invoker.shlib_extension | ||||
|     } else { | ||||
|       default_shlib_extension = shlib_extension | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.executable_extension)) { | ||||
|       default_executable_extension = invoker.executable_extension | ||||
|     } else { | ||||
|       default_executable_extension = "" | ||||
|     } | ||||
|  | ||||
|     # Bring these into our scope for string interpolation with default values. | ||||
|     if (defined(invoker.libs_section_prefix)) { | ||||
|       libs_section_prefix = invoker.libs_section_prefix | ||||
|     } else { | ||||
|       libs_section_prefix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.libs_section_postfix)) { | ||||
|       libs_section_postfix = invoker.libs_section_postfix | ||||
|     } else { | ||||
|       libs_section_postfix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.solink_libs_section_prefix)) { | ||||
|       solink_libs_section_prefix = invoker.solink_libs_section_prefix | ||||
|     } else { | ||||
|       solink_libs_section_prefix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.solink_libs_section_postfix)) { | ||||
|       solink_libs_section_postfix = invoker.solink_libs_section_postfix | ||||
|     } else { | ||||
|       solink_libs_section_postfix = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") { | ||||
|       extra_cflags = " " + invoker.extra_cflags | ||||
|     } else { | ||||
|       extra_cflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") { | ||||
|       extra_cppflags = " " + invoker.extra_cppflags | ||||
|     } else { | ||||
|       extra_cppflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") { | ||||
|       extra_cxxflags = " " + invoker.extra_cxxflags | ||||
|     } else { | ||||
|       extra_cxxflags = "" | ||||
|     } | ||||
|  | ||||
|     if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { | ||||
|       extra_ldflags = " " + invoker.extra_ldflags | ||||
|     } else { | ||||
|       extra_ldflags = "" | ||||
|     } | ||||
|  | ||||
|     # These library switches can apply to all tools below. | ||||
|     lib_switch = "-l" | ||||
|     lib_dir_switch = "-L" | ||||
|  | ||||
|     # Object files go in this directory. | ||||
|     object_subdir = "{{target_out_dir}}/{{label_name}}" | ||||
|  | ||||
|     tool("cc") { | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "CC {{output}}" | ||||
|       outputs = [ | ||||
|         # The whitelist file is also an output, but ninja does not | ||||
|         # currently support multiple outputs for tool("cc"). | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         compile_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_compile_wrapper.py", | ||||
|                         root_build_dir) | ||||
|         command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("cxx") { | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "CXX {{output}}" | ||||
|       outputs = [ | ||||
|         # The whitelist file is also an output, but ninja does not | ||||
|         # currently support multiple outputs for tool("cxx"). | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         compile_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_compile_wrapper.py", | ||||
|                         root_build_dir) | ||||
|         command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("asm") { | ||||
|       # For GCC we can just use the C compiler to compile assembly. | ||||
|       depfile = "{{output}}.d" | ||||
|       command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" | ||||
|       depsformat = "gcc" | ||||
|       description = "ASM {{output}}" | ||||
|       outputs = [ | ||||
|         "$object_subdir/{{source_name_part}}.o", | ||||
|       ] | ||||
|     } | ||||
|  | ||||
|     tool("alink") { | ||||
|       rspfile = "{{output}}.rsp" | ||||
|       whitelist_flag = " " | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         whitelist_flag = " --resource-whitelist=\"{{output}}.whitelist\"" | ||||
|       } | ||||
|  | ||||
|       # This needs a Python script to avoid using simple sh features in this | ||||
|       # command, in case the host does not use a POSIX shell (e.g. compiling | ||||
|       # POSIX-like toolchains such as NaCl on Windows). | ||||
|       ar_wrapper = | ||||
|           rebase_path("//build/toolchain/gcc_ar_wrapper.py", root_build_dir) | ||||
|       command = "$python_path \"$ar_wrapper\"$whitelist_flag --output={{output}} --ar=\"$ar\" {{arflags}} rcsD @\"$rspfile\"" | ||||
|       description = "AR {{output}}" | ||||
|       rspfile_content = "{{inputs}}" | ||||
|       outputs = [ | ||||
|         "{{output_dir}}/{{target_output_name}}{{output_extension}}", | ||||
|       ] | ||||
|  | ||||
|       # Shared libraries go in the target out directory by default so we can | ||||
|       # generate different targets with the same name and not have them collide. | ||||
|       default_output_dir = "{{target_out_dir}}" | ||||
|       default_output_extension = ".a" | ||||
|       output_prefix = "lib" | ||||
|     } | ||||
|  | ||||
|     tool("solink") { | ||||
|       soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so". | ||||
|       sofile = "{{output_dir}}/$soname"  # Possibly including toolchain dir. | ||||
|       rspfile = sofile + ".rsp" | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|       whitelist_flag = " " | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         whitelist_file = "$sofile.whitelist" | ||||
|         whitelist_flag = " --resource-whitelist=\"$whitelist_file\"" | ||||
|       } | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" | ||||
|       } else { | ||||
|         unstripped_sofile = sofile | ||||
|       } | ||||
|  | ||||
|       # These variables are not built into GN but are helpers that | ||||
|       # implement (1) linking to produce a .so, (2) extracting the symbols | ||||
|       # from that file (3) if the extracted list differs from the existing | ||||
|       # .TOC file, overwrite it, otherwise, don't change it. | ||||
|       tocfile = sofile + ".TOC" | ||||
|  | ||||
|       link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | ||||
|  | ||||
|       assert(defined(readelf), "to solink you must have a readelf") | ||||
|       assert(defined(nm), "to solink you must have an nm") | ||||
|       strip_switch = "" | ||||
|       if (defined(invoker.strip)) { | ||||
|         strip_switch = "--strip=${invoker.strip}" | ||||
|       } | ||||
|  | ||||
|       # This needs a Python script to avoid using a complex shell command | ||||
|       # requiring sh control structures, pipelines, and POSIX utilities. | ||||
|       # The host might not have a POSIX shell and utilities (e.g. Windows). | ||||
|       solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py") | ||||
|       command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --output=\"$sofile\"$whitelist_flag -- $link_command" | ||||
|  | ||||
|       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | ||||
|  | ||||
|       description = "SOLINK $sofile" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       default_output_extension = default_shlib_extension | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|       if (shlib_subdir != ".") { | ||||
|         default_output_dir += "/$shlib_subdir" | ||||
|       } | ||||
|  | ||||
|       output_prefix = "lib" | ||||
|  | ||||
|       # Since the above commands only updates the .TOC file when it changes, ask | ||||
|       # Ninja to check if the timestamp actually changed to know if downstream | ||||
|       # dependencies should be recompiled. | ||||
|       restat = true | ||||
|  | ||||
|       # Tell GN about the output files. It will link to the sofile but use the | ||||
|       # tocfile for dependency management. | ||||
|       outputs = [ | ||||
|         sofile, | ||||
|         tocfile, | ||||
|       ] | ||||
|       if (enable_resource_whitelist_generation) { | ||||
|         outputs += [ whitelist_file ] | ||||
|       } | ||||
|       if (sofile != unstripped_sofile) { | ||||
|         outputs += [ unstripped_sofile ] | ||||
|       } | ||||
|       link_output = sofile | ||||
|       depend_output = tocfile | ||||
|     } | ||||
|  | ||||
|     tool("solink_module") { | ||||
|       soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so". | ||||
|       sofile = "{{output_dir}}/$soname" | ||||
|       rspfile = sofile + ".rsp" | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" | ||||
|       } else { | ||||
|         unstripped_sofile = sofile | ||||
|       } | ||||
|  | ||||
|       command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\"" | ||||
|         command += " && " + strip_command | ||||
|       } | ||||
|       rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | ||||
|  | ||||
|       description = "SOLINK_MODULE $sofile" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       if (defined(invoker.loadable_module_extension)) { | ||||
|         default_output_extension = invoker.loadable_module_extension | ||||
|       } else { | ||||
|         default_output_extension = default_shlib_extension | ||||
|       } | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|       if (shlib_subdir != ".") { | ||||
|         default_output_dir += "/$shlib_subdir" | ||||
|       } | ||||
|  | ||||
|       output_prefix = "lib" | ||||
|  | ||||
|       outputs = [ | ||||
|         sofile, | ||||
|       ] | ||||
|       if (sofile != unstripped_sofile) { | ||||
|         outputs += [ unstripped_sofile ] | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     tool("link") { | ||||
|       exename = "{{target_output_name}}{{output_extension}}" | ||||
|       outfile = "{{output_dir}}/$exename" | ||||
|       rspfile = "$outfile.rsp" | ||||
|       unstripped_outfile = outfile | ||||
|       pool = "//build/toolchain:link_pool($default_toolchain)" | ||||
|  | ||||
|       # Use this for {{output_extension}} expansions unless a target manually | ||||
|       # overrides it (in which case {{output_extension}} will be what the target | ||||
|       # specifies). | ||||
|       default_output_extension = default_executable_extension | ||||
|  | ||||
|       default_output_dir = "{{root_out_dir}}" | ||||
|  | ||||
|       if (defined(invoker.strip)) { | ||||
|         unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" | ||||
|       } | ||||
|  | ||||
|       command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" | ||||
|       if (defined(invoker.strip)) { | ||||
|         link_wrapper = | ||||
|             rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) | ||||
|         command = "$python_path \"$link_wrapper\" --strip=\"${invoker.strip}\" --unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command" | ||||
|       } | ||||
|       description = "LINK $outfile" | ||||
|       rspfile_content = "{{inputs}}" | ||||
|       outputs = [ | ||||
|         outfile, | ||||
|       ] | ||||
|       if (outfile != unstripped_outfile) { | ||||
|         outputs += [ unstripped_outfile ] | ||||
|       } | ||||
|       if (defined(invoker.link_outputs)) { | ||||
|         outputs += invoker.link_outputs | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # These two are really entirely generic, but have to be repeated in | ||||
|     # each toolchain because GN doesn't allow a template to be used here. | ||||
|     # See //build/toolchain/toolchain.gni for details. | ||||
|     tool("stamp") { | ||||
|       command = stamp_command | ||||
|       description = stamp_description | ||||
|     } | ||||
|     tool("copy") { | ||||
|       command = copy_command | ||||
|       description = copy_description | ||||
|     } | ||||
|  | ||||
|     forward_variables_from(invoker, [ "deps" ]) | ||||
|   } | ||||
| } | ||||
|  | ||||
| # This is a shorthand for gcc_toolchain instances based on the Chromium-built | ||||
| # version of Clang. Only the toolchain_cpu and toolchain_os variables need to | ||||
| # be specified by the invoker, and optionally toolprefix if it's a | ||||
| # cross-compile case. Note that for a cross-compile case this toolchain | ||||
| # requires a config to pass the appropriate -target option, or else it will | ||||
| # actually just be doing a native compile. The invoker can optionally override | ||||
| # use_gold too. | ||||
| template("clang_toolchain") { | ||||
|   if (defined(invoker.toolprefix)) { | ||||
|     toolprefix = invoker.toolprefix | ||||
|   } else { | ||||
|     toolprefix = "" | ||||
|   } | ||||
|  | ||||
|   gcc_toolchain(target_name) { | ||||
|     prefix = rebase_path("$clang_base_path/bin", root_build_dir) | ||||
|     cc = "$prefix/clang" | ||||
|     cxx = "$prefix/clang++" | ||||
|     ld = cxx | ||||
|  | ||||
|     readelf = "${toolprefix}readelf" | ||||
|     ar = "${toolprefix}ar" | ||||
|     nm = "${toolprefix}nm" | ||||
|  | ||||
|     forward_variables_from(invoker, [ "strip" ]) | ||||
|  | ||||
|     toolchain_args = { | ||||
|       if (defined(invoker.toolchain_args)) { | ||||
|         forward_variables_from(invoker.toolchain_args, "*") | ||||
|       } | ||||
|       is_clang = true | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										235
									
								
								samples/GN/icu.gn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								samples/GN/icu.gn
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| # Copyright 2016 The Chromium Authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/linux/pkg_config.gni") | ||||
| import("//build/shim_headers.gni") | ||||
|  | ||||
| group("icu") { | ||||
|   public_deps = [ | ||||
|     ":icui18n", | ||||
|     ":icuuc", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| config("icu_config") { | ||||
|   defines = [ | ||||
|     "USING_SYSTEM_ICU=1", | ||||
|     "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| pkg_config("system_icui18n") { | ||||
|   packages = [ "icu-i18n" ] | ||||
| } | ||||
|  | ||||
| pkg_config("system_icuuc") { | ||||
|   packages = [ "icu-uc" ] | ||||
| } | ||||
|  | ||||
| source_set("icui18n") { | ||||
|   deps = [ | ||||
|     ":icui18n_shim", | ||||
|   ] | ||||
|   public_configs = [ | ||||
|     ":icu_config", | ||||
|     ":system_icui18n", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| source_set("icuuc") { | ||||
|   deps = [ | ||||
|     ":icuuc_shim", | ||||
|   ] | ||||
|   public_configs = [ | ||||
|     ":icu_config", | ||||
|     ":system_icuuc", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| shim_headers("icui18n_shim") { | ||||
|   root_path = "source/i18n" | ||||
|   headers = [ | ||||
|     # This list can easily be updated using the command below: | ||||
|     # find third_party/icu/source/i18n/unicode \ | ||||
|     # -iname '*.h' -printf '"%p",\n' | \ | ||||
|     # sed -e 's|third_party/icu/i18n/common/||' | sort -u | ||||
|     "unicode/alphaindex.h", | ||||
|     "unicode/basictz.h", | ||||
|     "unicode/calendar.h", | ||||
|     "unicode/choicfmt.h", | ||||
|     "unicode/coleitr.h", | ||||
|     "unicode/coll.h", | ||||
|     "unicode/compactdecimalformat.h", | ||||
|     "unicode/curramt.h", | ||||
|     "unicode/currpinf.h", | ||||
|     "unicode/currunit.h", | ||||
|     "unicode/datefmt.h", | ||||
|     "unicode/dcfmtsym.h", | ||||
|     "unicode/decimfmt.h", | ||||
|     "unicode/dtfmtsym.h", | ||||
|     "unicode/dtitvfmt.h", | ||||
|     "unicode/dtitvinf.h", | ||||
|     "unicode/dtptngen.h", | ||||
|     "unicode/dtrule.h", | ||||
|     "unicode/fieldpos.h", | ||||
|     "unicode/fmtable.h", | ||||
|     "unicode/format.h", | ||||
|     "unicode/fpositer.h", | ||||
|     "unicode/gender.h", | ||||
|     "unicode/gregocal.h", | ||||
|     "unicode/locdspnm.h", | ||||
|     "unicode/measfmt.h", | ||||
|     "unicode/measunit.h", | ||||
|     "unicode/measure.h", | ||||
|     "unicode/msgfmt.h", | ||||
|     "unicode/numfmt.h", | ||||
|     "unicode/numsys.h", | ||||
|     "unicode/plurfmt.h", | ||||
|     "unicode/plurrule.h", | ||||
|     "unicode/rbnf.h", | ||||
|     "unicode/rbtz.h", | ||||
|     "unicode/regex.h", | ||||
|     "unicode/region.h", | ||||
|     "unicode/reldatefmt.h", | ||||
|     "unicode/scientificnumberformatter.h", | ||||
|     "unicode/search.h", | ||||
|     "unicode/selfmt.h", | ||||
|     "unicode/simpletz.h", | ||||
|     "unicode/smpdtfmt.h", | ||||
|     "unicode/sortkey.h", | ||||
|     "unicode/stsearch.h", | ||||
|     "unicode/tblcoll.h", | ||||
|     "unicode/timezone.h", | ||||
|     "unicode/tmunit.h", | ||||
|     "unicode/tmutamt.h", | ||||
|     "unicode/tmutfmt.h", | ||||
|     "unicode/translit.h", | ||||
|     "unicode/tzfmt.h", | ||||
|     "unicode/tznames.h", | ||||
|     "unicode/tzrule.h", | ||||
|     "unicode/tztrans.h", | ||||
|     "unicode/ucal.h", | ||||
|     "unicode/ucol.h", | ||||
|     "unicode/ucoleitr.h", | ||||
|     "unicode/ucsdet.h", | ||||
|     "unicode/ucurr.h", | ||||
|     "unicode/udat.h", | ||||
|     "unicode/udateintervalformat.h", | ||||
|     "unicode/udatpg.h", | ||||
|     "unicode/udisplaycontext.h", | ||||
|     "unicode/ufieldpositer.h", | ||||
|     "unicode/uformattable.h", | ||||
|     "unicode/ugender.h", | ||||
|     "unicode/uldnames.h", | ||||
|     "unicode/ulocdata.h", | ||||
|     "unicode/umsg.h", | ||||
|     "unicode/unirepl.h", | ||||
|     "unicode/unum.h", | ||||
|     "unicode/unumsys.h", | ||||
|     "unicode/upluralrules.h", | ||||
|     "unicode/uregex.h", | ||||
|     "unicode/uregion.h", | ||||
|     "unicode/usearch.h", | ||||
|     "unicode/uspoof.h", | ||||
|     "unicode/utmscale.h", | ||||
|     "unicode/utrans.h", | ||||
|     "unicode/vtzone.h", | ||||
|   ] | ||||
| } | ||||
|  | ||||
| shim_headers("icuuc_shim") { | ||||
|   root_path = "source/common" | ||||
|   headers = [ | ||||
|     # This list can easily be updated using the command below: | ||||
|     # find third_party/icu/source/common/unicode \ | ||||
|     # -iname '*.h' -printf '"%p",\n' | \ | ||||
|     # sed -e 's|third_party/icu/source/common/||' | sort -u | ||||
|     "unicode/appendable.h", | ||||
|     "unicode/brkiter.h", | ||||
|     "unicode/bytestream.h", | ||||
|     "unicode/bytestrie.h", | ||||
|     "unicode/bytestriebuilder.h", | ||||
|     "unicode/caniter.h", | ||||
|     "unicode/chariter.h", | ||||
|     "unicode/dbbi.h", | ||||
|     "unicode/docmain.h", | ||||
|     "unicode/dtintrv.h", | ||||
|     "unicode/enumset.h", | ||||
|     "unicode/errorcode.h", | ||||
|     "unicode/filteredbrk.h", | ||||
|     "unicode/icudataver.h", | ||||
|     "unicode/icuplug.h", | ||||
|     "unicode/idna.h", | ||||
|     "unicode/listformatter.h", | ||||
|     "unicode/localpointer.h", | ||||
|     "unicode/locid.h", | ||||
|     "unicode/messagepattern.h", | ||||
|     "unicode/normalizer2.h", | ||||
|     "unicode/normlzr.h", | ||||
|     "unicode/parseerr.h", | ||||
|     "unicode/parsepos.h", | ||||
|     "unicode/platform.h", | ||||
|     "unicode/ptypes.h", | ||||
|     "unicode/putil.h", | ||||
|     "unicode/rbbi.h", | ||||
|     "unicode/rep.h", | ||||
|     "unicode/resbund.h", | ||||
|     "unicode/schriter.h", | ||||
|     "unicode/std_string.h", | ||||
|     "unicode/strenum.h", | ||||
|     "unicode/stringpiece.h", | ||||
|     "unicode/stringtriebuilder.h", | ||||
|     "unicode/symtable.h", | ||||
|     "unicode/ubidi.h", | ||||
|     "unicode/ubrk.h", | ||||
|     "unicode/ucasemap.h", | ||||
|     "unicode/ucat.h", | ||||
|     "unicode/uchar.h", | ||||
|     "unicode/ucharstrie.h", | ||||
|     "unicode/ucharstriebuilder.h", | ||||
|     "unicode/uchriter.h", | ||||
|     "unicode/uclean.h", | ||||
|     "unicode/ucnv.h", | ||||
|     "unicode/ucnv_cb.h", | ||||
|     "unicode/ucnv_err.h", | ||||
|     "unicode/ucnvsel.h", | ||||
|     "unicode/uconfig.h", | ||||
|     "unicode/udata.h", | ||||
|     "unicode/uenum.h", | ||||
|     "unicode/uidna.h", | ||||
|     "unicode/uiter.h", | ||||
|     "unicode/ulistformatter.h", | ||||
|     "unicode/uloc.h", | ||||
|     "unicode/umachine.h", | ||||
|     "unicode/umisc.h", | ||||
|     "unicode/unifilt.h", | ||||
|     "unicode/unifunct.h", | ||||
|     "unicode/unimatch.h", | ||||
|     "unicode/uniset.h", | ||||
|     "unicode/unistr.h", | ||||
|     "unicode/unorm.h", | ||||
|     "unicode/unorm2.h", | ||||
|     "unicode/uobject.h", | ||||
|     "unicode/urename.h", | ||||
|     "unicode/urep.h", | ||||
|     "unicode/ures.h", | ||||
|     "unicode/uscript.h", | ||||
|     "unicode/uset.h", | ||||
|     "unicode/usetiter.h", | ||||
|     "unicode/ushape.h", | ||||
|     "unicode/usprep.h", | ||||
|     "unicode/ustring.h", | ||||
|     "unicode/ustringtrie.h", | ||||
|     "unicode/utext.h", | ||||
|     "unicode/utf.h", | ||||
|     "unicode/utf16.h", | ||||
|     "unicode/utf32.h", | ||||
|     "unicode/utf8.h", | ||||
|     "unicode/utf_old.h", | ||||
|     "unicode/utrace.h", | ||||
|     "unicode/utypes.h", | ||||
|     "unicode/uvernum.h", | ||||
|     "unicode/uversion.h", | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										2788
									
								
								samples/GN/internal_rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2788
									
								
								samples/GN/internal_rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1422
									
								
								samples/GN/ios-rules.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1422
									
								
								samples/GN/ios-rules.gni
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										193
									
								
								samples/GN/isolate.gni
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								samples/GN/isolate.gni
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | ||||
| # Copyright 2016 the V8 project authors. All rights reserved. | ||||
| # Use of this source code is governed by a BSD-style license that can be | ||||
| # found in the LICENSE file. | ||||
|  | ||||
| import("//build/config/sanitizers/sanitizers.gni") | ||||
| import("//third_party/icu/config.gni") | ||||
| import("v8.gni") | ||||
|  | ||||
| declare_args() { | ||||
|   # Sets the test isolation mode (noop|prepare|check). | ||||
|   v8_test_isolation_mode = "noop" | ||||
| } | ||||
|  | ||||
| template("v8_isolate_run") { | ||||
|   forward_variables_from(invoker, | ||||
|                          "*", | ||||
|                          [ | ||||
|                            "deps", | ||||
|                            "isolate", | ||||
|                          ]) | ||||
|  | ||||
|   # Remember target name as within the action scope the target name will be | ||||
|   # different. | ||||
|   name = target_name | ||||
|  | ||||
|   assert(defined(invoker.deps)) | ||||
|   assert(defined(invoker.isolate)) | ||||
|  | ||||
|   if (name != "" && v8_test_isolation_mode != "noop") { | ||||
|     action(name + "_run") { | ||||
|       testonly = true | ||||
|  | ||||
|       deps = invoker.deps | ||||
|  | ||||
|       script = "//tools/isolate_driver.py" | ||||
|  | ||||
|       sources = [ | ||||
|         invoker.isolate, | ||||
|       ] | ||||
|  | ||||
|       inputs = [ | ||||
|         # Files that are known to be involved in this step. | ||||
|         "//tools/swarming_client/isolate.py", | ||||
|         "//tools/swarming_client/run_isolated.py", | ||||
|       ] | ||||
|  | ||||
|       if (v8_test_isolation_mode == "prepare") { | ||||
|         outputs = [ | ||||
|           "$root_out_dir/$name.isolated.gen.json", | ||||
|         ] | ||||
|       } else if (v8_test_isolation_mode == "check") { | ||||
|         outputs = [ | ||||
|           "$root_out_dir/$name.isolated", | ||||
|           "$root_out_dir/$name.isolated.state", | ||||
|         ] | ||||
|       } | ||||
|  | ||||
|       # Translate gn to gyp variables. | ||||
|       if (is_asan) { | ||||
|         asan = "1" | ||||
|       } else { | ||||
|         asan = "0" | ||||
|       } | ||||
|       if (is_msan) { | ||||
|         msan = "1" | ||||
|       } else { | ||||
|         msan = "0" | ||||
|       } | ||||
|       if (is_tsan) { | ||||
|         tsan = "1" | ||||
|       } else { | ||||
|         tsan = "0" | ||||
|       } | ||||
|       if (is_cfi) { | ||||
|         cfi_vptr = "1" | ||||
|       } else { | ||||
|         cfi_vptr = "0" | ||||
|       } | ||||
|       if (target_cpu == "x86") { | ||||
|         target_arch = "ia32" | ||||
|       } else { | ||||
|         target_arch = target_cpu | ||||
|       } | ||||
|       if (is_debug) { | ||||
|         configuration_name = "Debug" | ||||
|       } else { | ||||
|         configuration_name = "Release" | ||||
|       } | ||||
|       if (is_component_build) { | ||||
|         component = "shared_library" | ||||
|       } else { | ||||
|         component = "static_library" | ||||
|       } | ||||
|       if (icu_use_data_file) { | ||||
|         icu_use_data_file_flag = "1" | ||||
|       } else { | ||||
|         icu_use_data_file_flag = "0" | ||||
|       } | ||||
|       if (v8_enable_inspector) { | ||||
|         enable_inspector = "1" | ||||
|       } else { | ||||
|         enable_inspector = "0" | ||||
|       } | ||||
|       if (v8_use_external_startup_data) { | ||||
|         use_external_startup_data = "1" | ||||
|       } else { | ||||
|         use_external_startup_data = "0" | ||||
|       } | ||||
|       if (v8_use_snapshot) { | ||||
|         use_snapshot = "true" | ||||
|       } else { | ||||
|         use_snapshot = "false" | ||||
|       } | ||||
|       if (v8_has_valgrind) { | ||||
|         has_valgrind = "1" | ||||
|       } else { | ||||
|         has_valgrind = "0" | ||||
|       } | ||||
|       if (v8_gcmole) { | ||||
|         gcmole = "1" | ||||
|       } else { | ||||
|         gcmole = "0" | ||||
|       } | ||||
|  | ||||
|       # Note, all paths will be rebased in isolate_driver.py to be relative to | ||||
|       # the isolate file. | ||||
|       args = [ | ||||
|         v8_test_isolation_mode, | ||||
|         "--isolated", | ||||
|         rebase_path("$root_out_dir/$name.isolated", root_build_dir), | ||||
|         "--isolate", | ||||
|         rebase_path(invoker.isolate, root_build_dir), | ||||
|  | ||||
|         # Path variables are used to replace file paths when loading a .isolate | ||||
|         # file | ||||
|         "--path-variable", | ||||
|         "DEPTH", | ||||
|         rebase_path("//", root_build_dir), | ||||
|         "--path-variable", | ||||
|         "PRODUCT_DIR", | ||||
|         rebase_path(root_out_dir, root_build_dir), | ||||
|  | ||||
|         # TODO(machenbach): Set variables for remaining features. | ||||
|         "--config-variable", | ||||
|         "CONFIGURATION_NAME=$configuration_name", | ||||
|         "--config-variable", | ||||
|         "OS=$target_os", | ||||
|         "--config-variable", | ||||
|         "asan=$asan", | ||||
|         "--config-variable", | ||||
|         "cfi_vptr=$cfi_vptr", | ||||
|         "--config-variable", | ||||
|         "gcmole=$gcmole", | ||||
|         "--config-variable", | ||||
|         "has_valgrind=$has_valgrind", | ||||
|         "--config-variable", | ||||
|         "icu_use_data_file_flag=$icu_use_data_file_flag", | ||||
|         "--config-variable", | ||||
|         "is_gn=1", | ||||
|         "--config-variable", | ||||
|         "msan=$msan", | ||||
|         "--config-variable", | ||||
|         "tsan=$tsan", | ||||
|         "--config-variable", | ||||
|         "coverage=0", | ||||
|         "--config-variable", | ||||
|         "sanitizer_coverage=0", | ||||
|         "--config-variable", | ||||
|         "component=$component", | ||||
|         "--config-variable", | ||||
|         "target_arch=$target_arch", | ||||
|         "--config-variable", | ||||
|         "v8_enable_inspector=$enable_inspector", | ||||
|         "--config-variable", | ||||
|         "v8_use_external_startup_data=$use_external_startup_data", | ||||
|         "--config-variable", | ||||
|         "v8_use_snapshot=$use_snapshot", | ||||
|       ] | ||||
|  | ||||
|       if (is_win) { | ||||
|         args += [ | ||||
|           "--config-variable", | ||||
|           "msvs_version=2015", | ||||
|         ] | ||||
|       } else { | ||||
|         args += [ | ||||
|           "--config-variable", | ||||
|           "msvs_version=0", | ||||
|         ] | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										48
									
								
								samples/HTML+Django/nunjucks.njk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/HTML+Django/nunjucks.njk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| {% from "forms.html" import label as description %} | ||||
|  | ||||
|  | ||||
| {% macro field(name, value='', type='text') %} | ||||
|     <div class="field"> | ||||
|         <input type="{{ type }}" name="{{ name }}" | ||||
|                 value="{{ value | escape }}" /> | ||||
|     </div> | ||||
| {% endmacro %} | ||||
|  | ||||
| <html> | ||||
| <head> | ||||
|     {% extends "head.html" %} | ||||
| </head> | ||||
| <body> | ||||
| {% if horse %} | ||||
|     Chuck Norris once kicked a horse in the chin. Its descendants are known today as Giraffes. | ||||
| {% elif optimus %} | ||||
|     Chuck Norris once urinated in a semi truck's gas tank as a joke....that truck is now known as Optimus Prime. | ||||
| {% else %} | ||||
|     Chuck Norris threw a grenade and killed 50 people, then the grenade exploded. | ||||
| {% endif %} | ||||
|  | ||||
| {% block left %} | ||||
|     This is the left side! | ||||
| {% endblock %} | ||||
|  | ||||
| {% block right %} | ||||
|     This is the right side! | ||||
| {% endblock %} | ||||
|  | ||||
| {{ description('Username') }} | ||||
| {{ field('user') }} | ||||
| {{ field('pass', type='password') }} | ||||
|  | ||||
| <h1>Posts</h1> | ||||
| <ul> | ||||
|     {% for item in items %} | ||||
|         <li>{{ item.title }}</li> | ||||
|     {% else %} | ||||
|         <li>This would display if the 'item' collection were empty</li> | ||||
|     {% endfor %} | ||||
| </ul> | ||||
|  | ||||
| {# Don't escape foo #} | ||||
| {{ foo | safe }} | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										6
									
								
								samples/JSON5/filenames/.babelrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/JSON5/filenames/.babelrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "presets": [ | ||||
|     "es2015", | ||||
|     "es2016" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										60
									
								
								samples/Julia/julia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								samples/Julia/julia
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| #!/usr/bin/env julia | ||||
|  | ||||
| # From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath | ||||
| help_screen = """ | ||||
| usage: fullpath *[relative-paths] [-c] | ||||
|  | ||||
|   Prints the fullpath of the paths | ||||
|   If no paths are given as args, it will read them from stdin | ||||
|  | ||||
|   If there is only one path, the trailing newline is omitted | ||||
|  | ||||
|   The -c flag will copy the results into your pasteboard | ||||
| """ | ||||
|  | ||||
| help  = false | ||||
| copy  = false | ||||
| dir   = pwd() | ||||
| paths = [] | ||||
|  | ||||
| for arg = ARGS | ||||
|   if arg == "-h" || arg == "--help" | ||||
|     help = true | ||||
|   elseif arg == "-c" || arg == "--copy" | ||||
|     copy = true | ||||
|   elseif arg != "" | ||||
|     push!(paths, arg) | ||||
|   end | ||||
| end | ||||
|  | ||||
| if help | ||||
|   print(help_screen) | ||||
|   exit() | ||||
| end | ||||
|  | ||||
| function notempty(string) | ||||
|   return !isempty(string) | ||||
| end | ||||
|  | ||||
| if length(paths) == 0 | ||||
|   paths = filter(notempty, map(chomp, readlines())) | ||||
| end | ||||
|  | ||||
| function print_paths(stream, paths) | ||||
|   if length(paths) == 1 | ||||
|     path = paths[1] | ||||
|     print(stream, "$dir/$path") | ||||
|   else | ||||
|     for path = paths | ||||
|       println(stream, "$dir/$path") | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| if copy | ||||
|   read, write, process = readandwrite(`pbcopy`) | ||||
|   print_paths(write, paths) | ||||
|   close(write) | ||||
| end | ||||
|  | ||||
| print_paths(STDOUT, paths) | ||||
							
								
								
									
										47
									
								
								samples/MQL4/header-sample.mqh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								samples/MQL4/header-sample.mqh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                header-sample.mqh | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| Permission is hereby granted, free of charge, to any person      | | ||||
| //| obtaining a copy of this software and associated documentation   | | ||||
| //| files (the "Software"), to deal in the Software without          | | ||||
| //| restriction, including without limitation the rights to use,     | | ||||
| //| copy, modify, merge, publish, distribute, sublicense, and/or sell| | ||||
| //| copies of the Software, and to permit persons to whom the        | | ||||
| //| Software is furnished to do so, subject to the following         | | ||||
| //| conditions:                                                      | | ||||
| //|                                                                  | | ||||
| //| The above copyright notice and this permission notice shall be   | | ||||
| //| included in all copies or substantial portions of the Software.  | | ||||
| //|                                                                  | | ||||
| //| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  | | ||||
| //| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  | | ||||
| //| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         | | ||||
| //| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      | | ||||
| //| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     | | ||||
| //| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     | | ||||
| //| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    | | ||||
| //| OTHER DEALINGS IN THE SOFTWARE.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property strict | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                                  | | ||||
| //+------------------------------------------------------------------+ | ||||
| class CSomeObject | ||||
|   { | ||||
| protected: | ||||
|    int               m_someproperty; | ||||
| private: | ||||
|    bool              SomeFunction() {return true;} | ||||
| public: | ||||
|                      CSomeObject(void): m_someproperty(0) {} | ||||
|                     ~CSomeObject(void)                    {} | ||||
|    void              SetName(int n){m_someproperty=n;}// sets somepropery | ||||
|    int               GetName(){return(m_someproperty);} // returns someproperty | ||||
|   }; | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										61
									
								
								samples/MQL4/indicator-sample.mq4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								samples/MQL4/indicator-sample.mq4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                             indicator-sample.mq4 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| Permission is hereby granted, free of charge, to any person      | | ||||
| //| obtaining a copy of this software and associated documentation   | | ||||
| //| files (the "Software"), to deal in the Software without          | | ||||
| //| restriction, including without limitation the rights to use,     | | ||||
| //| copy, modify, merge, publish, distribute, sublicense, and/or sell| | ||||
| //| copies of the Software, and to permit persons to whom the        | | ||||
| //| Software is furnished to do so, subject to the following         | | ||||
| //| conditions:                                                      | | ||||
| //|                                                                  | | ||||
| //| The above copyright notice and this permission notice shall be   | | ||||
| //| included in all copies or substantial portions of the Software.  | | ||||
| //|                                                                  | | ||||
| //| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  | | ||||
| //| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  | | ||||
| //| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         | | ||||
| //| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      | | ||||
| //| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     | | ||||
| //| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     | | ||||
| //| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    | | ||||
| //| OTHER DEALINGS IN THE SOFTWARE.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property strict | ||||
|  | ||||
| #property indicator_chart_window | ||||
| #property indicator_plots 0 | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator initialization function                         | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnInit(void) | ||||
|   { | ||||
|  //--- | ||||
|    } | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Bears Power                                                      | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnCalculate(const int rates_total, | ||||
|                 const int prev_calculated, | ||||
|                 const datetime &time[], | ||||
|                 const double &open[], | ||||
|                 const double &high[], | ||||
|                 const double &low[], | ||||
|                 const double &close[], | ||||
|                 const long &tick_volume[], | ||||
|                 const long &volume[], | ||||
|                 const int &spread[]) | ||||
|   { | ||||
|   Print("The number of bars on the current chart: ",iBars(Symbol(),Period())); | ||||
| //--- | ||||
|    return(rates_total); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										51
									
								
								samples/MQL4/script-sample.mq4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/MQL4/script-sample.mq4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                script-sample.mq4 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| Permission is hereby granted, free of charge, to any person      | | ||||
| //| obtaining a copy of this software and associated documentation   | | ||||
| //| files (the "Software"), to deal in the Software without          | | ||||
| //| restriction, including without limitation the rights to use,     | | ||||
| //| copy, modify, merge, publish, distribute, sublicense, and/or sell| | ||||
| //| copies of the Software, and to permit persons to whom the        | | ||||
| //| Software is furnished to do so, subject to the following         | | ||||
| //| conditions:                                                      | | ||||
| //|                                                                  | | ||||
| //| The above copyright notice and this permission notice shall be   | | ||||
| //| included in all copies or substantial portions of the Software.  | | ||||
| //|                                                                  | | ||||
| //| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  | | ||||
| //| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  | | ||||
| //| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         | | ||||
| //| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      | | ||||
| //| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     | | ||||
| //| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     | | ||||
| //| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    | | ||||
| //| OTHER DEALINGS IN THE SOFTWARE.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property strict | ||||
| #property script_show_inputs | ||||
|  | ||||
| input int StopLoss=100; //Stop Loss | ||||
| input int TakeProfit=100; //Take Profit | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Script program start function                                    | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnStart() | ||||
|   { | ||||
|    double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); | ||||
|    Print("Minimum Stop Level=",minstoplevel," points"); | ||||
| //--- | ||||
|    double sl=NormalizeDouble(Bid-StopLoss*Point,Digits); | ||||
|    double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits); | ||||
| //--- | ||||
|    int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,"Test",0,0,clrNONE); | ||||
|    Print("Success? ",result); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										1390
									
								
								samples/MQL5/Regex.mqh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1390
									
								
								samples/MQL5/Regex.mqh
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										64
									
								
								samples/MQL5/indicator-sample.mq5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								samples/MQL5/indicator-sample.mq5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                             indicator-sample.mq5 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| Permission is hereby granted, free of charge, to any person      | | ||||
| //| obtaining a copy of this software and associated documentation   | | ||||
| //| files (the "Software"), to deal in the Software without          | | ||||
| //| restriction, including without limitation the rights to use,     | | ||||
| //| copy, modify, merge, publish, distribute, sublicense, and/or sell| | ||||
| //| copies of the Software, and to permit persons to whom the        | | ||||
| //| Software is furnished to do so, subject to the following         | | ||||
| //| conditions:                                                      | | ||||
| //|                                                                  | | ||||
| //| The above copyright notice and this permission notice shall be   | | ||||
| //| included in all copies or substantial portions of the Software.  | | ||||
| //|                                                                  | | ||||
| //| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  | | ||||
| //| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  | | ||||
| //| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         | | ||||
| //| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      | | ||||
| //| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     | | ||||
| //| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     | | ||||
| //| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    | | ||||
| //| OTHER DEALINGS IN THE SOFTWARE.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
|  | ||||
| #property indicator_chart_window | ||||
| #property indicator_plots   0 | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator initialization function                         | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnInit() | ||||
|   { | ||||
| //--- | ||||
|    return(INIT_SUCCEEDED); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Custom indicator iteration function                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| int OnCalculate(const int rates_total, | ||||
|                 const int prev_calculated, | ||||
|                 const datetime &time[], | ||||
|                 const double &open[], | ||||
|                 const double &high[], | ||||
|                 const double &low[], | ||||
|                 const double &close[], | ||||
|                 const long &tick_volume[], | ||||
|                 const long &volume[], | ||||
|                 const int &spread[]) | ||||
|   { | ||||
| //--- | ||||
|    int bars=Bars(Symbol(),0); | ||||
|    Print("Bars = ",bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated); | ||||
|    Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]); | ||||
| //--- return value of prev_calculated for next call | ||||
|    return(rates_total); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										56
									
								
								samples/MQL5/script-sample.mq5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								samples/MQL5/script-sample.mq5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                                                script-sample.mq5 | | ||||
| //|                                   Copyright 2016, Andrey Osorgin | | ||||
| //+------------------------------------------------------------------+ | ||||
| //|                     The MIT License (MIT)                        | | ||||
| //|                                                                  | | ||||
| //| Permission is hereby granted, free of charge, to any person      | | ||||
| //| obtaining a copy of this software and associated documentation   | | ||||
| //| files (the "Software"), to deal in the Software without          | | ||||
| //| restriction, including without limitation the rights to use,     | | ||||
| //| copy, modify, merge, publish, distribute, sublicense, and/or sell| | ||||
| //| copies of the Software, and to permit persons to whom the        | | ||||
| //| Software is furnished to do so, subject to the following         | | ||||
| //| conditions:                                                      | | ||||
| //|                                                                  | | ||||
| //| The above copyright notice and this permission notice shall be   | | ||||
| //| included in all copies or substantial portions of the Software.  | | ||||
| //|                                                                  | | ||||
| //| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  | | ||||
| //| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  | | ||||
| //| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         | | ||||
| //| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      | | ||||
| //| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     | | ||||
| //| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     | | ||||
| //| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    | | ||||
| //| OTHER DEALINGS IN THE SOFTWARE.                                  | | ||||
| //|                                                                  | | ||||
| //| A copy of the MIT License (MIT) is available at                  | | ||||
| //| https://opensource.org/licenses/MIT                              | | ||||
| //+------------------------------------------------------------------+ | ||||
| #property version   "1.00" | ||||
| #property script_show_inputs | ||||
|  | ||||
| #include <Trade\Trade.mqh> | ||||
|  | ||||
| input int StopLoss=100; // Stop Loss | ||||
| input int TakeProfit=100; // Take Profit | ||||
| //+------------------------------------------------------------------+ | ||||
| //| Script program start function                                    | | ||||
| //+------------------------------------------------------------------+ | ||||
| void OnStart() | ||||
|   { | ||||
|    CTrade trade; | ||||
| //--- | ||||
|    long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL); | ||||
|    Print("Minimum stop level is: ",stoplevel); | ||||
|    double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); | ||||
|    double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID); | ||||
|    double sl = NormalizeDouble(bid - StopLoss*Point(),Digits()); | ||||
|    double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits()); | ||||
| //--- | ||||
|    bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,"test"); | ||||
| //--- | ||||
|    Print("Success? ",result); | ||||
|   } | ||||
| //+------------------------------------------------------------------+ | ||||
							
								
								
									
										134
									
								
								samples/Makefile/file-icons.make
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								samples/Makefile/file-icons.make
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| charmap     := charmap.md | ||||
| font-name   := file-icons | ||||
| font-folder := dist | ||||
| font-config := icomoon.json | ||||
| icon-size   := 34 | ||||
| icon-folder := svg | ||||
| repo-name   := Alhadis/FileIcons | ||||
| svg         := $(wildcard $(icon-folder)/*.svg) | ||||
| last-commit  = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1) | ||||
|  | ||||
|  | ||||
| all: unpack $(font-folder)/$(font-name).woff2 charmap | ||||
|  | ||||
|  | ||||
| # Aliases | ||||
| unpack:  $(font-folder)/$(font-name).ttf | ||||
| charmap: $(charmap) | ||||
|  | ||||
|  | ||||
| # Extract a downloaded IcoMoon folder | ||||
| $(font-folder)/%.ttf: %.zip | ||||
| 	@rm -rf $(font-folder) tmp $(font-config) | ||||
| 	@unzip -qd tmp $^ | ||||
| 	@mv tmp/fonts $(font-folder) | ||||
| 	@mv tmp/selection.json $(font-config) | ||||
| 	@rm -rf tmp $^ | ||||
| 	@perl -pi -e 's|^( {2})+|"\t" x (length($$&)/2)|ge' $(font-config) | ||||
| 	@echo "" >> $(font-config) # Ensure trailing newline | ||||
| 	@echo "Files extracted." | ||||
|  | ||||
|  | ||||
| # Generate a WOFF2 file from a TTF | ||||
| %.woff2: %.ttf | ||||
| 	@[ ! -f $@ ] && { \ | ||||
| 		hash woff2_compress 2>/dev/null || { \ | ||||
| 			echo >&2 "WOFF2 conversion tools not found. Consult the readme file."; \ | ||||
| 			exit 2; \ | ||||
| 		}; \ | ||||
| 		woff2_compress $^ >/dev/null; \ | ||||
| 		echo "WOFF2 file generated."; \ | ||||
| 	}; | ||||
| 	 | ||||
|  | ||||
|  | ||||
| # Clean up SVG source | ||||
| lint: $(svg) | ||||
| 	@perl -0777 -pi -e '\ | ||||
| 		s/\r\n/\n/g; \ | ||||
| 		s/<g id="icomoon-ignore">\s*<\/g>//gmi; \ | ||||
| 		s/<g\s*>\s*<\/g>//gmi; \ | ||||
| 		s/\s+(id|viewBox|xml:space)="[^"]*"/ /gmi; \ | ||||
| 		s/<!DOCTYPE[^>]*>//gi; \ | ||||
| 		s/<\?xml.*?\?>//gi; \ | ||||
| 		s/<!--.*?-->//gm; \ | ||||
| 		s/ style="enable-background:.*?;"//gmi; \ | ||||
| 		s/"\s+>/">/g; \ | ||||
| 		s/\x20{2,}/ /g; \ | ||||
| 		s/[\t\n]+//gm;' $^ | ||||
|  | ||||
|  | ||||
|  | ||||
| # Generate/update character map | ||||
| $(charmap): | ||||
| 	@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # POSIX systems only: reattach hard links to File-Icons package | ||||
| relink: | ||||
| 	@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG) | ||||
| 	@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2) | ||||
|  | ||||
|  | ||||
|  | ||||
| # Force an icon's preview to be refreshed on GitHub | ||||
| cachebust: | ||||
| 	@$(call need-var,icon,ERROR_NO_ICON) | ||||
| 	@base="https://cdn.rawgit.com/Alhadis/FileIcons/"; \ | ||||
| 	perl -pi -e 's{$$base\K\w+(?=/svg/$(icon:%.svg=%)\.svg")}{$(last-commit)}ig;' $(charmap) | ||||
|  | ||||
|  | ||||
| # Dummy task to improve feedback if `cachebust` is mistyped | ||||
| icon: | ||||
| 	$(call need-var,,ERROR_UNDEF_ICON) | ||||
|  | ||||
|  | ||||
|  | ||||
| # Reset unstaged changes/additions in object directories | ||||
| clean: | ||||
| 	@git clean -fd $(font-folder) | ||||
| 	@git checkout -- $(font-folder) 2>/dev/null || true | ||||
|  | ||||
|  | ||||
| # Delete extracted and generated files | ||||
| distclean: | ||||
| 	@rm -rf $(font-folder) | ||||
|  | ||||
|  | ||||
| .PHONY: clean distclean $(charmap) cachebust icon | ||||
| .ONESHELL: | ||||
|  | ||||
|  | ||||
| # Error message shown to users attempting to run `make relink` without a link | ||||
| ERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \ | ||||
| 	| \ | ||||
| 	| Try this instead:\ | ||||
| 	| \ | ||||
| 	| \	make relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation |  | ||||
|  | ||||
|  | ||||
| # Error message shown when running `make cachebust` without an icon | ||||
| ERROR_NO_ICON := No icon specified. Task aborted.| \ | ||||
| 	| Usage: \ | ||||
| 	| \	make icon=file[.svg] cachebust \ | ||||
| 	| \ | ||||
| 	| Examples: \ | ||||
| 	| \	make icon=Manpage cachebust \ | ||||
| 	| \	make icon=APL.svg cachebust |  | ||||
|  | ||||
|  | ||||
| # Shown if user tries running `make icon NAME cachebust` by mistake | ||||
| ERROR_UNDEF_ICON := No task named \"icon\". \ | ||||
| 	| \ | ||||
| 	| Did you mean this? \ | ||||
| 	| \	make icon=NAME cachebust |  | ||||
| 	 | ||||
|  | ||||
|  | ||||
| # If the given value is empty, die with an error message | ||||
| need = @$(if $(1),,echo $(subst | ,$$'\n',$(2)); exit 2) | ||||
|  | ||||
| # Like `need`, but uses variable names instead of string values | ||||
| need-var = @$(call need,$($(1)),$($(2))) | ||||
							
								
								
									
										413
									
								
								samples/Objective-C/cocoa_monitor.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								samples/Objective-C/cocoa_monitor.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,413 @@ | ||||
| //======================================================================== | ||||
| // GLFW 3.3 OS X - www.glfw.org | ||||
| //------------------------------------------------------------------------ | ||||
| // Copyright (c) 2002-2006 Marcus Geelnard | ||||
| // Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org> | ||||
| // | ||||
| // This software is provided 'as-is', without any express or implied | ||||
| // warranty. In no event will the authors be held liable for any damages | ||||
| // arising from the use of this software. | ||||
| // | ||||
| // Permission is granted to anyone to use this software for any purpose, | ||||
| // including commercial applications, and to alter it and redistribute it | ||||
| // freely, subject to the following restrictions: | ||||
| // | ||||
| // 1. The origin of this software must not be misrepresented; you must not | ||||
| //    claim that you wrote the original software. If you use this software | ||||
| //    in a product, an acknowledgment in the product documentation would | ||||
| //    be appreciated but is not required. | ||||
| // | ||||
| // 2. Altered source versions must be plainly marked as such, and must not | ||||
| //    be misrepresented as being the original software. | ||||
| // | ||||
| // 3. This notice may not be removed or altered from any source | ||||
| //    distribution. | ||||
| // | ||||
| //======================================================================== | ||||
|  | ||||
| #include "internal.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
|  | ||||
| #include <IOKit/graphics/IOGraphicsLib.h> | ||||
| #include <CoreVideo/CVBase.h> | ||||
| #include <CoreVideo/CVDisplayLink.h> | ||||
| #include <ApplicationServices/ApplicationServices.h> | ||||
|  | ||||
|  | ||||
| // Get the name of the specified display | ||||
| // | ||||
| static char* getDisplayName(CGDirectDisplayID displayID) | ||||
| { | ||||
|     char* name; | ||||
|     CFDictionaryRef info, names; | ||||
|     CFStringRef value; | ||||
|     CFIndex size; | ||||
|  | ||||
|     // NOTE: This uses a deprecated function because Apple has | ||||
|     //       (as of January 2015) not provided any alternative | ||||
|     info = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), | ||||
|                                          kIODisplayOnlyPreferredName); | ||||
|     names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); | ||||
|  | ||||
|     if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), | ||||
|                                                  (const void**) &value)) | ||||
|     { | ||||
|         // This may happen if a desktop Mac is running headless | ||||
|         _glfwInputError(GLFW_PLATFORM_ERROR, | ||||
|                         "Cocoa: Failed to retrieve display name"); | ||||
|  | ||||
|         CFRelease(info); | ||||
|         return strdup("Unknown"); | ||||
|     } | ||||
|  | ||||
|     size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value), | ||||
|                                              kCFStringEncodingUTF8); | ||||
|     name = calloc(size + 1, 1); | ||||
|     CFStringGetCString(value, name, size, kCFStringEncodingUTF8); | ||||
|  | ||||
|     CFRelease(info); | ||||
|  | ||||
|     return name; | ||||
| } | ||||
|  | ||||
| // Check whether the display mode should be included in enumeration | ||||
| // | ||||
| static GLFWbool modeIsGood(CGDisplayModeRef mode) | ||||
| { | ||||
|     uint32_t flags = CGDisplayModeGetIOFlags(mode); | ||||
|     if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag)) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     if (flags & kDisplayModeInterlacedFlag) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     if (flags & kDisplayModeStretchedFlag) | ||||
|         return GLFW_FALSE; | ||||
|  | ||||
|     CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); | ||||
|     if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) && | ||||
|         CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0)) | ||||
|     { | ||||
|         CFRelease(format); | ||||
|         return GLFW_FALSE; | ||||
|     } | ||||
|  | ||||
|     CFRelease(format); | ||||
|     return GLFW_TRUE; | ||||
| } | ||||
|  | ||||
| // Convert Core Graphics display mode to GLFW video mode | ||||
| // | ||||
| static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode, | ||||
|                                             CVDisplayLinkRef link) | ||||
| { | ||||
|     GLFWvidmode result; | ||||
|     result.width = (int) CGDisplayModeGetWidth(mode); | ||||
|     result.height = (int) CGDisplayModeGetHeight(mode); | ||||
|     result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode); | ||||
|  | ||||
|     if (result.refreshRate == 0) | ||||
|     { | ||||
|         const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); | ||||
|         if (!(time.flags & kCVTimeIsIndefinite)) | ||||
|             result.refreshRate = (int) (time.timeScale / (double) time.timeValue); | ||||
|     } | ||||
|  | ||||
|     CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); | ||||
|  | ||||
|     if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) | ||||
|     { | ||||
|         result.redBits = 5; | ||||
|         result.greenBits = 5; | ||||
|         result.blueBits = 5; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         result.redBits = 8; | ||||
|         result.greenBits = 8; | ||||
|         result.blueBits = 8; | ||||
|     } | ||||
|  | ||||
|     CFRelease(format); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| // Starts reservation for display fading | ||||
| // | ||||
| static CGDisplayFadeReservationToken beginFadeReservation(void) | ||||
| { | ||||
|     CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken; | ||||
|  | ||||
|     if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess) | ||||
|         CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE); | ||||
|  | ||||
|     return token; | ||||
| } | ||||
|  | ||||
| // Ends reservation for display fading | ||||
| // | ||||
| static void endFadeReservation(CGDisplayFadeReservationToken token) | ||||
| { | ||||
|     if (token != kCGDisplayFadeReservationInvalidToken) | ||||
|     { | ||||
|         CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); | ||||
|         CGReleaseDisplayFadeReservation(token); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                       GLFW internal API                      ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| // Change the current video mode | ||||
| // | ||||
| GLFWbool _glfwSetVideoModeNS(_GLFWmonitor* monitor, const GLFWvidmode* desired) | ||||
| { | ||||
|     CFArrayRef modes; | ||||
|     CFIndex count, i; | ||||
|     CVDisplayLinkRef link; | ||||
|     CGDisplayModeRef native = NULL; | ||||
|     GLFWvidmode current; | ||||
|     const GLFWvidmode* best; | ||||
|  | ||||
|     best = _glfwChooseVideoMode(monitor, desired); | ||||
|     _glfwPlatformGetVideoMode(monitor, ¤t); | ||||
|     if (_glfwCompareVideoModes(¤t, best) == 0) | ||||
|         return GLFW_TRUE; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); | ||||
|     count = CFArrayGetCount(modes); | ||||
|  | ||||
|     for (i = 0;  i < count;  i++) | ||||
|     { | ||||
|         CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); | ||||
|         if (!modeIsGood(dm)) | ||||
|             continue; | ||||
|  | ||||
|         const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); | ||||
|         if (_glfwCompareVideoModes(best, &mode) == 0) | ||||
|         { | ||||
|             native = dm; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (native) | ||||
|     { | ||||
|         if (monitor->ns.previousMode == NULL) | ||||
|             monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); | ||||
|  | ||||
|         CGDisplayFadeReservationToken token = beginFadeReservation(); | ||||
|         CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL); | ||||
|         endFadeReservation(token); | ||||
|     } | ||||
|  | ||||
|     CFRelease(modes); | ||||
|     CVDisplayLinkRelease(link); | ||||
|  | ||||
|     if (!native) | ||||
|     { | ||||
|         _glfwInputError(GLFW_PLATFORM_ERROR, | ||||
|                         "Cocoa: Monitor mode list changed"); | ||||
|         return GLFW_FALSE; | ||||
|     } | ||||
|  | ||||
|     return GLFW_TRUE; | ||||
| } | ||||
|  | ||||
| // Restore the previously saved (original) video mode | ||||
| // | ||||
| void _glfwRestoreVideoModeNS(_GLFWmonitor* monitor) | ||||
| { | ||||
|     if (monitor->ns.previousMode) | ||||
|     { | ||||
|         CGDisplayFadeReservationToken token = beginFadeReservation(); | ||||
|         CGDisplaySetDisplayMode(monitor->ns.displayID, | ||||
|                                 monitor->ns.previousMode, NULL); | ||||
|         endFadeReservation(token); | ||||
|  | ||||
|         CGDisplayModeRelease(monitor->ns.previousMode); | ||||
|         monitor->ns.previousMode = NULL; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                       GLFW platform API                      ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| _GLFWmonitor** _glfwPlatformGetMonitors(int* count) | ||||
| { | ||||
|     uint32_t i, found = 0, displayCount; | ||||
|     _GLFWmonitor** monitors; | ||||
|     CGDirectDisplayID* displays; | ||||
|  | ||||
|     *count = 0; | ||||
|  | ||||
|     CGGetOnlineDisplayList(0, NULL, &displayCount); | ||||
|     displays = calloc(displayCount, sizeof(CGDirectDisplayID)); | ||||
|     monitors = calloc(displayCount, sizeof(_GLFWmonitor*)); | ||||
|  | ||||
|     CGGetOnlineDisplayList(displayCount, displays, &displayCount); | ||||
|  | ||||
|     for (i = 0;  i < displayCount;  i++) | ||||
|     { | ||||
|         _GLFWmonitor* monitor; | ||||
|  | ||||
|         if (CGDisplayIsAsleep(displays[i])) | ||||
|             continue; | ||||
|  | ||||
|         const CGSize size = CGDisplayScreenSize(displays[i]); | ||||
|         char* name = getDisplayName(displays[i]); | ||||
|  | ||||
|         monitor = _glfwAllocMonitor(name, size.width, size.height); | ||||
|         monitor->ns.displayID  = displays[i]; | ||||
|         monitor->ns.unitNumber = CGDisplayUnitNumber(displays[i]); | ||||
|  | ||||
|         free(name); | ||||
|  | ||||
|         found++; | ||||
|         monitors[found - 1] = monitor; | ||||
|     } | ||||
|  | ||||
|     free(displays); | ||||
|  | ||||
|     *count = found; | ||||
|     return monitors; | ||||
| } | ||||
|  | ||||
| GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second) | ||||
| { | ||||
|     // HACK: Compare unit numbers instead of display IDs to work around display | ||||
|     //       replacement on machines with automatic graphics switching | ||||
|     return first->ns.unitNumber == second->ns.unitNumber; | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) | ||||
| { | ||||
|     const CGRect bounds = CGDisplayBounds(monitor->ns.displayID); | ||||
|  | ||||
|     if (xpos) | ||||
|         *xpos = (int) bounds.origin.x; | ||||
|     if (ypos) | ||||
|         *ypos = (int) bounds.origin.y; | ||||
| } | ||||
|  | ||||
| GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* count) | ||||
| { | ||||
|     CFArrayRef modes; | ||||
|     CFIndex found, i, j; | ||||
|     GLFWvidmode* result; | ||||
|     CVDisplayLinkRef link; | ||||
|  | ||||
|     *count = 0; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); | ||||
|     found = CFArrayGetCount(modes); | ||||
|     result = calloc(found, sizeof(GLFWvidmode)); | ||||
|  | ||||
|     for (i = 0;  i < found;  i++) | ||||
|     { | ||||
|         CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); | ||||
|         if (!modeIsGood(dm)) | ||||
|             continue; | ||||
|  | ||||
|         const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, link); | ||||
|  | ||||
|         for (j = 0;  j < *count;  j++) | ||||
|         { | ||||
|             if (_glfwCompareVideoModes(result + j, &mode) == 0) | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         // Skip duplicate modes | ||||
|         if (i < *count) | ||||
|             continue; | ||||
|  | ||||
|         (*count)++; | ||||
|         result[*count - 1] = mode; | ||||
|     } | ||||
|  | ||||
|     CFRelease(modes); | ||||
|     CVDisplayLinkRelease(link); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode) | ||||
| { | ||||
|     CGDisplayModeRef displayMode; | ||||
|     CVDisplayLinkRef link; | ||||
|  | ||||
|     CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); | ||||
|  | ||||
|     displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); | ||||
|     *mode = vidmodeFromCGDisplayMode(displayMode, link); | ||||
|     CGDisplayModeRelease(displayMode); | ||||
|  | ||||
|     CVDisplayLinkRelease(link); | ||||
| } | ||||
|  | ||||
| void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) | ||||
| { | ||||
|     uint32_t i, size = CGDisplayGammaTableCapacity(monitor->ns.displayID); | ||||
|     CGGammaValue* values = calloc(size * 3, sizeof(CGGammaValue)); | ||||
|  | ||||
|     CGGetDisplayTransferByTable(monitor->ns.displayID, | ||||
|                                 size, | ||||
|                                 values, | ||||
|                                 values + size, | ||||
|                                 values + size * 2, | ||||
|                                 &size); | ||||
|  | ||||
|     _glfwAllocGammaArrays(ramp, size); | ||||
|  | ||||
|     for (i = 0; i < size; i++) | ||||
|     { | ||||
|         ramp->red[i]   = (unsigned short) (values[i] * 65535); | ||||
|         ramp->green[i] = (unsigned short) (values[i + size] * 65535); | ||||
|         ramp->blue[i]  = (unsigned short) (values[i + size * 2] * 65535); | ||||
|     } | ||||
|  | ||||
|     free(values); | ||||
| } | ||||
|  | ||||
| void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) | ||||
| { | ||||
|     int i; | ||||
|     CGGammaValue* values = calloc(ramp->size * 3, sizeof(CGGammaValue)); | ||||
|  | ||||
|     for (i = 0;  i < ramp->size;  i++) | ||||
|     { | ||||
|         values[i]                  = ramp->red[i] / 65535.f; | ||||
|         values[i + ramp->size]     = ramp->green[i] / 65535.f; | ||||
|         values[i + ramp->size * 2] = ramp->blue[i] / 65535.f; | ||||
|     } | ||||
|  | ||||
|     CGSetDisplayTransferByTable(monitor->ns.displayID, | ||||
|                                 ramp->size, | ||||
|                                 values, | ||||
|                                 values + ramp->size, | ||||
|                                 values + ramp->size * 2); | ||||
|  | ||||
|     free(values); | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
| //////                        GLFW native API                       ////// | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* handle) | ||||
| { | ||||
|     _GLFWmonitor* monitor = (_GLFWmonitor*) handle; | ||||
|     _GLFW_REQUIRE_INIT_OR_RETURN(kCGNullDirectDisplay); | ||||
|     return monitor->ns.displayID; | ||||
| } | ||||
|  | ||||
							
								
								
									
										93
									
								
								samples/PHP/ThriftGenerated.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								samples/PHP/ThriftGenerated.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| <?php | ||||
| namespace github\com; | ||||
|  | ||||
| /** | ||||
|  * Autogenerated by Thrift Compiler (0.9.3) | ||||
|  * | ||||
|  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING | ||||
|  *  @generated | ||||
|  */ | ||||
| use Thrift\Base\TBase; | ||||
| use Thrift\Type\TType; | ||||
| use Thrift\Type\TMessageType; | ||||
| use Thrift\Exception\TException; | ||||
| use Thrift\Exception\TProtocolException; | ||||
| use Thrift\Protocol\TProtocol; | ||||
| use Thrift\Protocol\TBinaryProtocolAccelerated; | ||||
| use Thrift\Exception\TApplicationException; | ||||
|  | ||||
|  | ||||
| class PullRequest { | ||||
|   static $_TSPEC; | ||||
|  | ||||
|   /** | ||||
|    * @var string | ||||
|    */ | ||||
|   public $title = null; | ||||
|  | ||||
|   public function __construct($vals=null) { | ||||
|     if (!isset(self::$_TSPEC)) { | ||||
|       self::$_TSPEC = array( | ||||
|         1 => array( | ||||
|           'var' => 'title', | ||||
|           'type' => TType::STRING, | ||||
|           ), | ||||
|         ); | ||||
|     } | ||||
|     if (is_array($vals)) { | ||||
|       if (isset($vals['title'])) { | ||||
|         $this->title = $vals['title']; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public function getName() { | ||||
|     return 'PullRequest'; | ||||
|   } | ||||
|  | ||||
|   public function read($input) | ||||
|   { | ||||
|     $xfer = 0; | ||||
|     $fname = null; | ||||
|     $ftype = 0; | ||||
|     $fid = 0; | ||||
|     $xfer += $input->readStructBegin($fname); | ||||
|     while (true) | ||||
|     { | ||||
|       $xfer += $input->readFieldBegin($fname, $ftype, $fid); | ||||
|       if ($ftype == TType::STOP) { | ||||
|         break; | ||||
|       } | ||||
|       switch ($fid) | ||||
|       { | ||||
|         case 1: | ||||
|           if ($ftype == TType::STRING) { | ||||
|             $xfer += $input->readString($this->title); | ||||
|           } else { | ||||
|             $xfer += $input->skip($ftype); | ||||
|           } | ||||
|           break; | ||||
|         default: | ||||
|           $xfer += $input->skip($ftype); | ||||
|           break; | ||||
|       } | ||||
|       $xfer += $input->readFieldEnd(); | ||||
|     } | ||||
|     $xfer += $input->readStructEnd(); | ||||
|     return $xfer; | ||||
|   } | ||||
|  | ||||
|   public function write($output) { | ||||
|     $xfer = 0; | ||||
|     $xfer += $output->writeStructBegin('PullRequest'); | ||||
|     if ($this->title !== null) { | ||||
|       $xfer += $output->writeFieldBegin('title', TType::STRING, 1); | ||||
|       $xfer += $output->writeString($this->title); | ||||
|       $xfer += $output->writeFieldEnd(); | ||||
|     } | ||||
|     $xfer += $output->writeFieldStop(); | ||||
|     $xfer += $output->writeStructEnd(); | ||||
|     return $xfer; | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										37
									
								
								samples/PHP/filenames/.php_cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								samples/PHP/filenames/.php_cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| $header = <<<'EOF' | ||||
| This file is part of PHP CS Fixer. | ||||
|  | ||||
| (c) Fabien Potencier <fabien@symfony.com> | ||||
|     Dariusz Rumiński <dariusz.ruminski@gmail.com> | ||||
|  | ||||
| This source file is subject to the MIT license that is bundled | ||||
| with this source code in the file LICENSE. | ||||
| EOF; | ||||
|  | ||||
| return PhpCsFixer\Config::create() | ||||
|     ->setRiskyAllowed(true) | ||||
|     ->setRules(array( | ||||
|         '@Symfony' => true, | ||||
|         '@Symfony:risky' => true, | ||||
|         'combine_consecutive_unsets' => true, | ||||
|         'header_comment' => array('header' => $header), | ||||
|         'array_syntax' => array('syntax' => 'long'), | ||||
|         'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'), | ||||
|         'no_useless_else' => true, | ||||
|         'no_useless_return' => true, | ||||
|         'ordered_class_elements' => true, | ||||
|         'ordered_imports' => true, | ||||
|         'php_unit_strict' => true, | ||||
|         'phpdoc_add_missing_param_annotation' => true, | ||||
|         'psr4' => true, | ||||
|         'strict_comparison' => true, | ||||
|         'strict_param' => true, | ||||
|     )) | ||||
|     ->setFinder( | ||||
|         PhpCsFixer\Finder::create() | ||||
|             ->exclude('tests/Fixtures') | ||||
|             ->in(__DIR__) | ||||
|     ) | ||||
| ; | ||||
							
								
								
									
										37
									
								
								samples/PHP/filenames/.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								samples/PHP/filenames/.php_cs.dist
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| <?php | ||||
|  | ||||
| $header = <<<'EOF' | ||||
| This file is part of PHP CS Fixer. | ||||
|  | ||||
| (c) Fabien Potencier <fabien@symfony.com> | ||||
|     Dariusz Rumiński <dariusz.ruminski@gmail.com> | ||||
|  | ||||
| This source file is subject to the MIT license that is bundled | ||||
| with this source code in the file LICENSE. | ||||
| EOF; | ||||
|  | ||||
| return PhpCsFixer\Config::create() | ||||
|     ->setRiskyAllowed(true) | ||||
|     ->setRules(array( | ||||
|         '@Symfony' => true, | ||||
|         '@Symfony:risky' => true, | ||||
|         'combine_consecutive_unsets' => true, | ||||
|         'header_comment' => array('header' => $header), | ||||
|         'array_syntax' => array('syntax' => 'long'), | ||||
|         'no_extra_consecutive_blank_lines' => array('break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'), | ||||
|         'no_useless_else' => true, | ||||
|         'no_useless_return' => true, | ||||
|         'ordered_class_elements' => true, | ||||
|         'ordered_imports' => true, | ||||
|         'php_unit_strict' => true, | ||||
|         'phpdoc_add_missing_param_annotation' => true, | ||||
|         'psr4' => true, | ||||
|         'strict_comparison' => true, | ||||
|         'strict_param' => true, | ||||
|     )) | ||||
|     ->setFinder( | ||||
|         PhpCsFixer\Finder::create() | ||||
|             ->exclude('tests/Fixtures') | ||||
|             ->in(__DIR__) | ||||
|     ) | ||||
| ; | ||||
							
								
								
									
										13
									
								
								samples/Pic/dextroamphetamine.chem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Pic/dextroamphetamine.chem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # Dextroamphetamine molecule | ||||
| .cstart | ||||
| 	.ps 26 | ||||
| 	size 28 | ||||
| R1: | ||||
| 	ring double 1,2 3,4 5,6 | ||||
| 	bond 60 from R1.V2 | ||||
| 	bond 120 | ||||
| A1: | ||||
| 	front bond down ; CH3 | ||||
| 	bond 60 from A1 ; NH2 | ||||
| 	.ps | ||||
| .cend | ||||
							
								
								
									
										25
									
								
								samples/Pic/graph.pic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/Pic/graph.pic
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| .PS | ||||
| 	ellipse "Pic" "example" | ||||
| 	arrow | ||||
| 	box "This is" "a box"  | ||||
| 	arrow right | ||||
| 	box "Another" "box" dashed | ||||
| 	move down then right; | ||||
| Thing: ellipse "This is a" "circle-thing" | ||||
| 	arrow <-> from last box.r to Thing.l | ||||
| 	move down then left; | ||||
| B: box "Still a box" | ||||
| 	arrow from Thing.l to B.r | ||||
| 	sprintf("Width = %g, Height = %g ", B.wid, B.ht) rjust at B.w | ||||
| 	move down | ||||
| .ps 15 | ||||
| 	define sadness { | ||||
| 		boxwid = 3; | ||||
| 		boxht = 1; | ||||
| 		textht = .5; | ||||
| 		box "\"I run from my depression by" " " "burying myself in code\"" | ||||
| 		arrow down from last box.s | ||||
| 		"Me" | ||||
| 	} | ||||
| 	sadness(); | ||||
| .PE | ||||
							
								
								
									
										15
									
								
								samples/Pic/ritalin.chem
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Pic/ritalin.chem
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| .\" RITALIN: Methylphenidate Hydrochloride | ||||
| .cstart | ||||
| .ps 15 | ||||
| size 15 | ||||
| 	R1: ring double 1,2 3,4 5,6 pointing up | ||||
| 	bond 60 length .35 from R1.V2 ; BP | ||||
| 	bond 120 length .35 from BP | ||||
| 	R2: ring pointing up put N at 1 | ||||
| 	H above R2 | ||||
| 	bond up  length .35 from BP ; BP | ||||
| 	bond -60 length .35 from BP ; O | ||||
| 	bond up | ||||
| 	double bond 60 length .35 from BP ; O | ||||
| .ps 10 | ||||
| .cend | ||||
							
								
								
									
										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 | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user