mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			172 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 62b1816297 | ||
|  | 2d1e1d4747 | ||
|  | f785aa0ae2 | ||
|  | cc476e212e | ||
|  | bca9716fc6 | ||
|  | fae6dbfebd | ||
|  | a7a0800b46 | ||
|  | 305293d3e5 | ||
|  | 17d4eb7a5e | ||
|  | f97e103b6d | ||
|  | dafca264b2 | ||
|  | be970e9e3d | ||
|  | e76837fa20 | ||
|  | e1b3403dc8 | ||
|  | 79da17c5c8 | ||
|  | e9623d542d | ||
|  | bc999f4067 | ||
|  | 474e536ae8 | ||
|  | 79647c5bb4 | ||
|  | 5409c39e35 | ||
|  | 5d4a24dd4f | ||
|  | c97abe7ef5 | ||
|  | edaea7bede | ||
|  | 909bce8ed9 | ||
|  | 4090c492e8 | ||
|  | a24afb0e12 | ||
|  | bc01f8b25f | ||
|  | 077c4141d6 | ||
|  | e5f20314e9 | ||
|  | 8a61bcb6b5 | ||
|  | 61b301b380 | ||
|  | be86f28be1 | ||
|  | a443380869 | ||
|  | 3d1d431cda | ||
|  | 9559ece8af | ||
|  | 8f56a1096d | ||
|  | 0ec85f902a | ||
|  | a47dde2166 | ||
|  | abdd6bfbd2 | ||
|  | d64104f472 | ||
|  | 1cd5ae2d57 | ||
|  | e27bf1627d | ||
|  | 0689d64efd | ||
|  | 3ba47aec38 | ||
|  | b90253981b | ||
|  | 513f678b6c | ||
|  | 478b9cf189 | ||
|  | 6675baff13 | ||
|  | a6efeebd21 | ||
|  | 6e2bb25b6e | ||
|  | a54edf71d1 | ||
|  | 8ff7eaf893 | ||
|  | a8d3872002 | ||
|  | dea03b7a46 | ||
|  | f5723dcccf | ||
|  | d772d1f162 | ||
|  | 46cfd16ae7 | ||
|  | 315243350b | ||
|  | 886d8a7293 | ||
|  | 54318f4001 | ||
|  | b3aee8abab | ||
|  | 1bdbadc1b3 | ||
|  | e0997b311b | ||
|  | 3c2ca312b9 | ||
|  | 315df1339a | ||
|  | e03b3e5ec4 | ||
|  | 43923976c2 | ||
|  | 6b8ee2f3f7 | ||
|  | b8e570bb3d | ||
|  | 69ff3c79b4 | ||
|  | eff4da20f8 | ||
|  | 473688b109 | ||
|  | 7bfb6ed5d7 | ||
|  | 276080aeec | ||
|  | 41c880afc7 | ||
|  | 3d242c3a3a | ||
|  | 9325b07d68 | ||
|  | ddeeb5d416 | ||
|  | c8bc0a5c79 | ||
|  | f58522d5a9 | ||
|  | 27a621531b | ||
|  | 0235433b7e | ||
|  | 6b5d1fe25b | ||
|  | f811ab1b28 | ||
|  | fc73f51855 | ||
|  | dd181421a7 | ||
|  | f6e2189739 | ||
|  | d61f31d3ed | ||
|  | 4e83a6ad23 | ||
|  | 7fc39dc8d1 | ||
|  | f10154a782 | ||
|  | 8761dc4e17 | ||
|  | 5a044b1c07 | ||
|  | 0100b76412 | ||
|  | c8754292f4 | ||
|  | 61faea0298 | ||
|  | b9ecf61dcb | ||
|  | 437f81c4a0 | ||
|  | 26dad7dada | ||
|  | b1e5d6f8f8 | ||
|  | 8c7b54d6e3 | ||
|  | fea0d8963c | ||
|  | 7aca52c68c | ||
|  | 529d3faaf8 | ||
|  | 9f0f4657a2 | ||
|  | 90ff1b5896 | ||
|  | feb82e34d6 | ||
|  | 4d7a34c177 | ||
|  | 5c3385ecd8 | ||
|  | a1af3a509c | ||
|  | 2913a87cc4 | ||
|  | 69cc86c572 | ||
|  | 60144c907e | ||
|  | 1828cf6fc7 | ||
|  | ad4d273241 | ||
|  | 0d03a94cde | ||
|  | 6af5adaac1 | ||
|  | 17a28f2e91 | ||
|  | baaa7a5c13 | ||
|  | cfeb2a833c | ||
|  | e6fd58b3aa | ||
|  | 2ef905ef1e | ||
|  | db80aa84dc | ||
|  | f404cc16a1 | ||
|  | 8b4acf7023 | ||
|  | 7393c2ef91 | ||
|  | 4948ec2999 | ||
|  | 408a325732 | ||
|  | 5ca211b9f7 | ||
|  | bc7596a8b5 | ||
|  | 6762ca8aa7 | ||
|  | bb7d6ab429 | ||
|  | 986611ac36 | ||
|  | 94b4ad1de6 | ||
|  | 3e2f18bf3f | ||
|  | 48c06cc299 | ||
|  | f10821ac49 | ||
|  | cd5298dee6 | ||
|  | a8c955609a | ||
|  | c5acce0604 | ||
|  | a6ccce7b76 | ||
|  | aa72012d41 | ||
|  | 458831b885 | ||
|  | f5e4789ccb | ||
|  | 1b712d2800 | ||
|  | e274196441 | ||
|  | c4c3c27cfe | ||
|  | a2dd9d2c8c | ||
|  | 06e095e5fc | ||
|  | b26d5bc1b1 | ||
|  | 607792e1b2 | ||
|  | fb38135a61 | ||
|  | a5d5b6e6c7 | ||
|  | 2fd2cdf68a | ||
|  | 11049ca3ca | ||
|  | c29bea19ef | ||
|  | 76b896a66d | ||
|  | a12520763c | ||
|  | 819bb7caab | ||
|  | 152205a146 | ||
|  | 85dbcb5444 | ||
|  | 5199fcf0a2 | ||
|  | dd557ed00a | ||
|  | addf4e2485 | ||
|  | 2f4ea20fdd | ||
|  | 81fcb4452e | ||
|  | 4f1a5cd456 | ||
|  | ae2d3d7e61 | ||
|  | 58ae0908e3 | ||
|  | e91caeaade | ||
|  | bd694c60e1 | ||
|  | 04f4b05412 | 
| @@ -152,4 +152,4 @@ If you are the current maintainer of this gem: | ||||
|    0. Test behavior locally, branch deploy, whatever needs to happen | ||||
|  0. Merge github/linguist PR | ||||
|  0. Tag and push: `git tag vx.xx.xx; git push --tags` | ||||
|  0. Push to rubygems.org -- `gem push github-linguist-2.10.12.gem` | ||||
|  0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| #     usage: linguist <path> [<--breakdown>] | ||||
|  | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/language' | ||||
| require 'linguist/repository' | ||||
| require 'rugged' | ||||
|  | ||||
| @@ -30,7 +31,7 @@ if File.directory?(path) | ||||
|     puts | ||||
|     file_breakdown = repo.breakdown_by_file | ||||
|     file_breakdown.each do |lang, files| | ||||
|       puts "#{lang}:"  | ||||
|       puts "#{lang}:" | ||||
|       files.each do |file| | ||||
|         puts file | ||||
|       end | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| require 'linguist/generated' | ||||
| require 'linguist/language' | ||||
|  | ||||
| require 'charlock_holmes' | ||||
| require 'escape_utils' | ||||
| require 'mime/types' | ||||
|   | ||||
| @@ -52,5 +52,20 @@ module Linguist | ||||
|     def size | ||||
|       File.size(@path) | ||||
|     end | ||||
|  | ||||
|     # Public: Get file extension. | ||||
|     # | ||||
|     # Returns a String. | ||||
|     def extension | ||||
|       # File.extname returns nil if the filename is an extension. | ||||
|       extension = File.extname(name) | ||||
|       basename = File.basename(name) | ||||
|       # Checks if the filename is an extension. | ||||
|       if extension.empty? && basename[0] == "." | ||||
|         basename | ||||
|       else | ||||
|         extension | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -54,7 +54,7 @@ module Linguist | ||||
|       name == 'Gemfile.lock' || | ||||
|         minified_files? || | ||||
|         compiled_coffeescript? || | ||||
|         xcode_project_file? || | ||||
|         xcode_file? || | ||||
|         generated_parser? || | ||||
|         generated_net_docfile? || | ||||
|         generated_net_designer_file? || | ||||
| @@ -67,14 +67,14 @@ module Linguist | ||||
|         generated_by_zephir? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an XCode project file? | ||||
|     # Internal: Is the blob an Xcode file? | ||||
|     # | ||||
|     # Generated if the file extension is an XCode project | ||||
|     # Generated if the file extension is an Xcode  | ||||
|     # file extension. | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def xcode_project_file? | ||||
|       ['.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     def xcode_file? | ||||
|       ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob minified files? | ||||
| @@ -235,7 +235,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def composer_lock? | ||||
|       !!name.match(/composer.lock/) | ||||
|       !!name.match(/composer\.lock/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated by Zephir | ||||
| @@ -256,3 +256,4 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| module Linguist | ||||
|   # A collection of simple heuristics that can be used to better analyze languages. | ||||
|   class Heuristics | ||||
|     ACTIVE = false | ||||
|     ACTIVE = true | ||||
|  | ||||
|     # Public: Given an array of String language names, | ||||
|     # apply heuristics against the given data and return an array | ||||
| @@ -13,24 +13,13 @@ module Linguist | ||||
|     # Returns an array of Languages or [] | ||||
|     def self.find_by_heuristics(data, languages) | ||||
|       if active? | ||||
|         if languages.all? { |l| ["Objective-C", "C++"].include?(l) } | ||||
|           disambiguate_c(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } | ||||
|           disambiguate_pl(data, languages) | ||||
|           result = disambiguate_pl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } | ||||
|           disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["TypeScript", "XML"].include?(l) } | ||||
|           disambiguate_ts(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } | ||||
|           disambiguate_cl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Rebol", "R"].include?(l) } | ||||
|           disambiguate_r(data, languages) | ||||
|           result = disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         return result | ||||
|       end | ||||
|     end | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,8 @@ end | ||||
| require 'linguist/classifier' | ||||
| require 'linguist/heuristics' | ||||
| require 'linguist/samples' | ||||
| require 'linguist/file_blob' | ||||
| require 'linguist/blob_helper' | ||||
|  | ||||
| module Linguist | ||||
|   # Language names that are recognizable by GitHub. Defined languages | ||||
| @@ -92,17 +94,25 @@ module Linguist | ||||
|  | ||||
|     # Public: Detects the Language of the blob. | ||||
|     # | ||||
|     # blob - an object that implements the Linguist `Blob` interface; | ||||
|     # 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) | ||||
|       name = blob.name.to_s | ||||
|  | ||||
|       # Check if the blob is possibly binary and bail early; this is a cheap | ||||
|       # test that uses the extension name to guess a binary binary mime type. | ||||
|       # | ||||
|       # We'll perform a more comprehensive test later which actually involves | ||||
|       # looking for binary characters in the blob | ||||
|       return nil if blob.likely_binary? || blob.binary? | ||||
|  | ||||
|       # A bit of an elegant hack. If the file is executable but extensionless, | ||||
|       # append a "magic" extension so it can be classified with other | ||||
|       # languages that have shebang scripts. | ||||
|       if File.extname(name).empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||
|       extension = FileBlob.new(name).extension | ||||
|       if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 | ||||
|         name += ".script!" | ||||
|       end | ||||
|  | ||||
| @@ -116,7 +126,7 @@ module Linguist | ||||
|         data = blob.data | ||||
|         possible_language_names = possible_languages.map(&:name) | ||||
|  | ||||
|         # Don't bother with emptiness | ||||
|         # Don't bother with binary contents or an empty file | ||||
|         if data.nil? || data == "" | ||||
|           nil | ||||
|         # Check if there's a shebang line and use that as authoritative | ||||
| @@ -126,7 +136,7 @@ module Linguist | ||||
|         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? | ||||
|           determined.first | ||||
|         # Lastly, fall back to the probablistic classifier. | ||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first | ||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names).first | ||||
|           # Return the actual Language object based of the string language name (i.e., first element of `#classify`) | ||||
|           Language[classified[0]] | ||||
|         end | ||||
| @@ -182,7 +192,8 @@ module Linguist | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_filename(filename) | ||||
|       basename, extname = File.basename(filename), File.extname(filename) | ||||
|       basename = File.basename(filename) | ||||
|       extname = FileBlob.new(filename).extension | ||||
|       langs = @filename_index[basename] + | ||||
|               @extension_index[extname] | ||||
|       langs.compact.uniq | ||||
| @@ -394,7 +405,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the extensions Array | ||||
|     attr_reader :filenames | ||||
|      | ||||
|  | ||||
|     # Public: Return all possible extensions for language | ||||
|     def all_extensions | ||||
|       (extensions + [primary_extension]).uniq | ||||
| @@ -521,6 +532,7 @@ module Linguist | ||||
|     if extnames = extensions[name] | ||||
|       extnames.each do |extname| | ||||
|         if !options['extensions'].include?(extname) | ||||
|           warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!' | ||||
|           options['extensions'] << extname | ||||
|         end | ||||
|       end | ||||
|   | ||||
| @@ -28,6 +28,16 @@ ABAP: | ||||
|   extensions: | ||||
|   - .abap | ||||
|  | ||||
| AGS Script: | ||||
|   type: programming | ||||
|   lexer: C++ | ||||
|   color: "#B9D9FF" | ||||
|   aliases: | ||||
|   - ags | ||||
|   extensions: | ||||
|   - .asc | ||||
|   - .ash | ||||
|  | ||||
| ANTLR: | ||||
|   type: programming | ||||
|   color: "#9DC3FF" | ||||
| @@ -35,6 +45,12 @@ ANTLR: | ||||
|   extensions: | ||||
|   - .g4 | ||||
|  | ||||
| APL: | ||||
|   type: programming | ||||
|   color: "#8a0707" | ||||
|   extensions: | ||||
|   - .apl | ||||
|  | ||||
| ASP: | ||||
|   type: programming | ||||
|   color: "#6a40fd" | ||||
| @@ -89,7 +105,7 @@ Agda: | ||||
|  | ||||
| Alloy: | ||||
|   type: programming  # 'modeling' would be more appropiate | ||||
|   lexer: Text only | ||||
|   lexer: Alloy | ||||
|   color: "#cc5c24" | ||||
|   extensions: | ||||
|   - .als | ||||
| @@ -157,7 +173,6 @@ Assembly: | ||||
|   - nasm | ||||
|   extensions: | ||||
|   - .asm | ||||
|   - .inc | ||||
|  | ||||
| Augeas: | ||||
|   type: programming | ||||
| @@ -222,6 +237,8 @@ BlitzBasic: | ||||
|   - .decls | ||||
|  | ||||
| BlitzMax: | ||||
|   type: programming | ||||
|   color: "#cd6400" | ||||
|   extensions: | ||||
|   - .bmx | ||||
|  | ||||
| @@ -259,6 +276,7 @@ C: | ||||
|   extensions: | ||||
|   - .c | ||||
|   - .cats | ||||
|   - .h | ||||
|   - .w | ||||
|  | ||||
| C#: | ||||
| @@ -287,6 +305,7 @@ C++: | ||||
|   - .cc | ||||
|   - .cxx | ||||
|   - .H | ||||
|   - .h | ||||
|   - .h++ | ||||
|   - .hh | ||||
|   - .hpp | ||||
| @@ -320,7 +339,7 @@ CLIPS: | ||||
| CMake: | ||||
|   extensions: | ||||
|   - .cmake | ||||
|   - .cmake.in | ||||
|   - .in | ||||
|   filenames: | ||||
|   - CMakeLists.txt | ||||
|  | ||||
| @@ -345,6 +364,14 @@ Ceylon: | ||||
|   extensions: | ||||
|   - .ceylon | ||||
|  | ||||
| Chapel: | ||||
|   type: programming | ||||
|   color: "#8dc63f" | ||||
|   aliases: | ||||
|   - chpl | ||||
|   extensions: | ||||
|   - .chpl | ||||
|  | ||||
| ChucK: | ||||
|   lexer: Java | ||||
|   extensions: | ||||
| @@ -353,9 +380,8 @@ ChucK: | ||||
| Cirru: | ||||
|   type: programming | ||||
|   color: "#aaaaff" | ||||
|   # ace_mode: cirru | ||||
|   # lexer: Cirru | ||||
|   lexer: Text only | ||||
|   ace_mode: cirru | ||||
|   lexer: Cirru | ||||
|   extensions: | ||||
|   - .cirru | ||||
|  | ||||
| @@ -379,7 +405,7 @@ Clojure: | ||||
|   - .cljscm | ||||
|   - .cljx | ||||
|   - .hic | ||||
|   - .cljs.hl | ||||
|   - .hl | ||||
|   filenames: | ||||
|   - riemann.config | ||||
|  | ||||
| @@ -402,14 +428,27 @@ CoffeeScript: | ||||
|  | ||||
| ColdFusion: | ||||
|   type: programming | ||||
|   group: ColdFusion | ||||
|   lexer: Coldfusion HTML | ||||
|   ace_mode: coldfusion | ||||
|   color: "#ed2cd6" | ||||
|   search_term: cfm | ||||
|   aliases: | ||||
|   - cfm | ||||
|   - cfml | ||||
|   extensions: | ||||
|   - .cfm | ||||
|  | ||||
| ColdFusion CFC: | ||||
|   type: programming | ||||
|   group: ColdFusion | ||||
|   lexer: Coldfusion CFC | ||||
|   ace_mode: coldfusion | ||||
|   color: "#ed2cd6" | ||||
|   search_term: cfc | ||||
|   aliases: | ||||
|   - cfc | ||||
|   extensions: | ||||
|   - .cfc | ||||
|  | ||||
| Common Lisp: | ||||
| @@ -443,6 +482,7 @@ Coq: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - .coq | ||||
|   - .v | ||||
|  | ||||
| Cpp-ObjDump: | ||||
|   type: data | ||||
| @@ -478,6 +518,12 @@ Cuda: | ||||
|   - .cu | ||||
|   - .cuh | ||||
|  | ||||
| Cycript: | ||||
|   type: programming | ||||
|   lexer: JavaScript | ||||
|   extensions: | ||||
|   - .cy | ||||
|  | ||||
| Cython: | ||||
|   type: programming | ||||
|   group: Python | ||||
| @@ -532,6 +578,7 @@ Dart: | ||||
| Diff: | ||||
|   extensions: | ||||
|   - .diff | ||||
|   - .patch | ||||
|  | ||||
| Dogescript: | ||||
|   type: programming | ||||
| @@ -580,7 +627,7 @@ Eagle: | ||||
|  | ||||
| Eiffel: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Eiffel | ||||
|   color: "#946d57" | ||||
|   extensions: | ||||
|   - .e | ||||
| @@ -600,7 +647,7 @@ Elm: | ||||
|  | ||||
| Emacs Lisp: | ||||
|   type: programming | ||||
|   lexer: Scheme | ||||
|   lexer: Common Lisp | ||||
|   color: "#c065db" | ||||
|   aliases: | ||||
|   - elisp | ||||
| @@ -611,11 +658,20 @@ Emacs Lisp: | ||||
|   - .el | ||||
|   - .emacs | ||||
|  | ||||
| EmberScript: | ||||
|   type: programming | ||||
|   color: "#f64e3e" | ||||
|   lexer: CoffeeScript | ||||
|   extensions: | ||||
|   - .em | ||||
|   - .emberscript | ||||
|  | ||||
| Erlang: | ||||
|   type: programming | ||||
|   color: "#0faf8d" | ||||
|   extensions: | ||||
|   - .erl | ||||
|   - .escript | ||||
|   - .hrl | ||||
|  | ||||
| F#: | ||||
| @@ -691,6 +747,7 @@ Forth: | ||||
|   extensions: | ||||
|   - .fth | ||||
|   - .4th | ||||
|   - .forth | ||||
|  | ||||
| Frege: | ||||
|   type: programming | ||||
| @@ -799,6 +856,15 @@ Gosu: | ||||
|   color: "#82937f" | ||||
|   extensions: | ||||
|   - .gs | ||||
|   - .gst | ||||
|   - .gsx | ||||
|   - .vark | ||||
|  | ||||
| Grace: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .grace | ||||
|  | ||||
| Grammatical Framework: | ||||
|   type: programming | ||||
| @@ -828,6 +894,7 @@ Groovy: | ||||
|   color: "#e69f56" | ||||
|   extensions: | ||||
|   - .groovy | ||||
|   - .gradle | ||||
|   - .grt | ||||
|   - .gtpl | ||||
|   - .gvy | ||||
| @@ -850,7 +917,6 @@ HTML: | ||||
|   extensions: | ||||
|   - .html | ||||
|   - .htm | ||||
|   - .html.hl | ||||
|   - .st | ||||
|   - .xhtml | ||||
|  | ||||
| @@ -870,9 +936,7 @@ HTML+ERB: | ||||
|   - erb | ||||
|   extensions: | ||||
|   - .erb | ||||
|   - .erb.deface | ||||
|   - .html.erb | ||||
|   - .html.erb.deface | ||||
|   - .deface | ||||
|  | ||||
| HTML+PHP: | ||||
|   type: markup | ||||
| @@ -890,17 +954,14 @@ Haml: | ||||
|   type: markup | ||||
|   extensions: | ||||
|   - .haml | ||||
|   - .haml.deface | ||||
|   - .html.haml.deface | ||||
|   - .deface | ||||
|  | ||||
| Handlebars: | ||||
|   type: markup | ||||
|   lexer: Text only | ||||
|   lexer: Handlebars | ||||
|   extensions: | ||||
|   - .handlebars | ||||
|   - .hbs | ||||
|   - .html.handlebars | ||||
|   - .html.hbs | ||||
|  | ||||
| Harbour: | ||||
|   type: programming | ||||
| @@ -926,7 +987,7 @@ Haxe: | ||||
|  | ||||
| Hy: | ||||
|   type: programming | ||||
|   lexer: Clojure | ||||
|   lexer: Hy | ||||
|   ace_mode: clojure | ||||
|   color: "#7891b1" | ||||
|   extensions: | ||||
| @@ -938,6 +999,13 @@ IDL: | ||||
|   color: "#e3592c" | ||||
|   extensions: | ||||
|   - .pro | ||||
|   - .dlm | ||||
|  | ||||
| IGOR Pro: | ||||
|   type: programming | ||||
|   lexer: Igor | ||||
|   extensions: | ||||
|   - .ipf | ||||
|  | ||||
| INI: | ||||
|   type: data | ||||
| @@ -960,7 +1028,7 @@ Idris: | ||||
|  | ||||
| Inform 7: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Inform 7 | ||||
|   wrap: true | ||||
|   extensions: | ||||
|   - .ni | ||||
| @@ -1012,6 +1080,7 @@ JSON: | ||||
|   searchable: false | ||||
|   extensions: | ||||
|   - .json | ||||
|   - .lock | ||||
|   - .sublime-keymap | ||||
|   - .sublime-mousemap | ||||
|   - .sublime-project | ||||
| @@ -1134,12 +1203,31 @@ LLVM: | ||||
|   extensions: | ||||
|   - .ll | ||||
|  | ||||
| LSL: | ||||
|   type: programming | ||||
|   lexer: LSL | ||||
|   ace_mode: lsl | ||||
|   extensions: | ||||
|   - .lsl | ||||
|   interpreters: | ||||
|   - lsl | ||||
|   color: '#3d9970' | ||||
|  | ||||
| LabVIEW: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .lvproj | ||||
|  | ||||
| Lasso: | ||||
|   type: programming | ||||
|   lexer: Lasso | ||||
|   color: "#2584c3" | ||||
|   extensions: | ||||
|   - .lasso | ||||
|   - .las | ||||
|   - .lasso9 | ||||
|   - .ldml | ||||
|  | ||||
| Latte: | ||||
|   type: markup | ||||
| @@ -1218,6 +1306,14 @@ Logtalk: | ||||
|   - .lgt | ||||
|   - .logtalk | ||||
|  | ||||
| LookML: | ||||
|   type: programming | ||||
|   lexer: YAML | ||||
|   ace_mode: yaml | ||||
|   color: "#652B81" | ||||
|   extensions: | ||||
|   - .lookml | ||||
|  | ||||
| Lua: | ||||
|   type: programming | ||||
|   ace_mode: lua | ||||
| @@ -1225,6 +1321,7 @@ Lua: | ||||
|   extensions: | ||||
|   - .lua | ||||
|   - .nse | ||||
|   - .pd_lua | ||||
|   - .rbxs | ||||
|   interpreters: | ||||
|   - lua | ||||
| @@ -1290,7 +1387,7 @@ Mathematica: | ||||
|   - .mathematica | ||||
|   - .m | ||||
|   - .nb | ||||
|   lexer: Text only | ||||
|   lexer: Mathematica | ||||
|  | ||||
| Matlab: | ||||
|   type: programming | ||||
| @@ -1338,7 +1435,7 @@ MiniD: # Legacy | ||||
| Mirah: | ||||
|   type: programming | ||||
|   lexer: Ruby | ||||
|   search_term: ruby | ||||
|   search_term: mirah | ||||
|   color: "#c7a938" | ||||
|   extensions: | ||||
|   - .druby | ||||
| @@ -1370,6 +1467,7 @@ Myghty: | ||||
| NSIS: | ||||
|   extensions: | ||||
|   - .nsi | ||||
|   - .nsh | ||||
|  | ||||
| Nemerle: | ||||
|   type: programming | ||||
| @@ -1397,6 +1495,13 @@ Nimrod: | ||||
|   - .nim | ||||
|   - .nimrod | ||||
|  | ||||
| Nit: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   color: "#0d8921" | ||||
|   extensions: | ||||
|   - .nit | ||||
|  | ||||
| Nix: | ||||
|   type: programming | ||||
|   lexer: Nix | ||||
| @@ -1427,6 +1532,7 @@ OCaml: | ||||
|   color: "#3be133" | ||||
|   extensions: | ||||
|   - .ml | ||||
|   - .eliom | ||||
|   - .eliomi | ||||
|   - .ml4 | ||||
|   - .mli | ||||
| @@ -1447,6 +1553,7 @@ Objective-C: | ||||
|   - objc | ||||
|   extensions: | ||||
|   - .m | ||||
|   - .h | ||||
|  | ||||
| Objective-C++: | ||||
|   type: programming | ||||
| @@ -1478,6 +1585,13 @@ Opa: | ||||
|   extensions: | ||||
|   - .opa | ||||
|  | ||||
| Opal: | ||||
|   type: programming | ||||
|   color: "#f7ede0" | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .opal | ||||
|  | ||||
| OpenCL: | ||||
|   type: programming | ||||
|   group: C | ||||
| @@ -1494,6 +1608,13 @@ OpenEdge ABL: | ||||
|   - abl | ||||
|   extensions: | ||||
|   - .p | ||||
|   - .cls | ||||
|  | ||||
| OpenSCAD: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .scad | ||||
|  | ||||
| Org: | ||||
|   type: prose | ||||
| @@ -1532,16 +1653,19 @@ PHP: | ||||
|   - .php | ||||
|   - .aw | ||||
|   - .ctp | ||||
|   - .module | ||||
|   - .php3 | ||||
|   - .php4 | ||||
|   - .php5 | ||||
|   - .phpt | ||||
|   filenames: | ||||
|   - Phakefile | ||||
|   interpreters: | ||||
|   - php | ||||
|  | ||||
| Pan: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   lexer: Pan | ||||
|   color: '#cc0000' | ||||
|   extensions: | ||||
|   - .pan | ||||
| @@ -1578,6 +1702,7 @@ Pascal: | ||||
|   extensions: | ||||
|   - .pas | ||||
|   - .dfm | ||||
|   - .dpr | ||||
|   - .lpr | ||||
|  | ||||
| Perl: | ||||
| @@ -1587,12 +1712,15 @@ Perl: | ||||
|   extensions: | ||||
|   - .pl | ||||
|   - .PL | ||||
|   - .cgi | ||||
|   - .fcgi | ||||
|   - .perl | ||||
|   - .ph | ||||
|   - .plx | ||||
|   - .pm | ||||
|   - .pod | ||||
|   - .psgi | ||||
|   - .t | ||||
|   interpreters: | ||||
|   - perl | ||||
|  | ||||
| @@ -1609,6 +1737,13 @@ Perl6: | ||||
|   - .pl6 | ||||
|   - .pm6 | ||||
|  | ||||
| PigLatin: | ||||
|   type: programming | ||||
|   color: "#fcd7de" | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .pig | ||||
|  | ||||
| Pike: | ||||
|   type: programming | ||||
|   color: "#066ab2" | ||||
| @@ -1659,9 +1794,9 @@ Prolog: | ||||
|   type: programming | ||||
|   color: "#74283c" | ||||
|   extensions: | ||||
|   - .prolog | ||||
|   - .ecl | ||||
|   - .pl | ||||
|   - .ecl | ||||
|   - .prolog | ||||
|  | ||||
| Propeller Spin: | ||||
|   type: programming | ||||
| @@ -1761,7 +1896,7 @@ R: | ||||
|  | ||||
| RDoc: | ||||
|   type: prose | ||||
|   lexer: Text only | ||||
|   lexer: Rd | ||||
|   ace_mode: rdoc | ||||
|   wrap: true | ||||
|   extensions: | ||||
| @@ -1801,6 +1936,7 @@ Racket: | ||||
|   - .rkt | ||||
|   - .rktd | ||||
|   - .rktl | ||||
|   - .scrbl | ||||
|  | ||||
| Ragel in Ruby Host: | ||||
|   type: programming | ||||
| @@ -1870,7 +2006,10 @@ Ruby: | ||||
|   - .god | ||||
|   - .irbrc | ||||
|   - .mspec | ||||
|   - .pluginspec | ||||
|   - .podspec | ||||
|   - .rabl | ||||
|   - .rake | ||||
|   - .rbuild | ||||
|   - .rbw | ||||
|   - .rbx | ||||
| @@ -1890,6 +2029,7 @@ Ruby: | ||||
|   - Jarfile | ||||
|   - Mavenfile | ||||
|   - Podfile | ||||
|   - Puppetfile | ||||
|   - Thorfile | ||||
|   - Vagrantfile | ||||
|   - buildfile | ||||
| @@ -1914,6 +2054,14 @@ SCSS: | ||||
|   extensions: | ||||
|   - .scss | ||||
|  | ||||
| SQF: | ||||
|   type: programming | ||||
|   color: "#FFCB1F" | ||||
|   lexer: C++ | ||||
|   extensions: | ||||
|   - .sqf | ||||
|   - .hqf | ||||
|  | ||||
| SQL: | ||||
|   type: data | ||||
|   ace_mode: sql | ||||
| @@ -1943,6 +2091,7 @@ Sass: | ||||
|   group: CSS | ||||
|   extensions: | ||||
|   - .sass | ||||
|   - .scss | ||||
|  | ||||
| Scala: | ||||
|   type: programming | ||||
| @@ -1950,6 +2099,7 @@ Scala: | ||||
|   color: "#7dd3b0" | ||||
|   extensions: | ||||
|   - .scala | ||||
|   - .sbt | ||||
|   - .sc | ||||
|  | ||||
| Scaml: | ||||
| @@ -1965,6 +2115,7 @@ Scheme: | ||||
|   - .scm | ||||
|   - .sld | ||||
|   - .sls | ||||
|   - .sps | ||||
|   - .ss | ||||
|   interpreters: | ||||
|   - guile | ||||
| @@ -1976,6 +2127,8 @@ Scilab: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - .sci | ||||
|   - .sce | ||||
|   - .tst | ||||
|  | ||||
| Self: | ||||
|   type: programming | ||||
| @@ -1995,8 +2148,10 @@ Shell: | ||||
|   - zsh | ||||
|   extensions: | ||||
|   - .sh | ||||
|   - .bash | ||||
|   - .bats | ||||
|   - .tmux | ||||
|   - .zsh | ||||
|   interpreters: | ||||
|   - bash | ||||
|   - sh | ||||
| @@ -2063,6 +2218,7 @@ Standard ML: | ||||
|   extensions: | ||||
|   - .ML | ||||
|   - .fun | ||||
|   - .sig | ||||
|   - .sml | ||||
|  | ||||
| Stata: | ||||
| @@ -2143,10 +2299,13 @@ TeX: | ||||
|   extensions: | ||||
|   - .tex | ||||
|   - .aux | ||||
|   - .bbx | ||||
|   - .bib | ||||
|   - .cbx | ||||
|   - .cls | ||||
|   - .dtx | ||||
|   - .ins | ||||
|   - .lbx | ||||
|   - .ltx | ||||
|   - .mkii | ||||
|   - .mkiv | ||||
| @@ -2263,6 +2422,7 @@ Visual Basic: | ||||
|   extensions: | ||||
|   - .vb | ||||
|   - .bas | ||||
|   - .cls | ||||
|   - .frm | ||||
|   - .frx | ||||
|   - .vba | ||||
| @@ -2291,6 +2451,7 @@ XML: | ||||
|   - wsdl | ||||
|   extensions: | ||||
|   - .xml | ||||
|   - .ant | ||||
|   - .axml | ||||
|   - .ccxml | ||||
|   - .clixml | ||||
| @@ -2304,6 +2465,7 @@ XML: | ||||
|   - .fsproj | ||||
|   - .glade | ||||
|   - .grxml | ||||
|   - .ivy | ||||
|   - .jelly | ||||
|   - .kml | ||||
|   - .launch | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -36,12 +36,28 @@ | ||||
| # Bootstrap minified css and js | ||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||
|  | ||||
| # Font Awesome | ||||
| - font-awesome.min.css | ||||
| - font-awesome.css | ||||
|  | ||||
| # Foundation css | ||||
| - foundation.min.css | ||||
| - foundation.css | ||||
|  | ||||
| # Normalize.css | ||||
| - normalize.css | ||||
|  | ||||
| # Bourbon SCSS | ||||
| - (^|/)[Bb]ourbon/.*\.css$ | ||||
| - (^|/)[Bb]ourbon/.*\.scss$ | ||||
|  | ||||
| # Animate.css | ||||
| - animate.css | ||||
| - animate.min.css | ||||
|  | ||||
| # Vendored dependencies | ||||
| - thirdparty/ | ||||
| - third[-_]?party/ | ||||
| - 3rd[-_]?party/ | ||||
| - vendors?/ | ||||
| - extern(al)?/ | ||||
|  | ||||
| @@ -109,6 +125,10 @@ | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)modernizr\.custom\.\d+\.js$ | ||||
|  | ||||
| # Knockout | ||||
| - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||
| - knockout-min.js | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| # django | ||||
| @@ -125,6 +145,9 @@ | ||||
|  | ||||
| ## Obj-C ## | ||||
|  | ||||
| # Cocoapods | ||||
| - ^Pods/ | ||||
|  | ||||
| # Sparkle | ||||
| - (^|/)Sparkle/ | ||||
|  | ||||
| @@ -192,6 +215,9 @@ | ||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
|  | ||||
| # Foundation js | ||||
| - foundation(\..*)?\.js$ | ||||
|  | ||||
| # Vagrant | ||||
| - ^Vagrantfile$ | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "3.0.0" | ||||
|   VERSION = "3.1.4" | ||||
| end | ||||
|   | ||||
							
								
								
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | ||||
| // main global script file | ||||
|  | ||||
| // A function that initializes a bunch of stuff. | ||||
| function initialize_control_panel() {  | ||||
|   // Centre the control panel | ||||
|   gPanel.Centre();  | ||||
|   // Centre the Restart dialog as well | ||||
|   gRestartYN.Centre();  | ||||
|   if (!IsSpeechVoxAvailable()) {  | ||||
|     // If there is no speech-vox file, and therefore no speech, | ||||
|     // disable all the controls related with speech. | ||||
|     lblVoice.Visible = false;   | ||||
|     btnVoice.Visible = false;   | ||||
|     sldVoice.Visible = false; | ||||
|   } | ||||
|   else { | ||||
|     // If there *is*, then set it to voice and text. It's best to use | ||||
|     // both whenever possible, for the player's sake. | ||||
|     SetVoiceMode(eSpeechVoiceAndText);  | ||||
|     // And reflect this in the control panel. | ||||
|     btnVoice.Text = "Voice and Text";  | ||||
|   } | ||||
|   if (!System.SupportsGammaControl) { | ||||
|     // If we can't change the gamma settings, disable the relevant options. | ||||
|     sldGamma.Visible = false;  | ||||
|     lblGamma.Visible = false; | ||||
|   }  | ||||
|    | ||||
|   //And now, set all the defaults | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   SetGameSpeed(40); | ||||
|   sldSpeed.Value = 40; | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Called when the game starts, before the first room is loaded | ||||
| function game_start() {    | ||||
|   // Put the code all in a function and then just call the function.  | ||||
|   // It saves cluttering up places like game_start. | ||||
|   initialize_control_panel();  | ||||
|   // Use the KeyboardMovement module to, per default, replicate the standard | ||||
|   // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info | ||||
|   KeyboardMovement.SetMode(eKeyboardMovement_Tapping);  | ||||
| } | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|    | ||||
|   // Put here anything you want to happen every game cycle, even when | ||||
|   // the game is paused. This will not run when the game is blocked | ||||
|   // inside a command like a blocking Walk() | ||||
|    | ||||
|   if (IsGamePaused() == 1) return; | ||||
|  | ||||
|   // Put here anything you want to happen every game cycle, but not | ||||
|   // when the game is paused. | ||||
| } | ||||
|  | ||||
| function repeatedly_execute_always() { | ||||
|    | ||||
|   // Put anything you want to happen every game cycle, even | ||||
|   // when the game is blocked inside a command like a | ||||
|   // blocking Walk(). | ||||
|   // You cannot run blocking commands from this function. | ||||
|    | ||||
| } | ||||
|  | ||||
| function show_inventory_window ()  | ||||
| { | ||||
|   gInventory.Visible = true; | ||||
|   // switch to the Use cursor (to select items with) | ||||
|   mouse.Mode = eModeInteract; | ||||
|   // But, override the appearance to look like the arrow | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function show_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = true; | ||||
|   // Get the list of save games | ||||
|   lstSaveGamesList.FillSaveGameList(); | ||||
|   if (lstSaveGamesList.ItemCount > 0) | ||||
|   { | ||||
|     // If there is at least one, set the default text | ||||
|     // to be the first game's name | ||||
|     txtNewSaveName.Text = lstSaveGamesList.Items[0]; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     // No save games yet, default empty text. | ||||
|     txtNewSaveName.Text = ""; | ||||
|   } | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function show_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = true; | ||||
|   lstRestoreGamesList.FillSaveGameList(); | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function close_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function close_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| // Called when a key is pressed. keycode holds the key's ASCII code | ||||
| function on_key_press(eKeyCode keycode) { | ||||
|   // The following is called before "if game is paused keycode=0", so | ||||
|   // it'll happen even when the game is paused. | ||||
|    | ||||
|   if ((keycode == eKeyEscape) && gRestartYN.Visible) { | ||||
|     //Use ESC to cancel restart. | ||||
|     gRestartYN.Visible = false;  | ||||
|     gIconbar.Visible = true; | ||||
|     // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|     // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|     // because it's already a pointer. Get used to thinking like this!! | ||||
|     if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && gPanel.Visible) { | ||||
|     // Use ESC to turn the panel off. | ||||
|     gPanel.Visible = false;  | ||||
|     mouse.UseDefaultGraphic(); | ||||
|     gIconbar.Visible = true; | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gSaveGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the save game dialog | ||||
|     close_save_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the restore game dialog | ||||
|     close_restore_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|    | ||||
|   if (keycode == eKeyReturn) {  | ||||
|     // ENTER, in this case merely confirms restart | ||||
|     if (gRestartYN.Visible) RestartGame(); | ||||
|   } | ||||
|  | ||||
|   if (IsGamePaused() || (IsInterfaceEnabled() == 0)) | ||||
|   { | ||||
|     // If the game is paused with a modal GUI on the | ||||
|     // screen, or the player interface is disabled in | ||||
|     // a cut scene, ignore any keypresses. | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // FUNCTION KEYS AND SYSTEM SHORTCUTS | ||||
|   if (keycode == eKeyEscape) { | ||||
|     // ESC | ||||
|     gPanel.Visible = true;  | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q | ||||
|   if (keycode == eKeyF5) show_save_game_dialog();   // F5 | ||||
|   if (keycode == eKeyF7) show_restore_game_dialog();  // F7 | ||||
|   if (keycode == eKeyF9) { | ||||
|     // F9, asks the player to confirm restarting (so much better to always confirm first) | ||||
|     gRestartYN.Visible = true;   | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12 | ||||
|   if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory | ||||
|  | ||||
|   // GAME COMMAND SHORTCUTS | ||||
|   if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. | ||||
|   if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. | ||||
|   if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, | ||||
|   if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. | ||||
|   if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. | ||||
|  | ||||
|   // For extra cursor modes, such as pick up, feel free to add as you will. | ||||
|   // Uncomment the line below if you use the "Pick Up" mode. | ||||
|   //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;  | ||||
|  | ||||
|   // DEBUG FUNCTIONS | ||||
|   if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory | ||||
|   if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version | ||||
|   if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas | ||||
|   if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room | ||||
|   if (keycode == eKeyCtrlW && game.debug_mode)  | ||||
|     player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area  | ||||
| } | ||||
|  | ||||
|  | ||||
| function on_mouse_click(MouseButton button) { | ||||
|   // called when a mouse button is clicked. button is either LEFT or RIGHT | ||||
|   if (IsGamePaused() == 1) { | ||||
|     // Game is paused, so do nothing (ie. don't allow mouse click) | ||||
|   } | ||||
|   else if (button == eMouseLeft) { | ||||
|     ProcessClick(mouse.x, mouse.y, mouse.Mode ); | ||||
|   } | ||||
|   else if (button == eMouseRight || button == eMouseWheelSouth){ | ||||
|     // right-click our mouse-wheel down, so cycle cursor | ||||
|     mouse.SelectNextMode(); | ||||
|   } | ||||
|   else if (button == eMouseMiddle) {  | ||||
|     // Middle-button-click, default make character walk to clicked area (a little shortcut) | ||||
|     // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to | ||||
|     // leave our options open - what if you have a special script triggered | ||||
|     // on "walking" mode? | ||||
|     ProcessClick(mouse.x, mouse.y, eModeWalkto);  | ||||
|   } | ||||
|   else if (button == eMouseWheelNorth) {  | ||||
|     // Mouse-wheel up, cycle cursors  | ||||
|     // If mode isn't WALK, set the previous mode (notice usage of numbers instead | ||||
|     // of eNums, when it suits us)... | ||||
|     if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;  | ||||
|     else  | ||||
|     {  | ||||
|       // ...but if it is WALK mode... | ||||
|       if (player.ActiveInventory!=null)  | ||||
|       { | ||||
|         //...and the player has a selected inventory item, set mouse mode to UseInv.  | ||||
|         mouse.Mode=eModeUseinv;  | ||||
|       } | ||||
|       else  | ||||
|       { | ||||
|         // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) | ||||
|         mouse.Mode=eModeTalkto;  | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function interface_click(int interface, int button) { | ||||
|   // This function is obsolete, from 2.62 and earlier versions. | ||||
| } | ||||
|  | ||||
| function btnInvUp_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollUp(); | ||||
| } | ||||
|  | ||||
| function btnInvDown_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollDown(); | ||||
| } | ||||
|  | ||||
| function btnInvOK_Click(GUIControl *control, MouseButton button) { | ||||
| 	// They pressed the OK button, close the GUI | ||||
| 	gInventory.Visible = false; | ||||
| 	mouse.UseDefaultGraphic(); | ||||
| } | ||||
|  | ||||
| function btnInvSelect_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
| 	// They pressed SELECT, so switch to the Get cursor | ||||
| 	mouse.Mode = eModeInteract; | ||||
| 	// But, override the appearance to look like the arrow | ||||
| 	mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnIconInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   show_inventory_window(); | ||||
| } | ||||
|  | ||||
| function btnIconCurInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   if (player.ActiveInventory != null) | ||||
|     mouse.Mode = eModeUseinv; | ||||
| } | ||||
|  | ||||
| function btnIconSave_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconLoad_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconExit_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   QuitGame(1); | ||||
| } | ||||
|  | ||||
| function btnIconAbout_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   gPanel.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function cEgo_Look() | ||||
| { | ||||
|   Display("Damn, I'm looking good!"); | ||||
| } | ||||
|  | ||||
| function cEgo_Interact() | ||||
| { | ||||
|   Display("You rub your hands up and down your clothes."); | ||||
| } | ||||
|  | ||||
| function cEgo_Talk() | ||||
| { | ||||
|   Display("Talking to yourself is a sign of madness!"); | ||||
| } | ||||
|  | ||||
| //START OF CONTROL PANEL FUNCTIONS | ||||
| function btnSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconSave_Click(btnIconSave, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function gControl_OnClick(GUI *theGui, MouseButton button) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| function btnAbout_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
| Display("Adventure Game Studio run-time engine default game."); | ||||
| } | ||||
|  | ||||
| function btnQuit_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   Wait(1); | ||||
|   QuitGame(1); | ||||
|   gPanel.Visible = true; | ||||
|   gIconbar.Visible = false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnLoad_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconLoad_Click(btnIconLoad, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnResume_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function sldAudio_OnChange(GUIControl *control) | ||||
| { | ||||
|   System.Volume = sldAudio.Value; | ||||
| } | ||||
|  | ||||
| function sldVoice_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Sets voice volume. Note that we don't check for the existence of speech.vox -  | ||||
|   // we did that in game_start, so if it's not there the slider won't even be available. | ||||
|   SetSpeechVolume(sldVoice.Value);  | ||||
| } | ||||
|  | ||||
| function btnVoice_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Note that we don't check for the existence of speech.vox - we did that in game_start, | ||||
|   // so if it's not there the button won't even be available. | ||||
|   if (btnVoice.Text == "Voice and Text") {  | ||||
|     SetVoiceMode(eSpeechVoiceOnly);  | ||||
|     btnVoice.Text = "Voice only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Voice only") { | ||||
|     SetVoiceMode(eSpeechTextOnly); | ||||
|     btnVoice.Text = "Text only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Text only") { | ||||
|     SetVoiceMode(eSpeechVoiceAndText); | ||||
|     btnVoice.Text = "Voice and Text"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| function sldGamma_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Set the gamma. Note there's no need to check for anything else, as we ensured, | ||||
|   // in game_start, that the slider won't even appear if it's not possible to do this. | ||||
|   System.Gamma = sldGamma.Value;  | ||||
| } | ||||
|  | ||||
| function btnDefault_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Reset everything to default. You'll have to edit these as well as the sliders | ||||
|   // if you'd rather have different default parameters. | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   sldSpeed.Value = 40; | ||||
|   SetGameSpeed(40); | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
| //END OF CONTROL PANEL FUNCTIONS | ||||
|  | ||||
| function dialog_request(int param)  | ||||
| { | ||||
|   // This is used by the dialog text parser if you need to process | ||||
|   // text that the player types in to the parser. | ||||
|   // It is not used by default. | ||||
| } | ||||
|  | ||||
| function sldSpeed_OnChange(GUIControl *control) | ||||
| { | ||||
|   SetGameSpeed(sldSpeed.Value); | ||||
| } | ||||
|  | ||||
| function btnRestart_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
| } | ||||
|  | ||||
| function btnRestartYes_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   RestartGame(); | ||||
| } | ||||
|  | ||||
| function btnRestartNo_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible = false; | ||||
|   gIconbar.Visible = true; | ||||
|   // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|   // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|   // because it's already a pointer. Get used to thinking like this!! | ||||
|   if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
| } | ||||
|  | ||||
| function btnCancelSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnSaveGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; | ||||
|   int i = 0; | ||||
|   while (i < lstSaveGamesList.ItemCount) | ||||
|   { | ||||
|     if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) | ||||
|     { | ||||
|       gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; | ||||
|     } | ||||
|     i++; | ||||
|   } | ||||
|   SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstRestoreGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); | ||||
|   } | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function lstSaveGamesList_OnSelectionCh(GUIControl *control) | ||||
| { | ||||
|   txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; | ||||
| } | ||||
|  | ||||
| function txtNewSaveName_OnActivate(GUIControl *control) | ||||
| { | ||||
|   // Pressing return in the text box simulates clicking the Save button | ||||
|   btnSaveGame_OnClick(control, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstSaveGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); | ||||
|     lstSaveGamesList.FillSaveGameList(); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // Main header script - this will be included into every script in | ||||
| // the game (local and global). Do not place functions here; rather, | ||||
| // place import definitions and #define names here to be used by all | ||||
| // scripts. | ||||
							
								
								
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| // Main script for module 'KeyboardMovement' | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // DEFINITIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| #define DISTANCE 10000// distance player walks in Tapping mode before he stops | ||||
|  | ||||
| enum KeyboardMovement_Directions { | ||||
| 	eKeyboardMovement_Stop,  | ||||
| 	eKeyboardMovement_DownLeft,  | ||||
| 	eKeyboardMovement_Down,  | ||||
| 	eKeyboardMovement_DownRight,  | ||||
| 	eKeyboardMovement_Left,  | ||||
| 	eKeyboardMovement_Right,  | ||||
| 	eKeyboardMovement_UpLeft,  | ||||
| 	eKeyboardMovement_Up,  | ||||
| 	eKeyboardMovement_UpRight | ||||
| }; | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // VARIABLES | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| // keycodes as variables for future key customization functions (static variables?): | ||||
| int KeyboardMovement_KeyDown = 380; // down arrow | ||||
| int KeyboardMovement_KeyLeft = 375; // left arrow | ||||
| int KeyboardMovement_KeyRight = 377; // right arrow | ||||
| int KeyboardMovement_KeyUp = 372; // up arrow | ||||
| int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) | ||||
| int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) | ||||
| int KeyboardMovement_KeyDownLeft = 379; // End (numpad) | ||||
| int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) | ||||
| int KeyboardMovement_KeyStop = 376; // 5 (numpad) | ||||
|  | ||||
| KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) | ||||
|  | ||||
| KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // USER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { | ||||
| 	KeyboardMovement_Mode = mode; | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| // key customization functions here | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // EVENT HANDLER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Pressing mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow | ||||
| 	else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character | ||||
|  | ||||
| 	if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_key_press(int keycode) { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Tapping mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right | ||||
| 	else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; | ||||
| 	else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; | ||||
| 	else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; | ||||
| 	else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; | ||||
| 	else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; | ||||
| 	else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
| 	else { // if new direction is same as current direction | ||||
| 		player.StopMoving(); // stop player character | ||||
| 		KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_event(EventType event, int data) { | ||||
|  | ||||
| 	if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
							
								
								
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // Script header for module 'KeyboardMovement' | ||||
|  | ||||
| #define KeyboardMovement_VERSION 101 | ||||
|  | ||||
| enum KeyboardMovement_Modes { | ||||
| 	eKeyboardMovement_None,  | ||||
| 	eKeyboardMovement_Tapping,  | ||||
| 	eKeyboardMovement_Pressing | ||||
| }; | ||||
|  | ||||
| struct KeyboardMovement { | ||||
| 	import static function SetMode(KeyboardMovement_Modes mode); | ||||
| }; | ||||
							
								
								
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| ⍝   You can try this at http://tryapl.org/ | ||||
| ⍝   I can not explain how much I suddenly love this crypto-language | ||||
|  | ||||
|  | ||||
|  | ||||
| Starts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics ' | ||||
| Middles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with ' | ||||
| Qualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential ' | ||||
| Finishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.' | ||||
|  | ||||
| rf     ← {(?⍴⍵)⊃⍵} | ||||
| erf    ← {rf ¨ ⍵} | ||||
|  | ||||
| deepak ← {erf Starts Middles Qualifiers Finishes} | ||||
|  | ||||
|  | ||||
|  | ||||
| deepak ⍬ | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,503 +0,0 @@ | ||||
|  | ||||
| ; flat assembler interface for Win32 | ||||
| ; Copyright (c) 1999-2014, Tomasz Grysztar. | ||||
| ; All rights reserved. | ||||
|  | ||||
| CREATE_NEW	       = 1 | ||||
| CREATE_ALWAYS	       = 2 | ||||
| OPEN_EXISTING	       = 3 | ||||
| OPEN_ALWAYS	       = 4 | ||||
| TRUNCATE_EXISTING      = 5 | ||||
|  | ||||
| FILE_SHARE_READ        = 1 | ||||
| FILE_SHARE_WRITE       = 2 | ||||
| FILE_SHARE_DELETE      = 4 | ||||
|  | ||||
| GENERIC_READ	       = 80000000h | ||||
| GENERIC_WRITE	       = 40000000h | ||||
|  | ||||
| STD_INPUT_HANDLE       = 0FFFFFFF6h | ||||
| STD_OUTPUT_HANDLE      = 0FFFFFFF5h | ||||
| STD_ERROR_HANDLE       = 0FFFFFFF4h | ||||
|  | ||||
| MEM_COMMIT	       = 1000h | ||||
| MEM_RESERVE	       = 2000h | ||||
| MEM_DECOMMIT	       = 4000h | ||||
| MEM_RELEASE	       = 8000h | ||||
| MEM_FREE	       = 10000h | ||||
| MEM_PRIVATE	       = 20000h | ||||
| MEM_MAPPED	       = 40000h | ||||
| MEM_RESET	       = 80000h | ||||
| MEM_TOP_DOWN	       = 100000h | ||||
|  | ||||
| PAGE_NOACCESS	       = 1 | ||||
| PAGE_READONLY	       = 2 | ||||
| PAGE_READWRITE	       = 4 | ||||
| PAGE_WRITECOPY	       = 8 | ||||
| PAGE_EXECUTE	       = 10h | ||||
| PAGE_EXECUTE_READ      = 20h | ||||
| PAGE_EXECUTE_READWRITE = 40h | ||||
| PAGE_EXECUTE_WRITECOPY = 80h | ||||
| PAGE_GUARD	       = 100h | ||||
| PAGE_NOCACHE	       = 200h | ||||
|  | ||||
| init_memory: | ||||
| 	xor	eax,eax | ||||
| 	mov	[memory_start],eax | ||||
| 	mov	eax,esp | ||||
| 	and	eax,not 0FFFh | ||||
| 	add	eax,1000h-10000h | ||||
| 	mov	[stack_limit],eax | ||||
| 	mov	eax,[memory_setting] | ||||
| 	shl	eax,10 | ||||
| 	jnz	allocate_memory | ||||
| 	push	buffer | ||||
| 	call	[GlobalMemoryStatus] | ||||
| 	mov	eax,dword [buffer+20] | ||||
| 	mov	edx,dword [buffer+12] | ||||
| 	cmp	eax,0 | ||||
| 	jl	large_memory | ||||
| 	cmp	edx,0 | ||||
| 	jl	large_memory | ||||
| 	shr	eax,2 | ||||
| 	add	eax,edx | ||||
| 	jmp	allocate_memory | ||||
|     large_memory: | ||||
| 	mov	eax,80000000h | ||||
|     allocate_memory: | ||||
| 	mov	edx,eax | ||||
| 	shr	edx,2 | ||||
| 	mov	ecx,eax | ||||
| 	sub	ecx,edx | ||||
| 	mov	[memory_end],ecx | ||||
| 	mov	[additional_memory_end],edx | ||||
| 	push	PAGE_READWRITE | ||||
| 	push	MEM_COMMIT | ||||
| 	push	eax | ||||
| 	push	0 | ||||
| 	call	[VirtualAlloc] | ||||
| 	or	eax,eax | ||||
| 	jz	not_enough_memory | ||||
| 	mov	[memory_start],eax | ||||
| 	add	eax,[memory_end] | ||||
| 	mov	[memory_end],eax | ||||
| 	mov	[additional_memory],eax | ||||
| 	add	[additional_memory_end],eax | ||||
| 	ret | ||||
|     not_enough_memory: | ||||
| 	mov	eax,[additional_memory_end] | ||||
| 	shl	eax,1 | ||||
| 	cmp	eax,4000h | ||||
| 	jb	out_of_memory | ||||
| 	jmp	allocate_memory | ||||
|  | ||||
| exit_program: | ||||
| 	movzx	eax,al | ||||
| 	push	eax | ||||
| 	mov	eax,[memory_start] | ||||
| 	test	eax,eax | ||||
| 	jz	do_exit | ||||
| 	push	MEM_RELEASE | ||||
| 	push	0 | ||||
| 	push	eax | ||||
| 	call	[VirtualFree] | ||||
|     do_exit: | ||||
| 	call	[ExitProcess] | ||||
|  | ||||
| get_environment_variable: | ||||
| 	mov	ecx,[memory_end] | ||||
| 	sub	ecx,edi | ||||
| 	cmp	ecx,4000h | ||||
| 	jbe	buffer_for_variable_ok | ||||
| 	mov	ecx,4000h | ||||
|     buffer_for_variable_ok: | ||||
| 	push	ecx | ||||
| 	push	edi | ||||
| 	push	esi | ||||
| 	call	[GetEnvironmentVariable] | ||||
| 	add	edi,eax | ||||
| 	cmp	edi,[memory_end] | ||||
| 	jae	out_of_memory | ||||
| 	ret | ||||
|  | ||||
| open: | ||||
| 	push	0 | ||||
| 	push	0 | ||||
| 	push	OPEN_EXISTING | ||||
| 	push	0 | ||||
| 	push	FILE_SHARE_READ | ||||
| 	push	GENERIC_READ | ||||
| 	push	edx | ||||
| 	call	[CreateFile] | ||||
| 	cmp	eax,-1 | ||||
| 	je	file_error | ||||
| 	mov	ebx,eax | ||||
| 	clc | ||||
| 	ret | ||||
|     file_error: | ||||
| 	stc | ||||
| 	ret | ||||
| create: | ||||
| 	push	0 | ||||
| 	push	0 | ||||
| 	push	CREATE_ALWAYS | ||||
| 	push	0 | ||||
| 	push	FILE_SHARE_READ | ||||
| 	push	GENERIC_WRITE | ||||
| 	push	edx | ||||
| 	call	[CreateFile] | ||||
| 	cmp	eax,-1 | ||||
| 	je	file_error | ||||
| 	mov	ebx,eax | ||||
| 	clc | ||||
| 	ret | ||||
| write: | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	ecx | ||||
| 	push	edx | ||||
| 	push	ebx | ||||
| 	call	[WriteFile] | ||||
| 	or	eax,eax | ||||
| 	jz	file_error | ||||
| 	clc | ||||
| 	ret | ||||
| read: | ||||
| 	mov	ebp,ecx | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	ecx | ||||
| 	push	edx | ||||
| 	push	ebx | ||||
| 	call	[ReadFile] | ||||
| 	or	eax,eax | ||||
| 	jz	file_error | ||||
| 	cmp	ebp,[bytes_count] | ||||
| 	jne	file_error | ||||
| 	clc | ||||
| 	ret | ||||
| close: | ||||
| 	push	ebx | ||||
| 	call	[CloseHandle] | ||||
| 	ret | ||||
| lseek: | ||||
| 	movzx	eax,al | ||||
| 	push	eax | ||||
| 	push	0 | ||||
| 	push	edx | ||||
| 	push	ebx | ||||
| 	call	[SetFilePointer] | ||||
| 	ret | ||||
|  | ||||
| display_string: | ||||
| 	push	[con_handle] | ||||
| 	call	[GetStdHandle] | ||||
| 	mov	ebp,eax | ||||
| 	mov	edi,esi | ||||
| 	or	ecx,-1 | ||||
| 	xor	al,al | ||||
| 	repne	scasb | ||||
| 	neg	ecx | ||||
| 	sub	ecx,2 | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	ecx | ||||
| 	push	esi | ||||
| 	push	ebp | ||||
| 	call	[WriteFile] | ||||
| 	ret | ||||
| display_character: | ||||
| 	push	ebx | ||||
| 	mov	[character],dl | ||||
| 	push	[con_handle] | ||||
| 	call	[GetStdHandle] | ||||
| 	mov	ebx,eax | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	1 | ||||
| 	push	character | ||||
| 	push	ebx | ||||
| 	call	[WriteFile] | ||||
| 	pop	ebx | ||||
| 	ret | ||||
| display_number: | ||||
| 	push	ebx | ||||
| 	mov	ecx,1000000000 | ||||
| 	xor	edx,edx | ||||
| 	xor	bl,bl | ||||
|       display_loop: | ||||
| 	div	ecx | ||||
| 	push	edx | ||||
| 	cmp	ecx,1 | ||||
| 	je	display_digit | ||||
| 	or	bl,bl | ||||
| 	jnz	display_digit | ||||
| 	or	al,al | ||||
| 	jz	digit_ok | ||||
| 	not	bl | ||||
|       display_digit: | ||||
| 	mov	dl,al | ||||
| 	add	dl,30h | ||||
| 	push	ecx | ||||
| 	call	display_character | ||||
| 	pop	ecx | ||||
|       digit_ok: | ||||
| 	mov	eax,ecx | ||||
| 	xor	edx,edx | ||||
| 	mov	ecx,10 | ||||
| 	div	ecx | ||||
| 	mov	ecx,eax | ||||
| 	pop	eax | ||||
| 	or	ecx,ecx | ||||
| 	jnz	display_loop | ||||
| 	pop	ebx | ||||
| 	ret | ||||
|  | ||||
| display_user_messages: | ||||
| 	mov	[displayed_count],0 | ||||
| 	call	show_display_buffer | ||||
| 	cmp	[displayed_count],1 | ||||
| 	jb	line_break_ok | ||||
| 	je	make_line_break | ||||
| 	mov	ax,word [last_displayed] | ||||
| 	cmp	ax,0A0Dh | ||||
| 	je	line_break_ok | ||||
| 	cmp	ax,0D0Ah | ||||
| 	je	line_break_ok | ||||
|       make_line_break: | ||||
| 	mov	word [buffer],0A0Dh | ||||
| 	push	[con_handle] | ||||
| 	call	[GetStdHandle] | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	2 | ||||
| 	push	buffer | ||||
| 	push	eax | ||||
| 	call	[WriteFile] | ||||
|       line_break_ok: | ||||
| 	ret | ||||
| display_block: | ||||
| 	add	[displayed_count],ecx | ||||
| 	cmp	ecx,1 | ||||
| 	ja	take_last_two_characters | ||||
| 	jb	block_displayed | ||||
| 	mov	al,[last_displayed+1] | ||||
| 	mov	ah,[esi] | ||||
| 	mov	word [last_displayed],ax | ||||
| 	jmp	block_ok | ||||
|       take_last_two_characters: | ||||
| 	mov	ax,[esi+ecx-2] | ||||
| 	mov	word [last_displayed],ax | ||||
|       block_ok: | ||||
| 	push	ecx | ||||
| 	push	[con_handle] | ||||
| 	call	[GetStdHandle] | ||||
| 	pop	ecx | ||||
| 	push	0 | ||||
| 	push	bytes_count | ||||
| 	push	ecx | ||||
| 	push	esi | ||||
| 	push	eax | ||||
| 	call	[WriteFile] | ||||
|       block_displayed: | ||||
| 	ret | ||||
|  | ||||
| fatal_error: | ||||
| 	mov	[con_handle],STD_ERROR_HANDLE | ||||
| 	mov	esi,error_prefix | ||||
| 	call	display_string | ||||
| 	pop	esi | ||||
| 	call	display_string | ||||
| 	mov	esi,error_suffix | ||||
| 	call	display_string | ||||
| 	mov	al,0FFh | ||||
| 	jmp	exit_program | ||||
| assembler_error: | ||||
| 	mov	[con_handle],STD_ERROR_HANDLE | ||||
| 	call	display_user_messages | ||||
| 	push	dword 0 | ||||
| 	mov	ebx,[current_line] | ||||
|       get_error_lines: | ||||
| 	mov	eax,[ebx] | ||||
| 	cmp	byte [eax],0 | ||||
| 	je	get_next_error_line | ||||
| 	push	ebx | ||||
| 	test	byte [ebx+7],80h | ||||
| 	jz	display_error_line | ||||
| 	mov	edx,ebx | ||||
|       find_definition_origin: | ||||
| 	mov	edx,[edx+12] | ||||
| 	test	byte [edx+7],80h | ||||
| 	jnz	find_definition_origin | ||||
| 	push	edx | ||||
|       get_next_error_line: | ||||
| 	mov	ebx,[ebx+8] | ||||
| 	jmp	get_error_lines | ||||
|       display_error_line: | ||||
| 	mov	esi,[ebx] | ||||
| 	call	display_string | ||||
| 	mov	esi,line_number_start | ||||
| 	call	display_string | ||||
| 	mov	eax,[ebx+4] | ||||
| 	and	eax,7FFFFFFFh | ||||
| 	call	display_number | ||||
| 	mov	dl,']' | ||||
| 	call	display_character | ||||
| 	pop	esi | ||||
| 	cmp	ebx,esi | ||||
| 	je	line_number_ok | ||||
| 	mov	dl,20h | ||||
| 	call	display_character | ||||
| 	push	esi | ||||
| 	mov	esi,[esi] | ||||
| 	movzx	ecx,byte [esi] | ||||
| 	inc	esi | ||||
| 	call	display_block | ||||
| 	mov	esi,line_number_start | ||||
| 	call	display_string | ||||
| 	pop	esi | ||||
| 	mov	eax,[esi+4] | ||||
| 	and	eax,7FFFFFFFh | ||||
| 	call	display_number | ||||
| 	mov	dl,']' | ||||
| 	call	display_character | ||||
|       line_number_ok: | ||||
| 	mov	esi,line_data_start | ||||
| 	call	display_string | ||||
| 	mov	esi,ebx | ||||
| 	mov	edx,[esi] | ||||
| 	call	open | ||||
| 	mov	al,2 | ||||
| 	xor	edx,edx | ||||
| 	call	lseek | ||||
| 	mov	edx,[esi+8] | ||||
| 	sub	eax,edx | ||||
| 	jz	line_data_displayed | ||||
| 	push	eax | ||||
| 	xor	al,al | ||||
| 	call	lseek | ||||
| 	mov	ecx,[esp] | ||||
| 	mov	edx,[additional_memory] | ||||
| 	lea	eax,[edx+ecx] | ||||
| 	cmp	eax,[additional_memory_end] | ||||
| 	ja	out_of_memory | ||||
| 	call	read | ||||
| 	call	close | ||||
| 	pop	ecx | ||||
| 	mov	esi,[additional_memory] | ||||
|       get_line_data: | ||||
| 	mov	al,[esi] | ||||
| 	cmp	al,0Ah | ||||
| 	je	display_line_data | ||||
| 	cmp	al,0Dh | ||||
| 	je	display_line_data | ||||
| 	cmp	al,1Ah | ||||
| 	je	display_line_data | ||||
| 	or	al,al | ||||
| 	jz	display_line_data | ||||
| 	inc	esi | ||||
| 	loop	get_line_data | ||||
|       display_line_data: | ||||
| 	mov	ecx,esi | ||||
| 	mov	esi,[additional_memory] | ||||
| 	sub	ecx,esi | ||||
| 	call	display_block | ||||
|       line_data_displayed: | ||||
| 	mov	esi,cr_lf | ||||
| 	call	display_string | ||||
| 	pop	ebx | ||||
| 	or	ebx,ebx | ||||
| 	jnz	display_error_line | ||||
| 	mov	esi,error_prefix | ||||
| 	call	display_string | ||||
| 	pop	esi | ||||
| 	call	display_string | ||||
| 	mov	esi,error_suffix | ||||
| 	call	display_string | ||||
| 	mov	al,2 | ||||
| 	jmp	exit_program | ||||
|  | ||||
| make_timestamp: | ||||
| 	push	buffer | ||||
| 	call	[GetSystemTime] | ||||
| 	movzx	ecx,word [buffer] | ||||
| 	mov	eax,ecx | ||||
| 	sub	eax,1970 | ||||
| 	mov	ebx,365 | ||||
| 	mul	ebx | ||||
| 	mov	ebp,eax | ||||
| 	mov	eax,ecx | ||||
| 	sub	eax,1969 | ||||
| 	shr	eax,2 | ||||
| 	add	ebp,eax | ||||
| 	mov	eax,ecx | ||||
| 	sub	eax,1901 | ||||
| 	mov	ebx,100 | ||||
| 	div	ebx | ||||
| 	sub	ebp,eax | ||||
| 	mov	eax,ecx | ||||
| 	xor	edx,edx | ||||
| 	sub	eax,1601 | ||||
| 	mov	ebx,400 | ||||
| 	div	ebx | ||||
| 	add	ebp,eax | ||||
| 	movzx	ecx,word [buffer+2] | ||||
| 	mov	eax,ecx | ||||
| 	dec	eax | ||||
| 	mov	ebx,30 | ||||
| 	mul	ebx | ||||
| 	add	ebp,eax | ||||
| 	cmp	ecx,8 | ||||
| 	jbe	months_correction | ||||
| 	mov	eax,ecx | ||||
| 	sub	eax,7 | ||||
| 	shr	eax,1 | ||||
| 	add	ebp,eax | ||||
| 	mov	ecx,8 | ||||
|       months_correction: | ||||
| 	mov	eax,ecx | ||||
| 	shr	eax,1 | ||||
| 	add	ebp,eax | ||||
| 	cmp	ecx,2 | ||||
| 	jbe	day_correction_ok | ||||
| 	sub	ebp,2 | ||||
| 	movzx	ecx,word [buffer] | ||||
| 	test	ecx,11b | ||||
| 	jnz	day_correction_ok | ||||
| 	xor	edx,edx | ||||
| 	mov	eax,ecx | ||||
| 	mov	ebx,100 | ||||
| 	div	ebx | ||||
| 	or	edx,edx | ||||
| 	jnz	day_correction | ||||
| 	mov	eax,ecx | ||||
| 	mov	ebx,400 | ||||
| 	div	ebx | ||||
| 	or	edx,edx | ||||
| 	jnz	day_correction_ok | ||||
|       day_correction: | ||||
| 	inc	ebp | ||||
|       day_correction_ok: | ||||
| 	movzx	eax,word [buffer+6] | ||||
| 	dec	eax | ||||
| 	add	eax,ebp | ||||
| 	mov	ebx,24 | ||||
| 	mul	ebx | ||||
| 	movzx	ecx,word [buffer+8] | ||||
| 	add	eax,ecx | ||||
| 	mov	ebx,60 | ||||
| 	mul	ebx | ||||
| 	movzx	ecx,word [buffer+10] | ||||
| 	add	eax,ecx | ||||
| 	mov	ebx,60 | ||||
| 	mul	ebx | ||||
| 	movzx	ecx,word [buffer+12] | ||||
| 	add	eax,ecx | ||||
| 	adc	edx,0 | ||||
| 	ret | ||||
|  | ||||
| error_prefix db 'error: ',0 | ||||
| error_suffix db '.' | ||||
| cr_lf db 0Dh,0Ah,0 | ||||
| line_number_start db ' [',0 | ||||
| line_data_start db ':',0Dh,0Ah,0 | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/BlitzMax/sample.bmx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| SuperStrict | ||||
|  | ||||
| Framework Brl.StandardIO | ||||
|  | ||||
| Type TMyType | ||||
| 	Field property:int | ||||
|  | ||||
| 	Function A:int(param:int) | ||||
| 		'do nothing | ||||
| 	End Function | ||||
|  | ||||
| 	Method B:int(param:int) | ||||
| 		'do nothing | ||||
| 	End Method | ||||
| End Type | ||||
|  | ||||
|  | ||||
| Global my:TMyType = new TMyType | ||||
| ?Win32 | ||||
| 	my.A() | ||||
| 	my.B() | ||||
| ?Linux | ||||
| 	my.B() | ||||
| 	my.A() | ||||
| ? | ||||
							
								
								
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | ||||
| // | ||||
| // Distributions Primer | ||||
| // | ||||
| // This primer demonstrates uses of some of Chapel's standard | ||||
| // distributions.  To use these distributions in a Chapel program, | ||||
| // the respective module must be used: | ||||
| // | ||||
| use BlockDist, CyclicDist, BlockCycDist, ReplicatedDist; | ||||
| use DimensionalDist2D, ReplicatedDim, BlockCycDim; | ||||
|  | ||||
| // | ||||
| // For each distribution, we'll create a distributed domain and array | ||||
| // and then initialize it just to give a brief flavor of how the | ||||
| // distribution maps across locales.  Running this example on 6 | ||||
| // locales does a nice job of illustrating the distribution | ||||
| // characteristics. | ||||
| // | ||||
| // All of these distributions support options to map to a different | ||||
| // virtual locale grid than the one used by default (a | ||||
| // multidimensional factoring of the built-in Locales array), as well | ||||
| // as to control the amount of parallelism used in data parallel | ||||
| // loops.  See the Standard Distributions chapter of the language spec | ||||
| // for more details. | ||||
| // | ||||
|  | ||||
| // | ||||
| // Make the program size configurable from the command line. | ||||
| // | ||||
| config const n = 8; | ||||
|  | ||||
| // | ||||
| // Declare a 2-dimensional domain Space that we will later use to | ||||
| // initialize the distributed domains. | ||||
| // | ||||
| const Space = {1..n, 1..n}; | ||||
|  | ||||
| // | ||||
| // The Block distribution distributes a bounding box from | ||||
| // n-dimensional space across the target locale array viewed as an | ||||
| // n-dimensional virtual locale grid.  The bounding box is blocked | ||||
| // into roughly equal portions across the locales.  Note that domains | ||||
| // declared over a Block distribution can also store indices outside | ||||
| // of the bounding box; the bounding box is merely used to compute | ||||
| // the blocking of space. | ||||
| // | ||||
| // In this example, we declare a 2-dimensional Block-distributed | ||||
| // domain BlockSpace and a Block-distributed array BA declared over | ||||
| // the domain. | ||||
| // | ||||
| const BlockSpace = Space dmapped Block(boundingBox=Space); | ||||
| var BA: [BlockSpace] int; | ||||
|  | ||||
| // | ||||
| // To illustrate how the index set is distributed across locales, | ||||
| // we'll use a forall loop to initialize each array element to the | ||||
| // locale ID that stores that index/element/iteration. | ||||
| // | ||||
| forall ba in BA do | ||||
|   ba = here.id; | ||||
|  | ||||
| // | ||||
| // Output the Block-distributed array to visually see how the elements | ||||
| // are partitioned across the locales. | ||||
| // | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Most of Chapel's standard distributions support an optional | ||||
| // targetLocales argument that permits you to pass in your own | ||||
| // array of locales to be targeted.  In general, the targetLocales | ||||
| // argument should match the rank of the distribution.  So for | ||||
| // example, to map a Block to a [numLocales x 1] view of the | ||||
| // locale set, one could do something like this: | ||||
|  | ||||
| // | ||||
| // We start by creating our own array of the locale values.  Here | ||||
| // we use the standard array reshape function for convenience, | ||||
| // but more generally, this array could be accessed/assigned like any | ||||
| // other. | ||||
| // | ||||
|  | ||||
| var MyLocaleView = {0..#numLocales, 1..1}; | ||||
| var MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView); | ||||
|  | ||||
| // | ||||
| // Then we'll declare a distributed domain/array that targets | ||||
| // this view of the locales: | ||||
| //  | ||||
|  | ||||
| const BlockSpace2 = Space dmapped Block(boundingBox=Space, | ||||
|                                         targetLocales=MyLocales); | ||||
| var BA2: [BlockSpace2] int; | ||||
|  | ||||
| // | ||||
| // Then we'll do a similar computation as before to verify where | ||||
| // everything ended up: | ||||
| // | ||||
| forall ba in BA2 do | ||||
|   ba = here.id; | ||||
|  | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA2); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll perform a similar computation for the Cyclic distribution. | ||||
| // Cyclic distributions start at a designated n-dimensional index and | ||||
| // distribute the n-dimensional space across an n-dimensional array | ||||
| // of locales in a round-robin fashion (in each dimension).  As with | ||||
| // the Block distribution, domains may be declared using the | ||||
| // distribution who have lower indices that the starting index; that | ||||
| // value should just be considered a parameterization of how the | ||||
| // distribution is defined. | ||||
| // | ||||
| const CyclicSpace = Space dmapped Cyclic(startIdx=Space.low); | ||||
| var CA: [CyclicSpace] int; | ||||
|  | ||||
| forall ca in CA do | ||||
|   ca = here.id; | ||||
|  | ||||
| writeln("Cyclic Array Index Map"); | ||||
| writeln(CA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll declare a Block-Cyclic distribution.  These | ||||
| // distributions also deal out indices in a round-robin fashion, | ||||
| // but rather than dealing out singleton indices, they deal out blocks | ||||
| // of indices.  Thus, the BlockCyclic distribution is parameterized | ||||
| // by a starting index (as with Cyclic) and a block size (per | ||||
| // dimension) specifying how large the chunks to be dealt out are. | ||||
| //  | ||||
| const BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low,  | ||||
|                                               blocksize=(2, 3)); | ||||
| var BCA: [BlkCycSpace] int; | ||||
|  | ||||
| forall bca in BCA do | ||||
|   bca = here.id; | ||||
|  | ||||
| writeln("Block-Cyclic Array Index Map"); | ||||
| writeln(BCA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // The ReplicatedDist distribution is different: each of the | ||||
| // original domain's indices - and the corresponding array elements - | ||||
| // is replicated onto each locale. (Note: consistency among these | ||||
| // array replicands is NOT maintained automatically.) | ||||
| // | ||||
| // This replication is observable in some cases but not others, | ||||
| // as shown below. Note: this behavior may change in the future. | ||||
| // | ||||
| const ReplicatedSpace = Space dmapped ReplicatedDist(); | ||||
| var RA: [ReplicatedSpace] int; | ||||
|  | ||||
| // The replication is observable - this visits each replicand. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| writeln("Replicated Array Index Map, ", RA.numElements, " elements total"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // The replication is observable when the replicated array is | ||||
| // on the left-hand side. If the right-hand side is not replicated, | ||||
| // it is copied into each replicand. | ||||
| // We illustrate this using a non-distributed array. | ||||
| // | ||||
| var A: [Space] int = [(i,j) in Space] i*100 + j; | ||||
| RA = A; | ||||
| writeln("Replicated Array after being array-assigned into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Analogously, each replicand will be visited and | ||||
| // other participated expressions will be computed on each locale | ||||
| // (a) when the replicated array is assigned a scalar: | ||||
| //       RA = 5; | ||||
| // (b) when it appears first in a zippered forall loop: | ||||
| //       forall (ra, a) in zip(RA, A) do ...; | ||||
| // (c) when it appears in a for loop: | ||||
| //       for ra in RA do ...; | ||||
| // | ||||
| // Zippering (RA,A) or (A,RA) in a 'for' loop will generate | ||||
| // an error due to their different number of elements. | ||||
|  | ||||
| // Let RA store the Index Map again, for the examples below. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| // | ||||
| // Only the local replicand is accessed - replication is NOT observable | ||||
| // and consistency is NOT maintained - when: | ||||
| // (a) the replicated array is indexed - an individual element is read... | ||||
| // | ||||
| on Locales(0) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| on Locales(LocaleSpace.high) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| writeln(); | ||||
|  | ||||
| // ...or an individual element is written; | ||||
| on Locales(LocaleSpace.high) do | ||||
|   RA(Space.low) = 7777; | ||||
|  | ||||
| writeln("Replicated Array after being indexed into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (b) the replicated array is on the right-hand side of an assignment... | ||||
| // | ||||
| on Locales(LocaleSpace.high) do | ||||
|   A = RA + 4; | ||||
| writeln("Non-Replicated Array after assignment from Replicated Array + 4"); | ||||
| writeln(A); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (c) ...or, generally, the replicated array or domain participates | ||||
| //     in a zippered forall loop, but not in the first position. | ||||
| //     The loop could look like: | ||||
| // | ||||
| //       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...; | ||||
| // | ||||
|  | ||||
|  | ||||
| // | ||||
| // The DimensionalDist2D distribution lets us build a 2D distribution | ||||
| // as a composition of specifiers for individual dimensions. | ||||
| // Under such a "dimensional" distribution each dimension is handled | ||||
| // independently of the other. | ||||
| // | ||||
| // The dimension specifiers are similar to the corresponding multi-dimensional | ||||
| // distributions in constructor arguments and index-to-locale mapping rules. | ||||
| // However, instead of an array of locales, a specifier constructor | ||||
| // accepts just the number of locales that the indices in the corresponding | ||||
| // dimension will be distributed across. | ||||
| // | ||||
| // The DimensionalDist2D constructor requires: | ||||
| // * an [0..nl1-1, 0..nl2-1] array of locales, where | ||||
| //   nl1 and nl2 are the number of locales in each dimension, and | ||||
| // * two dimension specifiers, created for nl1 and nl2 locale counts, resp. | ||||
| // | ||||
| // Presently, the following dimension specifiers are available | ||||
| // (shown here with their constructor arguments): | ||||
| // | ||||
| // * ReplicatedDim(numLocales) | ||||
| // * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh) | ||||
| // * BlockCyclicDim(lowIdx, blockSize, numLocales) | ||||
| // | ||||
|  | ||||
| // | ||||
| // The following example creates a dimensional distribution that | ||||
| // replicates over 2 locales (when available) in the first dimemsion | ||||
| // and distributes using block-cyclic distribution in the second dimension. | ||||
| // The example computes nl1 and nl2 and reshapes MyLocales correspondingly. | ||||
| // | ||||
|  | ||||
| var (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2); | ||||
| MyLocaleView = {0..#nl1, 0..#nl2}; | ||||
| MyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView); | ||||
|  | ||||
| const DimReplicatedBlockcyclicSpace = Space | ||||
|   dmapped DimensionalDist2D(MyLocales, | ||||
|                             new ReplicatedDim(numLocales = nl1), | ||||
|                             new BlockCyclicDim(numLocales = nl2, | ||||
|                                                lowIdx = 1, blockSize = 2)); | ||||
|  | ||||
| var DRBA: [DimReplicatedBlockcyclicSpace] int; | ||||
|  | ||||
| // The ReplicatedDim specifier always accesses the local replicand. | ||||
| // (This differs from how the ReplicatedDist distribution works.) | ||||
| // | ||||
| // This example visits each replicand. The behavior is the same | ||||
| // regardless of the second index into MyLocales below. | ||||
|  | ||||
| for locId1 in 0..#nl1 do on MyLocales[locId1, 0] { | ||||
|  | ||||
|   forall drba in DRBA do | ||||
|     drba = here.id; | ||||
|  | ||||
|   writeln("Dimensional2D(Replicated,BlockCyclic) Array Index Map", | ||||
|           " from ", here); | ||||
|  | ||||
|   // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0. | ||||
|   // Since we want to see what DRBA contains on the current locale, | ||||
|   // we use 'Helper' that is mapped using the default distribution. | ||||
|   // 'Helper = DRBA' captures the view of DRBA on the current locale, | ||||
|   // which we then print out. | ||||
|  | ||||
|   const Helper: [Space] int = DRBA; | ||||
|   writeln(Helper); | ||||
|   writeln(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| writeln("Hello, world!");    // print 'Hello, world!' to the console | ||||
							
								
								
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* The Computer Language Benchmarks Game | ||||
|    http://benchmarksgame.alioth.debian.org/ | ||||
|  | ||||
|    contributed by Albert Sidelnik | ||||
|    modified by Brad Chamberlain | ||||
| */ | ||||
|  | ||||
|  | ||||
| // | ||||
| // The number of timesteps to simulate; may be set via the command-line | ||||
| // | ||||
| config const n = 10000; | ||||
|  | ||||
| // | ||||
| // Constants representing pi, the solar mass, and the number of days per year | ||||
| // | ||||
| const pi = 3.141592653589793, | ||||
|       solarMass = 4 * pi**2, | ||||
|       daysPerYear = 365.24; | ||||
|  | ||||
| // | ||||
| // a record representing one of the bodies in the solar system | ||||
| // | ||||
| record body { | ||||
|   var pos: 3*real; | ||||
|   var v: 3*real; | ||||
|   var mass: real;  // does not change after it is set up | ||||
| } | ||||
|  | ||||
| // | ||||
| // the array of bodies that we'll be simulating | ||||
| // | ||||
| var bodies = [/* sun */ | ||||
|               new body(mass = solarMass), | ||||
|  | ||||
|               /* jupiter */ | ||||
|               new body(pos = ( 4.84143144246472090e+00, | ||||
|                               -1.16032004402742839e+00, | ||||
|                               -1.03622044471123109e-01), | ||||
|                          v = ( 1.66007664274403694e-03 * daysPerYear, | ||||
|                                7.69901118419740425e-03 * daysPerYear, | ||||
|                               -6.90460016972063023e-05 * daysPerYear), | ||||
|                       mass =   9.54791938424326609e-04 * solarMass), | ||||
|    | ||||
|               /* saturn */ | ||||
|               new body(pos = ( 8.34336671824457987e+00, | ||||
|                                4.12479856412430479e+00, | ||||
|                               -4.03523417114321381e-01), | ||||
|                          v = (-2.76742510726862411e-03 * daysPerYear, | ||||
|                                4.99852801234917238e-03 * daysPerYear, | ||||
|                                2.30417297573763929e-05 * daysPerYear), | ||||
|                       mass =   2.85885980666130812e-04 * solarMass), | ||||
|  | ||||
|               /* uranus */ | ||||
|               new body(pos = ( 1.28943695621391310e+01, | ||||
|                               -1.51111514016986312e+01, | ||||
|                               -2.23307578892655734e-01), | ||||
|                          v = ( 2.96460137564761618e-03 * daysPerYear, | ||||
|                                2.37847173959480950e-03 * daysPerYear, | ||||
|                               -2.96589568540237556e-05 * daysPerYear), | ||||
|                       mass =   4.36624404335156298e-05 * solarMass), | ||||
|  | ||||
|               /* neptune */ | ||||
|               new body(pos = ( 1.53796971148509165e+01, | ||||
|                               -2.59193146099879641e+01, | ||||
|                                1.79258772950371181e-01), | ||||
|                          v = ( 2.68067772490389322e-03 * daysPerYear, | ||||
|                                1.62824170038242295e-03 * daysPerYear, | ||||
|                               -9.51592254519715870e-05 * daysPerYear), | ||||
|                       mass =   5.15138902046611451e-05 * solarMass) | ||||
|               ]; | ||||
|  | ||||
| // | ||||
| // the number of bodies to be simulated | ||||
| // | ||||
| const numbodies = bodies.numElements; | ||||
|  | ||||
| // | ||||
| // The computation involves initializing the sun's velocity, | ||||
| // writing the initial energy, advancing the system through 'n' | ||||
| // timesteps, and writing the final energy. | ||||
| // | ||||
| proc main() { | ||||
|   initSun(); | ||||
|  | ||||
|   writef("%.9r\n", energy()); | ||||
|   for 1..n do | ||||
|     advance(0.01); | ||||
|   writef("%.9r\n", energy()); | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the sun's initial velocity | ||||
| // | ||||
| proc initSun() { | ||||
|   const p = + reduce (for b in bodies do (b.v * b.mass)); | ||||
|   bodies[1].v = -p / solarMass; | ||||
| } | ||||
|  | ||||
| // | ||||
| // advance the positions and velocities of all the bodies | ||||
| // | ||||
| proc advance(dt) { | ||||
|   for i in 1..numbodies { | ||||
|     for j in i+1..numbodies { | ||||
|       updateVelocities(bodies[i], bodies[j]); | ||||
|        | ||||
|       inline proc updateVelocities(ref b1, ref b2) { | ||||
|         const dpos = b1.pos - b2.pos, | ||||
|                mag = dt / sqrt(sumOfSquares(dpos))**3; | ||||
|          | ||||
|         b1.v -= dpos * b2.mass * mag; | ||||
|         b2.v += dpos * b1.mass * mag; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   for b in bodies do | ||||
|     b.pos += dt * b.v; | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the energy of the bodies | ||||
| // | ||||
| proc energy() { | ||||
|   var e = 0.0; | ||||
|    | ||||
|   for i in 1..numbodies { | ||||
|     const b1 = bodies[i]; | ||||
|      | ||||
|     e += 0.5 * b1.mass * sumOfSquares(b1.v); | ||||
|      | ||||
|     for j in i+1..numbodies { | ||||
|       const b2 = bodies[j]; | ||||
|        | ||||
|       e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos)); | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   return e; | ||||
| } | ||||
|  | ||||
| // | ||||
| // a helper routine to compute the sum of squares of a 3-tuple's components | ||||
| // | ||||
| inline proc sumOfSquares(x) | ||||
|   return x(1)**2 + x(2)**2 + x(3)**2; | ||||
							
								
								
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| // | ||||
| // An example of a parallel quick sort implementation that uses | ||||
| // "cobegin" to make each recursive call in parallel and "serial" to | ||||
| // limit the number of threads. | ||||
| // | ||||
|  | ||||
| use Random, Time; // for random number generation and the Timer class | ||||
|  | ||||
| var timer: Timer; // to time the sort | ||||
|  | ||||
| config var n: int = 2**15;      // the size of the array to be sorted | ||||
| config var thresh: int = 1;     // the recursive depth to serialize | ||||
| config var verbose: int = 0;    // print out this many elements in array | ||||
| config var timing: bool = true; // set timing to false to disable timer | ||||
|  | ||||
| var A: [1..n] real; // array of real numbers | ||||
|  | ||||
| // | ||||
| // initialize array with random numbers | ||||
| // | ||||
| fillRandom(A); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // start timer, call parallel quick sort routine, stop timer | ||||
| // | ||||
| if timing then timer.start(); | ||||
| pqsort(A, thresh); | ||||
| if timing then timer.stop(); | ||||
|  | ||||
| // | ||||
| // report sort time | ||||
| // | ||||
| if timing then writeln("sorted in ", timer.elapsed(), " seconds"); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| //   values should now be in sorted order | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // verify that array is sorted or halt | ||||
| // | ||||
| for i in 2..n do | ||||
|   if A(i) < A(i-1) then | ||||
|     halt("A(", i-1, ") == ", A(i-1), " > A(", i, ") == ", A(i)); | ||||
|  | ||||
| writeln("verification success"); | ||||
|  | ||||
| // | ||||
| // pqsort -- parallel quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   thresh: number of recursive calls to make before serializing | ||||
| //   low: lower bound of array to start sort at, defaults to whole array | ||||
| //   high: upper bound of array to stop sort at, defaults to whole array | ||||
| // | ||||
| proc pqsort(arr: [], | ||||
|            thresh: int, | ||||
|            low: int = arr.domain.low, | ||||
|            high: int = arr.domain.high) where arr.rank == 1 { | ||||
|  | ||||
|   // | ||||
|   // base case: arr[low..high] is small enough to bubble sort | ||||
|   // | ||||
|   if high - low < 8 { | ||||
|     bubbleSort(arr, low, high); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // determine pivot and partition arr[low..high] | ||||
|   // | ||||
|   const pivotVal = findPivot(); | ||||
|   const pivotLoc = partition(pivotVal); | ||||
|  | ||||
|   // | ||||
|   // make recursive calls to parallel quick sort each unsorted half of | ||||
|   // the array; if thresh is 0 or less, start executing conquer tasks | ||||
|   // serially | ||||
|   // | ||||
|   serial thresh <= 0 do cobegin { | ||||
|     pqsort(arr, thresh-1, low, pivotLoc-1); | ||||
|     pqsort(arr, thresh-1, pivotLoc+1, high); | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // findPivot -- helper routine to find pivot value using simple | ||||
|   //              median-of-3 method, returns pivot value | ||||
|   // | ||||
|   proc findPivot() { | ||||
|     const mid = low + (high-low+1) / 2; | ||||
|  | ||||
|     if arr(mid) < arr(low) then arr(mid) <=> arr(low); | ||||
|     if arr(high) < arr(low) then arr(high) <=> arr(low); | ||||
|     if arr(high) < arr(mid) then arr(high) <=> arr(mid); | ||||
|  | ||||
|     const pivotVal = arr(mid); | ||||
|     arr(mid) = arr(high-1); | ||||
|     arr(high-1) = pivotVal; | ||||
|  | ||||
|     return pivotVal; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // partition -- helper routine to partition array such that all | ||||
|   //              values less than pivot are to its left and all | ||||
|   //              values greater than pivot are to its right, returns | ||||
|   //              pivot location | ||||
|   // | ||||
|   proc partition(pivotVal) { | ||||
|     var ilo = low, ihi = high-1; | ||||
|     while (ilo < ihi) { | ||||
|       do { ilo += 1; } while arr(ilo) < pivotVal; | ||||
|       do { ihi -= 1; } while pivotVal < arr(ihi); | ||||
|       if (ilo < ihi) { | ||||
|         arr(ilo) <=> arr(ihi); | ||||
|       } | ||||
|     } | ||||
|     arr(high-1) = arr(ilo); | ||||
|     arr(ilo) = pivotVal; | ||||
|     return ilo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // | ||||
| // bubbleSort -- bubble sort for base case of quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   low: lower bound of array to start sort at | ||||
| //   high: upper bound of array to stop sort at | ||||
| // | ||||
| proc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 { | ||||
|   for i in low..high do | ||||
|     for j in low..high-1 do | ||||
|       if arr(j) > arr(j+1) then | ||||
|         arr(j) <=> arr(j+1); | ||||
| } | ||||
							
								
								
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| ;; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved. | ||||
| ;; The use and distribution terms for this software are covered by the | ||||
| ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | ||||
| ;; which can be found in the file epl-v10.html at the root of this distribution. | ||||
| ;; By using this software in any fashion, you are agreeing to be bound by | ||||
| ;; the terms of this license. | ||||
| ;; You must not remove this notice, or any other, from this software. | ||||
|  | ||||
| (page "index.html" | ||||
|   (:refer-clojure :exclude [nth]) | ||||
|   (:require | ||||
|    [tailrecursion.hoplon.reload        :refer [reload-all]] | ||||
|    [tailrecursion.hoplon.util          :refer [nth name pluralize]] | ||||
|    [tailrecursion.hoplon.storage-atom  :refer [local-storage]])) | ||||
|  | ||||
| ;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (declare route state editing) | ||||
|  | ||||
| (reload-all) | ||||
|  | ||||
| (def mapvi  (comp vec map-indexed)) | ||||
|  | ||||
| (defn dissocv [v i] | ||||
|   (let [z (- (dec (count v)) i)] | ||||
|     (cond (neg?  z) v | ||||
|           (zero? z) (pop v) | ||||
|           (pos?  z) (into (subvec v 0 i) (subvec v (inc i)))))) | ||||
|  | ||||
| (defn decorate [todo route editing i] | ||||
|   (let [{done? :completed text :text} todo] | ||||
|     (-> todo (assoc :editing (= editing i) | ||||
|                     :visible (and (not (empty? text)) | ||||
|                                   (or (= "#/" route) | ||||
|                                       (and (= "#/active" route) (not done?)) | ||||
|                                       (and (= "#/completed" route) done?))))))) | ||||
|  | ||||
| ;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (def   state        (-> (cell []) (local-storage ::store))) | ||||
|  | ||||
| ;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc  loaded?      false) | ||||
| (defc  editing      nil) | ||||
| (def   route        (route-cell "#/")) | ||||
|  | ||||
| ;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc= completed    (filter :completed state)) | ||||
| (defc= active       (remove :completed state)) | ||||
| (defc= plural-item  (pluralize "item" (count active))) | ||||
| (defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state)) | ||||
|  | ||||
| ;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defn  todo        [t]   {:completed false :text t}) | ||||
| (defn  destroy!    [i]   (swap! state dissocv i)) | ||||
| (defn  done!       [i v] (swap! state assoc-in [i :completed] v)) | ||||
| (defn  clear-done! [& _] (swap! state #(vec (remove :completed %)))) | ||||
| (defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t)))) | ||||
| (defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %))) | ||||
| (defn  editing!    [i v] (reset! editing (if v i nil))) | ||||
| (defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v))) | ||||
|  | ||||
| ;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (html :lang "en" | ||||
|   (head | ||||
|     (meta :charset "utf-8") | ||||
|     (meta :http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1") | ||||
|     (link :rel "stylesheet" :href "base.css") | ||||
|     (title "Hoplon • TodoMVC")) | ||||
|   (body | ||||
|     (noscript | ||||
|       (div :id "noscript" | ||||
|         (p "JavaScript is required to view this page."))) | ||||
|     (div | ||||
|       (section :id "todoapp" | ||||
|         (header :id "header" | ||||
|           (h1 "todos") | ||||
|           (form :on-submit #(do (new! (val-id :new-todo)) | ||||
|                                 (do! (by-id :new-todo) :value "")) | ||||
|             (input | ||||
|               :id "new-todo" | ||||
|               :type "text" | ||||
|               :autofocus true | ||||
|               :placeholder "What needs to be done?" | ||||
|               :on-blur #(do! (by-id :new-todo) :value "")))) | ||||
|         (section | ||||
|           :id "main" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (input | ||||
|             :id "toggle-all" | ||||
|             :type "checkbox" | ||||
|             :do-attr (cell= {:checked (empty? active)})  | ||||
|             :on-click #(all-done! (val-id :toggle-all))) | ||||
|           (label :for "toggle-all" | ||||
|             "Mark all as complete") | ||||
|           (ul :id "todo-list" | ||||
|             (loop-tpl | ||||
|               :reverse true | ||||
|               :bind-ids [done# edit#] | ||||
|               :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos]  | ||||
|               (li | ||||
|                 :do-class (cell= {:completed done? :editing edit?})  | ||||
|                 :do-toggle show? | ||||
|                 (div :class "view" :on-dblclick #(editing! @i true) | ||||
|                   (input | ||||
|                     :id done#  | ||||
|                     :type "checkbox" | ||||
|                     :class "toggle" | ||||
|                     :do-attr (cell= {:checked done?})  | ||||
|                     :on-click #(done! @i (val-id done#))) | ||||
|                   (label (text "~{todo-text}")) | ||||
|                   (button | ||||
|                     :type "submit" | ||||
|                     :class "destroy" | ||||
|                     :on-click  #(destroy! @i))) | ||||
|                 (form :on-submit #(editing! @i false) | ||||
|                   (input | ||||
|                     :id edit# | ||||
|                     :type "text" | ||||
|                     :class "edit" | ||||
|                     :do-value todo-text | ||||
|                     :do-focus edit? | ||||
|                     :on-blur #(when @edit? (editing! @i false)) | ||||
|                     :on-change #(when @edit? (text! @i (val-id edit#))))))))) | ||||
|         (footer  | ||||
|           :id "footer" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (span :id "todo-count" | ||||
|             (strong (text "~(count active) ")) | ||||
|             (span (text "~{plural-item} left"))) | ||||
|           (ul :id "filters" | ||||
|             (li (a :href "#/"          :do-class (cell= {:selected (= "#/" route)})          "All")) | ||||
|             (li (a :href "#/active"    :do-class (cell= {:selected (= "#/active" route)})    "Active")) | ||||
|             (li (a :href "#/completed" :do-class (cell= {:selected (= "#/completed" route)}) "Completed"))) | ||||
|           (button | ||||
|             :type      "submit" | ||||
|             :id        "clear-completed" | ||||
|             :on-click  #(clear-done!) | ||||
|             (text "Clear completed (~(count completed))")))) | ||||
|       (footer :id "info"  | ||||
|         (p "Double-click to edit a todo") | ||||
|         (p "Part of " (a :href "http://github.com/tailrecursion/hoplon-demos/" "hoplon-demos"))))))  | ||||
							
								
								
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| /** | ||||
| ******************************************************************************** | ||||
| ContentBox - A Modular Content Platform | ||||
| Copyright 2012 by Luis Majano and Ortus Solutions, Corp | ||||
| www.gocontentbox.org | www.luismajano.com | www.ortussolutions.com | ||||
| ******************************************************************************** | ||||
| Apache License, Version 2.0 | ||||
|  | ||||
| Copyright Since [2012] [Luis Majano and Ortus Solutions,Corp] | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| ******************************************************************************** | ||||
| * A generic content service for content objects | ||||
| */ | ||||
| component extends="coldbox.system.orm.hibernate.VirtualEntityService" singleton{ | ||||
|  | ||||
| 	// DI | ||||
| 	property name="settingService"			inject="id:settingService@cb"; | ||||
| 	property name="cacheBox"				inject="cachebox"; | ||||
| 	property name="log"						inject="logbox:logger:{this}"; | ||||
| 	property name="customFieldService" 	 	inject="customFieldService@cb"; | ||||
| 	property name="categoryService" 	 	inject="categoryService@cb"; | ||||
| 	property name="commentService" 	 		inject="commentService@cb"; | ||||
| 	property name="contentVersionService"	inject="contentVersionService@cb"; | ||||
| 	property name="authorService"			inject="authorService@cb"; | ||||
| 	property name="populator"				inject="wirebox:populator"; | ||||
| 	property name="systemUtil"				inject="SystemUtil@cb"; | ||||
| 	 | ||||
| 	/* | ||||
| 	* Constructor | ||||
| 	* @entityName.hint The content entity name to bind this service to. | ||||
| 	*/ | ||||
| 	ContentService function init(entityName="cbContent"){ | ||||
| 		// init it | ||||
| 		super.init(entityName=arguments.entityName, useQueryCaching=true); | ||||
|  | ||||
| 		// Test scope coloring in pygments | ||||
| 		this.colorTestVar = "Just for testing pygments!"; | ||||
| 		cookie.colorTestVar = ""; | ||||
| 		client.colorTestVar = "" | ||||
| 		session.colorTestVar = ""; | ||||
| 		application.colorTestVar = ""; | ||||
|  | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all content caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllPageWrapperCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @slug.hint The slug partial to clean on | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapperCaches(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper-#arguments.slug#",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear a page wrapper cache | ||||
| 	* @slug.hint The slug to clean | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapper(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Searches published content with cool paramters, remember published content only | ||||
| 	* @searchTerm.hint The search term to search | ||||
| 	* @max.hint The maximum number of records to paginate | ||||
| 	* @offset.hint The offset in the pagination | ||||
| 	* @asQuery.hint Return as query or array of objects, defaults to array of objects | ||||
| 	* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC | ||||
| 	* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all'] | ||||
| 	* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both. | ||||
| 	*/ | ||||
| 	function searchContent( | ||||
| 		any searchTerm="",  | ||||
| 		numeric max=0,  | ||||
| 		numeric offset=0,  | ||||
| 		boolean asQuery=false,  | ||||
| 		any sortOrder="publishedDate DESC",  | ||||
| 		any isPublished=true,  | ||||
| 		boolean searchActiveContent=true){ | ||||
|  | ||||
| 		var results = {}; | ||||
| 		var c = newCriteria(); | ||||
|  | ||||
| 		// only published content | ||||
| 		if( isBoolean( arguments.isPublished ) ){ | ||||
| 			// Published bit | ||||
| 			c.isEq( "isPublished", javaCast( "Boolean", arguments.isPublished ) ); | ||||
| 			// Published eq true evaluate other params | ||||
| 			if( arguments.isPublished ){ | ||||
| 				c.isLt("publishedDate", now() ) | ||||
| 				.$or( c.restrictions.isNull("expireDate"), c.restrictions.isGT("expireDate", now() ) ) | ||||
| 				.isEq("passwordProtection",""); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Search Criteria | ||||
| 		if( len( arguments.searchTerm ) ){ | ||||
| 			// like disjunctions | ||||
| 			c.createAlias("activeContent","ac"); | ||||
| 			// Do we search title and active content or just title? | ||||
| 			if( arguments.searchActiveContent ){ | ||||
| 				c.$or( c.restrictions.like("title","%#arguments.searchTerm#%"), | ||||
| 				  	  c.restrictions.like("ac.content", "%#arguments.searchTerm#%") ); | ||||
| 			} | ||||
| 			else{ | ||||
| 				c.like( "title", "%#arguments.searchTerm#%" );  | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// run criteria query and projections count | ||||
| 		results.count = c.count( "contentID" ); | ||||
| 		results.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY ) | ||||
| 							.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery); | ||||
| 	 | ||||
| 		return results; | ||||
| 	} | ||||
|  | ||||
| /********************************************* PRIVATE *********************************************/ | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	* Update the content hits | ||||
| 	* @contentID.hint The content id to update | ||||
| 	*/ | ||||
| 	private function syncUpdateHits(required contentID){ | ||||
| 		var q = new Query(sql="UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#").execute(); | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	private function closureTest(){ | ||||
| 		methodCall( | ||||
| 			param1, | ||||
| 			function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			param1 | ||||
| 		); | ||||
| 	} | ||||
| 	 | ||||
| 	private function StructliteralTest(){ | ||||
| 		return { | ||||
| 			foo = bar, | ||||
| 			brad = 'Wood', | ||||
| 			func = function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			array = [ | ||||
| 				1, | ||||
| 				2, | ||||
| 				3, | ||||
| 				4, | ||||
| 				5, | ||||
| 				'test', | ||||
| 				'testing', | ||||
| 				'testerton', | ||||
| 				{ | ||||
| 					foo = true, | ||||
| 					brad = false, | ||||
| 					wood = null | ||||
| 				} | ||||
| 			], | ||||
| 			last = "final" | ||||
| 		}; | ||||
| 	} | ||||
| 	 | ||||
| 	private function arrayliteralTest(){ | ||||
| 		return [ | ||||
| 			1, | ||||
| 			2, | ||||
| 			3, | ||||
| 			4, | ||||
| 			5, | ||||
| 			'test', | ||||
| 			'testing', | ||||
| 			'testerton', | ||||
| 			{ | ||||
| 				foo = true, | ||||
| 				brad = false, | ||||
| 				wood = null | ||||
| 			}, | ||||
| 			'testy-von-testavich' | ||||
| 		]; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
							
								
								
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <cfcomponent> | ||||
| 	 | ||||
| 	<cffunction name="init" access="public" returntype="any"> | ||||
| 		<cfargument name="arg1" type="any" required="true"> | ||||
| 		<cfset this.myVariable = arguments.arg1> | ||||
|  | ||||
| 		<cfreturn this> | ||||
| 	</cffunction> | ||||
|  | ||||
| 	<cffunction name="testFunc" access="private" returntype="void"> | ||||
| 		<cfargument name="arg1" type="any" required="false"> | ||||
| 		 | ||||
| 		<cfif structKeyExists(arguments, "arg1")> | ||||
| 			<cfset writeoutput("Argument exists")> | ||||
| 		</cfif> | ||||
| 	</cffunction> | ||||
| 	 | ||||
| </cfcomponent> | ||||
							
								
								
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| <!--- cfcomment ---> | ||||
| <!--- nested <!--- cfcomment ---> ---> | ||||
| <!--- multi-line | ||||
| nested | ||||
| <!--- | ||||
| cfcomment | ||||
| ---> | ||||
| ---> | ||||
| <!-- html comment --> | ||||
| <html> | ||||
| <head> | ||||
| <title>Date Functions</title> | ||||
| </head> | ||||
| <body> | ||||
| <cfset RightNow = Now()> | ||||
| <cfoutput> | ||||
|  #RightNow#<br /> | ||||
|  #DateFormat(RightNow)#<br /> | ||||
|  #DateFormat(RightNow,"mm/dd/yy")#<br /> | ||||
|  #TimeFormat(RightNow)#<br /> | ||||
|  #TimeFormat(RightNow,"hh:mm tt")#<br /> | ||||
|  #IsDate(RightNow)#<br /> | ||||
|  #IsDate("January 31, 2007")#<br /> | ||||
|  #IsDate("foo")#<br /> | ||||
|  #DaysInMonth(RightNow)# | ||||
| </cfoutput> | ||||
| <cfset x="x"> | ||||
| <cfset y="y"> | ||||
| <cfset z="z"> | ||||
| <cfoutput group="x"> | ||||
|     #x# | ||||
|     <cfoutput>#y#</cfoutput> | ||||
|     #z# | ||||
| </cfoutput> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
| <cfset person = "Paul"> | ||||
| <cfset greeting = "Hello #person#"> | ||||
|  | ||||
| <cfset greeting = "Hello" & " world!"> | ||||
| <cfset a = 5> | ||||
| <cfset b = 10> | ||||
| <cfset c = a^b> | ||||
| <cfset c = a MOD b> | ||||
| <cfset c = a / b> | ||||
| <cfset c = a * b> | ||||
| <cfset c = a + b> | ||||
| <cfset c = a - b> | ||||
| <!--- <!-- another <!--- nested --> ---> comment ---> | ||||
							
								
								
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,580 @@ | ||||
| (function(utils) { | ||||
| 	// Load C functions declared in utils.loadFuncs | ||||
| 	var shouldLoadCFuncs = true; | ||||
| 	// Expose the C functions to cycript's global scope | ||||
| 	var shouldExposeCFuncs = true; | ||||
| 	// Expose C constants to cycript's global scope | ||||
| 	var shouldExposeConsts = true; | ||||
| 	// Expose functions defined here to cycript's global scope | ||||
| 	var shouldExposeFuncs = true; | ||||
| 	// Which functions to expose | ||||
| 	var funcsToExpose = ["exec", "include", "sizeof", "logify", "apply", "str2voidPtr", "voidPtr2str", "double2voidPtr", "voidPtr2double", "isMemoryReadable", "isObject", "makeStruct"]; | ||||
| 	 | ||||
| 	// C functions that utils.loadFuncs loads | ||||
| 	var CFuncsDeclarations = [ | ||||
| 		// <stdlib.h> | ||||
| 		"void *calloc(size_t num, size_t size)", | ||||
| 		// <string.h> | ||||
| 		"char *strcpy(char *restrict dst, const char *restrict src)", | ||||
| 		"char *strdup(const char *s1)", | ||||
| 		"void* memset(void* dest, int ch, size_t count)", | ||||
| 		// <stdio.h> | ||||
| 		"FILE *fopen(const char *, const char *)", | ||||
| 		"int fclose(FILE *)", | ||||
| 		"size_t fread(void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		// <mach.h> | ||||
| 		"mach_port_t mach_task_self()", | ||||
| 		"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)", | ||||
| 		"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)", | ||||
| 		"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)", | ||||
| 		"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)", | ||||
| 	]; | ||||
| 	 | ||||
| 	/* | ||||
| 		Replacement for eval that can handle @encode etc. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.exec("@encode(void *(int, char))") | ||||
| 			@encode(void*(int,char)) | ||||
| 	*/ | ||||
| 	utils.exec = function(str) { | ||||
| 		var mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, "mkdir")); | ||||
| 		var tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, "tempnam")); | ||||
| 		var fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, "fopen")); | ||||
| 		var fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, "fclose")); | ||||
| 		var fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, "fwrite")); | ||||
| 		var symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, "symlink")); | ||||
| 		var unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, "unlink")); | ||||
| 		var getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, "getenv")); | ||||
| 		var setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, "setenv")); | ||||
| 		 | ||||
| 		var libdir = "/usr/lib/cycript0.9"; | ||||
| 		var dir = libdir + "/tmp"; | ||||
|  | ||||
| 		mkdir(dir, 0777); | ||||
| 		 | ||||
| 		// This is needed because tempnam seems to ignore the first argument on i386 | ||||
| 		var old_tmpdir = getenv("TMPDIR"); | ||||
| 		setenv("TMPDIR", dir, 1); | ||||
|  | ||||
| 		// No freeing :( | ||||
| 		var f = tempnam(dir, "exec-"); | ||||
| 		setenv("TMPDIR", old_tmpdir, 1); | ||||
| 		if(!f) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		symlink(f, f + ".cy"); | ||||
| 		 | ||||
| 		str = "exports.result = " + str; | ||||
|  | ||||
| 		var handle = fopen(f, "w"); | ||||
| 		fwrite(str, str.length, 1, handle); | ||||
| 		fclose(handle); | ||||
| 		 | ||||
| 		var r; | ||||
| 		var except = null; | ||||
| 		try { | ||||
| 			r = require(f.replace(libdir + "/", "")); | ||||
| 		} catch(e) { | ||||
| 			except = e; | ||||
| 		} | ||||
|  | ||||
| 		unlink(f + ".cy"); | ||||
| 		unlink(f); | ||||
| 		 | ||||
| 		if(except !== null) { | ||||
| 			throw except; | ||||
| 		} | ||||
|  | ||||
| 		return r.result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Applies known typedefs | ||||
| 		Used in utils.include and utils.makeStruct | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.applyTypedefs("mach_vm_address_t") | ||||
| 			"uint64_t" | ||||
| 	*/ | ||||
| 	utils.applyTypedefs = function(str) { | ||||
| 		var typedefs = { | ||||
| 			"struct": "", | ||||
| 			"restrict": "", | ||||
| 			"FILE": "void", | ||||
| 			"size_t": "uint64_t", | ||||
| 			"uintptr_t": "unsigned long", | ||||
| 			"kern_return_t": "int", | ||||
| 			"mach_port_t": "unsigned int", | ||||
| 			"mach_port_name_t": "unsigned int", | ||||
| 			"vm_offset_t": "unsigned long", | ||||
| 			"vm_size_t": "unsigned long", | ||||
| 			"mach_vm_address_t": "uint64_t", | ||||
| 			"mach_vm_offset_t": "uint64_t", | ||||
| 			"mach_vm_size_t": "uint64_t", | ||||
| 			"vm_map_offset_t": "uint64_t", | ||||
| 			"vm_map_address_t": "uint64_t", | ||||
| 			"vm_map_size_t": "uint64_t", | ||||
| 			"mach_port_context_t": "uint64_t", | ||||
| 			"vm_map_t": "unsigned int", | ||||
| 			"boolean_t": "unsigned int", | ||||
| 			"vm_prot_t": "int", | ||||
| 			"mach_msg_type_number_t": "unsigned int", | ||||
| 			"cpu_type_t": "int", | ||||
| 			"cpu_subtype_t": "int", | ||||
| 			"cpu_threadtype_t": "int", | ||||
| 		}; | ||||
| 		 | ||||
| 		for(var k in typedefs) { | ||||
| 			str = str.replace(new RegExp("(\\s|\\*|,|\\(|^)" + k + "(\\s|\\*|,|\\)|$)", "g"), "$1" + typedefs[k] + "$2"); | ||||
| 		} | ||||
| 		 | ||||
| 		return str; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Parses a C function declaration and returns the function name and cycript type | ||||
| 		If load is true, tries to load it into cycript using utils.exec | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var str = "void *calloc(size_t num, size_t size)"; | ||||
| 			"void *calloc(size_t num, size_t size)" | ||||
| 			cy# utils.include(str) | ||||
| 			["calloc","@encode(void *(uint64_t num,  uint64_t size))(140735674376857)"] | ||||
| 			cy# var ret = utils.include(str, true) | ||||
| 			["calloc",0x7fff93e0e299] | ||||
| 			cy# ret[1].type | ||||
| 			@encode(void*(unsigned long long int,unsigned long long int)) | ||||
| 			cy# ret[1](100, 1) | ||||
| 			0x100444100 | ||||
| 	*/ | ||||
| 	utils.include = function(str, load) { | ||||
| 		var re = /^\s*([^(]*(?:\s+|\*))(\w*)\s*\(([^)]*)\)\s*;?\s*$/; | ||||
| 		var match = re.exec(str); | ||||
| 		if(!match) { | ||||
| 			return -1; | ||||
| 		} | ||||
| 		var rType = utils.applyTypedefs(match[1]); | ||||
| 		var name = match[2]; | ||||
| 		var args = match[3]; | ||||
|  | ||||
| 		var argsRe = /([^,]+)(?:,|$)/g; | ||||
| 		var argsTypes = []; | ||||
| 		while((match = argsRe.exec(args)) !== null) { | ||||
| 			var type = utils.applyTypedefs(match[1]); | ||||
| 			argsTypes.push(type); | ||||
| 		} | ||||
| 		 | ||||
| 		var encodeString = "@encode("; | ||||
| 		encodeString += rType + "("; | ||||
| 		encodeString += argsTypes.join(", ") + "))"; | ||||
|  | ||||
| 		var fun = dlsym(RTLD_DEFAULT, name); | ||||
| 		if(fun !== null) { | ||||
| 			encodeString += "(" + fun + ")"; | ||||
| 			if(load) { | ||||
| 				return [name, utils.exec(encodeString)]; | ||||
| 			} | ||||
| 		} else if(load) { | ||||
| 			throw "Function couldn't be found with dlsym!"; | ||||
| 		} | ||||
|  | ||||
| 		return [name, encodeString]; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Loads the function declaration in the defs array using utils.exec and exposes to cycript's global scope | ||||
| 		Is automatically called if shouldLoadCFuncs is true | ||||
| 	*/ | ||||
| 	utils.funcs = {}; | ||||
| 	utils.loadfuncs = function(expose) { | ||||
| 		for(var i = 0; i < CFuncsDeclarations.length; i++) { | ||||
| 			try { | ||||
| 				var o = utils.include(CFuncsDeclarations[i], true); | ||||
| 				utils.funcs[o[0]] = o[1]; | ||||
| 				if(expose) { | ||||
| 					Cycript.all[o[0]] = o[1]; | ||||
| 				} | ||||
| 			} catch(e) { | ||||
| 				system.print("Failed to load function: " + i); | ||||
| 				try { | ||||
| 					system.print(utils.include(CFuncsDeclarations[i])); | ||||
| 				} catch(e2) { | ||||
| 					 | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calculates the size of a type like the C operator sizeof | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.sizeof(int) | ||||
| 			4 | ||||
| 			cy# utils.sizeof(@encode(void *)) | ||||
| 			8 | ||||
| 			cy# utils.sizeof("mach_vm_address_t") | ||||
| 			8 | ||||
| 	*/ | ||||
| 	utils.sizeof = function(type) { | ||||
| 		if(typeof type === "string") { | ||||
| 			type = utils.applyTypedefs(type); | ||||
| 			type = utils.exec("@encode(" + type + ")"); | ||||
| 		} | ||||
| 		 | ||||
| 		// (const) char * has "infinite" preceision | ||||
| 		if(type.toString().slice(-1) === "*") { | ||||
| 			return utils.sizeof(@encode(void *)); | ||||
| 		} | ||||
| 		 | ||||
| 		// float and double | ||||
| 		if(type.toString() === @encode(float).toString()) { | ||||
| 			return 4; | ||||
| 		} else if (type.toString() === @encode(double).toString()) { | ||||
| 			return 8; | ||||
| 		} | ||||
|  | ||||
| 		var typeInstance = type(0); | ||||
| 		 | ||||
| 		if(typeInstance instanceof Object) { | ||||
| 			// Arrays | ||||
| 			if("length" in typeInstance) { | ||||
| 				return typeInstance.length * utils.sizeof(typeInstance.type); | ||||
| 			} | ||||
| 			 | ||||
| 			// Structs | ||||
| 			if(typeInstance.toString() === "[object Struct]") { | ||||
| 				var typeStr = type.toString(); | ||||
| 				var arrayTypeStr = "[2" + typeStr + "]"; | ||||
| 				var arrayType = new Type(arrayTypeStr); | ||||
| 				 | ||||
| 				var arrayInstance = new arrayType; | ||||
| 				 | ||||
| 				return @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0])); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		for(var i = 0; i < 5; i++) { | ||||
| 			var maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1; | ||||
| 			if(i === 3) { | ||||
| 				// Floating point fix ;^) | ||||
| 				maxSigned /= 1000; | ||||
| 			} | ||||
|  | ||||
| 			// can't use !== or sizeof(void *) === 0.5 | ||||
| 			if(type(maxSigned) != maxSigned) { | ||||
| 				return Math.pow(2, i - 1); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Logs a specific message sent to an instance of a class like logify.pl in theos | ||||
| 		Requires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules | ||||
| 		Returns the old message returned by MS.hookMessage (Note: this is not just the old message!) | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:)) | ||||
| 			... | ||||
| 			cy# var n = [NSNumber numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5 | ||||
| 			@1.5 | ||||
| 	*/ | ||||
| 	utils.logify = function(cls, sel) { | ||||
| 		@import com.saurik.substrate.MS; | ||||
| 		@import org.cycript.NSLog; | ||||
| 		 | ||||
| 		var oldm = {}; | ||||
| 		 | ||||
| 		MS.hookMessage(cls, sel, function() { | ||||
| 			var args = [].slice.call(arguments); | ||||
| 			 | ||||
| 			var selFormat = sel.toString().replace(/:/g, ":%@ ").trim(); | ||||
| 			var logFormat = "%@[<%@: 0x%@> " + selFormat + "]"; | ||||
| 			 | ||||
| 			var standardArgs = [logFormat, class_isMetaClass(cls)? "+": "-", cls.toString(), (&this).valueOf().toString(16)]; | ||||
| 			var logArgs = standardArgs.concat(args); | ||||
| 			 | ||||
| 			NSLog.apply(null, logArgs); | ||||
| 			 | ||||
| 			var r = oldm->apply(this, arguments); | ||||
| 			 | ||||
| 			if(r !== undefined) { | ||||
| 				NSLog(" = %@", r); | ||||
| 			} | ||||
| 			 | ||||
| 			return r; | ||||
| 		}, oldm); | ||||
| 		 | ||||
| 		return oldm; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calls a C function by providing its name and arguments | ||||
| 		Doesn't support structs | ||||
| 		Return value is always a void pointer | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.apply("printf", ["%s %.3s, %d -> %c, float: %f\n", "foo", "barrrr", 97, 97, 1.5]) | ||||
| 			foo bar, 97 -> a, float: 1.500000 | ||||
| 			0x22 | ||||
| 	*/ | ||||
| 	utils.apply = function(fun, args) { | ||||
| 		if(!(args instanceof Array)) { | ||||
| 			throw "Args needs to be an array!"; | ||||
| 		} | ||||
| 		 | ||||
| 		var argc = args.length; | ||||
| 		var voidPtr = @encode(void *); | ||||
| 		var argTypes = []; | ||||
| 		for(var i = 0; i < argc; i++) { | ||||
| 			var argType = voidPtr; | ||||
| 			 | ||||
| 			var arg = args[i]; | ||||
| 			if(typeof arg === "string") { | ||||
| 				argType = @encode(char *); | ||||
| 			} | ||||
| 			if(typeof arg === "number" && arg % 1 !== 0) { | ||||
| 				argType = @encode(double); | ||||
| 			} | ||||
| 			 | ||||
| 			argTypes.push(argType); | ||||
| 		} | ||||
| 		 | ||||
| 		var type = voidPtr.functionWith.apply(voidPtr, argTypes); | ||||
| 		 | ||||
| 		if(typeof fun === "string") { | ||||
| 			fun = dlsym(RTLD_DEFAULT, fun); | ||||
| 		} | ||||
| 		 | ||||
| 		if(!fun) { | ||||
| 			throw "Function not found!"; | ||||
| 		} | ||||
|  | ||||
| 		return type(fun).apply(null, args); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a string (char *) to a void pointer (void *) | ||||
| 		You can't cast to strings to void pointers and vice versa in cycript. Blame saurik. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var voidPtr = utils.str2voidPtr("foobar") | ||||
| 			0x100331590 | ||||
| 			cy# utils.voidPtr2str(voidPtr) | ||||
| 			"foobar" | ||||
| 	*/ | ||||
| 	utils.str2voidPtr = function(str) { | ||||
| 		var strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(str); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of str2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2str = function(voidPtr) { | ||||
| 		var strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(voidPtr); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a double into a void pointer | ||||
| 		This can be used to view the binary representation of a floating point number | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var n = utils.double2voidPtr(-1.5) | ||||
| 			0xbff8000000000000 | ||||
| 			cy# utils.voidPtr2double(n) | ||||
| 			-1.5 | ||||
| 	*/ | ||||
| 	utils.double2voidPtr = function(n) { | ||||
| 		var doublePtr = new double; | ||||
| 		*doublePtr = n; | ||||
| 		 | ||||
| 		var voidPtrPtr = @encode(void **)(doublePtr); | ||||
| 		 | ||||
| 		return *voidPtrPtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of double2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2double = function(voidPtr) { | ||||
| 		var voidPtrPtr = new @encode(void **); | ||||
| 		*voidPtrPtr = voidPtr; | ||||
| 		 | ||||
| 		var doublePtr = @encode(double *)(voidPtrPtr); | ||||
| 		 | ||||
| 		return *doublePtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if a memory location is readable | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.isMemoryReadable(0) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(NSObject) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isMemoryReadable(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isMemoryReadable = function(ptr) { | ||||
| 		if(typeof ptr === "string") { | ||||
| 			return true; | ||||
| 		} | ||||
| 		 | ||||
| 		var fds = new @encode(int [2]); | ||||
| 		utils.apply("pipe", [fds]); | ||||
| 		var result = utils.apply("write", [fds[1], ptr, 1]) == 1; | ||||
| 		 | ||||
| 		utils.apply("close", [fds[0]]); | ||||
| 		utils.apply("close", [fds[1]]); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if the memory location contains an Objective-C object | ||||
|  | ||||
| 		Usage: | ||||
| 			cy# utils.isObject(0) | ||||
| 			false | ||||
| 			cy# utils.isObject(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isObject(NSObject) | ||||
| 			true | ||||
| 			cy# utils.isObject(objc_getMetaClass(NSObject)) | ||||
| 			true | ||||
| 			cy# utils.isObject([new NSObject init]) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isObject(a) | ||||
| 			false | ||||
| 			cy# *@encode(void **)(a) = NSObject; utils.isObject(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isObject = function(obj) { | ||||
| 		obj = @encode(void *)(obj); | ||||
| 		var lastObj = -1; | ||||
| 		 | ||||
| 		function objc_isa_ptr(obj) { | ||||
| 			// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html | ||||
| 			var objc_debug_isa_class_mask = 0x00000001fffffffa; | ||||
| 			obj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj; | ||||
| 			 | ||||
| 			if((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) { | ||||
| 				return null; | ||||
| 			} else { | ||||
| 				return obj; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		function ptrValue(obj) { | ||||
| 			return obj? obj.valueOf(): null; | ||||
| 		} | ||||
| 		 | ||||
| 		var foundMetaClass = false; | ||||
| 		 | ||||
| 		for(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) { | ||||
| 			obj = *@encode(void **)(obj); | ||||
| 			 | ||||
| 			if(ptrValue(obj) == ptrValue(lastObj)) { | ||||
| 				foundMetaClass = true; | ||||
| 				break; | ||||
| 			} | ||||
| 			 | ||||
| 			lastObj = obj; | ||||
| 		} | ||||
| 		 | ||||
| 		if(!foundMetaClass) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		if(lastObj === -1 || lastObj === null) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var obj_class = objc_isa_ptr(@encode(void **)(obj)[1]); | ||||
| 		 | ||||
| 		if(!utils.isMemoryReadable(obj_class)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]); | ||||
| 		var superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]); | ||||
| 		 | ||||
| 		return ptrValue(obj) == ptrValue(metaclass) && superclass == null; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Creates a cycript struct type from a C struct definition | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var foo = makeStruct("int a; short b; char c; uint64_t d; double e;", "foo"); | ||||
| 			@encode(foo) | ||||
| 			cy# var f = new foo | ||||
| 			&{a:0,b:0,c:0,d:0,e:0} | ||||
| 			cy# f->a = 100; f | ||||
| 			&{a:100,b:0,c:0,d:0,e:0} | ||||
| 			cy# *@encode(int *)(f) | ||||
| 			100 | ||||
| 	*/ | ||||
| 	utils.makeStruct = function(str, name) {		 | ||||
| 		var fieldRe = /(?:\s|\n)*([^;]+\s*(?:\s|\*))([^;]+)\s*;/g; | ||||
| 		 | ||||
| 		if(!name) { | ||||
| 			name = "struct" + Math.floor(Math.random() * 100000); | ||||
| 		} | ||||
| 		var typeStr = "{" + name + "="; | ||||
| 		 | ||||
| 		while((match = fieldRe.exec(str)) !== null) { | ||||
| 			var fieldType = utils.applyTypedefs(match[1]); | ||||
| 			var fieldName = match[2]; | ||||
| 			var encodedType = utils.exec("@encode(" + fieldType + ")").toString(); | ||||
| 			 | ||||
| 			typeStr += '"' + fieldName + '"' + encodedType; | ||||
| 		} | ||||
| 		 | ||||
| 		typeStr += "}"; | ||||
| 		 | ||||
| 		return new Type(typeStr); | ||||
| 	}; | ||||
| 	 | ||||
| 	// Various constants | ||||
| 	utils.constants = { | ||||
| 		VM_PROT_NONE:       0x0, | ||||
| 		VM_PROT_READ:       0x1, | ||||
| 		VM_PROT_WRITE:      0x2, | ||||
| 		VM_PROT_EXECUTE:    0x4, | ||||
| 		VM_PROT_NO_CHANGE:  0x8, | ||||
| 		VM_PROT_COPY:       0x10, | ||||
| 		VM_PROT_WANTS_COPY: 0x10, | ||||
| 		VM_PROT_IS_MASK:    0x40, | ||||
| 	}; | ||||
| 	var c = utils.constants; | ||||
| 	c.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE; | ||||
| 	c.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE; | ||||
| 	 | ||||
| 	if(shouldExposeConsts) { | ||||
| 		for(var k in c) { | ||||
| 			Cycript.all[k] = c[k]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldExposeFuncs) { | ||||
| 		for(var i = 0; i < funcsToExpose.length; i++) { | ||||
| 			var name = funcsToExpose[i]; | ||||
| 			Cycript.all[name] = utils[name]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldLoadCFuncs) { | ||||
| 		utils.loadfuncs(shouldExposeCFuncs); | ||||
| 	} | ||||
| })(exports); | ||||
							
								
								
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| class App.FromNowView extends Ember.View | ||||
|     tagName: 'time' | ||||
|     template: Ember.Handlebars.compile '{{view.output}}' | ||||
|     output: ~> | ||||
|         return moment(@value).fromNow() | ||||
|  | ||||
|     didInsertElement: -> | ||||
|         @tick() | ||||
|  | ||||
|     tick: -> | ||||
|         f = -> | ||||
|             @notifyPropertyChange 'output' | ||||
|             @tick() | ||||
|  | ||||
|         nextTick = Ember.run.later(this, f, 1000) | ||||
|         @set 'nextTick', nextTick | ||||
|  | ||||
|     willDestroyElement: -> | ||||
|         nextTick = @nextTick | ||||
|         Ember.run.cancel nextTick | ||||
|  | ||||
| Ember.Handlebars.helper 'fromNow', App.FromNowView | ||||
|  | ||||
							
								
								
									
										6
									
								
								samples/Grace/ackerman_function.grace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/Grace/ackerman_function.grace
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| method ack (m : Number, n : Number) -> Number { | ||||
|   print "ack {m} {n}" | ||||
|   if (m < = 0) then {n + 1} | ||||
|    elseif {n <= 0} then {ack((m -1), 1)} | ||||
|    else {ack(m -1, ack(m, n-1))} | ||||
| } | ||||
							
								
								
									
										554
									
								
								samples/Grace/grace_IDE.grace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										554
									
								
								samples/Grace/grace_IDE.grace
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,554 @@ | ||||
| import "gtk" as gtk | ||||
| import "io" as io | ||||
| import "mgcollections" as collections | ||||
| import "button_factory" as button_factory | ||||
| import "dialog_factory" as dialog_factory | ||||
| import "syntax_highlighter" as highlighter | ||||
| import "auto_completer" as aComp | ||||
|  | ||||
| //TODO | ||||
|  | ||||
| // Autocomplete typing | ||||
|  | ||||
| // FileChooser | ||||
| // Themes | ||||
|  | ||||
| // Details for the Top Level Window | ||||
| def window = gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||
| window.title := "Grace" | ||||
| window.set_default_size(700, 700) | ||||
| // ------------- | ||||
|  | ||||
| // Placeholder for the console window that can be popped out | ||||
| // of the main window | ||||
| var popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||
|  | ||||
| // Initialise the Boxes | ||||
| def mBox = gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||
| def buttonBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 2) | ||||
| var consoleButtons := gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 3) | ||||
| var consoleBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||
| var editorBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||
| var splitPane := gtk.paned(gtk.GTK_ORIENTATION_VERTICAL, 2) | ||||
| def menuBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 4) | ||||
| // ------------- | ||||
|  | ||||
| // Initialise the buttons | ||||
| def runButton = button_factory.make("run") | ||||
| var clearButton := button_factory.make("clear") | ||||
| var outButton := button_factory.make("out") | ||||
| var errorButton := button_factory.make("error") | ||||
| var popButton := button_factory.make("pop") | ||||
| def newButton = button_factory.make("new") | ||||
| def openButton = button_factory.make("open") | ||||
| def saveButton = button_factory.make("save") | ||||
| def saveAsButton = button_factory.make("saveAs") | ||||
| def closeButton = button_factory.make("close") | ||||
| // ------------- | ||||
|  | ||||
| // Details for the default text editor and scrolled window | ||||
| var tEdit := gtk.text_view | ||||
| tEdit.set_size_request(700, 400) | ||||
|  | ||||
| var scrolled_main := gtk.scrolled_window | ||||
| scrolled_main.set_size_request(700, 400) | ||||
| scrolled_main.add(tEdit) | ||||
| // ------------- | ||||
|  | ||||
| // Widget that allows multiple files to be edited (tabs) | ||||
| var notebook := gtk.notebook | ||||
| notebook.scrollable := true | ||||
| // ------------- | ||||
|  | ||||
| // Maps for holding the text_views and scrolled_windows | ||||
| var editor_map := collections.map.new | ||||
| editor_map.put(0, tEdit) | ||||
| var scrolled_map := collections.map.new | ||||
| scrolled_map.put(0, scrolled_main) | ||||
|  | ||||
| // ------------- | ||||
|  | ||||
| // Class that manages the syntax highlighting (This needs to be passed around otherwise | ||||
| // the text_tag table gets confused, ie there can only be one) | ||||
| def lighter = highlighter.Syntax_Highlighter.new(notebook, editor_map) | ||||
| tEdit.buffer.on "changed" do { | ||||
|     lighter.highlightLine | ||||
| } | ||||
|  | ||||
| // Class that manages any auto completion that is required | ||||
| def completer =  aComp.Auto_Completer.new(window, notebook, editor_map) | ||||
|  | ||||
| // Utility methods | ||||
| // ------------- | ||||
|  | ||||
| method deleteCompileFiles(page_num : Number) { | ||||
|     def cur_scrolled = scrolled_map.get(page_num) | ||||
|     var filename := notebook.get_tab_label_text(cur_scrolled) | ||||
|     filename := filename.substringFrom(0)to(filename.size - 7) //Removes .grace extension | ||||
|  | ||||
|     io.system("rm -f files/" ++ filename) | ||||
|     io.system("rm -f files/" ++ filename ++ ".c") | ||||
|     io.system("rm -f files/" ++ filename ++ ".gcn") | ||||
|     io.system("rm -f files/" ++ filename ++ ".gct") | ||||
| } | ||||
|  | ||||
| // ------------- | ||||
|  | ||||
|  | ||||
|  | ||||
| var currentConsole := "output"      // Which console is being shown | ||||
| var out := false | ||||
|  | ||||
|  | ||||
| var outText := "" | ||||
| var errorText := "" | ||||
|  | ||||
|  | ||||
|  | ||||
| // Give actions to the buttons | ||||
| // ------------- | ||||
|  | ||||
| runButton.on "clicked" do { | ||||
|     clearConsoles() | ||||
|  | ||||
|     // Get the details for the current page selected | ||||
|     def cur_page_num = notebook.current_page | ||||
|     def cur_page = editor_map.get(cur_page_num) | ||||
|     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||
|     def cur_page_label = notebook.get_tab_label_text(cur_scrolled) | ||||
|  | ||||
|     // Initialise text iterators | ||||
|     def sIter = gtk.text_iter | ||||
|     def eIter = gtk.text_iter | ||||
|  | ||||
|     // Set one at the beggining and one at the end of the text | ||||
|     cur_page.buffer.get_iter_at_offset(sIter, 0) | ||||
|     cur_page.buffer.get_iter_at_offset(eIter, -1) | ||||
|  | ||||
|     // Get the text between the text iterators | ||||
|     def text = cur_page.buffer.get_text(sIter, eIter, true) | ||||
|  | ||||
|     // Save the text to the file (in case the user hasn't already saved it) | ||||
|     def file = io.open("files/" ++ cur_page_label, "w") | ||||
|     file.write(text) | ||||
|     file.close | ||||
|  | ||||
|     // Run the program and pipe the output and errors into files to be read | ||||
|     io.system("../minigrace/minigrace " ++ "files/" ++ cur_page_label ++ " > output.txt 2> error.txt") | ||||
|     def outputFile = io.open("output.txt", "r") | ||||
|     def errorFile = io.open("error.txt", "r") | ||||
|     outText := outputFile.read | ||||
|     errorText := errorFile.read | ||||
|  | ||||
|     io.system("rm -f output.txt error.txt") | ||||
|  | ||||
|     var switched := false | ||||
|  | ||||
|     // Change the console to output if there is output text | ||||
|     if((outText.size > 0) && (currentConsole != "output")) then { | ||||
|         switch_to_output() | ||||
|         switched := true | ||||
|     } | ||||
|     // Change the console to errors if there were errors | ||||
|     if((errorText.size > 0) && (currentConsole != "errors")) then { | ||||
|         switch_to_errors() | ||||
|         switched := true | ||||
|     } | ||||
|  | ||||
|     // Remember to populate the console if it wasn't switched | ||||
|     if(!switched) then { | ||||
|         populateConsoles | ||||
|     } | ||||
| } | ||||
|  | ||||
| clearButton.on "clicked" do { | ||||
|     clearConsoles() | ||||
| } | ||||
|  | ||||
| outButton.on "clicked" do { | ||||
|     switch_to_output() | ||||
| } | ||||
|  | ||||
| errorButton.on "clicked" do { | ||||
|     switch_to_errors() | ||||
| } | ||||
|  | ||||
| popButton.on "clicked" do { | ||||
|     if(out) then { | ||||
|         popIn() | ||||
|     } else { | ||||
|         popOut() | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Gives a dialog to let the user create a new file to edit | ||||
| newButton.on "clicked" do { | ||||
|     def new_window_class = dialog_factory.new.new(notebook, editor_map, scrolled_map, lighter) | ||||
|  | ||||
|     def new_window = new_window_class.window() | ||||
|     new_window.show_all | ||||
| } | ||||
|  | ||||
| // Gives a dialog that lets the user open a file to edit | ||||
| openButton.on "clicked" do { | ||||
|     def open_window_class = dialog_factory.open.new(notebook, editor_map, scrolled_map, lighter) | ||||
|  | ||||
|     def open_window = open_window_class.window() | ||||
|     open_window.show_all | ||||
| } | ||||
|  | ||||
| // Saves the current file (if the name is Untitled.grace it will ask for a new name) | ||||
| saveButton.on "clicked" do { | ||||
|     def cur_page_num = notebook.current_page | ||||
|     def cur_page = editor_map.get(cur_page_num) | ||||
|     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||
|     def cur_page_label = notebook.get_tab_label_text(cur_scrolled) | ||||
|  | ||||
|     if(cur_page_label == "Untitled.grace") then { | ||||
|         def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, true) | ||||
|  | ||||
|         def saveAs_window = saveAs_window_class.window() | ||||
|         saveAs_window.show_all | ||||
|     } else { | ||||
|         // Initialise text iterators | ||||
|         def sIter = gtk.text_iter | ||||
|         def eIter = gtk.text_iter | ||||
|  | ||||
|         // Set one at the beggining and one at the end of the text | ||||
|         cur_page.buffer.get_iter_at_offset(sIter, 0) | ||||
|         cur_page.buffer.get_iter_at_offset(eIter, -1) | ||||
|  | ||||
|         // Get the text between the text iterators | ||||
|         def text = cur_page.buffer.get_text(sIter, eIter, true) | ||||
|  | ||||
|         // Save the file | ||||
|         def file = io.open("files/" ++ cur_page_label, "w") | ||||
|         file.write(text) | ||||
|         file.close | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| // Gives a dialog that lets the user save the file with a new name | ||||
| saveAsButton.on "clicked" do { | ||||
|     def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, false) | ||||
|  | ||||
|     def saveAs_window = saveAs_window_class.window() | ||||
|     saveAs_window.show_all | ||||
| } | ||||
|  | ||||
| // This will close a tab on the notebook | ||||
| // It also "removes" the page from the map, | ||||
| // by creating a new temporary map and putting all but | ||||
| // the removed page in. | ||||
| closeButton.on "clicked" do { | ||||
|     def page_num = notebook.current_page | ||||
|     def num_pages = notebook.n_pages | ||||
|  | ||||
|     if(num_pages > 1) then { | ||||
|         deleteCompileFiles(page_num) | ||||
|  | ||||
|         def e_map = collections.map.new | ||||
|         def s_map = collections.map.new | ||||
|  | ||||
|         // Copy every page up to the current page into the new maps | ||||
|         var x := 0 | ||||
|         while {x < page_num} do { | ||||
|             var eValue := editor_map.get(x) | ||||
|             var sValue := scrolled_map.get(x) | ||||
|             e_map.put(x, eValue) | ||||
|             s_map.put(x, sValue) | ||||
|  | ||||
|             x := x + 1 | ||||
|         } | ||||
|  | ||||
|         // Copy every page after the current page into the new map (shifted one down) | ||||
|         x := page_num + 1 | ||||
|         while {x < num_pages} do { | ||||
|             var eValue := editor_map.get(x) | ||||
|             var sValue := scrolled_map.get(x) | ||||
|             e_map.put((x - 1), eValue) | ||||
|             s_map.put((x - 1), sValue) | ||||
|  | ||||
|             x := x + 1 | ||||
|         } | ||||
|  | ||||
|         editor_map := e_map | ||||
|         scrolled_map := s_map | ||||
|         notebook.remove_page(page_num) | ||||
|  | ||||
|         notebook.show_all | ||||
|     } | ||||
|  | ||||
| } | ||||
| // ------------- | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // Consoles: | ||||
| // ------------- | ||||
|  | ||||
| var outConsole := gtk.text_view | ||||
| var outScroll := gtk.scrolled_window | ||||
| var errorConsole := gtk.text_view | ||||
| var errorScroll := gtk.scrolled_window | ||||
| var errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") | ||||
|  | ||||
|  | ||||
| // Creates a new output console | ||||
| method createOut { | ||||
|     outConsole := gtk.text_view | ||||
|     outScroll := gtk.scrolled_window | ||||
|     outScroll.add(outConsole) | ||||
|     if(out) then { | ||||
|         outConsole.set_size_request(400, 400) | ||||
|         outScroll.set_size_request(400, 400) | ||||
|     } else { | ||||
|         outConsole.set_size_request(700, 200) | ||||
|         outScroll.set_size_request(700, 200) | ||||
|     } | ||||
|     outConsole.editable := false | ||||
|     outConsole.buffer.set_text("[Output]:", -1) | ||||
| } | ||||
| createOut() | ||||
|  | ||||
| // Creates a new error console | ||||
| method createError { | ||||
|     errorConsole := gtk.text_view | ||||
|     errorScroll := gtk.scrolled_window | ||||
|     errorScroll.add(errorConsole) | ||||
|     if(out) then { | ||||
|         errorConsole.set_size_request(400, 400) | ||||
|         errorScroll.set_size_request(400, 400) | ||||
|     } else { | ||||
|         errorConsole.set_size_request(700, 200) | ||||
|         errorScroll.set_size_request(700, 200) | ||||
|     } | ||||
|     errorConsole.editable := false | ||||
|     errorConsole.buffer.set_text("[Errors]:", -1) | ||||
|     errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") | ||||
| } | ||||
| createError() | ||||
|  | ||||
| // Switches the console being shown to be output. This requires | ||||
| // the output console to be remade as it would have been destroyed when | ||||
| // it was switched previously | ||||
| method switch_to_output { | ||||
|     if(currentConsole != "output") then { | ||||
|         currentConsole := "output" | ||||
|         consoleBox.remove(errorScroll)     // This destroys the errorConsole | ||||
|  | ||||
|         createOut() | ||||
|  | ||||
|         consoleBox.add(outScroll) | ||||
|  | ||||
|         populateConsoles() | ||||
|         if(out) then { | ||||
|             popped.show_all | ||||
|         } else { | ||||
|             window.show_all | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Switches the console being shown to be errors. This requires | ||||
| // the error console to be remade as it would have been destroyed when | ||||
| // it was switched previously | ||||
| method switch_to_errors { | ||||
|     if(currentConsole != "errors") then { | ||||
|         currentConsole := "errors" | ||||
|         consoleBox.remove(outScroll)       // This destroys the outConsole | ||||
|  | ||||
|         createError() | ||||
|  | ||||
|         consoleBox.add(errorScroll) | ||||
|  | ||||
|         populateConsoles() | ||||
|         if(out) then { | ||||
|             popped.show_all | ||||
|         } else { | ||||
|             window.show_all | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // If there is text to be put into the consoles this will add it | ||||
| method populateConsoles { | ||||
|     if((outText.size > 0) && (currentConsole == "output")) then { | ||||
|         outConsole.buffer.set_text(outText, -1) | ||||
|     } | ||||
|     if((errorText.size > 0) && (currentConsole == "errors")) then { | ||||
|         def sIter = gtk.text_iter | ||||
|         def eIter = gtk.text_iter | ||||
|  | ||||
|         errorConsole.buffer.set_text(errorText, -1) | ||||
|         errorConsole.buffer.get_iter_at_offset(sIter, 0) | ||||
|         errorConsole.buffer.get_iter_at_offset(eIter, -1) | ||||
|         errorConsole.buffer.apply_tag(errorTag, sIter, eIter) | ||||
|     } | ||||
| } | ||||
|  | ||||
| method clearConsoles { | ||||
|     if(currentConsole == "output") then { | ||||
|         outConsole.buffer.set_text("[Output]:", -1) | ||||
|         outText := "" | ||||
|     } | ||||
|     if(currentConsole == "errors") then { | ||||
|         errorConsole.buffer.set_text("[Errors]:", -1) | ||||
|         errorText := "" | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| // Identical as the popIn method, but can be connected to the window's destroy button | ||||
| def popInBlock = { | ||||
|     consoleBox.reparent(splitPane) | ||||
|     popButton.label := "Pop Out" | ||||
|  | ||||
|     if(currentConsole == "output") then { | ||||
|         outConsole.set_size_request(700, 200) | ||||
|         outScroll.set_size_request(700, 200) | ||||
|     } | ||||
|     if(currentConsole == "errors") then { | ||||
|      errorConsole.set_size_request(700, 200) | ||||
|      errorScroll.set_size_request(700, 200) | ||||
|     } | ||||
|  | ||||
|     def cur_page_num = notebook.current_page | ||||
|     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||
|     def cur_page = editor_map.get(cur_page_num) | ||||
|  | ||||
|     cur_page.set_size_request(700, 400) | ||||
|     cur_scrolled.set_size_request(700, 400) | ||||
|  | ||||
|     out := false | ||||
|     popped.visible := false | ||||
| } | ||||
|  | ||||
|  | ||||
| // This pops the console out into a separate window | ||||
| method popOut { | ||||
|     popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) | ||||
|  | ||||
|     consoleBox.reparent(popped) | ||||
|     popButton.label := "Pop In" | ||||
|  | ||||
|     if(currentConsole == "output") then { | ||||
|         outConsole.set_size_request(400, 400) | ||||
|         outScroll.set_size_request(400, 400) | ||||
|     } | ||||
|     if(currentConsole == "errors") then { | ||||
|         errorConsole.set_size_request(400, 400) | ||||
|         errorScroll.set_size_request(400, 400) | ||||
|     } | ||||
|  | ||||
|     def cur_page_num = notebook.current_page | ||||
|     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||
|     def cur_page = editor_map.get(cur_page_num) | ||||
|  | ||||
|     cur_page.set_size_request(700, 580) | ||||
|     cur_scrolled.set_size_request(700, 580) | ||||
|  | ||||
|     out := true | ||||
|     popped.visible := true | ||||
|     popped.connect("destroy", popInBlock) | ||||
|     popped.show_all | ||||
|  | ||||
| } | ||||
|  | ||||
| // Puts the console back into the main window | ||||
| method popIn { | ||||
|     consoleBox.reparent(splitPane) | ||||
|     popButton.label := "Pop Out" | ||||
|  | ||||
|     if(currentConsole == "output") then { | ||||
|         outConsole.set_size_request(700, 200) | ||||
|         outScroll.set_size_request(700, 200) | ||||
|     } | ||||
|     if(currentConsole == "errors") then { | ||||
|         errorConsole.set_size_request(700, 200) | ||||
|         errorScroll.set_size_request(700, 200) | ||||
|     } | ||||
|  | ||||
|     def cur_page_num = notebook.current_page | ||||
|     def cur_scrolled = scrolled_map.get(cur_page_num) | ||||
|     def cur_page = editor_map.get(cur_page_num) | ||||
|  | ||||
|     cur_page.set_size_request(700, 400) | ||||
|     cur_scrolled.set_size_request(700, 400) | ||||
|  | ||||
|     out := false | ||||
|     popped.visible := false | ||||
| } | ||||
|  | ||||
| clearConsoles() | ||||
| // ------------- | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // Patch everything together | ||||
|  | ||||
| var hSeparator1 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) | ||||
| var hSeparator2 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) | ||||
|  | ||||
| menuBox.add(newButton) | ||||
| menuBox.add(openButton) | ||||
| menuBox.add(saveButton) | ||||
| menuBox.add(saveAsButton) | ||||
| buttonBox.add(runButton) | ||||
| buttonBox.add(closeButton) | ||||
|  | ||||
| consoleButtons.add(outButton) | ||||
| consoleButtons.add(errorButton) | ||||
| consoleButtons.add(clearButton) | ||||
| consoleButtons.add(popButton) | ||||
|  | ||||
| consoleBox.add(hSeparator1) | ||||
| consoleBox.add(consoleButtons) | ||||
| consoleBox.add(outScroll) | ||||
|  | ||||
| editorBox.add(hSeparator2) | ||||
| notebook.add(scrolled_main) | ||||
| notebook.set_tab_label_text(scrolled_main, "Untitled.grace") | ||||
| editorBox.add(notebook) | ||||
|  | ||||
| splitPane.add1(editorBox) | ||||
| splitPane.add2(consoleBox) | ||||
|  | ||||
| mBox.add(menuBox) | ||||
| mBox.add(buttonBox) | ||||
| mBox.add(splitPane) | ||||
|  | ||||
| window.add(mBox) | ||||
|  | ||||
| def exit = { | ||||
|     var x := 0 | ||||
|     while {x < notebook.n_pages} do { | ||||
|         deleteCompileFiles(x) | ||||
|  | ||||
|         x := x + 1 | ||||
|     } | ||||
|  | ||||
|     // Delete the compile files of the IDE | ||||
|     io.system("rm -f Grace_IDE.gct Grace_IDE.c Grace_IDE.gcn") | ||||
|     io.system("rm -f scanner.gct scanner.c scanner.gcn") | ||||
|     io.system("rm -f syntax_highlighter.gct syntax_highlighter.c syntax_highlighter.gcn") | ||||
|     io.system("rm -f syntax_colors.gct syntax_colors.c syntax_colors.gcn") | ||||
|     io.system("rm -f button_factory.gct button_factory.c button_factory.gcn") | ||||
|     io.system("rm -f dialog_factory.gct dialog_factory.c dialog_factory.gcn") | ||||
|     io.system("rm -f auto_completer.gct auto_completer.c auto_completer.gcn") | ||||
|  | ||||
|     print "Grace IDE Closed Successfully" | ||||
|     gtk.main_quit | ||||
| } | ||||
|  | ||||
| window.connect("destroy", exit) | ||||
| window.show_all | ||||
|  | ||||
| gtk.main | ||||
							
								
								
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| <!-- insert_before '[data-hook="buttons"]' --> | ||||
| <% if Spree::Config[:enable_fishbowl] %> | ||||
| <div class="row"> | ||||
|   <div class="twelve columns" id="fishbowl_preferences"> | ||||
|     <fieldset class="no-border-bottom"> | ||||
|       <legend align="center"><%= t(:fishbowl_settings)%></legend> | ||||
|       <% @fishbowl_options.each do |key| %> | ||||
|           <div class="field"> | ||||
|             <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %> | ||||
|             <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %> | ||||
|           </div> | ||||
|       <% end %> | ||||
|       <div class="field"> | ||||
|         <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %> | ||||
|         <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', "1", Spree::Config[:fishbowl_always_fetch_current_inventory]) %> | ||||
|         <%= t(:always_fetch_current_inventory) %> | ||||
|       </div> | ||||
|       <% if !@location_groups.empty? %> | ||||
|         <div class="field"> | ||||
|           <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %> | ||||
|           <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|     </fieldset> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|   $('.select2').select2(); | ||||
| </script> | ||||
| <% end %> | ||||
							
								
								
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| <% provide(:title, @header) %> | ||||
| <% present @users do |user_presenter| %> | ||||
| 	<div class="row key-header"> | ||||
| 		<h1><%= @header %></h1> | ||||
| 	</div> | ||||
|  | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class="row key-table"> | ||||
| 		<div class="small-12 columns"> | ||||
| 			<div class="row key-table-row"> | ||||
| 				<div class="small-2 columns">Name</div> | ||||
| 				<div class="small-3 columns">Email</div> | ||||
| 				<div class="small-1 columns">Chords</div> | ||||
| 				<div class="small-1 columns">Keys</div> | ||||
| 				<div class="small-1 columns">Tunings</div> | ||||
| 				<div class="small-1 columns">Credits</div> | ||||
| 				<div class="small-1 columns">Prem?</div> | ||||
| 				<div class="small-2 columns">Since?</div> | ||||
| 			</div> | ||||
|  | ||||
| 			<% if @users == [] %> | ||||
| 				<div class="row key-table-row"> | ||||
| 					<div class="small-4 small-centered columns">No Users</div> | ||||
| 				</div> | ||||
| 			<% else %> | ||||
| 				<%= render @users %> | ||||
| 			<% end %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| <% end %> | ||||
							
								
								
									
										29
									
								
								samples/Haml/buttons.html.haml.deface
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/Haml/buttons.html.haml.deface
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| / | ||||
|   replace '.actions' | ||||
|  | ||||
| .pull-right | ||||
|   .btn-group | ||||
|     = link_to page.url, target: "_blank", title: t('.view_live_html'), class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-picture.row-black | ||||
|        | ||||
|     = link_to refinery.edit_admin_page_path(page.nested_url, | ||||
|         switch_locale: (page.translations.first.locale unless page.translated_to_default_locale?)), | ||||
|         title: t('edit', :scope => 'refinery.admin.pages'), | ||||
|         class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-edit.row-blue | ||||
|        | ||||
|      | ||||
|     - if page.deletable? | ||||
|       = link_to refinery.admin_page_path(page.nested_url),  | ||||
|           methode: :delete, | ||||
|           title: t('delete', :scope => 'refinery.admin.pages'),  | ||||
|           class: "tip cancel confirm-delete btn btn-xs btn-default",  | ||||
|           data: { confirm: t('message', scope: 'refinery.admin.delete', title: page_title_with_translations(page)) } do | ||||
|         %i.icon-trash.row-red | ||||
|     - else | ||||
|       %button.btn.btn-xs.btn-default.disabled | ||||
|         %i.icon-trash | ||||
|        | ||||
|   .btn-group | ||||
|     = link_to refinery.new_admin_page_path(:parent_id => page.id), title: t('new', :scope => 'refinery.admin.pages'), class: "tip btn btn-xs btn-default" do | ||||
|       %i.icon-plus.row-green | ||||
							
								
								
									
										38
									
								
								samples/IGOR Pro/functions.ipf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/IGOR Pro/functions.ipf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| #pragma rtGlobals=3 | ||||
|  | ||||
| Function FooBar() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function FooBarSubType() : ButtonControl | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function/D FooBarVar() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| static Function FooBarStatic() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| threadsafe static Function FooBarStaticThreadsafe() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| threadsafe Function FooBarThread() | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
| Function CallOperationsAndBuiltInFuncs(string var) | ||||
|  | ||||
| 	string someDQString = "abcd" | ||||
|  | ||||
| 	Make/N=(1,2,3,4) myWave | ||||
| 	Redimension/N=(-1,-1,-1,5) myWave | ||||
|  | ||||
| 	print strlen(someDQString) | ||||
|  | ||||
| 	return 0 | ||||
| End | ||||
|  | ||||
							
								
								
									
										21
									
								
								samples/IGOR Pro/generic.ipf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/IGOR Pro/generic.ipf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #pragma rtGlobals=3 | ||||
|  | ||||
| StrConstant myConstString="abcd" | ||||
| // some comment | ||||
| constant myConst=123 | ||||
|  | ||||
| Structure struct1 | ||||
| 	string str | ||||
| 	variable var | ||||
| EndStructure | ||||
|  | ||||
| static Structure struct2 | ||||
| 	string str | ||||
| 	variable var | ||||
| EndStructure | ||||
|  | ||||
| #include "someFile" | ||||
|  | ||||
| #ifdef NOT_DEFINED | ||||
| 	// conditional compilation | ||||
| #endif | ||||
							
								
								
									
										74
									
								
								samples/LSL/LSL.lsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								samples/LSL/LSL.lsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|     Testing syntax highlighting | ||||
|     for the Linden Scripting Language | ||||
| */ | ||||
|  | ||||
| integer someIntNormal       = 3672; | ||||
| integer someIntHex          = 0x00000000; | ||||
| integer someIntMath         = PI_BY_TWO; | ||||
|  | ||||
| integer event               = 5673;// 'event' is invalid.illegal | ||||
|  | ||||
| key someKeyTexture          = TEXTURE_DEFAULT; | ||||
| string someStringSpecial    = EOF; | ||||
|  | ||||
| some_user_defined_function_without_return_type(string inputAsString) | ||||
| { | ||||
|     llSay(PUBLIC_CHANNEL, inputAsString); | ||||
| } | ||||
|  | ||||
| string user_defined_function_returning_a_string(key inputAsKey) | ||||
| { | ||||
|     return (string)inputAsKey; | ||||
| } | ||||
|  | ||||
| default | ||||
| { | ||||
|     state_entry() | ||||
|     { | ||||
|         key someKey = NULL_KEY; | ||||
|         someKey = llGetOwner(); | ||||
|  | ||||
|         string someString = user_defined_function_returning_a_string(someKey); | ||||
|  | ||||
|         some_user_defined_function_without_return_type(someString); | ||||
|     } | ||||
|  | ||||
|     touch_start(integer num_detected) | ||||
|     { | ||||
|         list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []); | ||||
|         integer numOfAgents = llGetListLength(agentsInRegion); | ||||
|  | ||||
|         integer index;                                                          // defaults to 0 | ||||
|         for (; index <= numOfAgents - 1; index++)                               // for each agent in region | ||||
|         { | ||||
|             llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, "Hello, Avatar!"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     touch_end(integer num_detected) | ||||
|     { | ||||
|         someIntNormal       = 3672; | ||||
|         someIntHex          = 0x00000000; | ||||
|         someIntMath         = PI_BY_TWO; | ||||
|  | ||||
|         event               = 5673;// 'event' is invalid.illegal | ||||
|  | ||||
|         someKeyTexture      = TEXTURE_DEFAULT; | ||||
|         someStringSpecial   = EOF; | ||||
|  | ||||
|         llSetInventoryPermMask("some item", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode | ||||
|  | ||||
|         llWhisper(PUBLIC_CHANNEL, "Leaving \"default\" now..."); | ||||
|         state other; | ||||
|     } | ||||
| } | ||||
|  | ||||
| state other | ||||
| { | ||||
|     state_entry() | ||||
|     { | ||||
|         llWhisper(PUBLIC_CHANNEL, "Entered \"state other\", returning to \"default\" again..."); | ||||
|         state default; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								samples/LookML/comments.view.lookml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/LookML/comments.view.lookml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| - view: comments | ||||
|   fields: | ||||
|  | ||||
|   - dimension: id | ||||
|     primary_key: true | ||||
|     type: int | ||||
|     sql: ${TABLE}.id | ||||
|  | ||||
|   - dimension: body | ||||
|     sql: ${TABLE}.body | ||||
|  | ||||
|   - dimension_group: created | ||||
|     type: time | ||||
|     timeframes: [time, date, week, month] | ||||
|     sql: ${TABLE}.created_at | ||||
|  | ||||
|   - dimension: headline_id | ||||
|     type: int | ||||
|     hidden: true | ||||
|     sql: ${TABLE}.headline_id | ||||
|  | ||||
|   - dimension_group: updated | ||||
|     type: time | ||||
|     timeframes: [time, date, week, month] | ||||
|     sql: ${TABLE}.updated_at | ||||
|  | ||||
|   - dimension: user_id | ||||
|     type: int | ||||
|     hidden: true | ||||
|     sql: ${TABLE}.user_id | ||||
|  | ||||
|   - measure: count | ||||
|     type: count | ||||
|     detail: detail* | ||||
|  | ||||
|  | ||||
|   # ----- Detail ------ | ||||
|   sets: | ||||
|     detail: | ||||
|       - id | ||||
|       - headlines.id | ||||
|       - headlines.name | ||||
|       - users.id | ||||
							
								
								
									
										272
									
								
								samples/Nit/calculator.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								samples/Nit/calculator.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| import gtk | ||||
|  | ||||
| class CalculatorContext | ||||
| 	var result : nullable Float = null | ||||
|  | ||||
| 	var last_op : nullable Char = null | ||||
|  | ||||
| 	var current : nullable Float = null | ||||
| 	var after_point : nullable Int = null | ||||
|  | ||||
| 	fun push_op( op : Char ) | ||||
| 	do | ||||
| 		apply_last_op_if_any | ||||
| 		if op == 'C' then | ||||
| 			self.result = 0.0 | ||||
| 			last_op = null | ||||
| 		else | ||||
| 			last_op = op # store for next push_op | ||||
| 		end | ||||
|  | ||||
| 		# prepare next current | ||||
| 		after_point = null | ||||
| 		current = null | ||||
| 	end | ||||
|  | ||||
| 	fun push_digit( digit : Int ) | ||||
| 	do | ||||
| 		var current = current | ||||
| 		if current == null then current = 0.0 | ||||
|  | ||||
| 		var after_point = after_point | ||||
| 		if after_point == null then | ||||
| 			current = current * 10.0 + digit.to_f | ||||
| 		else | ||||
| 			current = current + digit.to_f * 10.0.pow(after_point.to_f) | ||||
| 			self.after_point -= 1 | ||||
| 		end | ||||
|  | ||||
| 		self.current = current | ||||
| 	end | ||||
|  | ||||
| 	fun switch_to_decimals | ||||
| 	do | ||||
| 		if self.current == null then current = 0.0 | ||||
| 		if after_point != null then return | ||||
|  | ||||
| 		after_point = -1 | ||||
| 	end | ||||
|  | ||||
| 	fun apply_last_op_if_any | ||||
| 	do | ||||
| 		var op = last_op | ||||
|  | ||||
| 		var result = result | ||||
| 		if result == null then result = 0.0 | ||||
|  | ||||
| 		var current = current | ||||
| 		if current == null then current = 0.0 | ||||
|  | ||||
| 		if op == null then | ||||
| 			result = current | ||||
| 		else if op == '+' then | ||||
| 			result = result + current | ||||
| 		else if op == '-' then | ||||
| 			result = result - current | ||||
| 		else if op == '/' then | ||||
| 			result = result / current | ||||
| 		else if op == '*' then | ||||
| 			result = result * current | ||||
| 		end | ||||
| 		self.result = result | ||||
| 		self.current = null | ||||
| 	end | ||||
| end | ||||
|  | ||||
| class CalculatorGui | ||||
| 	super GtkCallable | ||||
|  | ||||
| 	var win : GtkWindow | ||||
| 	var container : GtkGrid | ||||
|  | ||||
| 	var lbl_disp : GtkLabel | ||||
| 	var but_eq : GtkButton | ||||
| 	var but_dot : GtkButton | ||||
|  | ||||
| 	var context = new CalculatorContext | ||||
|  | ||||
| 	redef fun signal( sender, user_data ) | ||||
| 	do | ||||
| 		var after_point = context.after_point | ||||
| 		if after_point == null then  | ||||
| 		    after_point = 0 | ||||
| 		else | ||||
| 		    after_point = (after_point.abs) | ||||
| 		end | ||||
| 		 | ||||
| 		if user_data isa Char then # is an operation | ||||
| 			var c = user_data | ||||
| 			if c == '.' then | ||||
| 				but_dot.sensitive= false | ||||
| 				context.switch_to_decimals | ||||
| 				lbl_disp.text = "{context.current.to_i}." | ||||
| 			else | ||||
| 				but_dot.sensitive= true | ||||
| 				context.push_op( c ) | ||||
| 				 | ||||
| 				var s = context.result.to_precision_native(6) | ||||
| 				var index : nullable Int = null | ||||
| 				for i in s.length.times do | ||||
| 				    var chiffre = s.chars[i] | ||||
| 				    if chiffre == '0' and index == null then | ||||
| 					index = i | ||||
| 				    else if chiffre != '0' then | ||||
| 					index = null | ||||
| 				    end | ||||
| 				end | ||||
| 				if index != null then | ||||
| 					s = s.substring(0, index) | ||||
| 					if s.chars[s.length-1] == ',' then s = s.substring(0, s.length-1) | ||||
| 				end | ||||
| 				lbl_disp.text = s | ||||
| 			end | ||||
| 		else if user_data isa Int then # is a number | ||||
| 			var n = user_data | ||||
| 			context.push_digit( n ) | ||||
| 			lbl_disp.text = context.current.to_precision_native(after_point) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	init | ||||
| 	do | ||||
| 		init_gtk | ||||
|  | ||||
| 		win = new GtkWindow( 0 ) | ||||
|  | ||||
| 		container = new GtkGrid(5,5,true) | ||||
| 		win.add( container ) | ||||
|  | ||||
| 		lbl_disp = new GtkLabel( "_" ) | ||||
| 		container.attach( lbl_disp, 0, 0, 5, 1 ) | ||||
|  | ||||
| 		# digits | ||||
| 		for n in [0..9] do | ||||
| 			var but = new GtkButton.with_label( n.to_s ) | ||||
| 			but.request_size( 64, 64 ) | ||||
| 			but.signal_connect( "clicked", self, n ) | ||||
| 			if n == 0 then | ||||
| 				container.attach( but, 0, 4, 1, 1 ) | ||||
| 			else container.attach( but, (n-1)%3, 3-(n-1)/3, 1, 1 ) | ||||
| 		end | ||||
|  | ||||
| 		# operators | ||||
| 		var r = 1 | ||||
| 		for op in ['+', '-', '*', '/' ] do | ||||
| 			var but = new GtkButton.with_label( op.to_s ) | ||||
| 			but.request_size( 64, 64 ) | ||||
| 			but.signal_connect( "clicked", self, op ) | ||||
| 			container.attach( but, 3, r, 1, 1 ) | ||||
| 			r+=1 | ||||
| 		end | ||||
|  | ||||
| 		# = | ||||
| 		but_eq = new GtkButton.with_label( "=" ) | ||||
| 		but_eq.request_size( 64, 64 ) | ||||
| 		but_eq.signal_connect( "clicked", self, '=' ) | ||||
| 		container.attach( but_eq, 4, 3, 1, 2 ) | ||||
|  | ||||
| 		# . | ||||
| 		but_dot = new GtkButton.with_label( "." ) | ||||
| 		but_dot.request_size( 64, 64 ) | ||||
| 		but_dot.signal_connect( "clicked", self, '.' ) | ||||
| 		container.attach( but_dot, 1, 4, 1, 1 ) | ||||
|  | ||||
| 		#C | ||||
| 		var but_c =  new GtkButton.with_label( "C" ) | ||||
| 		but_c.request_size( 64, 64 ) | ||||
| 		but_c.signal_connect("clicked", self, 'C') | ||||
| 		container.attach( but_c, 2, 4, 1, 1 ) | ||||
|  | ||||
| 		win.show_all | ||||
| 	end | ||||
| end | ||||
|  | ||||
| # context tests | ||||
| var context = new CalculatorContext | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 2 ) | ||||
| context.push_op( '+' ) | ||||
| context.push_digit( 3 ) | ||||
| context.push_op( '*' ) | ||||
| context.push_digit( 2 ) | ||||
| context.push_op( '=' ) | ||||
| var r = context.result.to_precision( 2 ) | ||||
| assert r == "30.00" else print r | ||||
|  | ||||
| context = new CalculatorContext | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 4 ) | ||||
| context.switch_to_decimals | ||||
| context.push_digit( 1 ) | ||||
| context.push_op( '*' ) | ||||
| context.push_digit( 3 ) | ||||
| context.push_op( '=' ) | ||||
| r = context.result.to_precision( 2 ) | ||||
| assert r == "42.30" else print r | ||||
|  | ||||
| context.push_op( '+' ) | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 1 ) | ||||
| context.push_op( '=' ) | ||||
| r = context.result.to_precision( 2 ) | ||||
| assert r == "53.30" else print r | ||||
|  | ||||
| context = new CalculatorContext | ||||
| context.push_digit( 4 ) | ||||
| context.push_digit( 2 ) | ||||
| context.switch_to_decimals | ||||
| context.push_digit( 3 ) | ||||
| context.push_op( '/' ) | ||||
| context.push_digit( 3 ) | ||||
| context.push_op( '=' ) | ||||
| r = context.result.to_precision( 2 ) | ||||
| assert r == "14.10" else print r | ||||
|  | ||||
| #test multiple decimals | ||||
| context = new CalculatorContext | ||||
| context.push_digit( 5 ) | ||||
| context.push_digit( 0 ) | ||||
| context.switch_to_decimals | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 2 ) | ||||
| context.push_digit( 3 ) | ||||
| context.push_op( '+' ) | ||||
| context.push_digit( 1 ) | ||||
| context.push_op( '=' ) | ||||
| r = context.result.to_precision( 3 ) | ||||
| assert r == "51.123" else print r | ||||
|  | ||||
| #test 'C' button | ||||
| context = new CalculatorContext | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 0 ) | ||||
| context.push_op( '+' ) | ||||
| context.push_digit( 1 ) | ||||
| context.push_digit( 0 ) | ||||
| context.push_op( '=' ) | ||||
| context.push_op( 'C' ) | ||||
| r = context.result.to_precision( 1 ) | ||||
| assert r == "0.0" else print r | ||||
|  | ||||
| # graphical application | ||||
|  | ||||
| if "NIT_TESTING".environ != "true" then | ||||
| 	var app = new CalculatorGui | ||||
| 	run_gtk | ||||
| end | ||||
							
								
								
									
										45
									
								
								samples/Nit/callback_chimpanze.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								samples/Nit/callback_chimpanze.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This sample has been implemented to show you how simple is it to play  | ||||
| # with native callbacks (C) through an high level with NIT program. | ||||
|  | ||||
| module callback_chimpanze | ||||
| import callback_monkey | ||||
|  | ||||
| class Chimpanze | ||||
| 	super MonkeyActionCallable | ||||
|  | ||||
| 	fun create | ||||
| 	do | ||||
| 		var monkey = new Monkey | ||||
| 		print "Hum, I'm sleeping ..." | ||||
| 		# Invoking method which will take some time to compute, and  | ||||
| 		# will be back in wokeUp method with information. | ||||
| 		# - Callback method defined in MonkeyActionCallable Interface | ||||
| 		monkey.wokeUpAction(self, "Hey, I'm awake.") | ||||
| 	end | ||||
|  | ||||
| 	# Inherit callback method, defined by MonkeyActionCallable interface | ||||
| 	# - Back of wokeUpAction method  | ||||
| 	redef fun wokeUp( sender:Monkey, message:Object ) | ||||
| 	do | ||||
| 		print message | ||||
| 	end | ||||
| end | ||||
|  | ||||
| var m = new Chimpanze | ||||
| m.create | ||||
							
								
								
									
										92
									
								
								samples/Nit/callback_monkey.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								samples/Nit/callback_monkey.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This sample has been implemented to show you how simple is it to play  | ||||
| # with native callbacks (C) through an high level with NIT program. | ||||
|  | ||||
| module callback_monkey | ||||
|  | ||||
| in "C header" `{ | ||||
| 	#include <stdio.h> | ||||
| 	#include <stdlib.h> | ||||
|  | ||||
| 	typedef struct {  | ||||
| 		int id; | ||||
| 		int age; | ||||
| 	} CMonkey; | ||||
|  | ||||
| 	typedef struct { | ||||
| 		MonkeyActionCallable toCall; | ||||
| 		Object message; | ||||
| 	} MonkeyAction; | ||||
| `} | ||||
|  | ||||
| in "C body" `{ | ||||
| 	// Method which reproduce a callback answer | ||||
| 	// Please note that a function pointer is only used to reproduce the callback | ||||
| 	void cbMonkey(CMonkey *mkey, void callbackFunc(CMonkey*, MonkeyAction*), MonkeyAction *data) | ||||
| 	{ | ||||
| 		sleep(2); | ||||
| 		callbackFunc( mkey, data ); | ||||
| 	} | ||||
|  | ||||
| 	// Back of background treatment, will be redirected to callback function | ||||
| 	void nit_monkey_callback_func( CMonkey *mkey, MonkeyAction *data ) | ||||
| 	{ | ||||
| 		// To call a your method, the signature must be written like this : | ||||
| 		// <Interface Name>_<Method>... | ||||
| 		MonkeyActionCallable_wokeUp( data->toCall, mkey, data->message ); | ||||
| 	} | ||||
| `} | ||||
|  | ||||
| # Implementable interface to get callback in defined methods | ||||
| interface MonkeyActionCallable | ||||
| 	fun wokeUp( sender:Monkey, message: Object) is abstract | ||||
| end | ||||
|  | ||||
| # Defining my object type Monkey, which is, in a low level, a pointer to a C struct (CMonkey) | ||||
| extern class Monkey `{ CMonkey * `} | ||||
| 	 | ||||
| 	new `{ | ||||
| 		CMonkey *monkey = malloc( sizeof(CMonkey) ); | ||||
| 		monkey->age = 10; | ||||
| 		monkey->id = 1; | ||||
| 		return monkey; | ||||
| 	`} | ||||
| 	 | ||||
| 	# Object method which will get a callback in wokeUp method, defined in MonkeyActionCallable interface | ||||
| 	# Must be defined as Nit/C method because of C call inside | ||||
| 	fun wokeUpAction( toCall: MonkeyActionCallable, message: Object ) is extern import MonkeyActionCallable.wokeUp `{ | ||||
|  | ||||
| 		// Allocating memory to keep reference of received parameters : | ||||
| 		// - Object receiver | ||||
| 		// - Message  | ||||
| 		MonkeyAction *data = malloc( sizeof(MonkeyAction) ); | ||||
|  | ||||
| 		// Incrementing reference counter to prevent from releasing | ||||
| 		MonkeyActionCallable_incr_ref( toCall ); | ||||
| 		Object_incr_ref( message ); | ||||
| 		 | ||||
| 		data->toCall = toCall; | ||||
| 		data->message = message; | ||||
| 		 | ||||
| 		// Calling method which reproduce a callback by passing : | ||||
| 		// - Receiver | ||||
| 		// - Function pointer to object return method | ||||
| 		// - Datas | ||||
| 		cbMonkey( recv, &nit_monkey_callback_func, data ); | ||||
| 	`} | ||||
| end | ||||
							
								
								
									
										167
									
								
								samples/Nit/circular_list.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								samples/Nit/circular_list.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Implementation of circular lists | ||||
| # This example shows the usage of generics and somewhat a specialisation of collections. | ||||
| module circular_list | ||||
|  | ||||
| # Sequences of elements implemented with a double-linked circular list | ||||
| class CircularList[E] | ||||
| 	# Like standard Array or LinkedList, CircularList is a Sequence. | ||||
| 	super Sequence[E] | ||||
|  | ||||
| 	# The first node of the list if any | ||||
| 	# The special case of an empty list is handled by a null node | ||||
| 	private var node: nullable CLNode[E] = null | ||||
|  | ||||
| 	redef fun iterator do return new CircularListIterator[E](self) | ||||
|  | ||||
| 	redef fun first do return self.node.item | ||||
|  | ||||
| 	redef fun push(e) | ||||
| 	do | ||||
| 		var new_node = new CLNode[E](e) | ||||
| 		var n = self.node | ||||
| 		if n == null then | ||||
| 			# the first node | ||||
| 			self.node = new_node | ||||
| 		else | ||||
| 			# not the first one, so attach nodes correctly. | ||||
| 			var old_last_node = n.prev | ||||
| 			new_node.next = n | ||||
| 			new_node.prev = old_last_node | ||||
| 			old_last_node.next = new_node | ||||
| 			n.prev = new_node | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	redef fun pop | ||||
| 	do | ||||
| 		var n = self.node | ||||
| 		assert n != null | ||||
| 		var prev = n.prev | ||||
| 		if prev == n then | ||||
| 			# the only node | ||||
| 			self.node = null | ||||
| 			return n.item | ||||
| 		end | ||||
| 		# not the only one do detach nodes correctly. | ||||
| 		var prev_prev = prev.prev | ||||
| 		n.prev = prev_prev | ||||
| 		prev_prev.next = n | ||||
| 		return prev.item | ||||
| 	end | ||||
|  | ||||
| 	redef fun unshift(e) | ||||
| 	do | ||||
| 		# Circularity has benefits. | ||||
| 		push(e) | ||||
| 		self.node = self.node.prev | ||||
| 	end | ||||
|  | ||||
| 	redef fun shift | ||||
| 	do | ||||
| 		# Circularity has benefits. | ||||
| 		self.node = self.node.next | ||||
| 		return self.pop | ||||
| 	end | ||||
|  | ||||
| 	# Move the first at the last position, the second at the first, etc. | ||||
| 	fun rotate | ||||
| 	do | ||||
| 		var n = self.node | ||||
| 		if n == null then return | ||||
| 		self.node = n.next | ||||
| 	end | ||||
|  | ||||
| 	# Sort the list using the Josephus algorithm. | ||||
| 	fun josephus(step: Int) | ||||
| 	do | ||||
| 		var res = new CircularList[E] | ||||
| 		while not self.is_empty do | ||||
| 			# count 'step' | ||||
| 			for i in [1..step[ do self.rotate | ||||
| 			# kill | ||||
| 			var x = self.shift | ||||
| 			res.add(x) | ||||
| 		end | ||||
| 		self.node = res.node | ||||
| 	end | ||||
| end | ||||
|  | ||||
| # Nodes of a CircularList | ||||
| private class CLNode[E] | ||||
| 	# The current item | ||||
| 	var item: E | ||||
|  | ||||
| 	# The next item in the circular list. | ||||
| 	# Because of circularity, there is always a next; | ||||
| 	# so by default let it be self | ||||
| 	var next: CLNode[E] = self | ||||
|  | ||||
| 	# The previous item in the circular list. | ||||
| 	# Coherence between next and previous nodes has to be maintained by the | ||||
| 	# circular list. | ||||
| 	var prev: CLNode[E] = self | ||||
| end | ||||
|  | ||||
| # An iterator of a CircularList. | ||||
| private class CircularListIterator[E] | ||||
| 	super IndexedIterator[E] | ||||
|  | ||||
| 	redef var index: Int | ||||
|  | ||||
| 	# The current node pointed. | ||||
| 	# Is null if the list is empty. | ||||
| 	var node: nullable CLNode[E] | ||||
|  | ||||
| 	# The list iterated. | ||||
| 	var list: CircularList[E] | ||||
|  | ||||
| 	redef fun is_ok | ||||
| 	do | ||||
| 		# Empty lists are not OK. | ||||
| 		# Pointing again the first node is not OK. | ||||
| 		return self.node != null and (self.index == 0 or self.node != self.list.node) | ||||
| 	end | ||||
|  | ||||
| 	redef fun next | ||||
| 	do | ||||
| 		self.node = self.node.next | ||||
| 		self.index += 1 | ||||
| 	end | ||||
|  | ||||
| 	redef fun item do return self.node.item | ||||
|  | ||||
| 	init(list: CircularList[E]) | ||||
| 	do | ||||
| 		self.node = list.node | ||||
| 		self.list = list | ||||
| 		self.index = 0 | ||||
| 	end | ||||
| end | ||||
|  | ||||
| var i = new CircularList[Int] | ||||
| i.add_all([1, 2, 3, 4, 5, 6, 7]) | ||||
| print i.first | ||||
| print i.join(":") | ||||
|  | ||||
| i.push(8) | ||||
| print i.shift | ||||
| print i.pop | ||||
| i.unshift(0) | ||||
| print i.join(":") | ||||
|  | ||||
| i.josephus(3) | ||||
| print i.join(":") | ||||
							
								
								
									
										78
									
								
								samples/Nit/clock.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								samples/Nit/clock.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This module provide a simple wall clock. | ||||
| # It is an example of getters and setters. | ||||
| # A beefed-up module is available in clock_more | ||||
| module clock | ||||
|  | ||||
| # A simple wall clock with 60 minutes and 12 hours. | ||||
| class Clock | ||||
| 	# total number of minutes from 0 to 719 | ||||
| 	var total_minutes: Int | ||||
| 	# Note: only the read acces is public, the write access is private. | ||||
|  | ||||
| 	# number of minutes in the current hour (from 0 to 59) | ||||
| 	fun minutes: Int do return self.total_minutes % 60 | ||||
| 	 | ||||
| 	# set the number of minutes in the current hour. | ||||
| 	# if m < 0 or m >= 60, the hour will be changed accordinlgy | ||||
| 	fun minutes=(m: Int) do self.total_minutes = self.hours * 60 + m | ||||
|  | ||||
| 	# number of hours (from 0 to 11) | ||||
| 	fun hours: Int do return self.total_minutes / 60 | ||||
|  | ||||
| 	# set the number of hours | ||||
| 	# the minutes will not be updated | ||||
| 	fun hours=(h: Int) do self.total_minutes = h * 60 + minutes | ||||
|  | ||||
| 	# the position of the hour arrow in the [0..60[ interval | ||||
| 	fun hour_pos: Int do return total_minutes / 12 | ||||
|  | ||||
| 	# replace the arrow of hours (from 0 to 59). | ||||
| 	# the hours and the minutes will be updated. | ||||
| 	fun hour_pos=(h: Int) do self.total_minutes = h * 12 | ||||
|  | ||||
| 	redef fun to_s do return "{hours}:{minutes}" | ||||
|  | ||||
| 	fun reset(hours, minutes: Int) do self.total_minutes = hours*60 + minutes | ||||
|  | ||||
| 	init(hours, minutes: Int) do self.reset(hours, minutes) | ||||
|  | ||||
| 	redef fun ==(o) | ||||
| 	do | ||||
| 		# Note: o is a nullable Object, a type test is required | ||||
| 		# Thanks to adaptive typing, there is no downcast | ||||
| 		# i.e. the code is safe! | ||||
| 		return o isa Clock and self.total_minutes == o.total_minutes | ||||
| 	end | ||||
| end | ||||
|  | ||||
| var c = new Clock(10,50) | ||||
| print "It's {c} o'clock." | ||||
|  | ||||
| c.minutes += 22 | ||||
| print "Now it's {c} o'clock." | ||||
|  | ||||
| print "The short arrow in on the {c.hour_pos/5} and the long arrow in on the {c.minutes/5}." | ||||
|  | ||||
| c.hours -= 2 | ||||
| print "Now it's {c} o'clock." | ||||
|  | ||||
| var c2 = new Clock(9, 11) | ||||
| print "It's {c2} on the second clock." | ||||
| print "The two clocks are synchronized: {c == c2}." | ||||
| c2.minutes += 1 | ||||
| print "It's now {c2} on the second clock." | ||||
| print "The two clocks are synchronized: {c == c2}." | ||||
							
								
								
									
										60
									
								
								samples/Nit/clock_more.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								samples/Nit/clock_more.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This module beef up the clock module by allowing a clock to be comparable. | ||||
| # It show the usage of class refinement | ||||
| module clock_more | ||||
|  | ||||
| import clock | ||||
|  | ||||
| redef class Clock | ||||
| 	# Clock are now comparable | ||||
| 	super Comparable | ||||
|  | ||||
| 	# Comparaison of a clock make only sense with an other clock | ||||
| 	redef type OTHER: Clock | ||||
|  | ||||
| 	redef fun <(o) | ||||
| 	do | ||||
| 		# Note: < is the only abstract method of Comparable. | ||||
| 		#       All other operators and methods rely on < and ==. | ||||
| 		return self.total_minutes < o.total_minutes | ||||
| 	end | ||||
| end | ||||
|  | ||||
| var c1 = new Clock(8, 12) | ||||
| var c2 = new Clock(8, 13) | ||||
| var c3 = new Clock(9, 13) | ||||
|  | ||||
| print "{c1}<{c2}? {c1<c2}" | ||||
| print "{c1}<={c2}? {c1<=c2}" | ||||
| print "{c1}>{c2}? {c1>c2}" | ||||
| print "{c1}>={c2}? {c1>=c2}" | ||||
| print "{c1}<=>{c2}? {c1<=>c2}" | ||||
| print "{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}" | ||||
| print "{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}" | ||||
| print "{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}" | ||||
|  | ||||
| print "-" | ||||
|  | ||||
| c1.minutes += 1 | ||||
|  | ||||
| print "{c1}<{c2}? {c1<c2}" | ||||
| print "{c1}<={c2}? {c1<=c2}" | ||||
| print "{c1}>{c2}? {c1>c2}" | ||||
| print "{c1}>={c2}? {c1>=c2}" | ||||
| print "{c1}<=>{c2}? {c1<=>c2}" | ||||
| print "{c1},{c2}? max={c1.max(c2)} min={c1.min(c2)}" | ||||
| print "{c1}.is_between({c2}, {c3})? {c1.is_between(c2, c3)}" | ||||
| print "{c2}.is_between({c1}, {c3})? {c2.is_between(c1, c3)}" | ||||
							
								
								
									
										113
									
								
								samples/Nit/curl_http.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								samples/Nit/curl_http.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Sample of the Curl module. | ||||
| module curl_http | ||||
|  | ||||
| import curl | ||||
|  | ||||
| # Small class to represent an Http Fetcher | ||||
| class MyHttpFetcher | ||||
| 	super CurlCallbacks | ||||
|  | ||||
| 	var curl: Curl | ||||
| 	var our_body: String = "" | ||||
|  | ||||
| 	init(curl: Curl) do self.curl = curl | ||||
|  | ||||
| 	# Release curl object | ||||
| 	fun destroy do self.curl.destroy | ||||
|  | ||||
| 	# Header callback | ||||
| 	redef fun header_callback(line: String) do | ||||
| 		# We keep this callback silent for testing purposes | ||||
| 		#if not line.has_prefix("Date:") then print "Header_callback : {line}" | ||||
| 	end | ||||
|  | ||||
| 	# Body callback | ||||
| 	redef fun body_callback(line: String) do self.our_body = "{self.our_body}{line}" | ||||
|  | ||||
| 	# Stream callback - Cf : No one is registered | ||||
| 	redef fun stream_callback(buffer: String, size: Int, count: Int) do print "Stream_callback : {buffer} - {size} - {count}" | ||||
| end | ||||
|  | ||||
|  | ||||
| # Program | ||||
| if args.length < 2 then | ||||
| 	print "Usage: curl_http <method wished [POST, GET, GET_FILE]> <target url>" | ||||
| else | ||||
| 	var curl = new Curl | ||||
| 	var url = args[1] | ||||
| 	var request = new CurlHTTPRequest(url, curl) | ||||
|  | ||||
| 	# HTTP Get Request | ||||
| 	if args[0] == "GET" then | ||||
| 		request.verbose = false | ||||
| 		var getResponse = request.execute | ||||
|  | ||||
| 		if getResponse isa CurlResponseSuccess then | ||||
| 			print "Status code : {getResponse.status_code}" | ||||
| 			print "Body : {getResponse.body_str}" | ||||
| 		else if getResponse isa CurlResponseFailed then | ||||
| 			print "Error code : {getResponse.error_code}" | ||||
| 			print "Error msg : {getResponse.error_msg}" | ||||
| 		end | ||||
|  | ||||
| 	# HTTP Post Request | ||||
| 	else if args[0] == "POST" then | ||||
| 		var myHttpFetcher = new MyHttpFetcher(curl) | ||||
| 		request.delegate = myHttpFetcher | ||||
|  | ||||
| 		var postDatas = new HeaderMap | ||||
| 		postDatas["Bugs Bunny"] = "Daffy Duck" | ||||
| 		postDatas["Batman"] = "Robin likes special characters @#ùà!è§'(\"é&://,;<>∞~*" | ||||
| 		postDatas["Batman"] = "Yes you can set multiple identical keys, but APACHE will consider only once, the last one" | ||||
| 		request.datas = postDatas | ||||
| 		request.verbose = false | ||||
| 		var postResponse = request.execute | ||||
|  | ||||
| 		print "Our body from the callback : {myHttpFetcher.our_body}" | ||||
|  | ||||
| 		if postResponse isa CurlResponseSuccess then | ||||
| 			print "*** Answer ***" | ||||
| 			print "Status code : {postResponse.status_code}" | ||||
| 			print "Body should be empty, because we decided to manage callbacks : {postResponse.body_str.length}" | ||||
| 		else if postResponse isa CurlResponseFailed then | ||||
| 			print "Error code : {postResponse.error_code}" | ||||
| 			print "Error msg : {postResponse.error_msg}" | ||||
| 		end | ||||
|  | ||||
| 	# HTTP Get to file Request | ||||
| 	else if args[0] == "GET_FILE" then | ||||
| 		var headers = new HeaderMap | ||||
| 		headers["Accept"] = "Moo" | ||||
| 		request.headers = headers | ||||
| 		request.verbose = false | ||||
| 		var downloadResponse = request.download_to_file(null) | ||||
|  | ||||
| 		if downloadResponse isa CurlFileResponseSuccess then | ||||
| 			print "*** Answer ***" | ||||
| 			print "Status code : {downloadResponse.status_code}" | ||||
| 			print "Size downloaded : {downloadResponse.size_download}" | ||||
| 		else if downloadResponse isa CurlResponseFailed then | ||||
| 			print "Error code : {downloadResponse.error_code}" | ||||
| 			print "Error msg : {downloadResponse.error_msg}" | ||||
| 		end | ||||
| 	# Program logic | ||||
| 	else | ||||
| 		print "Usage : Method[POST, GET, GET_FILE]" | ||||
| 	end | ||||
| end | ||||
							
								
								
									
										59
									
								
								samples/Nit/curl_mail.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/Nit/curl_mail.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Mail sender sample using the Curl module | ||||
| module curl_mail | ||||
|  | ||||
| import curl | ||||
|  | ||||
| var curl = new Curl | ||||
| var mail_request = new CurlMailRequest(curl) | ||||
|  | ||||
| # Networks | ||||
| var response = mail_request.set_outgoing_server("smtps://smtp.example.org:465", "user@example.org", "mypassword") | ||||
| if response isa CurlResponseFailed then | ||||
| 	print "Error code : {response.error_code}" | ||||
| 	print "Error msg : {response.error_msg}" | ||||
| end | ||||
|  | ||||
| # Headers | ||||
| mail_request.from = "Billy Bob" | ||||
| mail_request.to = ["user@example.org"] | ||||
| mail_request.cc = ["bob@example.org"] | ||||
| mail_request.bcc = null | ||||
|  | ||||
| var headers_body = new HeaderMap | ||||
| headers_body["Content-Type:"] = "text/html; charset=\"UTF-8\"" | ||||
| headers_body["Content-Transfer-Encoding:"] = "quoted-printable" | ||||
| mail_request.headers_body = headers_body | ||||
|  | ||||
| # Content | ||||
| mail_request.body = "<h1>Here you can write HTML stuff.</h1>" | ||||
| mail_request.subject = "Hello From My Nit Program" | ||||
|  | ||||
| # Others | ||||
| mail_request.verbose = false | ||||
|  | ||||
| # Send mail | ||||
| response = mail_request.execute | ||||
| if response isa CurlResponseFailed then | ||||
| 	print "Error code : {response.error_code}" | ||||
| 	print "Error msg : {response.error_msg}" | ||||
| else if response isa CurlMailResponseSuccess then | ||||
| 	print "Mail Sent" | ||||
| else | ||||
| 	print "Unknown Curl Response type" | ||||
| end | ||||
							
								
								
									
										243
									
								
								samples/Nit/draw_operation.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								samples/Nit/draw_operation.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,243 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Draws an arithmetic operation to the terminal | ||||
| module draw_operation | ||||
|  | ||||
| redef enum Int | ||||
| 	fun n_chars: Int `{ | ||||
| 		int c; | ||||
| 		if ( abs(recv) >= 10 ) | ||||
| 			c = 1+(int)log10f( (float)abs(recv) ); | ||||
| 		else | ||||
| 			c = 1; | ||||
| 		if ( recv < 0 ) c ++; | ||||
| 		return c; | ||||
| 	`} | ||||
| end | ||||
|  | ||||
| redef enum Char | ||||
| 	fun as_operator(a, b: Int): Int | ||||
| 	do | ||||
| 		if self == '+' then return a + b | ||||
| 		if self == '-' then return a - b | ||||
| 		if self == '*' then return a * b | ||||
| 		if self == '/' then return a / b | ||||
| 		if self == '%' then return a % b | ||||
| 		abort | ||||
| 	end | ||||
|  | ||||
| 	fun override_dispc: Bool | ||||
| 	do | ||||
| 		return self == '+' or self == '-' or self == '*' or self == '/' or self == '%' | ||||
| 	end | ||||
|  | ||||
| 	fun lines(s: Int): Array[Line] | ||||
| 	do | ||||
| 		if self == '+' then | ||||
| 			return [new Line(new P(0,s/2),1,0,s), new Line(new P(s/2,1),0,1,s-2)] | ||||
| 		else if self == '-' then | ||||
| 			return [new Line(new P(0,s/2),1,0,s)] | ||||
| 		else if self == '*' then | ||||
| 			var lines = new Array[Line] | ||||
| 			for y in [1..s-1[ do | ||||
| 				lines.add( new Line(new P(1,y), 1,0,s-2) ) | ||||
| 			end | ||||
| 			return lines | ||||
| 		else if self == '/' then | ||||
| 			return [new Line(new P(s-1,0), -1,1, s )] | ||||
| 		else if self == '%' then | ||||
| 			var q4 = s/4 | ||||
| 			var lines = [new Line(new P(s-1,0),-1,1,s)] | ||||
| 			for l in [0..q4[ do | ||||
| 				lines.append([ new Line( new P(0,l), 1,0,q4), new Line( new P(s-1,s-1-l), -1,0,q4) ]) | ||||
| 			end | ||||
| 			return lines | ||||
| 		else if self == '1' then | ||||
| 			return [new Line(new P(s/2,0), 0,1,s),new Line(new P(0,s-1),1,0,s), | ||||
| 				new Line( new P(s/2,0),-1,1,s/2)] | ||||
| 		else if self == '2' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s/2), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 0,1,s/2), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '3' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '4' then | ||||
| 			return [new Line(new P(s-1,0),0,1,s), new Line( new P(0,0), 0,1,s/2), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '5' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '6' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,s/2),0,1,s/2), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '7' then | ||||
| 			var tl = new P(0,0) | ||||
| 			var tr = new P(s-1,0) | ||||
| 			return [new Line(tl, 1,0,s), new Line(tr,-1,1,s)] | ||||
| 		else if self == '8' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '9' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s/2), | ||||
| 				new Line( new P(0,s/2), 1,0,s)] | ||||
| 		else if self == '0' then | ||||
| 			return [new Line(new P(0,0), 1,0,s),new Line(new P(s-1,0),0,1,s), | ||||
| 				new Line( new P(0,s-1),1,0,s), new Line( new P(0,0), 0,1,s)] | ||||
| 		end | ||||
| 		return new Array[Line] | ||||
| 	end | ||||
| end | ||||
|  | ||||
| class P | ||||
| 	var x : Int | ||||
| 	var y : Int | ||||
| end | ||||
|  | ||||
| redef class String | ||||
| 	# hack is to support a bug in the evaluation software | ||||
| 	fun draw(dispc: Char, size, gap: Int, hack: Bool) | ||||
| 	do | ||||
| 		var w = size * length +(length-1)*gap | ||||
| 		var h = size | ||||
| 		var map = new Array[Array[Char]] | ||||
| 		for x in [0..w[ do | ||||
| 			map[x] = new Array[Char].filled_with( ' ',  h ) | ||||
| 		end | ||||
|  | ||||
| 		var ci = 0 | ||||
| 		for c in self.chars do | ||||
| 			var local_dispc | ||||
| 			if c.override_dispc then | ||||
| 				local_dispc = c | ||||
| 			else | ||||
| 				local_dispc = dispc | ||||
| 			end | ||||
|  | ||||
| 			var lines = c.lines( size ) | ||||
| 			for line in lines do | ||||
| 				var x = line.o.x+ci*size | ||||
| 					x += ci*gap | ||||
| 				var y = line.o.y | ||||
| 				for s in [0..line.len[ do | ||||
| 					assert map.length > x and map[x].length > y else print "setting {x},{y} as {local_dispc}" | ||||
| 					map[x][y] = local_dispc | ||||
| 					x += line.step_x | ||||
| 					y += line.step_y | ||||
| 				end | ||||
| 			end | ||||
|  | ||||
| 			ci += 1 | ||||
| 		end | ||||
|  | ||||
| 		if hack then | ||||
| 			for c in [0..size[ do | ||||
| 				map[c][0] = map[map.length-size+c][0] | ||||
| 				map[map.length-size+c][0] = ' ' | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		for y in [0..h[ do | ||||
| 			for x in [0..w[ do | ||||
| 				printn map[x][y] | ||||
| 			end | ||||
| 			print "" | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| class Line | ||||
| 	var o : P | ||||
| 	var step_x : Int | ||||
| 	var step_y : Int | ||||
| 	var len : Int | ||||
| end | ||||
|  | ||||
| var a | ||||
| var b | ||||
| var op_char | ||||
| var disp_char | ||||
| var disp_size | ||||
| var disp_gap | ||||
|  | ||||
| if "NIT_TESTING".environ == "true" then | ||||
| 	a = 567 | ||||
| 	b = 13 | ||||
| 	op_char = '*' | ||||
| 	disp_char = 'O' | ||||
| 	disp_size = 8 | ||||
| 	disp_gap = 1 | ||||
| else | ||||
| 	printn "Left operand: " | ||||
| 	a = gets.to_i | ||||
|  | ||||
| 	printn "Right operand: " | ||||
| 	b = gets.to_i | ||||
|  | ||||
| 	printn "Operator (+, -, *, /, %): " | ||||
| 	op_char = gets.chars[0] | ||||
|  | ||||
| 	printn "Char to display: " | ||||
| 	disp_char = gets.chars[0] | ||||
|  | ||||
| 	printn "Size of text: " | ||||
| 	disp_size = gets.to_i | ||||
|  | ||||
| 	printn "Space between digits: " | ||||
| 	disp_gap = gets.to_i | ||||
| end | ||||
|  | ||||
| var result = op_char.as_operator( a, b ) | ||||
|  | ||||
| var len_a = a.n_chars | ||||
| var len_b = b.n_chars | ||||
| var len_res = result.n_chars | ||||
| var max_len = len_a.max( len_b.max( len_res ) ) + 1 | ||||
|  | ||||
| # draw first line | ||||
| var d = max_len - len_a | ||||
| var line_a = "" | ||||
| for i in [0..d[ do line_a += " " | ||||
| line_a += a.to_s | ||||
| line_a.draw( disp_char, disp_size, disp_gap, false ) | ||||
|  | ||||
| print "" | ||||
| # draw second line | ||||
| d = max_len - len_b-1 | ||||
| var line_b = op_char.to_s | ||||
| for i in [0..d[ do line_b += " " | ||||
| line_b += b.to_s | ||||
| line_b.draw( disp_char, disp_size, disp_gap, false ) | ||||
|  | ||||
| # draw ----- | ||||
| print "" | ||||
| for i in [0..disp_size*max_len+(max_len-1)*disp_gap] do | ||||
| 	printn "_" | ||||
| end | ||||
| print "" | ||||
| print "" | ||||
|  | ||||
| # draw result | ||||
| d = max_len - len_res | ||||
| var line_res = "" | ||||
| for i in [0..d[ do line_res += " " | ||||
| line_res += result.to_s | ||||
| line_res.draw( disp_char, disp_size, disp_gap, false ) | ||||
							
								
								
									
										46
									
								
								samples/Nit/drop_privileges.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Nit/drop_privileges.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Example using the privileges module to drop privileges from root | ||||
| module drop_privileges | ||||
|  | ||||
| import privileges | ||||
|  | ||||
| # basic command line options | ||||
| var opts = new OptionContext | ||||
| var opt_ug = new OptionUserAndGroup.for_dropping_privileges | ||||
| opt_ug.mandatory = true | ||||
| opts.add_option(opt_ug) | ||||
|  | ||||
| # parse and check command line options | ||||
| opts.parse(args) | ||||
| if not opts.errors.is_empty then | ||||
| 	print opts.errors | ||||
| 	print "Usage: drop_privileges [options]" | ||||
| 	opts.usage | ||||
| 	exit 1 | ||||
| end | ||||
|  | ||||
| # original user | ||||
| print "before {sys.uid}:{sys.gid}" | ||||
|  | ||||
| # make the switch | ||||
| var user_group = opt_ug.value | ||||
| assert user_group != null | ||||
| user_group.drop_privileges | ||||
|  | ||||
| # final user | ||||
| print "after {sys.uid}:{sys.egid}" | ||||
							
								
								
									
										69
									
								
								samples/Nit/extern_methods.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								samples/Nit/extern_methods.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # This module illustrates some uses of the FFI, specifically | ||||
| # how to use extern methods. Which means to implement a Nit method in C. | ||||
| module extern_methods | ||||
|  | ||||
| redef enum Int | ||||
| 	# Returns self'th fibonnaci number | ||||
| 	# implemented here in C for optimization purposes | ||||
| 	fun fib : Int import fib `{ | ||||
| 		if ( recv < 2 ) | ||||
| 			return recv; | ||||
| 		else | ||||
| 			return Int_fib( recv-1 ) + Int_fib( recv-2 ); | ||||
| 	`} | ||||
|  | ||||
| 	# System call to sleep for "self" seconds | ||||
| 	fun sleep `{ | ||||
| 		sleep( recv ); | ||||
| 	`} | ||||
|  | ||||
| 	# Return atan2l( self, x ) from libmath | ||||
| 	fun atan_with( x : Int ) : Float `{ | ||||
| 		return atan2( recv, x ); | ||||
| 	`} | ||||
|  | ||||
| 	# This method callback to Nit methods from C code | ||||
| 	# It will use from C code: | ||||
| 	# * the local fib method | ||||
| 	# * the + operator, a method of Int | ||||
| 	# * to_s, a method of all objects | ||||
| 	# * String.to_cstring, a method of String to return an equivalent char* | ||||
| 	fun foo import fib, +, to_s, String.to_cstring `{ | ||||
| 		long recv_fib = Int_fib( recv ); | ||||
| 		long recv_plus_fib = Int__plus( recv, recv_fib ); | ||||
|  | ||||
| 		String nit_string = Int_to_s( recv_plus_fib ); | ||||
| 		char *c_string = String_to_cstring( nit_string ); | ||||
|  | ||||
| 		printf( "from C: self + fib(self) = %s\n", c_string ); | ||||
| 	`} | ||||
|  | ||||
| 	# Equivalent to foo but written in pure Nit | ||||
| 	fun bar do print "from Nit: self + fib(self) = {self+self.fib}" | ||||
| end | ||||
|  | ||||
| print 12.fib | ||||
|  | ||||
| print "sleeping 1 second..." | ||||
| 1.sleep | ||||
|  | ||||
| print 100.atan_with( 200 ) | ||||
| 8.foo | ||||
| 8.bar | ||||
|  | ||||
							
								
								
									
										43
									
								
								samples/Nit/fibonacci.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/Nit/fibonacci.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # A simple exemple of refinement where a method is added to the integer class. | ||||
| module fibonacci | ||||
|  | ||||
| redef class Int | ||||
| 	# Calculate the self-th element of the fibonacci sequence. | ||||
| 	fun fibonacci: Int | ||||
| 	do | ||||
| 		if self < 2 then | ||||
| 			return 1 | ||||
| 		else | ||||
| 			return (self-2).fibonacci + (self-1).fibonacci | ||||
| 		end | ||||
| 	end  | ||||
| end | ||||
|  | ||||
| # Print usage and exit. | ||||
| fun usage | ||||
| do | ||||
| 	print "Usage: fibonnaci <integer>"  | ||||
| 	exit 0  | ||||
| end | ||||
|  | ||||
| # Main part | ||||
| if args.length != 1 then | ||||
| 	usage | ||||
| end | ||||
| print args.first.to_i.fibonacci | ||||
							
								
								
									
										1
									
								
								samples/Nit/hello_world.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Nit/hello_world.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| print "hello world" | ||||
							
								
								
									
										105
									
								
								samples/Nit/html_page.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								samples/Nit/html_page.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| import html | ||||
|  | ||||
| class NitHomepage | ||||
| 	super HTMLPage | ||||
|  | ||||
| 	redef fun head do | ||||
| 		add("meta").attr("charset", "utf-8") | ||||
| 		add("title").text("Nit") | ||||
| 		add("link").attr("rel", "icon").attr("href", "http://nitlanguage.org/favicon.ico").attr("type", "image/x-icon") | ||||
| 		add("link").attr("rel", "stylesheet").attr("href", "http://nitlanguage.org/style.css").attr("type", "text/css") | ||||
| 		add("link").attr("rel", "stylesheet").attr("href", "http://nitlanguage.org/local.css").attr("type", "text/css") | ||||
| 	end | ||||
|  | ||||
| 	redef fun body do | ||||
| 		open("article").add_class("page") | ||||
| 			open("section").add_class("pageheader") | ||||
| 				add_html("<a id='toptitle_first' class='toptitle'>the</a><a id='toptitle_second' class='toptitle' href=''>Nit</a><a id='toptitle_third' class='toptitle' href=''>Programming Language</a>") | ||||
| 				open("header").add_class("header") | ||||
| 					open("div").add_class("topsubtitle") | ||||
| 						add("p").text("A Fun Language for Serious Programming") | ||||
| 					close("div") | ||||
| 				close("header") | ||||
| 			close("section") | ||||
|  | ||||
| 			open("div").attr("id", "pagebody") | ||||
| 				open("section").attr("id", "content") | ||||
| 					add("h1").text("# What is Nit?") | ||||
| 					add("p").text("Nit is an object-oriented programming language. The goal of Nit is to propose a robust statically typed programming language where structure is not a pain.") | ||||
| 					add("p").text("So, what does the famous hello world program look like, in Nit?") | ||||
| 					add_html("<pre><tt><span class='normal'>print </span><span class='string'>'Hello, World!'</span></tt></pre>") | ||||
|  | ||||
| 					add("h1").text("# Feature Highlights") | ||||
| 					add("h2").text("Usability") | ||||
| 					add("p").text("Nit's goal is to be usable by real programmers for real projects") | ||||
|  | ||||
| 					open("ul") | ||||
| 						open("li") | ||||
| 						add("a").attr("href", "http://en.wikipedia.org/wiki/KISS_principle").text("KISS principle") | ||||
| 						close("li") | ||||
| 						add("li").text("Script-like language without verbosity nor cryptic statements") | ||||
| 						add("li").text("Painless static types: static typing should help programmers") | ||||
| 						add("li").text("Efficient development, efficient execution, efficient evolution.") | ||||
| 					close("ul") | ||||
|  | ||||
| 					add("h2").text("Robustness") | ||||
| 					add("p").text("Nit will help you to write bug-free programs") | ||||
|  | ||||
| 					open("ul") | ||||
| 						add("li").text("Strong static typing") | ||||
| 						add("li").text("No more NullPointerException") | ||||
| 					close("ul") | ||||
|  | ||||
| 					add("h2").text("Object-Oriented") | ||||
| 					add("p").text("Nit's guideline is to follow the most powerful OO principles") | ||||
|  | ||||
| 					open("ul") | ||||
| 						open("li") | ||||
| 						add("a").attr("href", "./everything_is_an_object/").text("Everything is an object") | ||||
| 						close("li") | ||||
| 						open("li") | ||||
| 						add("a").attr("href", "./multiple_inheritance/").text("Multiple inheritance") | ||||
| 						close("li") | ||||
| 						open("li") | ||||
| 						add("a").attr("href", "./refinement/").text("Open classes") | ||||
| 						close("li") | ||||
| 						open("li") | ||||
| 						add("a").attr("href", "./virtual_types/").text("Virtual types") | ||||
| 						close("li") | ||||
| 					close("ul") | ||||
|  | ||||
|  | ||||
| 					add("h1").text("# Getting Started") | ||||
| 					add("p").text("Get Nit from its Git repository:") | ||||
|  | ||||
| 					add_html("<pre><code>$ git clone http://nitlanguage.org/nit.git</code></pre>") | ||||
| 					add("p").text("Build the compiler (may be long):") | ||||
| 					add_html("<pre><code>$ cd nit\n") | ||||
| 					add_html("$ make</code></pre>") | ||||
| 					add("p").text("Compile a program:") | ||||
| 					add_html("<pre><code>$ bin/nitc examples/hello_world.nit</code></pre>") | ||||
| 					add("p").text("Execute the program:") | ||||
| 					add_html("<pre><code>$ ./hello_world</code></pre>") | ||||
| 				close("section") | ||||
| 			close("div") | ||||
| 		close("article") | ||||
| 	end | ||||
| end | ||||
|  | ||||
| var page = new NitHomepage | ||||
| page.write_to stdout | ||||
| page.write_to_file("nit.html") | ||||
							
								
								
									
										100
									
								
								samples/Nit/int_stack.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								samples/Nit/int_stack.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # An example that defines and uses stacks of integers. | ||||
| # The implementation is done with a simple linked list. | ||||
| # It features: free constructors, nullable types and some adaptive typing. | ||||
| module int_stack | ||||
|  | ||||
| # A stack of integer implemented by a simple linked list. | ||||
| # Note that this is only a toy class since a real linked list will gain to use | ||||
| # generics and extends interfaces, like Collection, from the standard library. | ||||
| class IntStack | ||||
| 	# The head node of the list. | ||||
| 	# Null means that the stack is empty. | ||||
| 	private var head: nullable ISNode = null | ||||
|  | ||||
| 	# Add a new integer in the stack. | ||||
| 	fun push(val: Int) | ||||
| 	do | ||||
| 		self.head = new ISNode(val, self.head) | ||||
| 	end | ||||
|  | ||||
| 	# Remove and return the last pushed integer. | ||||
| 	# Return null if the stack is empty. | ||||
| 	fun pop: nullable Int | ||||
| 	do | ||||
| 		var head = self.head | ||||
| 		if head == null then return null | ||||
| 		# Note: the followings are statically safe because of the | ||||
| 		# previous 'if'. | ||||
| 		var val = head.val | ||||
| 		self.head = head.next | ||||
| 		return val | ||||
| 	end | ||||
|  | ||||
| 	# Return the sum of all integers of the stack. | ||||
| 	# Return 0 if the stack is empty. | ||||
| 	fun sumall: Int | ||||
| 	do | ||||
| 		var sum = 0 | ||||
| 		var cur = self.head | ||||
| 		while cur != null do | ||||
| 			# Note: the followings are statically safe because of | ||||
| 			# the condition of the 'while'. | ||||
| 			sum += cur.val | ||||
| 			cur = cur.next | ||||
| 		end | ||||
| 		return sum | ||||
| 	end | ||||
|  | ||||
| 	# Note: Because all attributes have a default value, a free constructor | ||||
| 	# "init()" is implicitly defined. | ||||
| end | ||||
|  | ||||
| # A node of a IntStack | ||||
| private class ISNode | ||||
| 	# The integer value stored in the node. | ||||
| 	var val: Int | ||||
|  | ||||
| 	# The next node, if any. | ||||
| 	var next: nullable ISNode | ||||
|  | ||||
| 	# Note: A free constructor "init(val: Int, next: nullable ISNode)" is | ||||
| 	# implicitly defined. | ||||
| end | ||||
|  | ||||
| var l = new IntStack | ||||
| l.push(1) | ||||
| l.push(2) | ||||
| l.push(3) | ||||
|  | ||||
| print l.sumall | ||||
|  | ||||
| # Note: the 'for' control structure cannot be used on IntStack in its current state. | ||||
| # It requires a more advanced topic. | ||||
| # However, why not using the 'loop' control structure? | ||||
| loop | ||||
| 	var i = l.pop | ||||
| 	if i == null then break | ||||
| 	# The following is statically safe because of the previous 'if'. | ||||
| 	print i * 10 | ||||
| end | ||||
|  | ||||
| # Note: 'or else' is used to give an alternative of a null expression. | ||||
| l.push(5) | ||||
| print l.pop or else 0 # l.pop gives 5, so print 5 | ||||
| print l.pop or else 0 # l.pop gives null, so print the alternative: 0 | ||||
|  | ||||
|  | ||||
							
								
								
									
										193
									
								
								samples/Nit/opengles2_hello_triangle.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								samples/Nit/opengles2_hello_triangle.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Basic example of OpenGL ES 2.0 usage from the book OpenGL ES 2.0 Programming Guide. | ||||
| # | ||||
| # Code reference: | ||||
| # https://code.google.com/p/opengles-book-samples/source/browse/trunk/LinuxX11/Chapter_2/Hello_Triangle/Hello_Triangle.c  | ||||
| module opengles2_hello_triangle | ||||
|  | ||||
| import glesv2 | ||||
| import egl | ||||
| import mnit_linux # for sdl | ||||
| import x11 | ||||
|  | ||||
| if "NIT_TESTING".environ == "true" then exit(0) | ||||
|  | ||||
| var window_width = 800 | ||||
| var window_height = 600 | ||||
|  | ||||
| # | ||||
| ## SDL | ||||
| # | ||||
| var sdl_display = new SDLDisplay(window_width, window_height) | ||||
| var sdl_wm_info = new SDLSystemWindowManagerInfo | ||||
| var x11_window_handle = sdl_wm_info.x11_window_handle | ||||
|  | ||||
| # | ||||
| ## X11 | ||||
| # | ||||
| var x_display = x_open_default_display | ||||
| assert x_display != 0 else print "x11 fail" | ||||
|  | ||||
| # | ||||
| ## EGL | ||||
| # | ||||
| var egl_display = new EGLDisplay(x_display) | ||||
| assert egl_display.is_valid else print "EGL display is not valid" | ||||
| egl_display.initialize | ||||
|  | ||||
| print "EGL version: {egl_display.version}" | ||||
| print "EGL vendor: {egl_display.vendor}" | ||||
| print "EGL extensions: {egl_display.extensions.join(", ")}" | ||||
| print "EGL client APIs: {egl_display.client_apis.join(", ")}" | ||||
|  | ||||
| assert egl_display.is_valid else print egl_display.error | ||||
|  | ||||
| var config_chooser = new EGLConfigChooser | ||||
| #config_chooser.surface_type_egl | ||||
| config_chooser.blue_size = 8 | ||||
| config_chooser.green_size = 8 | ||||
| config_chooser.red_size = 8 | ||||
| #config_chooser.alpha_size = 8 | ||||
| #config_chooser.depth_size = 8 | ||||
| #config_chooser.stencil_size = 8 | ||||
| #config_chooser.sample_buffers = 1 | ||||
| config_chooser.close | ||||
|  | ||||
| var configs = config_chooser.choose(egl_display) | ||||
| assert configs != null else print "choosing config failed: {egl_display.error}" | ||||
| assert not configs.is_empty else print "no EGL config" | ||||
|  | ||||
| print "{configs.length} EGL configs available" | ||||
| for config in configs do | ||||
| 	var attribs = config.attribs(egl_display) | ||||
| 	print "* caveats: {attribs.caveat}" | ||||
| 	print "  conformant to: {attribs.conformant}" | ||||
| 	print "  size of RGBA: {attribs.red_size} {attribs.green_size} {attribs.blue_size} {attribs.alpha_size}" | ||||
| 	print "  buffer, depth, stencil: {attribs.buffer_size} {attribs.depth_size} {attribs.stencil_size}" | ||||
| end | ||||
|  | ||||
| var config = configs.first | ||||
|  | ||||
| var format = config.attribs(egl_display).native_visual_id | ||||
|  | ||||
| # TODO android part | ||||
| # Opengles1Display_midway_init(recv, format); | ||||
|  | ||||
| var surface = egl_display.create_window_surface(config, x11_window_handle, [0]) | ||||
| assert surface.is_ok else print egl_display.error | ||||
|  | ||||
| var context = egl_display.create_context(config) | ||||
| assert context.is_ok else print egl_display.error | ||||
|  | ||||
| var make_current_res = egl_display.make_current(surface, surface, context) | ||||
| assert make_current_res | ||||
|  | ||||
| var width = surface.attribs(egl_display).width | ||||
| var height = surface.attribs(egl_display).height | ||||
| print "Width: {width}" | ||||
| print "Height: {height}" | ||||
|  | ||||
| assert egl_bind_opengl_es_api else print "eglBingAPI failed: {egl_display.error}" | ||||
|  | ||||
| # | ||||
| ## GLESv2 | ||||
| # | ||||
|  | ||||
| print "Can compile shaders? {gl_shader_compiler}" | ||||
| assert_no_gl_error | ||||
|  | ||||
| assert gl_shader_compiler else print "Cannot compile shaders" | ||||
|  | ||||
| # gl program | ||||
| print gl_error.to_s | ||||
| var program = new GLProgram | ||||
| if not program.is_ok then | ||||
| 	print "Program is not ok: {gl_error.to_s}\nLog:" | ||||
| 	print program.info_log | ||||
| 	abort | ||||
| end | ||||
| assert_no_gl_error | ||||
|  | ||||
| # vertex shader | ||||
| var vertex_shader = new GLVertexShader | ||||
| assert vertex_shader.is_ok else print "Vertex shader is not ok: {gl_error}" | ||||
| vertex_shader.source = """ | ||||
| attribute vec4 vPosition;    | ||||
| void main()                  | ||||
| {                            | ||||
|   gl_Position = vPosition;   | ||||
| }                           """ | ||||
| vertex_shader.compile | ||||
| assert vertex_shader.is_compiled else print "Vertex shader compilation failed with: {vertex_shader.info_log} {program.info_log}" | ||||
| assert_no_gl_error | ||||
|  | ||||
| # fragment shader | ||||
| var fragment_shader = new GLFragmentShader | ||||
| assert fragment_shader.is_ok else print "Fragment shader is not ok: {gl_error}" | ||||
| fragment_shader.source = """ | ||||
| precision mediump float; | ||||
| void main() | ||||
| { | ||||
| 	gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); | ||||
| } | ||||
| """ | ||||
| fragment_shader.compile | ||||
| assert fragment_shader.is_compiled else print "Fragment shader compilation failed with: {fragment_shader.info_log}" | ||||
| assert_no_gl_error | ||||
|  | ||||
| program.attach_shader vertex_shader | ||||
| program.attach_shader fragment_shader | ||||
| program.bind_attrib_location(0, "vPosition") | ||||
| program.link | ||||
| assert program.is_linked else print "Linking failed: {program.info_log}" | ||||
| assert_no_gl_error | ||||
|  | ||||
| # draw! | ||||
| var vertices = [0.0, 0.5, 0.0, -0.5, -0.5, 0.0, 0.5, -0.5, 0.0] | ||||
| var vertex_array = new VertexArray(0, 3, vertices) | ||||
| vertex_array.attrib_pointer | ||||
| gl_clear_color(0.5, 0.0, 0.5, 1.0) | ||||
| for i in [0..10000[ do | ||||
| 	printn "." | ||||
| 	assert_no_gl_error | ||||
| 	gl_viewport(0, 0, width, height) | ||||
| 	gl_clear_color_buffer | ||||
| 	program.use | ||||
| 	vertex_array.enable | ||||
| 	vertex_array.draw_arrays_triangles | ||||
| 	egl_display.swap_buffers(surface) | ||||
| end | ||||
|  | ||||
| # delete | ||||
| program.delete | ||||
| vertex_shader.delete | ||||
| fragment_shader.delete | ||||
|  | ||||
| # | ||||
| ## EGL | ||||
| # | ||||
| # close | ||||
| egl_display.make_current(new EGLSurface.none, new EGLSurface.none, new EGLContext.none) | ||||
| egl_display.destroy_context(context) | ||||
| egl_display.destroy_surface(surface) | ||||
|  | ||||
| # | ||||
| ## SDL | ||||
| # | ||||
| # close | ||||
| sdl_display.destroy | ||||
							
								
								
									
										22
									
								
								samples/Nit/print_arguments.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Nit/print_arguments.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # How to print arguments of the command line. | ||||
| module print_arguments | ||||
|  | ||||
| for a in args do | ||||
| 	print a | ||||
| end | ||||
							
								
								
									
										48
									
								
								samples/Nit/procedural_array.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/Nit/procedural_array.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2004-2008 Jean Privat <jean@pryen.org> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # A procedural program (without explicit class definition). | ||||
| # This program manipulates arrays of integers. | ||||
| module procedural_array | ||||
|  | ||||
| # The sum of the elements of `a'. | ||||
| # Uses a 'for' control structure. | ||||
| fun array_sum(a: Array[Int]): Int | ||||
| do | ||||
| 	var sum = 0 | ||||
| 	for i in a do | ||||
| 		sum = sum + i | ||||
| 	end | ||||
| 	return sum | ||||
| end | ||||
|  | ||||
| # The sum of the elements of `a' (alternative version). | ||||
| # Uses a 'while' control structure. | ||||
| fun array_sum_alt(a: Array[Int]): Int | ||||
| do | ||||
| 	var sum = 0 | ||||
| 	var i = 0 | ||||
| 	while i < a.length do | ||||
| 		sum = sum + a[i] | ||||
| 		i = i + 1 | ||||
| 	end | ||||
| 	return sum | ||||
| end | ||||
|  | ||||
| # The main part of the program. | ||||
| var a = [10, 5, 8, 9] | ||||
| print(array_sum(a)) | ||||
| print(array_sum_alt(a)) | ||||
							
								
								
									
										38
									
								
								samples/Nit/socket_client.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/Nit/socket_client.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Client sample using the Socket module which connect to the server sample. | ||||
| module socket_client | ||||
|  | ||||
| import socket | ||||
|  | ||||
| if args.length < 2 then | ||||
| 	print "Usage : socket_client <host> <port>" | ||||
| 	return | ||||
| end | ||||
|  | ||||
| var s = new Socket.client(args[0], args[1].to_i) | ||||
| print "[HOST ADDRESS] : {s.address}" | ||||
| print "[HOST] : {s.host}" | ||||
| print "[PORT] : {s.port}" | ||||
| print "Connecting ... {s.connected}" | ||||
| if s.connected then | ||||
| 	print "Writing ... Hello server !" | ||||
| 	s.write("Hello server !") | ||||
| 	print "[Response from server] : {s.read(100)}" | ||||
| 	print "Closing ..." | ||||
| 	s.close | ||||
| end | ||||
							
								
								
									
										52
									
								
								samples/Nit/socket_server.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								samples/Nit/socket_server.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Server sample using the Socket module which allow client to connect | ||||
| module socket_server | ||||
|  | ||||
| import socket | ||||
|  | ||||
| if args.is_empty then | ||||
| 	print "Usage : socket_server <port>" | ||||
| 	return | ||||
| end | ||||
|  | ||||
| var socket = new Socket.server(args[0].to_i, 1) | ||||
| print "[PORT] : {socket.port.to_s}" | ||||
|  | ||||
| var clients = new Array[Socket] | ||||
| var max = socket | ||||
| loop | ||||
| 	var fs = new SocketObserver(true, true, true) | ||||
| 	fs.readset.set(socket) | ||||
|  | ||||
| 	for c in clients do fs.readset.set(c) | ||||
|  | ||||
| 	if fs.select(max, 4, 0) == 0 then | ||||
| 		print "Error occured in select {sys.errno.strerror}" | ||||
| 		break | ||||
| 	end | ||||
|  | ||||
| 	if fs.readset.is_set(socket) then | ||||
| 		var ns = socket.accept | ||||
| 		print "Accepting {ns.address} ... " | ||||
| 		print "[Message from {ns.address}] : {ns.read(100)}" | ||||
| 		ns.write("Goodbye client.") | ||||
| 		print "Closing {ns.address} ..." | ||||
| 		ns.close | ||||
| 	end | ||||
| end | ||||
|  | ||||
							
								
								
									
										94
									
								
								samples/Nit/tmpl_composer.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								samples/Nit/tmpl_composer.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| import template | ||||
|  | ||||
| ### Here, definition of the specific templates | ||||
|  | ||||
| # The root template for composers | ||||
| class TmplComposers | ||||
| 	super Template | ||||
|  | ||||
| 	# Short list of composers | ||||
| 	var composers = new Array[TmplComposer] | ||||
|  | ||||
| 	# Detailled list of composers | ||||
| 	var composer_details = new Array[TmplComposerDetail] | ||||
|  | ||||
| 	# Add a composer in both lists | ||||
| 	fun add_composer(firstname, lastname: String, birth, death: Int) | ||||
| 	do | ||||
| 		composers.add(new TmplComposer(lastname)) | ||||
| 		composer_details.add(new TmplComposerDetail(firstname, lastname, birth, death)) | ||||
| 	end | ||||
|  | ||||
| 	redef fun rendering do | ||||
| 		add """ | ||||
| COMPOSERS | ||||
| ========= | ||||
| """ | ||||
| 		add_all composers | ||||
| 		add """ | ||||
|  | ||||
| DETAILS | ||||
| ======= | ||||
| """ | ||||
| 		add_all composer_details | ||||
| 	end | ||||
| end | ||||
|  | ||||
| # A composer in the short list of composers | ||||
| class TmplComposer | ||||
| 	super Template | ||||
|  | ||||
| 	# Short name | ||||
| 	var name: String | ||||
|  | ||||
| 	init(name: String) do self.name = name | ||||
|  | ||||
| 	redef fun rendering do add "- {name}\n" | ||||
| end | ||||
|  | ||||
| # A composer in the detailled list of composers | ||||
| class TmplComposerDetail | ||||
| 	super Template | ||||
|  | ||||
| 	var firstname: String | ||||
| 	var lastname: String | ||||
| 	var birth: Int | ||||
| 	var death: Int | ||||
|  | ||||
| 	init(firstname, lastname: String, birth, death: Int) do | ||||
| 		self.firstname = firstname | ||||
| 		self.lastname = lastname | ||||
| 		self.birth = birth | ||||
| 		self.death = death | ||||
| 	end | ||||
|  | ||||
| 	redef fun rendering do add """ | ||||
|  | ||||
| COMPOSER: {{{firstname}}} {{{lastname}}} | ||||
| BIRTH...: {{{birth}}} | ||||
| DEATH...: {{{death}}} | ||||
| """ | ||||
|  | ||||
| end | ||||
|  | ||||
| ### Here a simple usage of the templates | ||||
|  | ||||
| var f = new TmplComposers | ||||
| f.add_composer("Johann Sebastian", "Bach", 1685, 1750) | ||||
| f.add_composer("George Frideric", "Handel", 1685, 1759) | ||||
| f.add_composer("Wolfgang Amadeus", "Mozart", 1756, 1791) | ||||
| f.write_to(stdout) | ||||
							
								
								
									
										46
									
								
								samples/Nit/websocket_server.nit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Nit/websocket_server.nit
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| # This file is part of NIT ( http://www.nitlanguage.org ). | ||||
| # | ||||
| # Copyright 2014 Lucas Bajolet <r4pass@hotmail.com> | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| # Sample module for a minimal chat server using Websockets on port 8088 | ||||
| module websocket_server | ||||
|  | ||||
| import websocket | ||||
|  | ||||
| var sock = new WebSocket(8088, 1) | ||||
|  | ||||
| var msg: String | ||||
|  | ||||
| if sock.listener.eof then | ||||
| 	print sys.errno.strerror | ||||
| end | ||||
|  | ||||
| sock.accept | ||||
|  | ||||
| while not sock.listener.eof do | ||||
| 	if not sock.connected then sock.accept | ||||
| 	if sys.stdin.poll_in then | ||||
| 		msg = gets | ||||
| 		printn "Received message : {msg}" | ||||
| 		if msg == "exit" then sock.close | ||||
| 		if msg == "disconnect" then sock.disconnect_client | ||||
| 		sock.write(msg) | ||||
| 	end | ||||
| 	if sock.can_read(10) then | ||||
| 		msg = sock.read_line | ||||
| 		if msg != "" then print msg | ||||
| 	end | ||||
| end | ||||
|  | ||||
							
								
								
									
										9
									
								
								samples/Opal/DeepakChopra.opal
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Opal/DeepakChopra.opal
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| -- Deepak Chopra nonsense text generator | ||||
| -- see https://github.com/StoneCypher/DeepakChopra_Opal/ | ||||
|  | ||||
| starts = ["Experiential truth ", "The physical world ", "Non-judgment ", "Quantum physics "] | ||||
| middles = ["nurtures an ", "projects onto ", "imparts reality to ", "constructs with "] | ||||
| qualifiers = ["abundance of ", "the barrier of ", "self-righteous ", "potential "] | ||||
| finishes = ["marvel.", "choices.", "creativity.", "actions."] | ||||
|  | ||||
| alert starts.sample + middles.sample + qualifiers.sample + finishes.sample | ||||
							
								
								
									
										13
									
								
								samples/OpenSCAD/not_simple.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/OpenSCAD/not_simple.scad
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // A more complicated 3D shape in OpenSCAD | ||||
| $fn=32; | ||||
|  | ||||
| difference() { | ||||
|     // main shape | ||||
|     union() { | ||||
|         translate( [ 0, 0,  2 ] ) cube( [ 15, 15, 4 ], center=true ); | ||||
|         translate( [ 0, 0, 13 ] ) cylinder( h=25, r1=5, r2=3, center=true ); | ||||
|         translate( [ 0, 0, 28 ] ) sphere( r=6 ); | ||||
|     } | ||||
|     // hole through center | ||||
|     translate( [ 0, 0, 17 ] ) cylinder( h=35, r=2, center=true ); | ||||
| } | ||||
							
								
								
									
										3
									
								
								samples/OpenSCAD/simple.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/OpenSCAD/simple.scad
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| // Simple sphere in OpenSCAD | ||||
|  | ||||
| sphere( r=10 ); | ||||
							
								
								
									
										34
									
								
								samples/PHP/filenames/.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								samples/PHP/filenames/.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #!/usr/bin/env php | ||||
| <? | ||||
| $aMenuLinks = Array( | ||||
| 	Array( | ||||
| 		"Blog",  | ||||
| 		SITE_DIR,  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"Photos",  | ||||
| 		SITE_DIR."photo/",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"About me",  | ||||
| 		SITE_DIR."about.php",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
| 	Array( | ||||
| 		"Contact",  | ||||
| 		SITE_DIR."contacts.php",  | ||||
| 		Array(),  | ||||
| 		Array(),  | ||||
| 		""  | ||||
| 	), | ||||
|  | ||||
| ); | ||||
| ?> | ||||
							
								
								
									
										447
									
								
								samples/Perl/example.cgi
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										447
									
								
								samples/Perl/example.cgi
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,447 @@ | ||||
| #!/usr/bin/perl | ||||
|  | ||||
| # v1.0 | ||||
| # nagiostat, program to insert performance-data from Nagios into RRD-archives | ||||
| # Copyright (C) 2004  Carl Bingel / Svensk IT konsult AB | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU General Public License | ||||
| # as published by the Free Software Foundation; either version 2 | ||||
| # of the License, or (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| ## Basic configuration options | ||||
| my $BASE_DIR = "/usr/share/nagiostat"; | ||||
| my $CONFIG_FILE = "/etc/nagios/nagiostat.conf";  ## Config-file location | ||||
| my $DEBUG_LOG_FILE = "/var/spool/nagiostat/debug.log";    ## Specify where to create log-file and what filename (must be writable by nagios-user!) | ||||
| my $DEBUGLEVEL = 1;              ## 0=Nothing, 1=Errors, 2=Warnings, 3=Debug | ||||
| my $DEBUGOUTPUT = 0;		 ## 0=file, 1=STDERR, 2=STDOUT (for cgi) | ||||
|  | ||||
| require 'shellwords.pl'; | ||||
|  | ||||
| ## Global vars | ||||
| my $DEBUG_TIMESTAMP=0; | ||||
|  | ||||
| ## Find out how program is run | ||||
| if( $ARGV[0] eq "-t") {		## -t = test configuration-file | ||||
|   print STDERR "nagiostat: Testing configuration-file..\n"; | ||||
|   $DEBUGLEVEL=3; | ||||
|   $DEBUGOUTPUT=1;    ## output errors to console and not file | ||||
|   my $c = &read_config(); | ||||
|   abort(); | ||||
| } elsif( $ARGV[0] eq "-p") {	## -p = parse performance-data (when started by nagios) | ||||
|   &parse_perfdata(); | ||||
| } else { | ||||
|   if( exists $ENV{'GATEWAY_INTERFACE'}) {	## we are run as a CGI-script! | ||||
|     $DEBUGOUTPUT=2;  ## output errors to web-browser | ||||
|     &run_as_cgi(); | ||||
|   } else {                                ## print some help-info | ||||
|     print STDERR "nagiostat: usage: | ||||
|         -t	Test configuration-file | ||||
|         -p	Parse/import performance-data (used when called from nagios) | ||||
| "; | ||||
|   } | ||||
| } | ||||
|  | ||||
| abort(); | ||||
|  | ||||
| sub abort { | ||||
|    ## logfile: write blank if we wrote anything... | ||||
|    if( $DEBUG_TIMESTAMP!=0) { | ||||
|      debug( 1, "");	 | ||||
|    } | ||||
|    exit; | ||||
| } | ||||
|  | ||||
| ## | ||||
| ##  Program is called as CGI | ||||
| ## | ||||
| sub run_as_cgi { | ||||
|    use CGI; | ||||
|    my $cgi = new CGI; | ||||
|     | ||||
|    my $graph_name = $cgi->param( "graph_name"); | ||||
|    my $graph_iteration = $cgi->param( "graph_iteration"); | ||||
|  | ||||
|    if( $graph_iteration eq "") { | ||||
|       print "Content-type: text/html\nExpires: 0\n\n"; | ||||
|    } else { | ||||
|       print "Content-type: image/gif\nExpires: 0\n\n"; | ||||
|    } | ||||
|  | ||||
|    my $config = read_config(); | ||||
|  | ||||
|    if( $graph_name eq "") {       | ||||
|       ## | ||||
|       ## display index of graphs | ||||
|       ## | ||||
|       display_htmltemplate( $config->{'htmltemplatepath'}."/".$config->{'graphindextemplate'}, $graph_name, $config); | ||||
|    } else {                      ## display graph | ||||
|       if( ! exists $config->{'graphs'}->{$graph_name}) { | ||||
|          debug( 1, "ERROR: Graph '$graph_name' does not exist!"); | ||||
|          exit; | ||||
|       } elsif( $graph_iteration eq "") { | ||||
|          ## | ||||
|          ## Display HTML-page with all the graphs | ||||
|          ## | ||||
|          if( ! -r $config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}) { | ||||
|             debug( 1, "ERROR: HTML-template '".($config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'})."' is not readable by effective userid!"); | ||||
|             exit; | ||||
|          } | ||||
|          display_htmltemplate( $config->{'htmltemplatepath'}."/".$config->{'graphs'}->{$graph_name}->{'htmltemplate'}, $graph_name, $config); | ||||
|       } else {                    | ||||
|          ## | ||||
|          ## generate graph (call 'rrdtool graph') | ||||
|          ## | ||||
|          my $rrdtool_cmdline = $config->{'rrdtoolpath'}." graph - ".join( " ", @{$config->{'plottemplates'}->{ $config->{'graphs'}->{$graph_name}->{'plottemplate'} } });  | ||||
|           | ||||
|          ## expand variables | ||||
|          my $rrdarchive = $config->{'rrdarchivepath'}."/".$config->{'graphs'}->{$graph_name}->{'rrdfilename'}; | ||||
|          $rrdtool_cmdline =~ s/\$f/$rrdarchive/g; | ||||
|          my $t_start = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'starttime'}; | ||||
|          $rrdtool_cmdline =~ s/\$s/$t_start/g; | ||||
|          my $t_end = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'endtime'}; | ||||
|          $rrdtool_cmdline =~ s/\$e/$t_end/g; | ||||
|          my $t_descr = $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} }->[$graph_iteration]->{'description'}; | ||||
|          $rrdtool_cmdline =~ s/\$d/$t_descr/g; | ||||
|  | ||||
|          ## Call rrdtool (should probably be fixed to call it in a better way, like exec) | ||||
|          print `$rrdtool_cmdline`; | ||||
|       } | ||||
|  | ||||
|    } | ||||
|  | ||||
| } | ||||
|  | ||||
| ## Display HTML template (and do variable-substitution and other stuff) | ||||
| ## | ||||
| sub display_htmltemplate { | ||||
|    my( $filename, $graph_name, $config) = @_; | ||||
|  | ||||
|    if( -r $filename) { | ||||
|       open( HTML, $filename); | ||||
|       while( <HTML>) { | ||||
|          ## All is a big regex.. :-) | ||||
|          s/\$(\w+)/my $t=sub {    | ||||
|             my $varname = $_[0]; | ||||
|             if( $varname eq "GRAPHNAME") {                           ## return the name of the graph | ||||
|                if( $config->{'graphs'}->{$graph_name}->{'title'} ne "") { | ||||
|                   return( $config->{'graphs'}->{$graph_name}->{'title'}); | ||||
|                } else { | ||||
|                   return( "Graph ".$graph_name); | ||||
|                } | ||||
|             } elsif( $varname eq "CURRENTTIME") {                    ## return current date-time | ||||
|                return( localtime()); | ||||
|             } elsif( $varname eq "GRAPHINDEX" || $varname eq "GRAPHINDEX_ONEROW") {    ## return HTML-code for index of the different graphs | ||||
|                my $return_html; | ||||
|                foreach my $gn ( sort keys %{$config->{'graphs'}}) {            | ||||
|                      $return_html.=(($varname eq "GRAPHINDEX")?"<LI>":""). | ||||
|                      "<A HREF=\"?graph_name=$gn\">".($config->{'graphs'}->{$gn}->{'title'})."<\/A>".                  # must escape slash since were inside an regex! | ||||
|                      (($varname eq "GRAPHINDEX_ONEROW")?"  ":""); | ||||
|                } | ||||
|                return( $return_html); | ||||
|             } elsif( $varname eq "GRAPH_AUTOGENERATE") {             ## return HTML-code for displaying the actual graph-images | ||||
|                my $iteration_id=0; | ||||
|                my $return_html; | ||||
|                foreach my $time ( @{ $config->{'graphtimetemplates'}->{ $config->{'graphs'}->{$graph_name}->{'graphtimetemplate'} } }) { | ||||
|                  $return_html.="<P>".($time->{'description'})."<BR><IMG SRC=\"?graph_name=$graph_name&graph_iteration=$iteration_id\">";  | ||||
|                  $iteration_id++; | ||||
|                } | ||||
|                return( $return_html); | ||||
|             } else {                                                 ## unknown variable | ||||
|                return( "##UNKNOWN-VARIABLE##"); | ||||
|             } | ||||
|          }; &$t($1)/eig;   ## i thought that regex would never end! | ||||
|          print; | ||||
|       } | ||||
|       close( HTML); | ||||
|    } else { | ||||
|       print "ERROR: HTML-template '$filename' does not exist or is not readable by effective userid."; | ||||
|    } | ||||
|  | ||||
| } | ||||
|  | ||||
| ## | ||||
| ##  Process incoming performance-data (parse output from check-plugin and insert values into rrd-archives) | ||||
| ## | ||||
| sub parse_perfdata { | ||||
|  | ||||
|   $DEBUG_TIMESTAMP=0; | ||||
|    | ||||
|   my $config = read_config(); | ||||
|  | ||||
|   my $rrd_updates; | ||||
|  | ||||
|   ##  Provide more symbolic names (same names as the macros in nagios configuration-file) | ||||
|  | ||||
|   my( $LASTCHECK, $HOSTNAME, $SERVICEDESCR, $SERVICESTATE, $OUTPUT, $PERFDATA) = split( /\|!!\|/, $ARGV[1]); | ||||
|   debug( 3, "**INCOMING PERFDATA:\n  LASTCHECK=$LASTCHECK\n  HOSTNAME=$HOSTNAME\n  SERVICEDESCR=\"$SERVICEDESCR\"\n  SERVICESTATE=\"$SERVICESTATE\"\n  OUTPUT=\"$OUTPUT\"\n  PERFDATA=\"$PERFDATA\""); | ||||
|    | ||||
|   my $host_and_descr_found; | ||||
|   ## Loop through all host_regexes | ||||
|   foreach my $host_regex ( keys %{$config->{'regexes'}}) { | ||||
|     ## Loop through all service_description_regexes | ||||
|     foreach my $service_regex ( keys %{$config->{'regexes'}->{$host_regex}}) { | ||||
|       if( ($HOSTNAME =~ m/$host_regex/i) && ($SERVICEDESCR =~ m/$service_regex/i) ) {     ## match! | ||||
|         $host_and_descr_found=1; | ||||
|         ## Loop through all InsertValue-lines with same host and service_description match | ||||
|         foreach my $insert_value ( @{$config->{'regexes'}->{$host_regex}->{$service_regex}} ) { | ||||
|           ## Loop through all regexes that should match values in the output/perfdata | ||||
|           foreach my $regex ( @{ $config->{'valueregextemplates'}->{$insert_value->{'regextemplate'}} }) { | ||||
|              my $regex_string = $regex->{'regex'}; | ||||
|              if( $regex->{'regex_what'} eq "output") {         ## do regex on "output" | ||||
|                 if( $OUTPUT =~ m/$regex_string/) { | ||||
|                    debug( 3, " +VALUE: ".$1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'}); | ||||
|                    $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'}; | ||||
|                 } else { | ||||
|                    debug( 2, "**WARNING: No match for value with regex on output '$regex_string'."); | ||||
|                 } | ||||
|              } else {                                          ## do regex on "perfdata" | ||||
|                 if( $PERFDATA =~ m/$regex_string/) { | ||||
|                    debug( 3, " +VALUE: ".$1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'value'}}, $1); | ||||
|                    push( @{$rrd_updates->{$insert_value->{'rrdarchive'}}->{'dsaname'}}, $regex->{'dsaname'}); | ||||
|                    $rrd_updates->{$insert_value->{'rrdarchive'}}->{'rrdcreatetemplate'} = $insert_value->{'rrdcreatetemplate'};  #$config->{'regexes'}->{$host_regex}->{$service_regex}->[0]->{'rrdcreatetemplate'}; | ||||
|                 } else { | ||||
|                    debug( 2, "**WARNING: No match for value with regex on perfdata '$regex_string'."); | ||||
|                 } | ||||
|              } | ||||
|           } | ||||
|         } | ||||
|          | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   if( !$host_and_descr_found) { | ||||
|     debug( 2, "**WARNING: Hostname and description didn't match any of the regexes in the config-file."); | ||||
|   } else { | ||||
|     ## | ||||
|     ## Insert the value into the RRD by calling the rrdtool (may be several rrd-archives) | ||||
|     ## | ||||
|     foreach my $archive ( keys %{$rrd_updates}) { | ||||
|       debug( 3, " =INSERT into '$archive': ".join( ",", @{$rrd_updates->{$archive}->{'value'}} )." DSA-names=".join( ",", @{$rrd_updates->{$archive}->{'dsaname'}}) ); | ||||
|        | ||||
|       my $rrdarchive_filename = $config->{'rrdarchivepath'}."/".$archive; | ||||
|        | ||||
|       ## Create RRD-Archive (according to template) if it does not exist | ||||
|       if( ! -e $rrdarchive_filename) { | ||||
|          my $rrdtool_cmdline = $config->{'rrdtoolpath'}." create ".$rrdarchive_filename." ".(join( " ", @{$config->{'rrdcreatetemplates'}->{$rrd_updates->{$archive}->{'rrdcreatetemplate'}}})); | ||||
|          debug( 2, "**CREATING: $rrdarchive_filename, cmdline='".$rrdtool_cmdline."'."); | ||||
|          `$rrdtool_cmdline`; | ||||
|       } | ||||
|  | ||||
|       ## Check if rrd-archive is writable | ||||
|       if( ! -w $rrdarchive_filename) {					## check wheter RRD-archive exists | ||||
|         debug( 1, "!!ERROR: RRD-archive '".$rrdarchive_filename."' does not exist or is not writable by effective UID."); abort(); | ||||
|       } | ||||
|  | ||||
|       ## Assemle command-line for rrdtool | ||||
|       my $rrdtool_cmdline = $config->{'rrdtoolpath'}." update ".$rrdarchive_filename. | ||||
| 	                    " --template ".join( ":", @{$rrd_updates->{$archive}->{'dsaname'}}). | ||||
|                             " $LASTCHECK:".join( ":", @{$rrd_updates->{$archive}->{'value'}}); | ||||
|       debug( 3, " !RRDCMDLINE: ".$rrdtool_cmdline); | ||||
|       my $result = `$rrdtool_cmdline`; | ||||
|       if( $result ne "") { | ||||
|         debug( 1, "!!RESULT: $result"); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## | ||||
| ##  Read config-file and check for errors | ||||
| ## | ||||
| sub read_config { | ||||
|   my $config; | ||||
|   open( CONFIG, $CONFIG_FILE); | ||||
|   my( $line_counter); | ||||
|   while( <CONFIG>) { | ||||
|     $line_counter++; | ||||
|     chomp; | ||||
|     my( @args) = &shellwords( $_); | ||||
|     my $orig_confline = $_; | ||||
|     $args[0] = uc( $args[0]); | ||||
|    | ||||
|     if( $args[0] eq "INSERTVALUE") {	##  INSERTVALUE-command | ||||
|       shift @args; | ||||
|       my( $rrd_filename, $rrdcreatetemplate, $hostname_regex, $servicedescr_regex, $regex_template) = @args; | ||||
|  | ||||
|       if( ! exists $config->{'rrdcreatetemplates'}->{$rrdcreatetemplate}) { | ||||
|          debug( 1, "!!ERROR: RRDCreateTemplate '$rrdcreatetemplate' is not defined but refered to in line $line_counter."); abort(); | ||||
|       } | ||||
|       if( $hostname_regex !~ m/^\/(.*)\/$/) {			## verify hostname regex | ||||
|         debug( 1, "!!ERROR: Hostname regex should be enclosed in slashes, i.e. /HOSTNAME/ and optionally enclosed in quotes if needed. Conf-line $line_counter."); abort(); | ||||
|       } else { | ||||
|         $hostname_regex = $1; | ||||
|       } | ||||
|       if( $servicedescr_regex !~ m/^\/(.*)\/$/) {			## verify service description regex | ||||
|         debug( 1, "!!ERROR: Service-description regex should be enclosed in slashes, i.e. /SERVICEDESCR/ and optionally enclosed in quotes if needed. Config-line $line_counter."); | ||||
|         abort(); | ||||
|       } else { | ||||
|         $servicedescr_regex = $1; | ||||
|       } | ||||
|       if( ! exists $config->{'valueregextemplates'}->{$regex_template}) {  ## verify value-regex-template exists | ||||
|          debug( 1, "!!ERROR: VALUEREGEXTEMPLATE '$regex_template' is not defined on line $line_counter."); abort(); | ||||
|       } | ||||
|       push( @{$config->{'regexes'}->{$hostname_regex}->{$servicedescr_regex}}, { | ||||
|             'rrdarchive' => $rrd_filename, | ||||
|             'rrdcreatetemplate' => $rrdcreatetemplate, | ||||
|             'regextemplate' => $regex_template | ||||
|             } ); | ||||
|     } elsif( $args[0] =~ m/^(\s*)#/ || $args[0] eq "") {	## comment or blank row | ||||
|       ## do nuthin | ||||
|     } elsif( $args[0] eq "RRDTOOLPATH") {               ## RRDToolPath args: path | ||||
|       $config->{'rrdtoolpath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "PLOTTEMPLATE") {		## PlotTemplate args: name,htmltemplate,parameters.. | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: PLOTTEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'plottemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: PLOTTTEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       $config->{'plottemplates'}->{$name} = [ @params]; | ||||
|     } elsif( $args[0] eq "GRAPHTIMETEMPLATE") {         ## GraphTimeTemplate args: name,parameters.. | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: GRAPHTIMETEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'graphtimetemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: GRAPHTIMETEMPLATE-names must be uniqe. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       foreach my $time_template (@params) { | ||||
|          my( $t_start, $t_end, @t_descr) = split( /:/, $time_template); | ||||
|          my $t_descr = join( ":", @t_descr);    # workaround if ':' is used in description-string | ||||
|          if( $t_start eq "" || $t_end eq "") { | ||||
|             debug( 1, "!!ERROR: GRAPHTIMETEMPLATE, each time-definition should be defined as '<starttime>:<endtime>:<description>' on line $line_counter."); | ||||
|          } | ||||
|          push( @{$config->{'graphtimetemplates'}->{$name}}, { | ||||
|              'starttime' => $t_start, | ||||
|              'endtime' => $t_end, | ||||
|              'description' => $t_descr | ||||
|          }); | ||||
|       } | ||||
|     } elsif( $args[0] eq "RRDCREATETEMPLATE") {         ## RRDCreateTemplate | ||||
|       shift @args; | ||||
|       my( $name, @params) = @args; | ||||
|       if( $name eq "") { | ||||
|         debug( 1, "!!ERROR: RRDCREATETEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'rrdcreatetemplates'}->{$name}) { | ||||
|         debug( 1, "!!ERROR: RRDCREATETEMPLATE-names must be uniq. Duplicate name found on line: $line_counter."); abort(); | ||||
|       } | ||||
|       $config->{'rrdcreatetemplates'}->{$name} = [ @params]; | ||||
|     } elsif( $args[0] eq "VALUEREGEXTEMPLATE") {        ## ValueRegexTemplate | ||||
|       shift @args; | ||||
|       my( $template_name, @regexes) = @args; | ||||
|       if( $template_name eq "") { | ||||
|          debug( 1, "!!ERROR: VALUEREGEXTEMPLATE-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       foreach my $r (@regexes) { | ||||
|          if( $r !~ m/^(output|perfdata):(\w+):\/(.*)\/$/) { | ||||
|            debug( 1, "!!ERROR: Value-regex should be formatted as 'output:dsaname:/regex/' or 'perfdata:dsaname:/regex/' depending on in which field to extract the data. The value should be within parantheses in the regex. Config-line $line_counter."); | ||||
|            abort(); | ||||
|          } else { | ||||
|            my( $regex_what, $dsa_name, $regex) = ( $1, $2, $3); | ||||
|            push( @{$config->{'valueregextemplates'}->{$template_name}}, {  | ||||
|                    'regex_what' => $regex_what,  | ||||
|                    'regex' => $regex,  | ||||
|                    'dsaname' => $dsa_name | ||||
|                   } ); | ||||
|          } | ||||
|       } | ||||
|     } elsif( $args[0] eq "RRDARCHIVEPATH") {            ## RRDARCHIVEPATH | ||||
|       $config->{'rrdarchivepath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "HTMLTEMPLATEPATH") {          ## HTMLTemplatePath | ||||
|       $config->{'htmltemplatepath'} = $args[1]; | ||||
|     } elsif( $args[0] eq "GRAPHINDEXTEMPLATE") {        ## GraphIndexTemplate | ||||
|       $config->{'graphindextemplate'} = $args[1]; | ||||
|     } elsif( $args[0] eq "GRAPH") {			## GRAPH args: name,rrdfilename,rrdcreatetemplate,graphtimetemplate,plottemplate,htmltemplate | ||||
|       if( $args[1] eq "") { | ||||
| 	debug( 1, "!!ERROR: GRAPH-name must be specified on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( ! exists $config->{'graphtimetemplates'}->{$args[3]}) { | ||||
|         debug( 1, "!!ERROR: Unknown GRAPHTIMETEMPLATE on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( ! exists $config->{'plottemplates'}->{$args[4]}) { | ||||
|         debug( 1, "!!ERROR: Unknown PLOTTEMPLATE on line $line_counter."); abort(); | ||||
|       } | ||||
|       if( exists $config->{'graphs'}->{$args[1]}) { | ||||
|         debug( 1, "!!ERROR: Graphnames must be uniqe. Duplicate name found on line: $line_counter."); | ||||
|         abort(); | ||||
|       } else { | ||||
|         $config->{'graphs'}->{$args[1]} = { | ||||
| 		'graphname' => $args[1], | ||||
| 		'rrdfilename' => $args[2], | ||||
|                 'graphtimetemplate' => $args[3], | ||||
|                 'plottemplate' => $args[4], | ||||
|                 'htmltemplate' => $args[5], | ||||
|                 'title' => $args[6] | ||||
|         }; | ||||
|       } | ||||
|     } else { | ||||
|       debug( 1, "!!ERROR: Unknown config-file directive on line $line_counter: '".$args[0]."'"); | ||||
|     } | ||||
|   } | ||||
|   close( CONFIG); | ||||
|  | ||||
|   if( ! -x $config->{'rrdtoolpath'}) { | ||||
|     debug( 1, "!!ERROR: RRDTOOLPATH does not point to executable rrdtool-binary."); | ||||
|     abort(); | ||||
|   } | ||||
|   if( ! -x $config->{'rrdarchivepath'}) { | ||||
|      debug( 1, "!!ERROR: RRDARCHIVEPATH, '".($config->{'rrdarchivepath'})."' is not readable by effective userid."); abort(); | ||||
|   } | ||||
|   if( ! -x $config->{'htmltemplatepath'}) { | ||||
|      debug( 1, "!!ERROR: HTMLTEMPLATEPATH, '".($config->{'htmltemplatepath'})."' is not readable by effective userid."); abort(); | ||||
|   } | ||||
|  | ||||
|   return( $config); | ||||
| } | ||||
|  | ||||
|  | ||||
| ##  | ||||
| ##  Write debug-output/logging | ||||
| ## | ||||
| sub debug { | ||||
|   my( $level, $msg) = @_; | ||||
|   if( $DEBUGLEVEL >= $level) { | ||||
|  | ||||
|     ## write timestamp | ||||
|     if( !$DEBUG_TIMESTAMP) {	 | ||||
|       $DEBUG_TIMESTAMP=1; | ||||
|       debug( 1, scalar localtime()); | ||||
|     } | ||||
|  | ||||
|     ## write to file or STDERR | ||||
|     if( $DEBUGOUTPUT == 0) { | ||||
|       open( DEBUGOUTPUT, ">>".$DEBUG_LOG_FILE); | ||||
|       print DEBUGOUTPUT $msg."\n"; | ||||
|       close( DEBUGOUTPUT); | ||||
|     } elsif( $DEBUGOUTPUT == 2) { | ||||
|       print "<BR><PRE>$msg</PRE>"; | ||||
|     } else { | ||||
|       print STDERR $msg."\n"; | ||||
|     } | ||||
|  | ||||
|   } | ||||
| } | ||||
							
								
								
									
										11
									
								
								samples/Perl/strict.t
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Perl/strict.t
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| use Test::Base; | ||||
|  | ||||
| __DATA__ | ||||
| === Strict Test | ||||
|  | ||||
| --- perl strict | ||||
| my $x = 5; | ||||
| --- strict | ||||
| use strict; | ||||
| use warnings; | ||||
| my $x = 5; | ||||
							
								
								
									
										10
									
								
								samples/PigLatin/example.pig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								samples/PigLatin/example.pig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| /** | ||||
|  * sample.pig | ||||
|  */ | ||||
|  | ||||
| REGISTER $SOME_JAR; | ||||
|  | ||||
| A = LOAD 'person' USING PigStorage() AS (name:chararray, age:int); -- Load person | ||||
| B = FOREACH A generate name; | ||||
| DUMP B; | ||||
|  | ||||
							
								
								
									
										1051
									
								
								samples/Prolog/admin.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1051
									
								
								samples/Prolog/admin.pl
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5
									
								
								samples/Prolog/ex6.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								samples/Prolog/ex6.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| %6.8 | ||||
| subset(Set, Subset) :- | ||||
| 	append(L1, Subset, Set). | ||||
| powerset(Set, Subset) :- | ||||
| 	bagof(Subset, subset(Set, Subset), Subset). | ||||
							
								
								
									
										68
									
								
								samples/SQF/fn_remoteExecFnc.sqf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								samples/SQF/fn_remoteExecFnc.sqf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* | ||||
|  * Author: commy2 | ||||
|  * | ||||
|  * Execute a function on a remote machine in mp. | ||||
|  *  | ||||
|  * Argument: | ||||
|  * 0: Function arguments (Array) | ||||
|  * 1: Function to execute, has to be defined on the remote machine first (String) | ||||
|  * 2: The function will be executed where this unit is local OR the mode were this function should be executed. (Object OR Number, optional default: 2) | ||||
|  * 		Mode 0: execute on this machine only | ||||
|  * 		Mode 1: execute on server | ||||
|  * 		Mode 2: execute on all clients + server | ||||
|  * 		Mode 3: execute on dedicated only | ||||
|  *  | ||||
|  * Return value: | ||||
|  * Nothing | ||||
|  */ | ||||
|  | ||||
| private ["_arguments", "_function", "_unit", "_id"]; | ||||
|  | ||||
| AGM_Core_remoteFnc = _this; | ||||
|  | ||||
| _arguments = _this select 0; | ||||
| _function = call compile (_this select 1); | ||||
| _unit = _this select 2; | ||||
|  | ||||
| if (isNil "_unit") then { | ||||
| 	_unit = 2; | ||||
| }; | ||||
|  | ||||
| if (typeName _unit == "SCALAR") exitWith { | ||||
| 	switch (_unit) do { | ||||
| 		case 0 : { | ||||
| 			_arguments call _function; | ||||
| 		}; | ||||
| 		case 1 : { | ||||
| 			if (isServer) then { | ||||
| 				_arguments call _function; | ||||
| 			} else { | ||||
| 				publicVariableServer "AGM_Core_remoteFnc"; | ||||
| 			}; | ||||
| 		}; | ||||
| 		case 2 : { | ||||
| 			_arguments call _function; | ||||
|  | ||||
| 			AGM_Core_remoteFnc set [2, 0]; | ||||
| 			publicVariable "AGM_Core_remoteFnc"; | ||||
| 		}; | ||||
| 		case 3 : { | ||||
| 			if (isDedicated) then { | ||||
| 				_arguments call _function; | ||||
| 			} else { | ||||
| 				if (!isServer) then {publicVariableServer "AGM_Core_remoteFnc"}; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| if (local _unit) then { | ||||
| 	_arguments call _function; | ||||
| } else { | ||||
| 	if (isServer) then { | ||||
| 		_id = owner _unit; | ||||
| 		_id publicVariableClient "AGM_Core_remoteFnc"; | ||||
| 	} else { | ||||
| 		publicVariableServer "AGM_Core_remoteFnc"; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										19
									
								
								samples/SQF/macros.hqf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/SQF/macros.hqf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #include <version.hqf> | ||||
|  | ||||
| #define SET(VAR,VALUE) private #VAR; VAR = VALUE; | ||||
| #define CONV(VAR,ARRAY,POOL) VAR = ARRAY select (POOL find VAR); | ||||
|  | ||||
| #define ALL_HITPOINTS_MAN [ \ | ||||
|   "HitHead", "HitBody", \ | ||||
|   "HitLeftArm", "HitRightArm", \ | ||||
|   "HitLeftLeg","HitRightLeg" \ | ||||
| ] | ||||
|  | ||||
| #define ALL_HITPOINTS_VEH [ \ | ||||
|   "HitBody", "HitHull", "HitEngine", "HitFuel", \ | ||||
|   "HitTurret", "HitGun", \ | ||||
|   "HitLTrack", "HitRTrack", \ | ||||
|   "HitLFWheel", "HitRFWheel", "HitLF2Wheel", "HitRF2Wheel", "HitLMWheel", "HitRMWheel", "HitLBWheel", "HitRBWheel", \ | ||||
|   "HitAvionics", "HitHRotor", "HitVRotor", \ | ||||
|   "HitRGlass", "HitLGlass", "HitGlass1", "HitGlass2", "HitGlass3", "HitGlass4", "HitGlass5", "HitGlass6" \ | ||||
| ] | ||||
							
								
								
									
										119
									
								
								samples/TeX/authortitle.cbx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								samples/TeX/authortitle.cbx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| \ProvidesFile{authortitle.cbx} | ||||
| [\abx@cbxid] | ||||
|  | ||||
| \ExecuteBibliographyOptions{uniquename,uniquelist,autocite=footnote} | ||||
|  | ||||
| \renewcommand*{\iffinalcitedelim}{\iflastcitekey} | ||||
|  | ||||
| \newbool{cbx:parens} | ||||
|  | ||||
| \newbibmacro*{cite}{% | ||||
|   \iffieldundef{shorthand} | ||||
|     {\ifnameundef{labelname} | ||||
|        {} | ||||
|        {\printnames{labelname}% | ||||
|         \setunit{\nametitledelim}}% | ||||
|      \usebibmacro{cite:title}}% | ||||
|     {\usebibmacro{cite:shorthand}}} | ||||
|  | ||||
| \newbibmacro*{citetitle}{% | ||||
|   \iffieldundef{shorthand} | ||||
|     {\usebibmacro{cite:title}}% | ||||
|     {\usebibmacro{cite:shorthand}}} | ||||
|  | ||||
| \newbibmacro*{textcite}{% | ||||
|   \ifnameundef{labelname} | ||||
|     {} | ||||
|     {\printnames{labelname}% | ||||
|      \setunit{% | ||||
|        \global\booltrue{cbx:parens}% | ||||
|        \addspace\bibopenparen}}% | ||||
|   \ifnumequal{\value{citecount}}{1} | ||||
|     {\usebibmacro{prenote}} | ||||
|     {}% | ||||
|   \iffieldundef{shorthand} | ||||
|     {\usebibmacro{cite:title}}% | ||||
|     {\usebibmacro{cite:shorthand}}} | ||||
|  | ||||
| \newbibmacro*{cite:title}{% | ||||
|   \printtext[bibhyperref]{% | ||||
|     \printfield[citetitle]{labeltitle}}} | ||||
|  | ||||
| \newbibmacro*{cite:shorthand}{% | ||||
|   \printtext[bibhyperref]{\printfield{shorthand}}} | ||||
|  | ||||
| \newbibmacro*{textcite:postnote}{% | ||||
|   \iffieldundef{postnote} | ||||
|     {\ifbool{cbx:parens} | ||||
|        {\bibcloseparen} | ||||
|        {}} | ||||
|     {\ifbool{cbx:parens} | ||||
|        {\postnotedelim} | ||||
|        {\addspace\bibopenparen}% | ||||
|      \printfield{postnote}\bibcloseparen}} | ||||
|  | ||||
| \DeclareCiteCommand{\cite} | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{cite}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand*{\cite} | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{citetitle}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand{\parencite}[\mkbibparens] | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{cite}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand*{\parencite}[\mkbibparens] | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{citetitle}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand{\footcite}[\mkbibfootnote] | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{cite}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand{\footcitetext}[\mkbibfootnotetext] | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{cite}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand{\smartcite}[\iffootnote\mkbibparens\mkbibfootnote] | ||||
|   {\usebibmacro{prenote}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \usebibmacro{cite}} | ||||
|   {\multicitedelim} | ||||
|   {\usebibmacro{postnote}} | ||||
|  | ||||
| \DeclareCiteCommand{\textcite} | ||||
|   {\boolfalse{cbx:parens}} | ||||
|   {\usebibmacro{citeindex}% | ||||
|    \iffirstcitekey | ||||
|      {\setcounter{textcitetotal}{1}} | ||||
|      {\stepcounter{textcitetotal}% | ||||
|       \textcitedelim}% | ||||
|    \usebibmacro{textcite}} | ||||
|   {\ifbool{cbx:parens} | ||||
|      {\bibcloseparen\global\boolfalse{cbx:parens}} | ||||
|      {}} | ||||
|   {\usebibmacro{textcite:postnote}} | ||||
|  | ||||
| \DeclareMultiCiteCommand{\textcites}{\textcite}{} | ||||
|  | ||||
| \endinput | ||||
							
								
								
									
										554
									
								
								samples/TeX/english.lbx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										554
									
								
								samples/TeX/english.lbx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,554 @@ | ||||
| \ProvidesFile{english.lbx} | ||||
| [\abx@lbxid] | ||||
|  | ||||
| \DeclareRedundantLanguages{english,american}{english,american,british, | ||||
| canadian,australian,newzealand,USenglish,UKenglish} | ||||
|  | ||||
| \DeclareBibliographyExtras{% | ||||
|   \protected\def\bibrangedash{% | ||||
|     \textendash\penalty\hyphenpenalty}% breakable dash | ||||
|   \protected\def\bibdatedash{\bibrangedash}% | ||||
|   \def\finalandcomma{\addcomma}% | ||||
|   \def\finalandsemicolon{\addsemicolon}% | ||||
|   \protected\def\mkbibordinal#1{% | ||||
|     \begingroup | ||||
|     \@tempcnta0#1\relax\number\@tempcnta | ||||
|     \@whilenum\@tempcnta>100\do{\advance\@tempcnta-100\relax}% | ||||
|     \ifnum\@tempcnta>20 | ||||
|       \@whilenum\@tempcnta>9\do{\advance\@tempcnta-10\relax}% | ||||
|     \fi | ||||
|     \ifcase\@tempcnta th\or st\or nd\or rd\else th\fi | ||||
|     \endgroup}% | ||||
|   \protected\def\mkbibmascord{\mkbibordinal}% | ||||
|   \protected\def\mkbibfemord{\mkbibordinal}% | ||||
|   \protected\def\mkbibneutord{\mkbibordinal}% | ||||
|   \protected\def\mkbibdatelong#1#2#3{% | ||||
|     \iffieldundef{#2} | ||||
|       {} | ||||
|       {\mkbibmonth{\thefield{#2}}% | ||||
|        \iffieldundef{#3} | ||||
|          {\iffieldundef{#1}{}{\space}} | ||||
| 	 {\nobreakspace}}% | ||||
|     \iffieldundef{#3} | ||||
|       {} | ||||
|       {\stripzeros{\thefield{#3}}% | ||||
|        \iffieldundef{#1}{}{,\space}}% | ||||
|      \iffieldbibstring{#1} | ||||
|        {\bibstring{\thefield{#1}}} | ||||
|        {\stripzeros{\thefield{#1}}}}% | ||||
|   \protected\def\mkbibdateshort#1#2#3{% | ||||
|     \iffieldundef{#2} | ||||
|       {} | ||||
|       {\mkdatezeros{\thefield{#2}}% | ||||
|        \iffieldundef{#3} | ||||
|          {\iffieldundef{#1}{}{/}} | ||||
|          {/}}% | ||||
|     \iffieldundef{#3} | ||||
|       {} | ||||
|       {\mkdatezeros{\thefield{#3}}% | ||||
|        \iffieldundef{#1}{}{/}}% | ||||
|      \iffieldbibstring{#1} | ||||
|        {\bibstring{\thefield{#1}}} | ||||
|        {\mkdatezeros{\thefield{#1}}}}% | ||||
|   \savecommand\mkbibrangecomp | ||||
|   \savecommand\mkbibrangecompextra | ||||
|   \savecommand\mkbibrangeterse | ||||
|   \savecommand\mkbibrangeterseextra | ||||
|   \protected\def\mkbibrangecomp{% | ||||
|     \lbx@us@mkbibrangetrunc@long{long}}% | ||||
|   \protected\def\mkbibrangeterse{% | ||||
|     \lbx@us@mkbibrangetrunc@short{short}}% | ||||
|   \protected\def\mkbibrangecompextra{% | ||||
|     \lbx@us@mkbibrangetruncextra@long{long}}% | ||||
|   \protected\def\mkbibrangeterseextra{% | ||||
|     \lbx@us@mkbibrangetruncextra@short{short}}% | ||||
| } | ||||
|  | ||||
| \UndeclareBibliographyExtras{% | ||||
|   \restorecommand\mkbibrangecomp | ||||
|   \restorecommand\mkbibrangecompextra | ||||
|   \restorecommand\mkbibrangeterse | ||||
|   \restorecommand\mkbibrangeterseextra | ||||
| } | ||||
|  | ||||
| \DeclareBibliographyStrings{% | ||||
|   bibliography     = {{Bibliography}{Bibliography}}, | ||||
|   references       = {{References}{References}}, | ||||
|   shorthands       = {{List of Abbreviations}{Abbreviations}}, | ||||
|   editor           = {{editor}{ed\adddot}}, | ||||
|   editors          = {{editors}{eds\adddot}}, | ||||
|   compiler         = {{compiler}{comp\adddot}}, | ||||
|   compilers        = {{compilers}{comp\adddot}}, | ||||
|   redactor         = {{redactor}{red\adddot}}, | ||||
|   redactors        = {{redactors}{red\adddot}}, | ||||
|   reviser          = {{reviser}{rev\adddot}}, | ||||
|   revisers         = {{revisers}{rev\adddot}}, | ||||
|   founder          = {{founder}{found\adddot}}, | ||||
|   founders         = {{founders}{found\adddot}}, | ||||
|   continuator      = {{continued}{cont\adddot}},% FIXME: unsure | ||||
|   continuators     = {{continued}{cont\adddot}},% FIXME: unsure | ||||
|   collaborator     = {{collaborator}{collab\adddot}},% FIXME: unsure | ||||
|   collaborators    = {{collaborators}{collab\adddot}},% FIXME: unsure | ||||
|   translator       = {{translator}{trans\adddot}}, | ||||
|   translators      = {{translators}{trans\adddot}}, | ||||
|   commentator      = {{commentator}{comm\adddot}}, | ||||
|   commentators     = {{commentators}{comm\adddot}}, | ||||
|   annotator        = {{annotator}{annot\adddot}}, | ||||
|   annotators       = {{annotators}{annot\adddot}}, | ||||
|   commentary       = {{commentary}{comm\adddot}}, | ||||
|   annotations      = {{annotations}{annot\adddot}}, | ||||
|   introduction     = {{introduction}{intro\adddot}}, | ||||
|   foreword         = {{foreword}{forew\adddot}}, | ||||
|   afterword        = {{afterword}{afterw\adddot}}, | ||||
|   editortr         = {{editor and translator}% | ||||
|                       {ed\adddotspace and trans\adddot}}, | ||||
|   editorstr        = {{editors and translators}% | ||||
|                       {eds\adddotspace and trans\adddot}}, | ||||
|   editorco         = {{editor and commentator}% | ||||
|                       {ed\adddotspace and comm\adddot}}, | ||||
|   editorsco        = {{editors and commentators}% | ||||
|                       {eds\adddotspace and comm\adddot}}, | ||||
|   editoran         = {{editor and annotator}% | ||||
|                       {ed\adddotspace and annot\adddot}}, | ||||
|   editorsan        = {{editors and annotators}% | ||||
|                       {eds\adddotspace and annot\adddot}}, | ||||
|   editorin         = {{editor and introduction}% | ||||
|                       {ed\adddotspace and introd\adddot}}, | ||||
|   editorsin        = {{editors and introduction}% | ||||
|                       {eds\adddotspace and introd\adddot}}, | ||||
|   editorfo         = {{editor and foreword}% | ||||
|                       {ed\adddotspace and forew\adddot}}, | ||||
|   editorsfo        = {{editors and foreword}% | ||||
|                       {eds\adddotspace and forew\adddot}}, | ||||
|   editoraf         = {{editor and afterword}% | ||||
|                       {ed\adddotspace and afterw\adddot}}, | ||||
|   editorsaf        = {{editors and afterword}% | ||||
|                       {eds\adddotspace and afterw\adddot}}, | ||||
|   editortrco       = {{editor, translator\finalandcomma\ and commentator}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\finalandcomma\ and comm\adddot}}, | ||||
|   editorstrco      = {{editors, translators\finalandcomma\ and commentators}% | ||||
|                       {eds.,\addabbrvspace trans\adddot\finalandcomma\ and comm\adddot}}, | ||||
|   editortran       = {{editor, translator\finalandcomma\ and annotator}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\finalandcomma\ and annot\adddot}}, | ||||
|   editorstran      = {{editors, translators\finalandcomma\ and annotators}% | ||||
|                       {eds.,\addabbrvspace trans\adddot\finalandcomma\ and annot\adddot}}, | ||||
|   editortrin       = {{editor, translator\finalandcomma\ and introduction}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorstrin      = {{editors, translators\finalandcomma\ and introduction}% | ||||
|                       {eds.,\addabbrvspace trans\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editortrfo       = {{editor, translator\finalandcomma\ and foreword}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorstrfo      = {{editors, translators\finalandcomma\ and foreword}% | ||||
|                       {eds.,\addabbrvspace trans\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editortraf       = {{editor, translator\finalandcomma\ and afterword}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorstraf      = {{editors, translators\finalandcomma\ and afterword}% | ||||
|                       {eds.,\addabbrvspace trans\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorcoin       = {{editor, commentator\finalandcomma\ and introduction}% | ||||
|                       {ed.,\addabbrvspace comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorscoin      = {{editors, commentators\finalandcomma\ and introduction}% | ||||
|                       {eds.,\addabbrvspace comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorcofo       = {{editor, commentator\finalandcomma\ and foreword}% | ||||
|                       {ed.,\addabbrvspace comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorscofo      = {{editors, commentators\finalandcomma\ and foreword}% | ||||
|                       {eds.,\addabbrvspace comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorcoaf       = {{editor, commentator\finalandcomma\ and afterword}% | ||||
|                       {ed.,\addabbrvspace comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorscoaf      = {{editors, commentators\finalandcomma\ and afterword}% | ||||
|                       {eds.,\addabbrvspace comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editoranin       = {{editor, annotator\finalandcomma\ and introduction}% | ||||
|                       {ed.,\addabbrvspace annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorsanin      = {{editors, annotators\finalandcomma\ and introduction}% | ||||
|                       {eds.,\addabbrvspace annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editoranfo       = {{editor, annotator\finalandcomma\ and foreword}% | ||||
|                       {ed.,\addabbrvspace annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorsanfo      = {{editors, annotators\finalandcomma\ and foreword}% | ||||
|                       {eds.,\addabbrvspace annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editoranaf       = {{editor, annotator\finalandcomma\ and afterword}% | ||||
|                       {ed.,\addabbrvspace annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorsanaf      = {{editors, annotators\finalandcomma\ and afterword}% | ||||
|                       {eds.,\addabbrvspace annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editortrcoin     = {{editor, translator, commentator\finalandcomma\ and introduction}% | ||||
|                       {ed.,\addabbrvspace trans., comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorstrcoin    = {{editors, translators, commentators\finalandcomma\ and introduction}% | ||||
|                       {eds.,\addabbrvspace trans., comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editortrcofo     = {{editor, translator, commentator\finalandcomma\ and foreword}% | ||||
|                       {ed.,\addabbrvspace trans., comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorstrcofo    = {{editors, translators, commentators\finalandcomma\ and foreword}% | ||||
|                       {eds.,\addabbrvspace trans., comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editortrcoaf     = {{editor, translator, commentator\finalandcomma\ and afterword}% | ||||
|                       {ed.,\addabbrvspace trans., comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorstrcoaf    = {{editors, translators, commentators\finalandcomma\ and afterword}% | ||||
|                       {eds.,\addabbrvspace trans., comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editortranin     = {{editor, translator, annotator\finalandcomma\ and introduction}% | ||||
|                       {ed.,\addabbrvspace trans., annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editorstranin    = {{editors, translators, annotators\finalandcomma\ and introduction}% | ||||
|                       {eds.,\addabbrvspace trans., annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   editortranfo     = {{editor, translator, annotator\finalandcomma\ and foreword}% | ||||
|                       {ed.,\addabbrvspace trans., annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editorstranfo    = {{editors, translators, annotators\finalandcomma\ and foreword}% | ||||
|                       {eds.,\addabbrvspace trans., annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   editortranaf     = {{editor, translator, annotator\finalandcomma\ and afterword}% | ||||
|                       {ed.,\addabbrvspace trans., annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   editorstranaf    = {{editors, translators, annotators\finalandcomma\ and afterword}% | ||||
|                       {eds.,\addabbrvspace trans., annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   translatorco     = {{translator and commentator}% | ||||
|                       {trans\adddot\ and comm\adddot}}, | ||||
|   translatorsco    = {{translators and commentators}% | ||||
|                       {trans\adddot\ and comm\adddot}}, | ||||
|   translatoran     = {{translator and annotator}% | ||||
|                       {trans\adddot\ and annot\adddot}}, | ||||
|   translatorsan    = {{translators and annotators}% | ||||
|                       {trans\adddot\ and annot\adddot}}, | ||||
|   translatorin     = {{translation and introduction}% | ||||
|                       {trans\adddot\ and introd\adddot}}, | ||||
|   translatorsin    = {{translation and introduction}% | ||||
|                       {trans\adddot\ and introd\adddot}}, | ||||
|   translatorfo     = {{translation and foreword}% | ||||
|                       {trans\adddot\ and forew\adddot}}, | ||||
|   translatorsfo    = {{translation and foreword}% | ||||
|                       {trans\adddot\ and forew\adddot}}, | ||||
|   translatoraf     = {{translation and afterword}% | ||||
|                       {trans\adddot\ and afterw\adddot}}, | ||||
|   translatorsaf    = {{translation and afterword}% | ||||
|                       {trans\adddot\ and afterw\adddot}}, | ||||
|   translatorcoin   = {{translation, commentary\finalandcomma\ and introduction}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   translatorscoin  = {{translation, commentary\finalandcomma\ and introduction}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   translatorcofo   = {{translation, commentary\finalandcomma\ and foreword}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   translatorscofo  = {{translation, commentary\finalandcomma\ and foreword}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   translatorcoaf   = {{translation, commentary\finalandcomma\ and afterword}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   translatorscoaf  = {{translation, commentary\finalandcomma\ and afterword}% | ||||
|                       {trans., comm\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   translatoranin   = {{translation, annotations\finalandcomma\ and introduction}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   translatorsanin  = {{translation, annotations\finalandcomma\ and introduction}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and introd\adddot}}, | ||||
|   translatoranfo   = {{translation, annotations\finalandcomma\ and foreword}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   translatorsanfo  = {{translation, annotations\finalandcomma\ and foreword}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and forew\adddot}}, | ||||
|   translatoranaf   = {{translation, annotations\finalandcomma\ and afterword}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   translatorsanaf  = {{translation, annotations\finalandcomma\ and afterword}% | ||||
|                       {trans., annot\adddot\finalandcomma\ and afterw\adddot}}, | ||||
|   byauthor         = {{by}{by}}, | ||||
|   byeditor         = {{edited by}{ed\adddotspace by}}, | ||||
|   bycompiler       = {{compiled by}{comp\adddotspace by}}, | ||||
|   byredactor       = {{redacted by}{red\adddotspace by}}, | ||||
|   byreviser        = {{revised by}{rev\adddotspace by}}, | ||||
|   byreviewer       = {{reviewed by}{rev\adddotspace by}}, | ||||
|   byfounder        = {{founded by}{found\adddotspace by}}, | ||||
|   bycontinuator    = {{continued by}{cont\adddotspace by}}, | ||||
|   bycollaborator   = {{in collaboration with}{in collab\adddotspace with}},% FIXME: unsure | ||||
|   bytranslator     = {{translated \lbx@lfromlang\ by}{trans\adddot\ \lbx@sfromlang\ by}}, | ||||
|   bycommentator    = {{commented by}{comm\adddot\ by}}, | ||||
|   byannotator      = {{annotated by}{annot\adddot\ by}}, | ||||
|   withcommentator  = {{with a commentary by}{with a comment\adddot\ by}}, | ||||
|   withannotator    = {{with annotations by}{with annots\adddot\ by}}, | ||||
|   withintroduction = {{with an introduction by}{with an intro\adddot\ by}}, | ||||
|   withforeword     = {{with a foreword by}{with a forew\adddot\ by}}, | ||||
|   withafterword    = {{with an afterword by}{with an afterw\adddot\ by}}, | ||||
|   byeditortr       = {{edited and translated \lbx@lfromlang\ by}% | ||||
|                       {ed\adddotspace and trans\adddot\ \lbx@sfromlang\ by}}, | ||||
|   byeditorco       = {{edited and commented by}% | ||||
|                       {ed\adddotspace and comm\adddot\ by}}, | ||||
|   byeditoran       = {{edited and annotated by}% | ||||
|                       {ed\adddotspace and annot\adddot\ by}}, | ||||
|   byeditorin       = {{edited, with an introduction, by}% | ||||
|                       {ed.,\addabbrvspace with an introd., by}}, | ||||
|   byeditorfo       = {{edited, with a foreword, by}% | ||||
|                       {ed.,\addabbrvspace with a forew., by}}, | ||||
|   byeditoraf       = {{edited, with an afterword, by}% | ||||
|                       {ed.,\addabbrvspace with an afterw., by}}, | ||||
|   byeditortrco     = {{edited, translated \lbx@lfromlang\finalandcomma\ and commented by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and comm\adddot\ by}}, | ||||
|   byeditortran     = {{edited, translated \lbx@lfromlang\finalandcomma\ and annotated by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and annot\adddot\ by}}, | ||||
|   byeditortrin     = {{edited and translated \lbx@lfromlang, with an introduction, by}% | ||||
|                       {ed\adddotspace and trans\adddot\ \lbx@sfromlang, with an introd., by}}, | ||||
|   byeditortrfo     = {{edited and translated \lbx@lfromlang, with a foreword, by}% | ||||
|                       {ed\adddotspace and trans\adddot\ \lbx@sfromlang, with a forew., by}}, | ||||
|   byeditortraf     = {{edited and translated \lbx@lfromlang, with an afterword, by}% | ||||
|                       {ed\adddotspace and trans\adddot\ \lbx@sfromlang, with an afterw., by}}, | ||||
|   byeditorcoin     = {{edited and commented, with an introduction, by}% | ||||
|                       {ed\adddotspace and comm., with an introd., by}}, | ||||
|   byeditorcofo     = {{edited and commented, with a foreword, by}% | ||||
|                       {ed\adddotspace and comm., with a forew., by}}, | ||||
|   byeditorcoaf     = {{edited and commented, with an afterword, by}% | ||||
|                       {ed\adddotspace and comm., with an afterw., by}}, | ||||
|   byeditoranin     = {{edited and annotated, with an introduction, by}% | ||||
|                       {ed\adddotspace and annot., with an introd., by}}, | ||||
|   byeditoranfo     = {{edited and annotated, with a foreword, by}% | ||||
|                       {ed\adddotspace and annot., with a forew., by}}, | ||||
|   byeditoranaf     = {{edited and annotated, with an afterword, by}% | ||||
|                       {ed\adddotspace and annot., with an afterw., by}}, | ||||
|   byeditortrcoin   = {{edited, translated \lbx@lfromlang\finalandcomma\ and commented, with an introduction, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and comm., with an introd., by}}, | ||||
|   byeditortrcofo   = {{edited, translated \lbx@lfromlang\finalandcomma\ and commented, with a foreword, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and comm., with a forew., by}}, | ||||
|   byeditortrcoaf   = {{edited, translated \lbx@lfromlang\finalandcomma\ and commented, with an afterword, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and comm., with an afterw., by}}, | ||||
|   byeditortranin   = {{edited, translated \lbx@lfromlang\finalandcomma\ and annotated, with an introduction, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and annot, with an introd., by}}, | ||||
|   byeditortranfo   = {{edited, translated \lbx@lfromlang\finalandcomma\ and annotated, with a foreword, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and annot, with a forew., by}}, | ||||
|   byeditortranaf   = {{edited, translated \lbx@lfromlang\finalandcomma\ and annotated, with an afterword, by}% | ||||
|                       {ed.,\addabbrvspace trans\adddot\ \lbx@sfromlang\finalandcomma\ and annot, with an afterw., by}}, | ||||
|   bytranslatorco   = {{translated \lbx@lfromlang\ and commented by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and comm\adddot\ by}}, | ||||
|   bytranslatoran   = {{translated \lbx@lfromlang\ and annotated by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and annot\adddot\ by}}, | ||||
|   bytranslatorin   = {{translated \lbx@lfromlang, with an introduction, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang, with an introd., by}}, | ||||
|   bytranslatorfo   = {{translated \lbx@lfromlang, with a foreword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang, with a forew., by}}, | ||||
|   bytranslatoraf   = {{translated \lbx@lfromlang, with an afterword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang, with an afterw., by}}, | ||||
|   bytranslatorcoin = {{translated \lbx@lfromlang\ and commented, with an introduction, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and comm., with an introd., by}}, | ||||
|   bytranslatorcofo = {{translated \lbx@lfromlang\ and commented, with a foreword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and comm., with a forew., by}}, | ||||
|   bytranslatorcoaf = {{translated \lbx@lfromlang\ and commented, with an afterword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and comm., with an afterw., by}}, | ||||
|   bytranslatoranin = {{translated \lbx@lfromlang\ and annotated, with an introduction, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and annot., with an introd., by}}, | ||||
|   bytranslatoranfo = {{translated \lbx@lfromlang\ and annotated, with a foreword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and annot., with a forew., by}}, | ||||
|   bytranslatoranaf = {{translated \lbx@lfromlang\ and annotated, with an afterword, by}% | ||||
|                       {trans\adddot\ \lbx@sfromlang\ and annot., with an afterw., by}}, | ||||
|   and              = {{and}{and}}, | ||||
|   andothers        = {{et\addabbrvspace al\adddot}{et\addabbrvspace al\adddot}}, | ||||
|   andmore          = {{et\addabbrvspace al\adddot}{et\addabbrvspace al\adddot}}, | ||||
|   volume           = {{volume}{vol\adddot}}, | ||||
|   volumes          = {{volumes}{vols\adddot}}, | ||||
|   involumes        = {{in}{in}}, | ||||
|   jourvol          = {{volume}{vol\adddot}}, | ||||
|   jourser          = {{series}{ser\adddot}}, | ||||
|   book             = {{book}{book}}, | ||||
|   part             = {{part}{part}}, | ||||
|   issue            = {{issue}{issue}}, | ||||
|   newseries        = {{new series}{new ser\adddot}}, | ||||
|   oldseries        = {{old series}{old ser\adddot}}, | ||||
|   edition          = {{edition}{ed\adddot}}, | ||||
|   reprint          = {{reprint}{repr\adddot}}, | ||||
|   reprintof        = {{reprint of}{repr\adddotspace of}}, | ||||
|   reprintas        = {{reprinted as}{rpt\adddotspace as}}, | ||||
|   reprintfrom      = {{reprinted from}{repr\adddotspace from}}, | ||||
|   reviewof         = {{review of}{rev\adddotspace of}}, | ||||
|   translationof    = {{translation of}{trans\adddotspace of}}, | ||||
|   translationas    = {{translated as}{trans\adddotspace as}}, | ||||
|   translationfrom  = {{translated from}{trans\adddotspace from}}, | ||||
|   origpubas        = {{originally published as}{orig\adddotspace pub\adddotspace as}}, | ||||
|   origpubin        = {{originally published in}{orig\adddotspace pub\adddotspace in}}, | ||||
|   astitle          = {{as}{as}}, | ||||
|   bypublisher      = {{by}{by}}, | ||||
|   page             = {{page}{p\adddot}}, | ||||
|   pages            = {{pages}{pp\adddot}}, | ||||
|   column           = {{column}{col\adddot}}, | ||||
|   columns          = {{columns}{cols\adddot}}, | ||||
|   line             = {{line}{l\adddot}}, | ||||
|   lines            = {{lines}{ll\adddot}}, | ||||
|   nodate           = {{no date}{n\adddot d\adddot}}, | ||||
|   verse            = {{verse}{v\adddot}}, | ||||
|   verses           = {{verses}{vv\adddot}}, | ||||
|   section          = {{section}{\S}}, | ||||
|   sections         = {{sections}{\S\S}}, | ||||
|   paragraph        = {{paragraph}{par\adddot}}, | ||||
|   paragraphs       = {{paragraphs}{par\adddot}}, | ||||
|   in               = {{in}{in}}, | ||||
|   inseries         = {{in}{in}}, | ||||
|   ofseries         = {{of}{of}}, | ||||
|   number           = {{number}{no\adddot}}, | ||||
|   chapter          = {{chapter}{chap\adddot}}, | ||||
|   mathesis         = {{Master's thesis}{MA\addabbrvspace thesis}}, | ||||
|   phdthesis        = {{PhD\addabbrvspace thesis}{PhD\addabbrvspace thesis}}, | ||||
|   candthesis       = {{Candidate thesis}{Cand\adddotspace thesis}}, | ||||
|   resreport        = {{research report}{research rep\adddot}}, | ||||
|   techreport       = {{technical report}{tech\adddotspace rep\adddot}}, | ||||
|   software         = {{computer software}{comp\adddotspace software}}, | ||||
|   datacd           = {{CD-ROM}{CD-ROM}}, | ||||
|   audiocd          = {{audio CD}{audio CD}}, | ||||
|   version          = {{version}{version}}, | ||||
|   url              = {{address}{address}}, | ||||
|   urlfrom          = {{available from}{available from}}, | ||||
|   urlseen          = {{visited on}{visited on}}, | ||||
|   inpreparation    = {{in preparation}{in preparation}}, | ||||
|   submitted        = {{submitted}{submitted}}, | ||||
|   forthcoming      = {{forthcoming}{forthcoming}}, | ||||
|   inpress          = {{in press}{in press}}, | ||||
|   prepublished     = {{pre-published}{pre-published}}, | ||||
|   citedas          = {{henceforth cited as}{henceforth cited as}}, | ||||
|   thiscite         = {{especially}{esp\adddot}}, | ||||
|   seenote          = {{see note}{see n\adddot}}, | ||||
|   quotedin         = {{quoted in}{qtd\adddotspace in}}, | ||||
|   idem             = {{idem}{idem}}, | ||||
|   idemsm           = {{idem}{idem}}, | ||||
|   idemsf           = {{eadem}{eadem}}, | ||||
|   idemsn           = {{idem}{idem}}, | ||||
|   idempm           = {{eidem}{eidem}}, | ||||
|   idempf           = {{eaedem}{eaedem}}, | ||||
|   idempn           = {{eadem}{eadem}}, | ||||
|   idempp           = {{eidem}{eidem}}, | ||||
|   ibidem           = {{ibidem}{ibid\adddot}}, | ||||
|   opcit            = {{op\adddotspace cit\adddot}{op\adddotspace cit\adddot}}, | ||||
|   loccit           = {{loc\adddotspace cit\adddot}{loc\adddotspace cit\adddot}}, | ||||
|   confer           = {{cf\adddot}{cf\adddot}}, | ||||
|   sequens          = {{sq\adddot}{sq\adddot}}, | ||||
|   sequentes        = {{sqq\adddot}{sqq\adddot}}, | ||||
|   passim           = {{passim}{pass\adddot}}, | ||||
|   see              = {{see}{see}}, | ||||
|   seealso          = {{see also}{see also}}, | ||||
|   backrefpage      = {{cited on page}{cit\adddotspace on p\adddot}}, | ||||
|   backrefpages     = {{cited on pages}{cit\adddotspace on pp\adddot}}, | ||||
|   january          = {{January}{Jan\adddot}}, | ||||
|   february         = {{February}{Feb\adddot}}, | ||||
|   march            = {{March}{Mar\adddot}}, | ||||
|   april            = {{April}{Apr\adddot}}, | ||||
|   may              = {{May}{May}}, | ||||
|   june             = {{June}{June}}, | ||||
|   july             = {{July}{July}}, | ||||
|   august           = {{August}{Aug\adddot}}, | ||||
|   september        = {{September}{Sept\adddot}}, | ||||
|   october          = {{October}{Oct\adddot}}, | ||||
|   november         = {{November}{Nov\adddot}}, | ||||
|   december         = {{December}{Dec\adddot}}, | ||||
|   langamerican     = {{American}{American}}, | ||||
|   langbrazilian    = {{Brazilian}{Brazilian}}, | ||||
|   langcatalan      = {{Catalan}{Catalan}}, | ||||
|   langcroatian     = {{Croatian}{Croatian}}, | ||||
|   langczech        = {{Czech}{Czech}}, | ||||
|   langdanish       = {{Danish}{Danish}}, | ||||
|   langdutch        = {{Dutch}{Dutch}}, | ||||
|   langenglish      = {{English}{English}}, | ||||
|   langfinnish      = {{Finnish}{Finnish}}, | ||||
|   langfrench       = {{French}{French}}, | ||||
|   langgerman       = {{German}{German}}, | ||||
|   langgreek        = {{Greek}{Greek}}, | ||||
|   langitalian      = {{Italian}{Italian}}, | ||||
|   langlatin        = {{Latin}{Latin}}, | ||||
|   langnorwegian    = {{Norwegian}{Norwegian}}, | ||||
|   langpolish       = {{Polish}{Polish}}, | ||||
|   langportuguese   = {{Portuguese}{Portuguese}}, | ||||
|   langrussian      = {{Russian}{Russian}}, | ||||
|   langslovene      = {{Slovene}{Slovene}}, | ||||
|   langspanish      = {{Spanish}{Spanish}}, | ||||
|   langswedish      = {{Swedish}{Swedish}}, | ||||
|   fromamerican     = {{from the American}{from the American}}, | ||||
|   frombrazilian    = {{from the Brazilian}{from the Brazilian}}, | ||||
|   fromcatalan      = {{from the Catalan}{from the Catalan}}, | ||||
|   fromcroatian     = {{from the Croatian}{from the Croatian}}, | ||||
|   fromczech        = {{from the Czech}{from the Czech}}, | ||||
|   fromdanish       = {{from the Danish}{from the Danish}}, | ||||
|   fromdutch        = {{from the Dutch}{from the Dutch}}, | ||||
|   fromenglish      = {{from the English}{from the English}}, | ||||
|   fromfinnish      = {{from the Finnish}{from the Finnish}}, | ||||
|   fromfrench       = {{from the French}{from the French}}, | ||||
|   fromgerman       = {{from the German}{from the German}}, | ||||
|   fromgreek        = {{from the Greek}{from the Greek}}, | ||||
|   fromitalian      = {{from the Italian}{from the Italian}}, | ||||
|   fromlatin        = {{from the Latin}{from the Latin}}, | ||||
|   fromnorwegian    = {{from the Norwegian}{from the Norwegian}}, | ||||
|   frompolish       = {{from the Polish}{from the Polish}}, | ||||
|   fromportuguese   = {{from the Portuguese}{from the Portuguese}}, | ||||
|   fromrussian      = {{from the Russian}{from the Russian}}, | ||||
|   fromslovene      = {{from the Slovene}{from the Slovene}}, | ||||
|   fromspanish      = {{from the Spanish}{from the Spanish}}, | ||||
|   fromswedish      = {{from the Swedish}{from the Swedish}}, | ||||
|   countryde        = {{Germany}{DE}}, | ||||
|   countryeu        = {{European Union}{EU}}, | ||||
|   countryep        = {{European Union}{EP}}, | ||||
|   countryfr        = {{France}{FR}}, | ||||
|   countryuk        = {{United Kingdom}{GB}}, | ||||
|   countryus        = {{United States of America}{US}}, | ||||
|   patent           = {{patent}{pat\adddot}}, | ||||
|   patentde         = {{German patent}{German pat\adddot}}, | ||||
|   patenteu         = {{European patent}{European pat\adddot}}, | ||||
|   patentfr         = {{French patent}{French pat\adddot}}, | ||||
|   patentuk         = {{British patent}{British pat\adddot}}, | ||||
|   patentus         = {{U.S\adddotspace patent}{U.S\adddotspace pat\adddot}}, | ||||
|   patreq           = {{patent request}{pat\adddot\ req\adddot}}, | ||||
|   patreqde         = {{German patent request}{German pat\adddot\ req\adddot}}, | ||||
|   patreqeu         = {{European patent request}{European pat\adddot\ req\adddot}}, | ||||
|   patreqfr         = {{French patent request}{French pat\adddot\ req\adddot}}, | ||||
|   patrequk         = {{British patent request}{British pat\adddot\ req\adddot}}, | ||||
|   patrequs         = {{U.S\adddotspace patent request}{U.S\adddotspace pat\adddot\ req\adddot}}, | ||||
|   file             = {{file}{file}}, | ||||
|   library          = {{library}{library}}, | ||||
|   abstract         = {{abstract}{abstract}}, | ||||
|   annotation       = {{annotations}{annotations}}, | ||||
| } | ||||
|  | ||||
| \protected\gdef\lbx@us@mkbibrangetrunc@long#1#2{% | ||||
|   \iffieldundef{#2year} | ||||
|     {} | ||||
|     {\printtext[#2date]{% | ||||
|        \iffieldsequal{#2year}{#2endyear} | ||||
| 	 {\csuse{mkbibdate#1}{}{#2month}{#2day}} | ||||
| 	 {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}% | ||||
|        \iffieldundef{#2endyear} | ||||
| 	 {} | ||||
| 	 {\iffieldequalstr{#2endyear}{} | ||||
|             {\mbox{\bibdatedash}} | ||||
| 	    {\bibdatedash | ||||
| 	     \iffieldsequal{#2year}{#2endyear} | ||||
| 	       {\iffieldsequal{#2month}{#2endmonth} | ||||
|         	  {\csuse{mkbibdate#1}{#2endyear}{}{#2endday}} | ||||
| 		  {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}} | ||||
| 	       {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}}}}} | ||||
|  | ||||
| \protected\gdef\lbx@us@mkbibrangetrunc@short#1#2{% | ||||
|   \iffieldundef{#2year} | ||||
|     {} | ||||
|     {\printtext[#2date]{% | ||||
|        \iffieldsequal{#2year}{#2endyear} | ||||
|          {\csuse{mkbibdate#1}{}{#2month}{#2day}} | ||||
|          {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}% | ||||
|        \iffieldundef{#2endyear} | ||||
|          {} | ||||
|          {\iffieldequalstr{#2endyear}{} | ||||
|             {\mbox{\bibdatedash}} | ||||
|             {\bibdatedash | ||||
|              \csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}}}} | ||||
|  | ||||
| \protected\gdef\lbx@us@mkbibrangetruncextra@long#1#2{% | ||||
|   \iffieldundef{#2year} | ||||
|     {} | ||||
|     {\printtext[#2date]{% | ||||
|        \iffieldsequal{#2year}{#2endyear} | ||||
|          {\csuse{mkbibdate#1}{}{#2month}{#2day}} | ||||
|          {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}% | ||||
|        \iffieldundef{#2endyear} | ||||
|          {\printfield{extrayear}} | ||||
|          {\iffieldequalstr{#2endyear}{} | ||||
|             {\printfield{extrayear}% | ||||
|              \mbox{\bibdatedash}} | ||||
|             {\bibdatedash | ||||
|              \iffieldsequal{#2year}{#2endyear} | ||||
|                {\iffieldsequal{#2month}{#2endmonth} | ||||
|                   {\csuse{mkbibdate#1}{#2endyear}{}{#2endday}} | ||||
|                   {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}} | ||||
|                {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}% | ||||
|              \printfield{extrayear}}}}}} | ||||
|  | ||||
| \protected\gdef\lbx@us@mkbibrangetruncextra@short#1#2{% | ||||
|   \iffieldundef{#2year} | ||||
|     {} | ||||
|     {\printtext[#2date]{% | ||||
|        \iffieldsequal{#2year}{#2endyear} | ||||
|          {\csuse{mkbibdate#1}{}{#2month}{#2day}} | ||||
|          {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}}% | ||||
|        \iffieldundef{#2endyear} | ||||
|          {\printfield{extrayear}} | ||||
|          {\iffieldequalstr{#2endyear}{} | ||||
|             {\printfield{extrayear}% | ||||
|           \mbox{\bibdatedash}} | ||||
|          {\bibdatedash | ||||
|           \csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% | ||||
|        \printfield{extrayear}}}}}} | ||||
|  | ||||
| \endinput | ||||
							
								
								
									
										6
									
								
								samples/TeX/verbose.bbx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								samples/TeX/verbose.bbx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| \ProvidesFile{verbose.bbx} | ||||
| [\abx@bbxid] | ||||
|  | ||||
| \RequireBibliographyStyle{authortitle} | ||||
|  | ||||
| \endinput | ||||
							
								
								
									
										542
									
								
								samples/XML/filenames/.cproject
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										542
									
								
								samples/XML/filenames/.cproject
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,542 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <?fileVersion 4.0.0?> | ||||
|  | ||||
| <cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||
| 	<storageModule moduleId="org.eclipse.cdt.core.settings"> | ||||
| 		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.1803931088"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.1803931088" moduleId="org.eclipse.cdt.core.settings" name="Debug"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration artifactName="Graph抽象資料結構" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.1803931088" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug"> | ||||
| 					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1803931088." name="/" resourcePath=""> | ||||
| 						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1808064337" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug"> | ||||
| 							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.475427293" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/> | ||||
| 							<builder buildPath="${workspace_loc:/Graph抽象資料結構/Debug}" id="cdt.managedbuild.target.gnu.builder.exe.debug.939020465" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1433738663" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1829995894" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug"> | ||||
| 								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.442000851" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/> | ||||
| 								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.508927038" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> | ||||
| 								<option id="gnu.cpp.compiler.option.include.paths.343012625" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths"/> | ||||
| 								<option id="gnu.cpp.compiler.option.preprocessor.def.432825827" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols"> | ||||
| 									<listOptionValue builtIn="false" value="DEBUG"/> | ||||
| 								</option> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1791758539" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1529597285" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug"> | ||||
| 								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1364110929" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/> | ||||
| 								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1080217050" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> | ||||
| 								<option id="gnu.c.compiler.option.include.paths.1256182591" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths"/> | ||||
| 								<option id="gnu.c.compiler.option.preprocessor.def.symbols.1858410383" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> | ||||
| 									<listOptionValue builtIn="false" value="DEBUG"/> | ||||
| 								</option> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.24351646" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1253142147" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.2139040707" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1870115166" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.2025871733" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1643445921" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 					<sourceEntries> | ||||
| 						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> | ||||
| 					</sourceEntries> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> | ||||
| 		</cconfiguration> | ||||
| 		<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.32754498"> | ||||
| 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.32754498" moduleId="org.eclipse.cdt.core.settings" name="Release"> | ||||
| 				<externalSettings/> | ||||
| 				<extensions> | ||||
| 					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | ||||
| 				</extensions> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 				<configuration artifactName="Graph抽象資料結構" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.32754498" name="Release" parent="cdt.managedbuild.config.gnu.exe.release"> | ||||
| 					<folderInfo id="cdt.managedbuild.config.gnu.exe.release.32754498." name="/" resourcePath=""> | ||||
| 						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1285242355" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release"> | ||||
| 							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.1495976902" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/> | ||||
| 							<builder buildPath="${workspace_loc:/Graph抽象資料結構/Release}" id="cdt.managedbuild.target.gnu.builder.exe.release.1973733698" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1600860298" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1473926095" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release"> | ||||
| 								<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1632726668" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/> | ||||
| 								<option id="gnu.cpp.compiler.exe.release.option.debugging.level.2009085397" name="Debug Level" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/> | ||||
| 								<option id="gnu.cpp.compiler.option.include.paths.1869632172" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths"/> | ||||
| 								<option id="gnu.cpp.compiler.option.preprocessor.def.1246679568" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols"> | ||||
| 									<listOptionValue builtIn="false" value="NDEBUG"/> | ||||
| 								</option> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1744095710" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.478520411" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release"> | ||||
| 								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.1683736183" name="Optimization Level" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/> | ||||
| 								<option id="gnu.c.compiler.exe.release.option.debugging.level.171063916" name="Debug Level" superClass="gnu.c.compiler.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/> | ||||
| 								<option id="gnu.c.compiler.option.include.paths.1466846915" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths"/> | ||||
| 								<option id="gnu.c.compiler.option.preprocessor.def.symbols.659261280" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"> | ||||
| 									<listOptionValue builtIn="false" value="NDEBUG"/> | ||||
| 								</option> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.892999416" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.977357087" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.1587341853" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1655647987" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> | ||||
| 									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | ||||
| 									<additionalInput kind="additionalinput" paths="$(LIBS)"/> | ||||
| 								</inputType> | ||||
| 							</tool> | ||||
| 							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.721843795" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release"> | ||||
| 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.827453761" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> | ||||
| 							</tool> | ||||
| 						</toolChain> | ||||
| 					</folderInfo> | ||||
| 					<sourceEntries> | ||||
| 						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> | ||||
| 					</sourceEntries> | ||||
| 				</configuration> | ||||
| 			</storageModule> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> | ||||
| 			<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> | ||||
| 		</cconfiguration> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||
| 		<project id="Graph抽象資料結構.cdt.managedbuild.target.gnu.exe.1361850129" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="scannerConfiguration"> | ||||
| 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> | ||||
| 		<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="makefileGenerator"> | ||||
| 				<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> | ||||
| 			<buildOutputProvider> | ||||
| 				<openAction enabled="true" filePath=""/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</buildOutputProvider> | ||||
| 			<scannerInfoProvider id="specsFile"> | ||||
| 				<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> | ||||
| 				<parser enabled="true"/> | ||||
| 			</scannerInfoProvider> | ||||
| 		</profile> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1803931088;cdt.managedbuild.config.gnu.exe.debug.1803931088.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1529597285;cdt.managedbuild.tool.gnu.c.compiler.input.24351646"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="makefileGenerator"> | ||||
| 					<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.32754498;cdt.managedbuild.config.gnu.exe.release.32754498.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1473926095;cdt.managedbuild.tool.gnu.cpp.compiler.input.1744095710"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="makefileGenerator"> | ||||
| 					<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1803931088;cdt.managedbuild.config.gnu.exe.debug.1803931088.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1829995894;cdt.managedbuild.tool.gnu.cpp.compiler.input.1791758539"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="makefileGenerator"> | ||||
| 					<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.32754498;cdt.managedbuild.config.gnu.exe.release.32754498.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.478520411;cdt.managedbuild.tool.gnu.c.compiler.input.892999416"> | ||||
| 			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="makefileGenerator"> | ||||
| 					<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/${specs_file}"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'g++ -E -P -v -dD "${plugin_state_location}/specs.cpp"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 			<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> | ||||
| 				<buildOutputProvider> | ||||
| 					<openAction enabled="true" filePath=""/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</buildOutputProvider> | ||||
| 				<scannerInfoProvider id="specsFile"> | ||||
| 					<runAction arguments="-c 'gcc -E -P -v -dD "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/> | ||||
| 					<parser enabled="true"/> | ||||
| 				</scannerInfoProvider> | ||||
| 			</profile> | ||||
| 		</scannerConfigBuildInfo> | ||||
| 	</storageModule> | ||||
| 	<storageModule moduleId="refreshScope"/> | ||||
| </cproject> | ||||
| @@ -140,6 +140,13 @@ class TestBlob < Test::Unit::TestCase | ||||
|     assert !blob("Perl/script.pl").binary? | ||||
|   end | ||||
|  | ||||
|   def test_all_binary | ||||
|     Samples.each do |sample| | ||||
|       blob = blob(sample[:path]) | ||||
|       assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def test_text | ||||
|     assert blob("Text/README").text? | ||||
|     assert blob("Text/dump.sql").text? | ||||
| @@ -185,9 +192,9 @@ class TestBlob < Test::Unit::TestCase | ||||
|     assert !blob("Text/README").generated? | ||||
|  | ||||
|     # Xcode project files | ||||
|     assert blob("XML/MainMenu.xib").generated? | ||||
|     assert !blob("XML/MainMenu.xib").generated? | ||||
|     assert blob("Binary/MainMenu.nib").generated? | ||||
|     assert blob("XML/project.pbxproj").generated? | ||||
|     assert !blob("XML/project.pbxproj").generated? | ||||
|  | ||||
|     # Gemfile.locks | ||||
|     assert blob("Gemfile.lock").generated? | ||||
| @@ -277,7 +284,7 @@ class TestBlob < Test::Unit::TestCase | ||||
|  | ||||
|     # 'thirdparty' directory | ||||
|     assert blob("thirdparty/lib/main.c").vendored? | ||||
|      | ||||
|  | ||||
|     # 'extern(al)' directory | ||||
|     assert blob("extern/util/__init__.py").vendored? | ||||
|     assert blob("external/jquery.min.js").vendored? | ||||
| @@ -386,6 +393,16 @@ class TestBlob < Test::Unit::TestCase | ||||
|     # NuGet Packages | ||||
|     assert blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? | ||||
|  | ||||
|     # Font Awesome | ||||
|     assert blob("some/asset/path/font-awesome.min.css").vendored? | ||||
|     assert blob("some/asset/path/font-awesome.css").vendored? | ||||
|  | ||||
|     # Normalize | ||||
|     assert blob("some/asset/path/normalize.css").vendored? | ||||
|  | ||||
|     # Cocoapods | ||||
|     assert blob('Pods/blah').vendored? | ||||
|  | ||||
|     # Html5shiv | ||||
|     assert blob("Scripts/html5shiv.js").vendored? | ||||
|     assert blob("Scripts/html5shiv.min.js").vendored? | ||||
| @@ -400,6 +417,11 @@ class TestBlob < Test::Unit::TestCase | ||||
|     assert blob("cordova-2.1.0.js").vendored? | ||||
|     assert blob("cordova-2.1.0.min.js").vendored? | ||||
|  | ||||
|     # Foundation js | ||||
|     assert blob("foundation.js").vendored? | ||||
|     assert blob("foundation.min.js").vendored? | ||||
|     assert blob("foundation.abide.js").vendored? | ||||
|  | ||||
|     # Vagrant | ||||
|     assert blob("Vagrantfile").vendored? | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal Lexer['C'], Language['OpenCL'].lexer | ||||
|     assert_equal Lexer['C'], Language['XS'].lexer | ||||
|     assert_equal Lexer['C++'], Language['C++'].lexer | ||||
|     assert_equal Lexer['Chapel'], Language['Chapel'].lexer | ||||
|     assert_equal Lexer['Coldfusion HTML'], Language['ColdFusion'].lexer | ||||
|     assert_equal Lexer['Coq'], Language['Coq'].lexer | ||||
|     assert_equal Lexer['FSharp'], Language['F#'].lexer | ||||
| @@ -32,6 +33,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal Lexer['Java'], Language['ChucK'].lexer | ||||
|     assert_equal Lexer['Java'], Language['Java'].lexer | ||||
|     assert_equal Lexer['JavaScript'], Language['JavaScript'].lexer | ||||
|     assert_equal Lexer['LSL'], Language['LSL'].lexer | ||||
|     assert_equal Lexer['MOOCode'], Language['Moocode'].lexer | ||||
|     assert_equal Lexer['MuPAD'], Language['mupad'].lexer | ||||
|     assert_equal Lexer['NASM'], Language['Assembly'].lexer | ||||
| @@ -45,7 +47,6 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal Lexer['Ruby'], Language['Mirah'].lexer | ||||
|     assert_equal Lexer['Ruby'], Language['Ruby'].lexer | ||||
|     assert_equal Lexer['S'], Language['R'].lexer | ||||
|     assert_equal Lexer['Scheme'], Language['Emacs Lisp'].lexer | ||||
|     assert_equal Lexer['Scheme'], Language['Nu'].lexer | ||||
|     assert_equal Lexer['Racket'], Language['Racket'].lexer | ||||
|     assert_equal Lexer['Scheme'], Language['Scheme'].lexer | ||||
| @@ -71,6 +72,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal Language['C'], Language.find_by_alias('c') | ||||
|     assert_equal Language['C++'], Language.find_by_alias('c++') | ||||
|     assert_equal Language['C++'], Language.find_by_alias('cpp') | ||||
|     assert_equal Language['Chapel'], Language.find_by_alias('chpl') | ||||
|     assert_equal Language['CoffeeScript'], Language.find_by_alias('coffee') | ||||
|     assert_equal Language['CoffeeScript'], Language.find_by_alias('coffee-script') | ||||
|     assert_equal Language['ColdFusion'], Language.find_by_alias('cfm') | ||||
| @@ -167,7 +169,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal 'pot',           Language['Gettext Catalog'].search_term | ||||
|     assert_equal 'irc',           Language['IRC log'].search_term | ||||
|     assert_equal 'lhs',           Language['Literate Haskell'].search_term | ||||
|     assert_equal 'ruby',          Language['Mirah'].search_term | ||||
|     assert_equal 'mirah',         Language['Mirah'].search_term | ||||
|     assert_equal 'raw',           Language['Raw token data'].search_term | ||||
|     assert_equal 'bash',          Language['Shell'].search_term | ||||
|     assert_equal 'vim',           Language['VimL'].search_term | ||||
| @@ -185,6 +187,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|  | ||||
|   def test_programming | ||||
|     assert_equal :programming, Language['JavaScript'].type | ||||
|     assert_equal :programming, Language['LSL'].type | ||||
|     assert_equal :programming, Language['Perl'].type | ||||
|     assert_equal :programming, Language['PowerShell'].type | ||||
|     assert_equal :programming, Language['Python'].type | ||||
| @@ -249,13 +252,13 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal Language['Nginx'], Language.find_by_filename('nginx.conf').first | ||||
|     assert_equal ['C', 'C++', 'Objective-C'], Language.find_by_filename('foo.h').map(&:name).sort | ||||
|     assert_equal [], Language.find_by_filename('rb') | ||||
|     assert_equal [], Language.find_by_filename('.rb') | ||||
|     assert_equal [], Language.find_by_filename('.nkt') | ||||
|     assert_equal [], Language.find_by_filename('.null') | ||||
|     assert_equal [Language['Shell']], Language.find_by_filename('.bashrc') | ||||
|     assert_equal [Language['Shell']], Language.find_by_filename('bash_profile') | ||||
|     assert_equal [Language['Shell']], Language.find_by_filename('.zshrc') | ||||
|     assert_equal [Language['Clojure']], Language.find_by_filename('riemann.config') | ||||
|     assert_equal [Language['HTML+Django']], Language.find_by_filename('index.jinja') | ||||
|     assert_equal [Language['Chapel']], Language.find_by_filename('examples/hello.chpl') | ||||
|   end | ||||
|  | ||||
|   def test_find_by_shebang | ||||
| @@ -325,6 +328,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal '#3581ba', Language['Python'].color | ||||
|     assert_equal '#f1e05a', Language['JavaScript'].color | ||||
|     assert_equal '#31859c', Language['TypeScript'].color | ||||
|     assert_equal '#3d9970', Language['LSL'].color | ||||
|   end | ||||
|  | ||||
|   def test_colors | ||||
| @@ -337,6 +341,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|     assert_equal 'coffee', Language['CoffeeScript'].ace_mode | ||||
|     assert_equal 'csharp', Language['C#'].ace_mode | ||||
|     assert_equal 'css', Language['CSS'].ace_mode | ||||
|     assert_equal 'lsl', Language['LSL'].ace_mode | ||||
|     assert_equal 'javascript', Language['JavaScript'].ace_mode | ||||
|   end | ||||
|  | ||||
| @@ -351,6 +356,7 @@ class TestLanguage < Test::Unit::TestCase | ||||
|   end | ||||
|  | ||||
|   def test_extensions | ||||
|     assert Language['LSL'].extensions.include?('.lsl') | ||||
|     assert Language['Perl'].extensions.include?('.pl') | ||||
|     assert Language['Python'].extensions.include?('.py') | ||||
|     assert Language['Ruby'].extensions.include?('.rb') | ||||
|   | ||||
| @@ -35,15 +35,33 @@ class TestSamples < Test::Unit::TestCase | ||||
|     assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c } | ||||
|     assert_equal data['tokens_total'], data['tokens'].inject(0) { |n, (_, ts)| n += ts.inject(0) { |m, (_, c)| m += c } } | ||||
|   end | ||||
|    | ||||
|  | ||||
|   # Check that there aren't samples with extensions that aren't explicitly defined in languages.yml | ||||
|   def test_parity | ||||
|     extensions = Samples::DATA['extnames'] | ||||
|     languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__) | ||||
|     languages = YAML.load_file(languages_yml) | ||||
|  | ||||
|     languages.each do |name, options| | ||||
|       options['extensions'] ||= [] | ||||
|  | ||||
|       if extnames = extensions[name] | ||||
|         extnames.each do |extname| | ||||
|           next if extname == '.script!' | ||||
|           assert options['extensions'].include?(extname), "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   # If a language extension isn't globally unique then make sure there are samples | ||||
|   def test_presence | ||||
|     Linguist::Language.all.each do |language| | ||||
|       language.all_extensions.each do |extension| | ||||
|         language_matches = Language.find_by_filename("foo#{extension}") | ||||
|          | ||||
|  | ||||
|         # If there is more than one language match for a given extension | ||||
|         # then check that there are examples for that language with the extension  | ||||
|         # then check that there are examples for that language with the extension | ||||
|         if language_matches.length > 1 | ||||
|           language_matches.each do |language| | ||||
|             assert File.directory?("samples/#{language.name}"), "#{language.name} is missing a samples directory" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user