mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			29 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fc435a2541 | ||
|  | 04394750e7 | ||
|  | e415a1351b | ||
|  | 6ec907a915 | ||
|  | 1f55f01fa9 | ||
|  | 5d79b88875 | ||
|  | 458890b4b9 | ||
|  | 89267f792d | ||
|  | b183fcca05 | ||
|  | 684a57dbc0 | ||
|  | 400086a5c8 | ||
|  | 38b966a554 | ||
|  | 31b0df67b7 | ||
|  | cfe496e9fc | ||
|  | b85aeaad3e | ||
|  | 64f3509222 | ||
|  | f8df871d85 | ||
|  | 620150d188 | ||
|  | 630dca515a | ||
|  | d2de997fcc | ||
|  | b8711f8ccf | ||
|  | 34aaab19b2 | ||
|  | 220108857c | ||
|  | 657adaabec | ||
|  | a41f40a30e | ||
|  | 080cd097ba | ||
|  | 866e446dbe | ||
|  | 897f39083d | ||
|  | f8a7d11808 | 
| @@ -23,7 +23,6 @@ elsif File.file?(path) | |||||||
|  |  | ||||||
|   puts "#{blob.name}: #{blob.loc} lines (#{blob.sloc} sloc)" |   puts "#{blob.name}: #{blob.loc} lines (#{blob.sloc} sloc)" | ||||||
|   puts "  type:      #{type}" |   puts "  type:      #{type}" | ||||||
|   puts "  extension: #{blob.pathname.extname}" |  | ||||||
|   puts "  mime type: #{blob.mime_type}" |   puts "  mime type: #{blob.mime_type}" | ||||||
|   puts "  language:  #{blob.language}" |   puts "  language:  #{blob.language}" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| Gem::Specification.new do |s| | Gem::Specification.new do |s| | ||||||
|   s.name    = 'github-linguist' |   s.name    = 'github-linguist' | ||||||
|   s.version = '2.2.1' |   s.version = '2.3.2' | ||||||
|   s.summary = "GitHub Language detection" |   s.summary = "GitHub Language detection" | ||||||
|  |  | ||||||
|   s.authors = "GitHub" |   s.authors = "GitHub" | ||||||
| @@ -10,8 +10,9 @@ Gem::Specification.new do |s| | |||||||
|  |  | ||||||
|   s.add_dependency 'charlock_holmes', '~> 0.6.6' |   s.add_dependency 'charlock_holmes', '~> 0.6.6' | ||||||
|   s.add_dependency 'escape_utils',    '~> 0.2.3' |   s.add_dependency 'escape_utils',    '~> 0.2.3' | ||||||
|   s.add_dependency 'mime-types',      '~> 1.18' |   s.add_dependency 'mime-types',      '~> 1.19' | ||||||
|   s.add_dependency 'pygments.rb',     '>= 0.2.13' |   s.add_dependency 'pygments.rb',     '>= 0.2.13' | ||||||
|  |   s.add_development_dependency 'mocha' | ||||||
|   s.add_development_dependency 'json' |   s.add_development_dependency 'json' | ||||||
|   s.add_development_dependency 'rake' |   s.add_development_dependency 'rake' | ||||||
|   s.add_development_dependency 'yajl-ruby' |   s.add_development_dependency 'yajl-ruby' | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| require 'linguist/blob_helper' | require 'linguist/blob_helper' | ||||||
| require 'linguist/generated' | require 'linguist/generated' | ||||||
| require 'linguist/language' | require 'linguist/language' | ||||||
| require 'linguist/mime' |  | ||||||
| require 'linguist/repository' | require 'linguist/repository' | ||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| require 'linguist/generated' | require 'linguist/generated' | ||||||
| require 'linguist/language' | require 'linguist/language' | ||||||
| require 'linguist/mime' |  | ||||||
|  |  | ||||||
| require 'charlock_holmes' | require 'charlock_holmes' | ||||||
| require 'escape_utils' | require 'escape_utils' | ||||||
|  | require 'mime/types' | ||||||
| require 'pygments' | require 'pygments' | ||||||
| require 'yaml' | require 'yaml' | ||||||
|  |  | ||||||
| @@ -23,6 +23,22 @@ module Linguist | |||||||
|       File.extname(name.to_s) |       File.extname(name.to_s) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Internal: Lookup mime type for extension. | ||||||
|  |     # | ||||||
|  |     # Returns a MIME::Type | ||||||
|  |     def _mime_type | ||||||
|  |       if defined? @_mime_type | ||||||
|  |         @_mime_type | ||||||
|  |       else | ||||||
|  |         guesses = ::MIME::Types.type_for(extname.to_s) | ||||||
|  |  | ||||||
|  |         # Prefer text mime types over binary | ||||||
|  |         @_mime_type = guesses.detect { |type| type.ascii? } || | ||||||
|  |           # Otherwise use the first guess | ||||||
|  |           guesses.first | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |  | ||||||
|     # Public: Get the actual blob mime type |     # Public: Get the actual blob mime type | ||||||
|     # |     # | ||||||
|     # Examples |     # Examples | ||||||
| @@ -32,7 +48,14 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns a mime type String. |     # Returns a mime type String. | ||||||
|     def mime_type |     def mime_type | ||||||
|       @mime_type ||= Mime.mime_for(extname.to_s) |       _mime_type ? _mime_type.to_s : 'text/plain' | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     # Internal: Is the blob binary according to its mime type | ||||||
|  |     # | ||||||
|  |     # Return true or false | ||||||
|  |     def binary_mime_type? | ||||||
|  |       _mime_type ? _mime_type.binary? : false | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Get the Content-Type header value |     # Public: Get the Content-Type header value | ||||||
| @@ -83,15 +106,6 @@ module Linguist | |||||||
|       @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data |       @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Public: Is the blob binary according to its mime type |  | ||||||
|     # |  | ||||||
|     # Return true or false |  | ||||||
|     def binary_mime_type? |  | ||||||
|       if mime_type = Mime.lookup_mime_type_for(extname) |  | ||||||
|         mime_type.binary? |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     # Public: Is the blob binary? |     # Public: Is the blob binary? | ||||||
|     # |     # | ||||||
|     # Return true or false |     # Return true or false | ||||||
| @@ -146,7 +160,7 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Return true or false |     # Return true or false | ||||||
|     def safe_to_colorize? |     def safe_to_colorize? | ||||||
|       text? && !large? && !high_ratio_of_long_lines? |       !large? && text? && !high_ratio_of_long_lines? | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Does the blob have a ratio of long lines? |     # Internal: Does the blob have a ratio of long lines? | ||||||
| @@ -236,7 +250,9 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Return true or false |     # Return true or false | ||||||
|     def indexable? |     def indexable? | ||||||
|       if binary? |       if size > 100 * 1024 | ||||||
|  |         false | ||||||
|  |       elsif binary? | ||||||
|         false |         false | ||||||
|       elsif extname == '.txt' |       elsif extname == '.txt' | ||||||
|         true |         true | ||||||
| @@ -246,8 +262,6 @@ module Linguist | |||||||
|         false |         false | ||||||
|       elsif generated? |       elsif generated? | ||||||
|         false |         false | ||||||
|       elsif size > 100 * 1024 |  | ||||||
|         false |  | ||||||
|       else |       else | ||||||
|         true |         true | ||||||
|       end |       end | ||||||
| @@ -259,11 +273,15 @@ module Linguist | |||||||
|     # |     # | ||||||
|     # Returns a Language or nil if none is detected |     # Returns a Language or nil if none is detected | ||||||
|     def language |     def language | ||||||
|       if defined? @language |       return @language if defined? @language | ||||||
|         @language |  | ||||||
|       elsif !binary_mime_type? |       if defined?(@data) && @data.is_a?(String) | ||||||
|         @language = Language.detect(name.to_s, lambda { data }, mode) |         data = @data | ||||||
|  |       else | ||||||
|  |         data = lambda { binary_mime_type? ? "" : self.data } | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  |       @language = Language.detect(name.to_s, data, mode) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     # Internal: Get the lexer of the blob. |     # Internal: Get the lexer of the blob. | ||||||
|   | |||||||
| @@ -1,91 +0,0 @@ | |||||||
| require 'mime/types' |  | ||||||
| require 'yaml' |  | ||||||
|  |  | ||||||
| class MIME::Type |  | ||||||
|   attr_accessor :override |  | ||||||
| end |  | ||||||
|  |  | ||||||
| # Register additional mime type extensions |  | ||||||
| # |  | ||||||
| # Follows same format as mime-types data file |  | ||||||
| #   https://github.com/halostatue/mime-types/blob/master/lib/mime/types.rb.data |  | ||||||
| File.read(File.expand_path("../mimes.yml", __FILE__)).lines.each do |line| |  | ||||||
|   # Regexp was cargo culted from mime-types lib |  | ||||||
|   next unless line =~ %r{^ |  | ||||||
|     #{MIME::Type::MEDIA_TYPE_RE} |  | ||||||
|     (?:\s@([^\s]+))? |  | ||||||
|     (?:\s:(#{MIME::Type::ENCODING_RE}))? |  | ||||||
|   }x |  | ||||||
|  |  | ||||||
|   mediatype  = $1 |  | ||||||
|   subtype    = $2 |  | ||||||
|   extensions = $3 |  | ||||||
|   encoding   = $4 |  | ||||||
|  |  | ||||||
|   # Lookup existing mime type |  | ||||||
|   mime_type = MIME::Types["#{mediatype}/#{subtype}"].first || |  | ||||||
|     # Or create a new instance |  | ||||||
|     MIME::Type.new("#{mediatype}/#{subtype}") |  | ||||||
|  |  | ||||||
|   if extensions |  | ||||||
|     extensions.split(/,/).each do |extension| |  | ||||||
|       mime_type.extensions << extension |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   if encoding |  | ||||||
|     mime_type.encoding = encoding |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   mime_type.override = true |  | ||||||
|  |  | ||||||
|   # Kind of hacky, but we need to reindex the mime type after making changes |  | ||||||
|   MIME::Types.add_type_variant(mime_type) |  | ||||||
|   MIME::Types.index_extensions(mime_type) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| module Linguist |  | ||||||
|   module Mime |  | ||||||
|     # Internal: Look up mime type for extension. |  | ||||||
|     # |  | ||||||
|     # ext - The extension String. May include leading "." |  | ||||||
|     # |  | ||||||
|     # Examples |  | ||||||
|     # |  | ||||||
|     #   Mime.mime_for('.html') |  | ||||||
|     #   # => 'text/html' |  | ||||||
|     # |  | ||||||
|     #   Mime.mime_for('txt') |  | ||||||
|     #   # => 'text/plain' |  | ||||||
|     # |  | ||||||
|     # Return mime type String otherwise falls back to 'text/plain'. |  | ||||||
|     def self.mime_for(ext) |  | ||||||
|       mime_type = lookup_mime_type_for(ext) |  | ||||||
|       mime_type ? mime_type.to_s : 'text/plain' |  | ||||||
|     end |  | ||||||
|  |  | ||||||
|     # Internal: Lookup mime type for extension or mime type |  | ||||||
|     # |  | ||||||
|     # ext_or_mime_type - A file extension ".txt" or mime type "text/plain". |  | ||||||
|     # |  | ||||||
|     # Returns a MIME::Type |  | ||||||
|     def self.lookup_mime_type_for(ext_or_mime_type) |  | ||||||
|       ext_or_mime_type ||= '' |  | ||||||
|  |  | ||||||
|       if ext_or_mime_type =~ /\w+\/\w+/ |  | ||||||
|         guesses = ::MIME::Types[ext_or_mime_type] |  | ||||||
|       else |  | ||||||
|         guesses = ::MIME::Types.type_for(ext_or_mime_type) |  | ||||||
|       end |  | ||||||
|  |  | ||||||
|       # Use custom override first |  | ||||||
|       guesses.detect { |type| type.override } || |  | ||||||
|  |  | ||||||
|         # Prefer text mime types over binary |  | ||||||
|         guesses.detect { |type| type.ascii? } || |  | ||||||
|  |  | ||||||
|         # Otherwise use the first guess |  | ||||||
|         guesses.first |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
| @@ -1,62 +0,0 @@ | |||||||
| # Additional types to add to MIME::Types |  | ||||||
| # |  | ||||||
| # MIME types are used to set the Content-Type of raw binary blobs. All text |  | ||||||
| # blobs are served as text/plain regardless of their type to ensure they |  | ||||||
| # open in the browser rather than downloading. |  | ||||||
| # |  | ||||||
| # The encoding helps determine whether a file should be treated as plain |  | ||||||
| # text or binary. By default, a mime type's encoding is base64 (binary). |  | ||||||
| # These types will show a "View Raw" link. To force a type to render as |  | ||||||
| # plain text, set it to 8bit for UTF-8. text/* types will be treated as |  | ||||||
| # text by default. |  | ||||||
| # |  | ||||||
| #   <type> @<extensions> :<encoding> |  | ||||||
| # |  | ||||||
| # type       - mediatype/subtype |  | ||||||
| # extensions - comma seperated extension list |  | ||||||
| # encoding   - base64 (binary), 7bit (ASCII), 8bit (UTF-8), or |  | ||||||
| #              quoted-printable (Printable ASCII). |  | ||||||
| # |  | ||||||
| # Follows same format as mime-types data file |  | ||||||
| #   https://github.com/halostatue/mime-types/blob/master/lib/mime/types.rb.data |  | ||||||
| # |  | ||||||
| # Any additions or modifications (even trivial) should have corresponding |  | ||||||
| # test change in `test/test_mime.rb`. |  | ||||||
|  |  | ||||||
| # TODO: Lookup actual types |  | ||||||
| application/octet-stream @a,blend,gem,graffle,ipa,lib,mcz,nib,o,ogv,otf,pfx,pigx,plgx,psd,sib,spl,sqlite3,swc,ucode,xpi |  | ||||||
|  |  | ||||||
| # Please keep this list alphabetized |  | ||||||
| application/java-archive @ear,war |  | ||||||
| application/netcdf :8bit |  | ||||||
| application/ogg @ogg |  | ||||||
| application/postscript :base64 |  | ||||||
| application/vnd.adobe.air-application-installer-package+zip @air |  | ||||||
| application/vnd.mozilla.xul+xml :8bit |  | ||||||
| application/vnd.oasis.opendocument.presentation @odp |  | ||||||
| application/vnd.oasis.opendocument.spreadsheet @ods |  | ||||||
| application/vnd.oasis.opendocument.text @odt |  | ||||||
| application/vnd.openofficeorg.extension @oxt |  | ||||||
| application/vnd.openxmlformats-officedocument.presentationml.presentation @pptx |  | ||||||
| application/x-chrome-extension @crx |  | ||||||
| application/x-iwork-keynote-sffkey @key |  | ||||||
| application/x-iwork-numbers-sffnumbers @numbers |  | ||||||
| application/x-iwork-pages-sffpages @pages |  | ||||||
| application/x-ms-xbap @xbap :8bit |  | ||||||
| application/x-parrot-bytecode @pbc |  | ||||||
| application/x-shockwave-flash @swf |  | ||||||
| application/x-silverlight-app @xap |  | ||||||
| application/x-supercollider @sc :8bit |  | ||||||
| application/x-troff-ms :8bit |  | ||||||
| application/x-wais-source :8bit |  | ||||||
| application/xaml+xml @xaml :8bit |  | ||||||
| application/xslt+xml @xslt :8bit |  | ||||||
| image/x-icns @icns |  | ||||||
| text/cache-manifest @manifest |  | ||||||
| text/plain @cu,cxx |  | ||||||
| text/x-logtalk @lgt |  | ||||||
| text/x-nemerle @n |  | ||||||
| text/x-nimrod @nim |  | ||||||
| text/x-ocaml @ml,mli,mll,mly,sig,sml |  | ||||||
| text/x-rust @rs,rc |  | ||||||
| text/x-scheme @rkt,scm,sls,sps,ss |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -16,12 +16,18 @@ module Linguist | |||||||
|       new.extract_tokens(data) |       new.extract_tokens(data) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     # Read up to 100KB | ||||||
|  |     BYTE_LIMIT = 100_000 | ||||||
|  |  | ||||||
|  |     # Start state on token, ignore anything till the next newline | ||||||
|     SINGLE_LINE_COMMENTS = [ |     SINGLE_LINE_COMMENTS = [ | ||||||
|       '//', # C |       '//', # C | ||||||
|       '#',  # Ruby |       '#',  # Ruby | ||||||
|       '%',  # Tex |       '%',  # Tex | ||||||
|     ] |     ] | ||||||
|  |  | ||||||
|  |     # Start state on opening token, ignore anything until the closing | ||||||
|  |     # token is reached. | ||||||
|     MULTI_LINE_COMMENTS = [ |     MULTI_LINE_COMMENTS = [ | ||||||
|       ['/*', '*/'],    # C |       ['/*', '*/'],    # C | ||||||
|       ['<!--', '-->'], # XML |       ['<!--', '-->'], # XML | ||||||
| @@ -30,7 +36,7 @@ module Linguist | |||||||
|     ] |     ] | ||||||
|  |  | ||||||
|     START_SINGLE_LINE_COMMENT =  Regexp.compile(SINGLE_LINE_COMMENTS.map { |c| |     START_SINGLE_LINE_COMMENT =  Regexp.compile(SINGLE_LINE_COMMENTS.map { |c| | ||||||
|       "^\s*#{Regexp.escape(c)} " |       "\s*#{Regexp.escape(c)} " | ||||||
|     }.join("|")) |     }.join("|")) | ||||||
|  |  | ||||||
|     START_MULTI_LINE_COMMENT =  Regexp.compile(MULTI_LINE_COMMENTS.map { |c| |     START_MULTI_LINE_COMMENT =  Regexp.compile(MULTI_LINE_COMMENTS.map { |c| | ||||||
| @@ -52,22 +58,24 @@ module Linguist | |||||||
|  |  | ||||||
|       tokens = [] |       tokens = [] | ||||||
|       until s.eos? |       until s.eos? | ||||||
|  |         break if s.pos >= BYTE_LIMIT | ||||||
|  |  | ||||||
|         if token = s.scan(/^#!.+$/) |         if token = s.scan(/^#!.+$/) | ||||||
|           if name = extract_shebang(token) |           if name = extract_shebang(token) | ||||||
|             tokens << "SHEBANG#!#{name}" |             tokens << "SHEBANG#!#{name}" | ||||||
|           end |           end | ||||||
|  |  | ||||||
|         # Single line comment |         # Single line comment | ||||||
|         elsif token = s.scan(START_SINGLE_LINE_COMMENT) |         elsif s.beginning_of_line? && token = s.scan(START_SINGLE_LINE_COMMENT) | ||||||
|           tokens << token.strip |           # tokens << token.strip | ||||||
|           s.skip_until(/\n|\Z/) |           s.skip_until(/\n|\Z/) | ||||||
|  |  | ||||||
|         # Multiline comments |         # Multiline comments | ||||||
|         elsif token = s.scan(START_MULTI_LINE_COMMENT) |         elsif token = s.scan(START_MULTI_LINE_COMMENT) | ||||||
|           tokens << token |           # tokens << token | ||||||
|           close_token = MULTI_LINE_COMMENTS.assoc(token)[1] |           close_token = MULTI_LINE_COMMENTS.assoc(token)[1] | ||||||
|           s.skip_until(Regexp.compile(Regexp.escape(close_token))) |           s.skip_until(Regexp.compile(Regexp.escape(close_token))) | ||||||
|           tokens << close_token |           # tokens << close_token | ||||||
|  |  | ||||||
|         # Skip single or double quoted strings |         # Skip single or double quoted strings | ||||||
|         elsif s.scan(/"/) |         elsif s.scan(/"/) | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								samples/C++/gdsdbreader.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								samples/C++/gdsdbreader.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | #ifndef GDSDBREADER_H | ||||||
|  | #define GDSDBREADER_H | ||||||
|  |  | ||||||
|  | // This file contains core structures, classes and types for the entire gds app | ||||||
|  | // WARNING: DO NOT MODIFY UNTIL IT'S STRICTLY NECESSARY | ||||||
|  |  | ||||||
|  | #include <QDir> | ||||||
|  | #include "diagramwidget/qgldiagramwidget.h" | ||||||
|  |  | ||||||
|  | #define GDS_DIR "gdsdata" | ||||||
|  |  | ||||||
|  | enum level {LEVEL_ONE, LEVEL_TWO, LEVEL_THREE}; | ||||||
|  |  | ||||||
|  | // The internal structure of the db to store information about each node (each level) | ||||||
|  | // this will be serialized before being written to file | ||||||
|  | class dbDataStructure | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     QString label; | ||||||
|  |     quint32 depth; | ||||||
|  |     quint32 userIndex; | ||||||
|  |     QByteArray data;    // This is COMPRESSED data, optimize ram and disk space, is decompressed | ||||||
|  |                         // just when needed (to display the comments) | ||||||
|  |  | ||||||
|  |     // The following ID is used to create second-third level files | ||||||
|  |     quint64 uniqueID; | ||||||
|  |     // All the next items linked to this one | ||||||
|  |     QVector<dbDataStructure*> nextItems; | ||||||
|  |     // Corresponding indices vector (used to store data) | ||||||
|  |     QVector<quint32> nextItemsIndices; | ||||||
|  |     // The father element (or NULL if it's root) | ||||||
|  |     dbDataStructure* father; | ||||||
|  |     // Corresponding indices vector (used to store data) | ||||||
|  |     quint32 fatherIndex; | ||||||
|  |     bool noFatherRoot; // Used to tell if this node is the root (so hasn't a father) | ||||||
|  |  | ||||||
|  |     // These fields will be useful for levels 2 and 3 | ||||||
|  |     QString fileName; // Relative filename for the associated code file | ||||||
|  |     QByteArray firstLineData; // Compressed first line data, this will be used with the line number to retrieve info | ||||||
|  |     QVector<quint32> linesNumbers; // First and next lines (next are relative to the first) numbers | ||||||
|  |  | ||||||
|  |     // -- Generic system data not to be stored on disk | ||||||
|  |     void *glPointer; // GL pointer | ||||||
|  |  | ||||||
|  |     // These operator overrides prevent the glPointer and other non-disk-necessary data serialization | ||||||
|  |     friend QDataStream& operator<<(QDataStream& stream, const dbDataStructure& myclass) | ||||||
|  |     // Notice: this function has to be "friend" because it cannot be a member function, member functions | ||||||
|  |     // have an additional parameter "this" which isn't in the argument list of an operator overload. A friend | ||||||
|  |     // function has full access to private data of the class without having the "this" argument | ||||||
|  |     { | ||||||
|  |         // Don't write glPointer and every pointer-dependent structure | ||||||
|  |         return stream << myclass.label << myclass.depth << myclass.userIndex << qCompress(myclass.data) | ||||||
|  |                          << myclass.uniqueID << myclass.nextItemsIndices << myclass.fatherIndex << myclass.noFatherRoot | ||||||
|  |                             << myclass.fileName << qCompress(myclass.firstLineData) << myclass.linesNumbers; | ||||||
|  |     } | ||||||
|  |     friend QDataStream& operator>>(QDataStream& stream, dbDataStructure& myclass) | ||||||
|  |     { | ||||||
|  |         //Don't read it, either | ||||||
|  |         stream >> myclass.label >> myclass.depth >> myclass.userIndex >> myclass.data | ||||||
|  |                       >> myclass.uniqueID >> myclass.nextItemsIndices >> myclass.fatherIndex >> myclass.noFatherRoot | ||||||
|  |                          >> myclass.fileName >> myclass.firstLineData >> myclass.linesNumbers; | ||||||
|  |         myclass.data = qUncompress(myclass.data); | ||||||
|  |         myclass.firstLineData = qUncompress(myclass.firstLineData); | ||||||
|  |         return stream; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif // GDSDBREADER_H | ||||||
							
								
								
									
										415
									
								
								samples/C++/qscicommand.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										415
									
								
								samples/C++/qscicommand.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,415 @@ | |||||||
|  | // This defines the interface to the QsciCommand class. | ||||||
|  | // | ||||||
|  | // Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com> | ||||||
|  | //  | ||||||
|  | // This file is part of QScintilla. | ||||||
|  | //  | ||||||
|  | // This file may be used under the terms of the GNU General Public | ||||||
|  | // License versions 2.0 or 3.0 as published by the Free Software | ||||||
|  | // Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 | ||||||
|  | // included in the packaging of this file.  Alternatively you may (at | ||||||
|  | // your option) use any later version of the GNU General Public | ||||||
|  | // License if such license has been publicly approved by Riverbank | ||||||
|  | // Computing Limited (or its successors, if any) and the KDE Free Qt | ||||||
|  | // Foundation. In addition, as a special exception, Riverbank gives you | ||||||
|  | // certain additional rights. These rights are described in the Riverbank | ||||||
|  | // GPL Exception version 1.1, which can be found in the file | ||||||
|  | // GPL_EXCEPTION.txt in this package. | ||||||
|  | //  | ||||||
|  | // If you are unsure which license is appropriate for your use, please | ||||||
|  | // contact the sales department at sales@riverbankcomputing.com. | ||||||
|  | //  | ||||||
|  | // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||||||
|  | // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef QSCICOMMAND_H | ||||||
|  | #define QSCICOMMAND_H | ||||||
|  |  | ||||||
|  | #ifdef __APPLE__ | ||||||
|  | extern "C++" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <qstring.h> | ||||||
|  |  | ||||||
|  | #include <Qsci/qsciglobal.h> | ||||||
|  | #include <Qsci/qsciscintillabase.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class QsciScintilla; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! \brief The QsciCommand class represents an internal editor command that may | ||||||
|  | //! have one or two keys bound to it. | ||||||
|  | //! | ||||||
|  | //! Methods are provided to change the keys bound to the command and to remove | ||||||
|  | //! a key binding.  Each command has a user friendly description of the command | ||||||
|  | //! for use in key mapping dialogs. | ||||||
|  | class QSCINTILLA_EXPORT QsciCommand | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     //! This enum defines the different commands that can be assigned to a key. | ||||||
|  |     enum Command { | ||||||
|  |         //! Move down one line. | ||||||
|  |         LineDown = QsciScintillaBase::SCI_LINEDOWN, | ||||||
|  |  | ||||||
|  |         //! Extend the selection down one line. | ||||||
|  |         LineDownExtend = QsciScintillaBase::SCI_LINEDOWNEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection down one line. | ||||||
|  |         LineDownRectExtend = QsciScintillaBase::SCI_LINEDOWNRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Scroll the view down one line. | ||||||
|  |         LineScrollDown = QsciScintillaBase::SCI_LINESCROLLDOWN, | ||||||
|  |  | ||||||
|  |         //! Move up one line. | ||||||
|  |         LineUp = QsciScintillaBase::SCI_LINEUP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection up one line. | ||||||
|  |         LineUpExtend = QsciScintillaBase::SCI_LINEUPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection up one line. | ||||||
|  |         LineUpRectExtend = QsciScintillaBase::SCI_LINEUPRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Scroll the view up one line. | ||||||
|  |         LineScrollUp = QsciScintillaBase::SCI_LINESCROLLUP, | ||||||
|  |  | ||||||
|  |         //! Scroll to the start of the document. | ||||||
|  |         ScrollToStart = QsciScintillaBase::SCI_SCROLLTOSTART, | ||||||
|  |  | ||||||
|  |         //! Scroll to the end of the document. | ||||||
|  |         ScrollToEnd = QsciScintillaBase::SCI_SCROLLTOEND, | ||||||
|  |  | ||||||
|  |         //! Scroll vertically to centre the current line. | ||||||
|  |         VerticalCentreCaret = QsciScintillaBase::SCI_VERTICALCENTRECARET, | ||||||
|  |  | ||||||
|  |         //! Move down one paragraph. | ||||||
|  |         ParaDown = QsciScintillaBase::SCI_PARADOWN, | ||||||
|  |  | ||||||
|  |         //! Extend the selection down one paragraph. | ||||||
|  |         ParaDownExtend = QsciScintillaBase::SCI_PARADOWNEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move up one paragraph. | ||||||
|  |         ParaUp = QsciScintillaBase::SCI_PARAUP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection up one paragraph. | ||||||
|  |         ParaUpExtend = QsciScintillaBase::SCI_PARAUPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move left one character. | ||||||
|  |         CharLeft = QsciScintillaBase::SCI_CHARLEFT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection left one character. | ||||||
|  |         CharLeftExtend = QsciScintillaBase::SCI_CHARLEFTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection left one character. | ||||||
|  |         CharLeftRectExtend = QsciScintillaBase::SCI_CHARLEFTRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move right one character. | ||||||
|  |         CharRight = QsciScintillaBase::SCI_CHARRIGHT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection right one character. | ||||||
|  |         CharRightExtend = QsciScintillaBase::SCI_CHARRIGHTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection right one character. | ||||||
|  |         CharRightRectExtend = QsciScintillaBase::SCI_CHARRIGHTRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move left one word. | ||||||
|  |         WordLeft = QsciScintillaBase::SCI_WORDLEFT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection left one word. | ||||||
|  |         WordLeftExtend = QsciScintillaBase::SCI_WORDLEFTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move right one word. | ||||||
|  |         WordRight = QsciScintillaBase::SCI_WORDRIGHT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection right one word. | ||||||
|  |         WordRightExtend = QsciScintillaBase::SCI_WORDRIGHTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the previous word. | ||||||
|  |         WordLeftEnd = QsciScintillaBase::SCI_WORDLEFTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the previous word. | ||||||
|  |         WordLeftEndExtend = QsciScintillaBase::SCI_WORDLEFTENDEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the next word. | ||||||
|  |         WordRightEnd = QsciScintillaBase::SCI_WORDRIGHTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the next word. | ||||||
|  |         WordRightEndExtend = QsciScintillaBase::SCI_WORDRIGHTENDEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move left one word part. | ||||||
|  |         WordPartLeft = QsciScintillaBase::SCI_WORDPARTLEFT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection left one word part. | ||||||
|  |         WordPartLeftExtend = QsciScintillaBase::SCI_WORDPARTLEFTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move right one word part. | ||||||
|  |         WordPartRight = QsciScintillaBase::SCI_WORDPARTRIGHT, | ||||||
|  |  | ||||||
|  |         //! Extend the selection right one word part. | ||||||
|  |         WordPartRightExtend = QsciScintillaBase::SCI_WORDPARTRIGHTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the start of the document line. | ||||||
|  |         Home = QsciScintillaBase::SCI_HOME, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the start of the document line. | ||||||
|  |         HomeExtend = QsciScintillaBase::SCI_HOMEEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection to the start of the document line. | ||||||
|  |         HomeRectExtend = QsciScintillaBase::SCI_HOMERECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the start of the displayed line. | ||||||
|  |         HomeDisplay = QsciScintillaBase::SCI_HOMEDISPLAY, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the start of the displayed line. | ||||||
|  |         HomeDisplayExtend = QsciScintillaBase::SCI_HOMEDISPLAYEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the start of the displayed or document line. | ||||||
|  |         HomeWrap = QsciScintillaBase::SCI_HOMEWRAP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the start of the displayed or document | ||||||
|  |         //! line. | ||||||
|  |         HomeWrapExtend = QsciScintillaBase::SCI_HOMEWRAPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the first visible character in the document line. | ||||||
|  |         VCHome = QsciScintillaBase::SCI_VCHOME, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the first visible character in the document | ||||||
|  |         //! line. | ||||||
|  |         VCHomeExtend = QsciScintillaBase::SCI_VCHOMEEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection to the first visible character in | ||||||
|  |         //! the document line. | ||||||
|  |         VCHomeRectExtend = QsciScintillaBase::SCI_VCHOMERECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the first visible character of the displayed or document | ||||||
|  |         //! line. | ||||||
|  |         VCHomeWrap = QsciScintillaBase::SCI_VCHOMEWRAP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the first visible character of the | ||||||
|  |         //! displayed or document line. | ||||||
|  |         VCHomeWrapExtend = QsciScintillaBase::SCI_VCHOMEWRAPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the document line. | ||||||
|  |         LineEnd = QsciScintillaBase::SCI_LINEEND, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the document line. | ||||||
|  |         LineEndExtend = QsciScintillaBase::SCI_LINEENDEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection to the end of the document line. | ||||||
|  |         LineEndRectExtend = QsciScintillaBase::SCI_LINEENDRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the displayed line. | ||||||
|  |         LineEndDisplay = QsciScintillaBase::SCI_LINEENDDISPLAY, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the displayed line. | ||||||
|  |         LineEndDisplayExtend = QsciScintillaBase::SCI_LINEENDDISPLAYEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the displayed or document line. | ||||||
|  |         LineEndWrap = QsciScintillaBase::SCI_LINEENDWRAP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the displayed or document line. | ||||||
|  |         LineEndWrapExtend = QsciScintillaBase::SCI_LINEENDWRAPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the start of the document. | ||||||
|  |         DocumentStart = QsciScintillaBase::SCI_DOCUMENTSTART, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the start of the document. | ||||||
|  |         DocumentStartExtend = QsciScintillaBase::SCI_DOCUMENTSTARTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move to the end of the document. | ||||||
|  |         DocumentEnd = QsciScintillaBase::SCI_DOCUMENTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the selection to the end of the document. | ||||||
|  |         DocumentEndExtend = QsciScintillaBase::SCI_DOCUMENTENDEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move up one page. | ||||||
|  |         PageUp = QsciScintillaBase::SCI_PAGEUP, | ||||||
|  |  | ||||||
|  |         //! Extend the selection up one page. | ||||||
|  |         PageUpExtend = QsciScintillaBase::SCI_PAGEUPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection up one page. | ||||||
|  |         PageUpRectExtend = QsciScintillaBase::SCI_PAGEUPRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Move down one page. | ||||||
|  |         PageDown = QsciScintillaBase::SCI_PAGEDOWN, | ||||||
|  |  | ||||||
|  |         //! Extend the selection down one page. | ||||||
|  |         PageDownExtend = QsciScintillaBase::SCI_PAGEDOWNEXTEND, | ||||||
|  |  | ||||||
|  |         //! Extend the rectangular selection down one page. | ||||||
|  |         PageDownRectExtend = QsciScintillaBase::SCI_PAGEDOWNRECTEXTEND, | ||||||
|  |  | ||||||
|  |         //! Stuttered move up one page. | ||||||
|  |         StutteredPageUp = QsciScintillaBase::SCI_STUTTEREDPAGEUP, | ||||||
|  |  | ||||||
|  |         //! Stuttered extend the selection up one page. | ||||||
|  |         StutteredPageUpExtend = QsciScintillaBase::SCI_STUTTEREDPAGEUPEXTEND, | ||||||
|  |  | ||||||
|  |         //! Stuttered move down one page. | ||||||
|  |         StutteredPageDown = QsciScintillaBase::SCI_STUTTEREDPAGEDOWN, | ||||||
|  |  | ||||||
|  |         //! Stuttered extend the selection down one page. | ||||||
|  |         StutteredPageDownExtend = QsciScintillaBase::SCI_STUTTEREDPAGEDOWNEXTEND, | ||||||
|  |  | ||||||
|  |         //! Delete the current character. | ||||||
|  |         Delete = QsciScintillaBase::SCI_CLEAR, | ||||||
|  |  | ||||||
|  |         //! Delete the previous character. | ||||||
|  |         DeleteBack = QsciScintillaBase::SCI_DELETEBACK, | ||||||
|  |  | ||||||
|  |         //! Delete the previous character if not at start of line. | ||||||
|  |         DeleteBackNotLine = QsciScintillaBase::SCI_DELETEBACKNOTLINE, | ||||||
|  |  | ||||||
|  |         //! Delete the word to the left. | ||||||
|  |         DeleteWordLeft = QsciScintillaBase::SCI_DELWORDLEFT, | ||||||
|  |  | ||||||
|  |         //! Delete the word to the right. | ||||||
|  |         DeleteWordRight = QsciScintillaBase::SCI_DELWORDRIGHT, | ||||||
|  |  | ||||||
|  |         //! Delete right to the end of the next word. | ||||||
|  |         DeleteWordRightEnd = QsciScintillaBase::SCI_DELWORDRIGHTEND, | ||||||
|  |  | ||||||
|  |         //! Delete the line to the left. | ||||||
|  |         DeleteLineLeft = QsciScintillaBase::SCI_DELLINELEFT, | ||||||
|  |  | ||||||
|  |         //! Delete the line to the right. | ||||||
|  |         DeleteLineRight = QsciScintillaBase::SCI_DELLINERIGHT, | ||||||
|  |  | ||||||
|  |         //! Delete the current line. | ||||||
|  |         LineDelete = QsciScintillaBase::SCI_LINEDELETE, | ||||||
|  |  | ||||||
|  |         //! Cut the current line to the clipboard. | ||||||
|  |         LineCut = QsciScintillaBase::SCI_LINECUT, | ||||||
|  |  | ||||||
|  |         //! Copy the current line to the clipboard. | ||||||
|  |         LineCopy = QsciScintillaBase::SCI_LINECOPY, | ||||||
|  |  | ||||||
|  |         //! Transpose the current and previous lines. | ||||||
|  |         LineTranspose = QsciScintillaBase::SCI_LINETRANSPOSE, | ||||||
|  |  | ||||||
|  |         //! Duplicate the current line. | ||||||
|  |         LineDuplicate = QsciScintillaBase::SCI_LINEDUPLICATE, | ||||||
|  |  | ||||||
|  |         //! Select the whole document. | ||||||
|  |         SelectAll = QsciScintillaBase::SCI_SELECTALL, | ||||||
|  |  | ||||||
|  |         //! Move the selected lines up one line. | ||||||
|  |         MoveSelectedLinesUp = QsciScintillaBase::SCI_MOVESELECTEDLINESUP, | ||||||
|  |  | ||||||
|  |         //! Move the selected lines down one line. | ||||||
|  |         MoveSelectedLinesDown = QsciScintillaBase::SCI_MOVESELECTEDLINESDOWN, | ||||||
|  |  | ||||||
|  |         //! Duplicate the selection. | ||||||
|  |         SelectionDuplicate = QsciScintillaBase::SCI_SELECTIONDUPLICATE, | ||||||
|  |  | ||||||
|  |         //! Convert the selection to lower case. | ||||||
|  |         SelectionLowerCase = QsciScintillaBase::SCI_LOWERCASE, | ||||||
|  |  | ||||||
|  |         //! Convert the selection to upper case. | ||||||
|  |         SelectionUpperCase = QsciScintillaBase::SCI_UPPERCASE, | ||||||
|  |  | ||||||
|  |         //! Cut the selection to the clipboard. | ||||||
|  |         SelectionCut = QsciScintillaBase::SCI_CUT, | ||||||
|  |  | ||||||
|  |         //! Copy the selection to the clipboard. | ||||||
|  |         SelectionCopy = QsciScintillaBase::SCI_COPY, | ||||||
|  |  | ||||||
|  |         //! Paste from the clipboard. | ||||||
|  |         Paste = QsciScintillaBase::SCI_PASTE, | ||||||
|  |  | ||||||
|  |         //! Toggle insert/overtype. | ||||||
|  |         EditToggleOvertype = QsciScintillaBase::SCI_EDITTOGGLEOVERTYPE, | ||||||
|  |  | ||||||
|  |         //! Insert a platform dependent newline. | ||||||
|  |         Newline = QsciScintillaBase::SCI_NEWLINE, | ||||||
|  |  | ||||||
|  |         //! Insert a formfeed. | ||||||
|  |         Formfeed = QsciScintillaBase::SCI_FORMFEED, | ||||||
|  |  | ||||||
|  |         //! Indent one level. | ||||||
|  |         Tab = QsciScintillaBase::SCI_TAB, | ||||||
|  |  | ||||||
|  |         //! De-indent one level. | ||||||
|  |         Backtab = QsciScintillaBase::SCI_BACKTAB, | ||||||
|  |  | ||||||
|  |         //! Cancel any current operation. | ||||||
|  |         Cancel = QsciScintillaBase::SCI_CANCEL, | ||||||
|  |  | ||||||
|  |         //! Undo the last command. | ||||||
|  |         Undo = QsciScintillaBase::SCI_UNDO, | ||||||
|  |  | ||||||
|  |         //! Redo the last command. | ||||||
|  |         Redo = QsciScintillaBase::SCI_REDO, | ||||||
|  |  | ||||||
|  |         //! Zoom in. | ||||||
|  |         ZoomIn = QsciScintillaBase::SCI_ZOOMIN, | ||||||
|  |  | ||||||
|  |         //! Zoom out. | ||||||
|  |         ZoomOut = QsciScintillaBase::SCI_ZOOMOUT, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     //! Return the command that will be executed by this instance. | ||||||
|  |     Command command() const {return scicmd;} | ||||||
|  |  | ||||||
|  |     //! Execute the command. | ||||||
|  |     void execute(); | ||||||
|  |  | ||||||
|  |     //! Binds the key \a key to the command.  If \a key is 0 then the key | ||||||
|  |     //! binding is removed.  If \a key is invalid then the key binding is | ||||||
|  |     //! unchanged.  Valid keys are any visible or control character or any | ||||||
|  |     //! of \c Key_Down, \c Key_Up, \c Key_Left, \c Key_Right, \c Key_Home, | ||||||
|  |     //! \c Key_End, \c Key_PageUp, \c Key_PageDown, \c Key_Delete, | ||||||
|  |     //! \c Key_Insert, \c Key_Escape, \c Key_Backspace, \c Key_Tab and | ||||||
|  |     //! \c Key_Return.  Keys may be modified with any combination of \c SHIFT, | ||||||
|  |     //! \c CTRL, \c ALT and \c META. | ||||||
|  |     //! | ||||||
|  |     //! \sa key(), setAlternateKey(), validKey() | ||||||
|  |     void setKey(int key); | ||||||
|  |  | ||||||
|  |     //! Binds the alternate key \a altkey to the command.  If \a key is 0 | ||||||
|  |     //! then the alternate key binding is removed. | ||||||
|  |     //! | ||||||
|  |     //! \sa alternateKey(), setKey(), validKey() | ||||||
|  |     void setAlternateKey(int altkey); | ||||||
|  |  | ||||||
|  |     //! The key that is currently bound to the command is returned. | ||||||
|  |     //! | ||||||
|  |     //! \sa setKey(), alternateKey() | ||||||
|  |     int key() const {return qkey;} | ||||||
|  |  | ||||||
|  |     //! The alternate key that is currently bound to the command is | ||||||
|  |     //! returned. | ||||||
|  |     //! | ||||||
|  |     //! \sa setAlternateKey(), key() | ||||||
|  |     int alternateKey() const {return qaltkey;} | ||||||
|  |  | ||||||
|  |     //! If the key \a key is valid then true is returned. | ||||||
|  |     static bool validKey(int key); | ||||||
|  |  | ||||||
|  |     //! The user friendly description of the command is returned. | ||||||
|  |     QString description() const; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     friend class QsciCommandSet; | ||||||
|  |  | ||||||
|  |     QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey, | ||||||
|  |             const char *desc); | ||||||
|  |  | ||||||
|  |     void bindKey(int key,int &qk,int &scik); | ||||||
|  |  | ||||||
|  |     QsciScintilla *qsCmd; | ||||||
|  |     Command scicmd; | ||||||
|  |     int qkey, scikey, qaltkey, scialtkey; | ||||||
|  |     const char *descCmd; | ||||||
|  |  | ||||||
|  |     QsciCommand(const QsciCommand &); | ||||||
|  |     QsciCommand &operator=(const QsciCommand &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #ifdef __APPLE__ | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										116
									
								
								samples/C++/qsciprinter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								samples/C++/qsciprinter.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | |||||||
|  | // This module defines interface to the QsciPrinter class. | ||||||
|  | // | ||||||
|  | // Copyright (c) 2011 Riverbank Computing Limited <info@riverbankcomputing.com> | ||||||
|  | //  | ||||||
|  | // This file is part of QScintilla. | ||||||
|  | //  | ||||||
|  | // This file may be used under the terms of the GNU General Public | ||||||
|  | // License versions 2.0 or 3.0 as published by the Free Software | ||||||
|  | // Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 | ||||||
|  | // included in the packaging of this file.  Alternatively you may (at | ||||||
|  | // your option) use any later version of the GNU General Public | ||||||
|  | // License if such license has been publicly approved by Riverbank | ||||||
|  | // Computing Limited (or its successors, if any) and the KDE Free Qt | ||||||
|  | // Foundation. In addition, as a special exception, Riverbank gives you | ||||||
|  | // certain additional rights. These rights are described in the Riverbank | ||||||
|  | // GPL Exception version 1.1, which can be found in the file | ||||||
|  | // GPL_EXCEPTION.txt in this package. | ||||||
|  | //  | ||||||
|  | // If you are unsure which license is appropriate for your use, please | ||||||
|  | // contact the sales department at sales@riverbankcomputing.com. | ||||||
|  | //  | ||||||
|  | // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||||||
|  | // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef QSCIPRINTER_H | ||||||
|  | #define QSCIPRINTER_H | ||||||
|  |  | ||||||
|  | #ifdef __APPLE__ | ||||||
|  | extern "C++" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <qprinter.h> | ||||||
|  |  | ||||||
|  | #include <Qsci/qsciglobal.h> | ||||||
|  | #include <Qsci/qsciscintilla.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | QT_BEGIN_NAMESPACE | ||||||
|  | class QRect; | ||||||
|  | class QPainter; | ||||||
|  | QT_END_NAMESPACE | ||||||
|  |  | ||||||
|  | class QsciScintillaBase; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //! \brief The QsciPrinter class is a sub-class of the Qt QPrinter class that | ||||||
|  | //! is able to print the text of a Scintilla document. | ||||||
|  | //! | ||||||
|  | //! The class can be further sub-classed to alter to layout of the text, adding | ||||||
|  | //! headers and footers for example. | ||||||
|  | class QSCINTILLA_EXPORT QsciPrinter : public QPrinter | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     //! Constructs a printer paint device with mode \a mode. | ||||||
|  |     QsciPrinter(PrinterMode mode = ScreenResolution); | ||||||
|  |  | ||||||
|  |     //! Destroys the QsciPrinter instance. | ||||||
|  |     virtual ~QsciPrinter(); | ||||||
|  |  | ||||||
|  |     //! Format a page, by adding headers and footers for example, before the | ||||||
|  |     //! document text is drawn on it.  \a painter is the painter to be used to | ||||||
|  |     //! add customised text and graphics.  \a drawing is true if the page is | ||||||
|  |     //! actually being drawn rather than being sized.  \a painter drawing | ||||||
|  |     //! methods must only be called when \a drawing is true.  \a area is the | ||||||
|  |     //! area of the page that will be used to draw the text.  This should be | ||||||
|  |     //! modified if it is necessary to reserve space for any customised text or | ||||||
|  |     //! graphics.  By default the area is relative to the printable area of the | ||||||
|  |     //! page.  Use QPrinter::setFullPage() because calling printRange() if you | ||||||
|  |     //! want to try and print over the whole page.  \a pagenr is the number of | ||||||
|  |     //! the page.  The first page is numbered 1. | ||||||
|  |     virtual void formatPage(QPainter &painter, bool drawing, QRect &area, | ||||||
|  |             int pagenr); | ||||||
|  |  | ||||||
|  |     //! Return the number of points to add to each font when printing. | ||||||
|  |     //! | ||||||
|  |     //! \sa setMagnification() | ||||||
|  |     int magnification() const {return mag;} | ||||||
|  |  | ||||||
|  |     //! Sets the number of points to add to each font when printing to \a | ||||||
|  |     //! magnification. | ||||||
|  |     //! | ||||||
|  |     //! \sa magnification() | ||||||
|  |     virtual void setMagnification(int magnification); | ||||||
|  |  | ||||||
|  |     //! Print a range of lines from the Scintilla instance \a qsb.  \a from is | ||||||
|  |     //! the first line to print and a negative value signifies the first line | ||||||
|  |     //! of text.  \a to is the last line to print and a negative value | ||||||
|  |     //! signifies the last line of text.  true is returned if there was no | ||||||
|  |     //! error. | ||||||
|  |     virtual int printRange(QsciScintillaBase *qsb, int from = -1, int to = -1); | ||||||
|  |  | ||||||
|  |     //! Return the line wrap mode used when printing.  The default is | ||||||
|  |     //! QsciScintilla::WrapWord. | ||||||
|  |     //! | ||||||
|  |     //! \sa setWrapMode() | ||||||
|  |     QsciScintilla::WrapMode wrapMode() const {return wrap;} | ||||||
|  |  | ||||||
|  |     //! Sets the line wrap mode used when printing to \a wmode. | ||||||
|  |     //! | ||||||
|  |     //! \sa wrapMode() | ||||||
|  |     virtual void setWrapMode(QsciScintilla::WrapMode wmode); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     int mag; | ||||||
|  |     QsciScintilla::WrapMode wrap; | ||||||
|  |  | ||||||
|  |     QsciPrinter(const QsciPrinter &); | ||||||
|  |     QsciPrinter &operator=(const QsciPrinter &); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #ifdef __APPLE__ | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										1267
									
								
								samples/C/rf_io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1267
									
								
								samples/C/rf_io.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										682
									
								
								samples/C/rf_io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										682
									
								
								samples/C/rf_io.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,682 @@ | |||||||
|  | /** | ||||||
|  | ** Copyright (c) 2011-2012, Karapetsas Eleftherios | ||||||
|  | ** All rights reserved. | ||||||
|  | ** | ||||||
|  | ** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | ||||||
|  | **  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | ||||||
|  | **  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in | ||||||
|  | **     the documentation and/or other materials provided with the distribution. | ||||||
|  | **  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from | ||||||
|  | ** | ||||||
|  | **  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, | ||||||
|  | **  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  | **  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | **  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||||
|  | **  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||||||
|  | **  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | **  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | **/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef REFU_IO_H | ||||||
|  | #define REFU_IO_H | ||||||
|  |  | ||||||
|  | #include <rf_setup.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" | ||||||
|  | {// opening bracket for calling from C++ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // New line feed | ||||||
|  | #define RF_LF   0xA | ||||||
|  | // Carriage Return | ||||||
|  | #define RF_CR   0xD | ||||||
|  |  | ||||||
|  | #ifdef REFU_WIN32_VERSION | ||||||
|  |     #define i_PLUSB_WIN32   "b" | ||||||
|  | #else | ||||||
|  |     #define i_PLUSB_WIN32   "" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // This is the type that represents the file offset | ||||||
|  | #ifdef _MSC_VER | ||||||
|  | typedef __int64 foff_rft; | ||||||
|  | #else | ||||||
|  | #include <sys/types.h> | ||||||
|  | typedef off64_t foff_rft; | ||||||
|  | #endif | ||||||
|  | ///Fseek and Ftelll definitions | ||||||
|  | #ifdef _MSC_VER | ||||||
|  |     #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    _fseeki64(i_FILE_,i_OFFSET_,i_WHENCE_) | ||||||
|  |     #define rfFtell(i_FILE_)                        _ftelli64(i_FILE_) | ||||||
|  | #else | ||||||
|  |     #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    fseeko64(i_FILE_,i_OFFSET_,i_WHENCE_) | ||||||
|  |     #define rfFtell(i_FILE_)                        ftello64(i_FILE_) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /** | ||||||
|  | ** @defgroup RF_IOGRP I/O | ||||||
|  | ** @addtogroup RF_IOGRP | ||||||
|  | ** @{ | ||||||
|  | **/ | ||||||
|  |  | ||||||
|  | // @brief Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function | ||||||
|  | // shall not be adding any CR character that is found in the file behind a newline character since this is | ||||||
|  | // the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside. | ||||||
|  | // | ||||||
|  | // @param[in] f The file descriptor to read | ||||||
|  | // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function | ||||||
|  | // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later | ||||||
|  | // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] bufferSize Give an @c uint32_t here to receive the capacity of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file | ||||||
|  | // with reading this line | ||||||
|  | // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. | ||||||
|  | // The possible errors to return are the same as rfFgets_UTF8() | ||||||
|  | i_DECLIMEX_ int32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof); | ||||||
|  | // @brief Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function | ||||||
|  | // shall not be adding any CR character that is found in the file behind a newline character since this is | ||||||
|  | // the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside. | ||||||
|  | // | ||||||
|  | // @param[in] f The file descriptor to read | ||||||
|  | // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function | ||||||
|  | // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later | ||||||
|  | // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file | ||||||
|  | // with reading this line | ||||||
|  | // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. | ||||||
|  | // + Any error that can be returned by @ref rfFgets_UTF16BE() | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor | ||||||
|  | // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 | ||||||
|  | i_DECLIMEX_ int32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); | ||||||
|  | // @brief Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function | ||||||
|  | // shall not be adding any CR character that is found in the file behind a newline character since this is | ||||||
|  | // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. | ||||||
|  | // | ||||||
|  | // @param[in] f The file descriptor to read | ||||||
|  | // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function | ||||||
|  | // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later | ||||||
|  | // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file | ||||||
|  | // with reading this line | ||||||
|  | // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. | ||||||
|  | // + Any error that can be returned by @ref rfFgets_UTF16LE() | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor | ||||||
|  | // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 | ||||||
|  | i_DECLIMEX_ int32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); | ||||||
|  |  | ||||||
|  | // @brief Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function | ||||||
|  | // shall not be adding any CR character that is found in the file behind a newline character since this is | ||||||
|  | // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. | ||||||
|  | // | ||||||
|  | // @param[in] f The file descriptor to read | ||||||
|  | // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function | ||||||
|  | // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later | ||||||
|  | // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file | ||||||
|  | // with reading this line | ||||||
|  | // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. | ||||||
|  | // + Any error that can be returned by @ref rfFgets_UTF32BE() | ||||||
|  | // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 | ||||||
|  | i_DECLIMEX_ int32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); | ||||||
|  | // @brief Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function | ||||||
|  | // shall not be adding any CR character that is found in the file behind a newline character since this is | ||||||
|  | // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. | ||||||
|  | // | ||||||
|  | // @param[in] f The file descriptor to read | ||||||
|  | // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function | ||||||
|  | // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later | ||||||
|  | // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes | ||||||
|  | // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file | ||||||
|  | // with reading this line | ||||||
|  | // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. | ||||||
|  | // + Any error that can be returned by @ref rfFgets_UTF32LE() | ||||||
|  | // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 | ||||||
|  | i_DECLIMEX_ int32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); | ||||||
|  |  | ||||||
|  | // @brief Gets a number of bytes from a BIG endian UTF-32 file descriptor | ||||||
|  | // | ||||||
|  | // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes | ||||||
|  | // have been read or new line or EOF character has been encountered. | ||||||
|  | // | ||||||
|  | // The function will read until @c num characters are read and if @c num | ||||||
|  | // would take us to the middle of a UTF32 character then the next character shall also be read | ||||||
|  | // and the function will return the number of bytes read. | ||||||
|  | // Since the function null terminates the buffer the given @c buff needs to be of at least | ||||||
|  | // @c num+7 size to cater for the worst case. | ||||||
|  | // | ||||||
|  | // The final bytestream stored inside @c buff is in the endianess of the system. | ||||||
|  | // | ||||||
|  | // If right after the last character read comes the EOF, the function | ||||||
|  | // shall detect so and assign @c true to @c eof. | ||||||
|  | // | ||||||
|  | // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function | ||||||
|  | // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7 | ||||||
|  | // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4 | ||||||
|  | // @param[in] f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. | ||||||
|  | // @return Returns the actual number of bytes read or an error if there was a problem. | ||||||
|  | // The possible errors are: | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eof); | ||||||
|  | // @brief Gets a number of bytes from a Little endian UTF-32 file descriptor | ||||||
|  | // | ||||||
|  | // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes | ||||||
|  | // have been read or new line or EOF character has been encountered. | ||||||
|  | // | ||||||
|  | // The function will read until @c num characters are read and if @c num | ||||||
|  | // would take us to the middle of a UTF32 character then the next character shall also be read | ||||||
|  | // and the function will return the number of bytes read. | ||||||
|  | // Since the function null terminates the buffer the given @c buff needs to be of at least | ||||||
|  | // @c num+7 size to cater for the worst case. | ||||||
|  | // | ||||||
|  | // The final bytestream stored inside @c buff is in the endianess of the system. | ||||||
|  | // | ||||||
|  | // If right after the last character read comes the EOF, the function | ||||||
|  | // shall detect so and assign @c true to @c eof. | ||||||
|  | // | ||||||
|  | // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function | ||||||
|  | // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7 | ||||||
|  | // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4 | ||||||
|  | // @param[in] f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. | ||||||
|  | // @return Returns the actual number of bytes read or an error if there was a problem. | ||||||
|  | // The possible errors are: | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eof); | ||||||
|  |  | ||||||
|  | // @brief Gets a number of bytes from a BIG endian UTF-16 file descriptor | ||||||
|  | // | ||||||
|  | // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes | ||||||
|  | // have been read or new line or EOF character has been encountered. | ||||||
|  | // | ||||||
|  | // The function will read until @c num characters are read and if @c num | ||||||
|  | // would take us to the middle of a UTF16 character then the next character shall also be read | ||||||
|  | // and the function will return the number of bytes read. | ||||||
|  | // Since the function null terminates the buffer the given @c buff needs to be of at least | ||||||
|  | // @c num+5 size to cater for the worst case. | ||||||
|  | // | ||||||
|  | // The final bytestream stored inside @c buff is in the endianess of the system. | ||||||
|  | // | ||||||
|  | // If right after the last character read comes the EOF, the function | ||||||
|  | // shall detect so and assign @c true to @c eof. | ||||||
|  | // | ||||||
|  | // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function | ||||||
|  | // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+5 | ||||||
|  | // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2 | ||||||
|  | // @param[in] f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. | ||||||
|  | // @return Returns the actual number of bytes read or an error if there was a problem. | ||||||
|  | // The possible errors are: | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eof); | ||||||
|  | // @brief Gets a number of bytes from a Little endian UTF-16 file descriptor | ||||||
|  | // | ||||||
|  | // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes | ||||||
|  | // have been read or new line or EOF character has been encountered. | ||||||
|  | // | ||||||
|  | // The function will read until @c num characters are read and if @c num | ||||||
|  | // would take us to the middle of a UTF16 character then the next character shall also be read | ||||||
|  | // and the function will return the number of bytes read. | ||||||
|  | // Since the function null terminates the buffer the given @c buff needs to be of at least | ||||||
|  | // @c num+5 size to cater for the worst case. | ||||||
|  | // | ||||||
|  | // The final bytestream stored inside @c buff is in the endianess of the system. | ||||||
|  | // | ||||||
|  | // If right after the last character read comes the EOF, the function | ||||||
|  | // shall detect so and assign @c true to @c eof. | ||||||
|  | // | ||||||
|  | // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function | ||||||
|  | // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+2 | ||||||
|  | // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2 | ||||||
|  | // @param[in] f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. | ||||||
|  | // @return Returns the actual number of bytes read or an error if there was a problem. | ||||||
|  | // The possible errors are: | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eof); | ||||||
|  | // @brief Gets a number of bytes from a UTF-8 file descriptor | ||||||
|  | // | ||||||
|  | // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num characters | ||||||
|  | // have been read or new line or EOF character has been encountered. | ||||||
|  | // | ||||||
|  | // The function  automatically adds a null termination character at the end of | ||||||
|  | // @c buff but this character is not included in the returned actual number of bytes. | ||||||
|  | // | ||||||
|  | // The function will read until @c num characters are read and if @c num | ||||||
|  | // would take us to the middle of a UTF8 character then the next character shall also be read | ||||||
|  | // and the function will return the number of bytes read. | ||||||
|  | // Since the function null terminates the buffer the given @c buff needs to be of at least | ||||||
|  | // @c num+4 size to cater for the worst case. | ||||||
|  | // | ||||||
|  | // If right after the last character read comes the EOF, the function | ||||||
|  | // shall detect so and assign @c true to @c eof. | ||||||
|  | // | ||||||
|  | // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function | ||||||
|  | // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param[in] buff A buffer to be filled with the contents of the file. Should of size at least @c num+4 | ||||||
|  | // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 1 byte) | ||||||
|  | // @param[in] f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. | ||||||
|  | // @return Returns the actual number of bytes read or an error if there was a problem. | ||||||
|  | // The possible errors are: | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation | ||||||
|  | // byte and did not find it | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should | ||||||
|  | // have been continuation bytes | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eof); | ||||||
|  |  | ||||||
|  | // @brief  Gets a unicode character from a UTF-8 file descriptor | ||||||
|  | // | ||||||
|  | // This function attempts to assume a more modern fgetc() role for UTF-8 encoded files. | ||||||
|  | // Reads bytes from the File descriptor @c f until a full UTF-8 unicode character has been read | ||||||
|  | // | ||||||
|  | // After this function the file pointer will have moved either by @c 1, @c 2, @c 3 or @c 4 | ||||||
|  | // bytes if the return value is positive. You can see how much by checking the return value. | ||||||
|  | // | ||||||
|  | // You shall need to provide an integer at @c c to contain either the decoded Unicode | ||||||
|  | // codepoint or the UTF-8 endoced byte depending on the value of the @c cp argument. | ||||||
|  | // | ||||||
|  | // @param f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param c Pass an int that will receive either the unicode code point value or | ||||||
|  | // the UTF8 bytes depending on the value of the @c cp flag | ||||||
|  | // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point | ||||||
|  | // of the read character, so the UTF-8 will be decoded. | ||||||
|  | // If @c false the int passed at @c c will contain the value of the read bytes in UTF-8 without any decoding | ||||||
|  | // @return Returns the number of bytes read (either @c 1, @c 2, @c 3 or @c 4) or an error if the function | ||||||
|  | // fails for some reason. Possible error values are: | ||||||
|  | // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered | ||||||
|  | // in the middle of a UTF-8 encoded character where we would be expecting something different | ||||||
|  | // and @c RE_UTF8_INVALID_SEQUENCE_END error is also logged | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation | ||||||
|  | // byte and did not find it | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should | ||||||
|  | // have been continuation bytes | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgetc_UTF8(FILE* f,uint32_t *c,char cp); | ||||||
|  | // @brief  Gets a unicode character from a UTF-16 Big Endian file descriptor | ||||||
|  | // | ||||||
|  | // This function attempts to assume a more modern fgetc() role for UTF-16 encoded files. | ||||||
|  | // Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read | ||||||
|  | // | ||||||
|  | // After this function the file pointer will have moved either by @c 2 or @c 4 | ||||||
|  | // bytes if the return value is positive. You can see how much by checking the return value. | ||||||
|  | // | ||||||
|  | // You shall need to provide an integer at @c c to contain either the decoded Unicode | ||||||
|  | // codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument. | ||||||
|  | // | ||||||
|  | // @param f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param c Pass an int that will receive either the unicode code point value or | ||||||
|  | // the UTF16 bytes depending on the value of the @c cp flag | ||||||
|  | // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point | ||||||
|  | // of the read character, so the UTF-16 will be decoded. | ||||||
|  | // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding | ||||||
|  | // @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function | ||||||
|  | // fails for some reason. Possible error values are: | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values | ||||||
|  | // + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found | ||||||
|  | // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered | ||||||
|  | // while we expect a UTF-16 surrogate pair an appropriate error is logged | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp); | ||||||
|  | // @brief  Gets a unicode character from a UTF-16 Little Endian file descriptor | ||||||
|  | // | ||||||
|  | // This function attempts to assume a more modern fgetc() role for UTF-16 encoded files. | ||||||
|  | // Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read | ||||||
|  | // | ||||||
|  | // After this function the file pointer will have moved either by @c 2 or @c 4 | ||||||
|  | // bytes if the return value is positive. You can see how much by checking the return value. | ||||||
|  | // | ||||||
|  | // You shall need to provide an integer at @c c to contain either the decoded Unicode | ||||||
|  | // codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument. | ||||||
|  | // | ||||||
|  | // @param f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param c Pass an int that will receive either the unicode code point value or | ||||||
|  | // the UTF16 bytes depending on the value of the @c cp flag | ||||||
|  | // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point | ||||||
|  | // of the read character, so the UTF-16 will be decoded. | ||||||
|  | // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding | ||||||
|  | // @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function | ||||||
|  | // fails for some reason. Possible error values are: | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values | ||||||
|  | // + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found | ||||||
|  | // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered | ||||||
|  | // while we expect a UTF-16 surrogate pair an appropriate error is logged | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp); | ||||||
|  | // @brief  Gets a unicode character from a UTF-32 Little Endian file descriptor | ||||||
|  | // | ||||||
|  | // This function attempts to assume a more modern fgetc() role for UTF-32 encoded files. | ||||||
|  | // Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read | ||||||
|  | // | ||||||
|  | // After this function the file pointer will have moved by @c 4 | ||||||
|  | // bytes if the return value is positive. | ||||||
|  | // | ||||||
|  | // You shall need to provide an integer at @c to contain the UTF-32 codepoint. | ||||||
|  | // | ||||||
|  | // @param f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param c Pass an int that will receive either the unicode code point value or | ||||||
|  | // the UTF16 bytes depending on the value of the @c cp flag | ||||||
|  | // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding | ||||||
|  | // @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors: | ||||||
|  | // + @c RE_FILE_EOF: The end of file has been found while reading. | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c); | ||||||
|  | // @brief  Gets a unicode character from a UTF-32 Big Endian file descriptor | ||||||
|  | // | ||||||
|  | // This function attempts to assume a more modern fgetc() role for UTF-32 encoded files. | ||||||
|  | // Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read | ||||||
|  | // | ||||||
|  | // After this function the file pointer will have moved by @c 4 | ||||||
|  | // bytes if the return value is positive. | ||||||
|  | // | ||||||
|  | // You shall need to provide an integer at @c to contain the UTF-32 codepoint. | ||||||
|  | // | ||||||
|  | // @param f A valid FILE descriptor from which to read the bytes | ||||||
|  | // @param c Pass an int that will receive either the unicode code point value or | ||||||
|  | // the UTF16 bytes depending on the value of the @c cp flag | ||||||
|  | // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding | ||||||
|  | // @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors: | ||||||
|  | // + @c RE_FILE_EOF: The end of file has been found while reading. | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an unknown read error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system | ||||||
|  | // + @c RE_INTERRUPT: If during reading, there was a system interrupt | ||||||
|  | // + @c RE_FILE_IO: If there was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space | ||||||
|  | i_DECLIMEX_ int32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c); | ||||||
|  |  | ||||||
|  | // @brief Moves a unicode character backwards in a big endian UTF-32 file stream | ||||||
|  | // | ||||||
|  | // @param f The file stream | ||||||
|  | // @param c Returns the character we moved back to as a unicode codepoint | ||||||
|  | // @return Returns either @c RF_SUCCESS for success or one of the following errors: | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system | ||||||
|  | // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal | ||||||
|  | // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. | ||||||
|  | // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason | ||||||
|  | // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set | ||||||
|  | // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt | ||||||
|  | // + @c RE_FILE_IO: There was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: There was no space on the device holding the file | ||||||
|  | // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading | ||||||
|  | i_DECLIMEX_ int32_t rfFback_UTF32BE(FILE* f,uint32_t *c); | ||||||
|  | // @brief Moves a unicode character backwards in a little endian UTF-32 file stream | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param f The file stream | ||||||
|  | // @param c Returns the character we moved back to as a unicode codepoint | ||||||
|  | // @return Returns either @c RF_SUCCESS for success or one of the following errors: | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system | ||||||
|  | // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal | ||||||
|  | // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. | ||||||
|  | // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason | ||||||
|  | // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set | ||||||
|  | // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt | ||||||
|  | // + @c RE_FILE_IO: There was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: There was no space on the device holding the file | ||||||
|  | // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading | ||||||
|  | i_DECLIMEX_ int32_t rfFback_UTF32LE(FILE* f,uint32_t *c); | ||||||
|  | // @brief Moves a unicode character backwards in a big endian UTF-16 file stream | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param f The file stream | ||||||
|  | // @param c Returns the character we moved back to as a unicode codepoint | ||||||
|  | // @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors: | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system | ||||||
|  | // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal | ||||||
|  | // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. | ||||||
|  | // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason | ||||||
|  | // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set | ||||||
|  | // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt | ||||||
|  | // + @c RE_FILE_IO: There was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: There was no space on the device holding the file | ||||||
|  | // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading | ||||||
|  | i_DECLIMEX_ int32_t rfFback_UTF16BE(FILE* f,uint32_t *c); | ||||||
|  | // @brief Moves a unicode character backwards in a little endian UTF-16 file stream | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param f The file stream | ||||||
|  | // @param c Returns the character we moved back to as a unicode codepoint | ||||||
|  | // @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors: | ||||||
|  | // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system | ||||||
|  | // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal | ||||||
|  | // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. | ||||||
|  | // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason | ||||||
|  | // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set | ||||||
|  | // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt | ||||||
|  | // + @c RE_FILE_IO: There was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: There was no space on the device holding the file | ||||||
|  | // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading | ||||||
|  | i_DECLIMEX_ int32_t rfFback_UTF16LE(FILE* f,uint32_t *c); | ||||||
|  | // @brief Moves a unicode character backwards in a UTF-8 file stream | ||||||
|  | // | ||||||
|  | // The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under | ||||||
|  | // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial | ||||||
|  | // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and | ||||||
|  | // _set_fmode(). For more information take a look at the msdn pages here: | ||||||
|  | // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx | ||||||
|  | // | ||||||
|  | // @param f The file stream | ||||||
|  | // @param c Returns the character we moved back to as a unicode codepoint | ||||||
|  | // @return Returns either the number of bytes moved backwards for success (either @c 4, @c 3, @c 2 or @c 1) or one of the following errors: | ||||||
|  | // + @c RE_UTF8_INVALID_SEQUENCE: If during moving bacwards in the file unexpected UTF-8 bytes were found | ||||||
|  | // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system | ||||||
|  | // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal | ||||||
|  | // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. | ||||||
|  | // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason | ||||||
|  | // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set | ||||||
|  | // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt | ||||||
|  | // + @c RE_FILE_IO: There was a physical I/O error | ||||||
|  | // + @c RE_FILE_NOSPACE: There was no space on the device holding the file | ||||||
|  | // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent | ||||||
|  | // + @c RE_FILE_READ: If during reading the file there was an error | ||||||
|  | // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread | ||||||
|  | // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading | ||||||
|  | i_DECLIMEX_ int32_t rfFback_UTF8(FILE* f,uint32_t *c); | ||||||
|  |  | ||||||
|  | // @brief Opens another process as a pipe | ||||||
|  | // | ||||||
|  | // This function is a cross-platform popen wrapper. In linux it uses popen and in Windows it uses | ||||||
|  | // _popen. | ||||||
|  | // @lmsFunction | ||||||
|  | // @param command The string with the command to execute. Is basically the name of the program/process you want to spawn | ||||||
|  | // with its full path and its parameters. @inhtype{String,StringX} @tmpSTR | ||||||
|  | // @param mode The mode you want the pipe to work in. There are two possible values: | ||||||
|  | // + @c "r" The calling process can read the spawned command's standard output via the returned stream. | ||||||
|  | // + @c "w" The calling process can write to the spawned command's standard input via the returned stream. | ||||||
|  | // | ||||||
|  | // Anything else will result in an error | ||||||
|  | // @return For success popen will return a FILE descriptor that can be used to either read or write from the pipe. | ||||||
|  | // If there was an error @c 0 is returned and an error is logged. | ||||||
|  | #ifdef RF_IAMHERE_FOR_DOXYGEN | ||||||
|  | i_DECLIMEX_ FILE* rfPopen(void* command,const char* mode); | ||||||
|  | #else | ||||||
|  | i_DECLIMEX_ FILE* i_rfPopen(void* command,const char* mode); | ||||||
|  | #define rfPopen(i_CMD_,i_MODE_) i_rfLMS_WRAP2(FILE*,i_rfPopen,i_CMD_,i_MODE_) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | // @brief Closes a pipe | ||||||
|  | // | ||||||
|  | // This function is a cross-platform wrapper for pclose. It closes a file descriptor opened with @ref rfPopen() and | ||||||
|  | // returns the exit code of the process that was running | ||||||
|  | // @param stream The file descriptor of the pipe returned by @ref rfPopen() that we want to close | ||||||
|  | // @return Returns the exit code of the process or -1 if there was an error | ||||||
|  | i_DECLIMEX_ int rfPclose(FILE* stream); | ||||||
|  |  | ||||||
|  | // @} End of I/O group | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | }///closing bracket for calling from C++ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif//include guards end | ||||||
							
								
								
									
										2348
									
								
								samples/C/rfc_string.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2348
									
								
								samples/C/rfc_string.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1459
									
								
								samples/C/rfc_string.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1459
									
								
								samples/C/rfc_string.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1363
									
								
								samples/C/wglew.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1363
									
								
								samples/C/wglew.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										68
									
								
								samples/Prolog/calc.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								samples/Prolog/calc.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | action_module(calculator) . | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %[-,-,d1,-] --push(D)-->          [-,-,D,-]  if mode(init) | ||||||
|  | push(D) < - | ||||||
|  |   mode(init), | ||||||
|  |   deny([displayed(D1),mode(init)]), | ||||||
|  |   affirm([displayed(D),mode(cont)]). | ||||||
|  |  | ||||||
|  | %[-,-,D1,-] --push(D)-->          [-,-,10*D1+D,-]  if mode(cont) | ||||||
|  | push(D) < - | ||||||
|  |   mode(cont), | ||||||
|  |   deny(displayed(D1)), | ||||||
|  |   New = 10*D1 + D, | ||||||
|  |   affirm(displayed(New)). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(clear)-->      [0,nop,0,0] | ||||||
|  | push(clear) < - | ||||||
|  |   deny([accumulator(A),op(O),displayed(D),memory(M),mode(X)]), | ||||||
|  |   affirm([accumulator(0),op(nop),displayed(0),memory(0),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(mem_rec)-->    [a,op,m,m] | ||||||
|  | push(mem_rec) < - | ||||||
|  |   memory(M), | ||||||
|  |   deny([displayed(D),mode(X)]), | ||||||
|  |   affirm([displayed(M),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(plus)-->       [op(a,d),plus,d,m] | ||||||
|  | push(plus) < - | ||||||
|  |   displayed(D), | ||||||
|  |   deny([accumulator(A),op(O),mode(X)]), | ||||||
|  |   eval(O,A,D,V),   ; use normal arithmetic, i.e., V=O(A,D) | ||||||
|  |   affirm([accumulator(V),op(plus),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(minus)-->      [op(a,d,minus,d,m] | ||||||
|  | push(minus) lt - | ||||||
|  |   displayed(D), | ||||||
|  |   deny([accumulator(A),op(O),mode(X)]), | ||||||
|  |   eval(O,A,D,V),   ; use normal arithmetic, i.e., V=O(A,D) | ||||||
|  |   affirm([accumulator(V),op(minus),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(times)-->      [op(a,d),times,d,m] | ||||||
|  | push(times) < - | ||||||
|  |   displayed(D), | ||||||
|  |   deny([accumulator(A),op(O),mode(X)]), | ||||||
|  |   eval(O,A,D,V),   ; use normal arithmetic, i.e., V=O(A,D) | ||||||
|  |   affirm([accumulator(V),op(times),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(equal)-->      [a,nop,op(a,d),m] | ||||||
|  | push(equal) < - | ||||||
|  |   accumulator(A), | ||||||
|  |   deny([op(O),displayed(D),mode(X)]), | ||||||
|  |   eval(O,A,D,V), | ||||||
|  |   affirm([op(nop),displayed(V),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(mem_plus)-->   [a,nop,v,plus(m,v)] where v=op(a,d) | ||||||
|  | push(mem_plus) < - | ||||||
|  |   accumulator(A), | ||||||
|  |   deny([op(O),displayed(D),memory(M),mode(X)]), | ||||||
|  |   eval(O,A,D,V), | ||||||
|  |   eval(plus,M,V,V1), | ||||||
|  |   affirm([op(nop),displayed(V),memory(V1),mode(init)]). | ||||||
|  |  | ||||||
|  | %[a,op,d,m] --push(plus_minus)--> [a,op,-d,m] | ||||||
|  | push(clear) < - | ||||||
|  |   deny([displayed(D),mode(X)]), | ||||||
|  |   eval(minus,0,D,V), | ||||||
|  |   affirm([displayed(V),mode(init)]). | ||||||
							
								
								
									
										94
									
								
								samples/Prolog/normal_form.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								samples/Prolog/normal_form.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | |||||||
|  | %%----- normalize(+Wff,-NormalClauses) ------ | ||||||
|  | normalize(Wff,NormalClauses) :- | ||||||
|  |    conVert(Wff,[],S), | ||||||
|  |    cnF(S,T), | ||||||
|  |    flatten_and(T,U), | ||||||
|  |    make_clauses(U,NormalClauses). | ||||||
|  |  | ||||||
|  | %%-----  make a sequence out of a conjunction ----- | ||||||
|  | flatten_and(X /\ Y, F) :- | ||||||
|  |    !, | ||||||
|  |    flatten_and(X,A), | ||||||
|  |    flatten_and(Y, B), | ||||||
|  |    sequence_append(A,B,F). | ||||||
|  | flatten_and(X,X). | ||||||
|  |  | ||||||
|  | %%-----  make a sequence out of a disjunction ----- | ||||||
|  | flatten_or(X \/ Y, F) :- | ||||||
|  |    !, | ||||||
|  |    flatten_or(X,A), | ||||||
|  |    flatten_or(Y,B), | ||||||
|  |    sequence_append(A,B,F). | ||||||
|  | flatten_or(X,X). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%----- append two sequences ------------------------------- | ||||||
|  | sequence_append((X,R),S,(X,T)) :- !, sequence_append(R,S,T). | ||||||
|  | sequence_append((X),S,(X,S)). | ||||||
|  |  | ||||||
|  | %%----- separate into positive and negative literals ----------- | ||||||
|  | separate((A,B),P,N) :- | ||||||
|  |    !, | ||||||
|  |    (A = ~X -> N=[X|N1], | ||||||
|  |                separate(B,P,N1) | ||||||
|  |              ; | ||||||
|  |                P=[A|P1], | ||||||
|  |                separate(B,P1,N) ). | ||||||
|  | separate(A,P,N) :- | ||||||
|  |    (A = ~X -> N=[X], | ||||||
|  |                P = [] | ||||||
|  |             ; | ||||||
|  |                P=[A], | ||||||
|  |                N = [] ). | ||||||
|  |  | ||||||
|  | %%----- tautology ---------------------------- | ||||||
|  | tautology(P,N) :- some_occurs(N,P). | ||||||
|  |  | ||||||
|  | some_occurs([F|R],B) :- | ||||||
|  |    occurs(F,B) | some_occurs(R,B). | ||||||
|  |  | ||||||
|  | occurs(A,[F|_]) :- | ||||||
|  |    A == F, | ||||||
|  |    !. | ||||||
|  | occurs(A,[_|R]) :- | ||||||
|  |    occurs(A,R). | ||||||
|  |  | ||||||
|  | make_clauses((A,B),C) :- | ||||||
|  |    !, | ||||||
|  |    flatten_or(A,F), | ||||||
|  |    separate(F,P,N), | ||||||
|  |    (tautology(P,N) -> | ||||||
|  |       make_clauses(B,C) | ||||||
|  |           ; | ||||||
|  |       make_clause(P,N,D), | ||||||
|  |       C = [D|R], | ||||||
|  |       make_clauses(B,R) ). | ||||||
|  | make_clauses(A,C) :- | ||||||
|  |    flatten_or(A,F), | ||||||
|  |    separate(F,P,N), | ||||||
|  |    (tautology(P,N) -> | ||||||
|  |        C = [] | ||||||
|  |         ; | ||||||
|  |        make_clause(P,N,D), | ||||||
|  |        C = [D] ). | ||||||
|  |  | ||||||
|  | make_clause([],N, false :- B) :- | ||||||
|  |    !, | ||||||
|  |    make_sequence(N,B,','). | ||||||
|  | make_clause(P,[],H) :- | ||||||
|  |    !, | ||||||
|  |    make_sequence(P,H,'|'). | ||||||
|  | make_clause(P,N, H :- T) :- | ||||||
|  |    make_sequence(P,H,'|'), | ||||||
|  |    make_sequence(N,T,','). | ||||||
|  |  | ||||||
|  | make_sequence([A],A,_) :- !. | ||||||
|  | make_sequence([F|R],(F|S),'|') :- | ||||||
|  |    make_sequence(R,S,'|'). | ||||||
|  | make_sequence([F|R],(F,S),',') :- | ||||||
|  |    make_sequence(R,S,','). | ||||||
|  |  | ||||||
|  | write_list([F|R]) :- | ||||||
|  |    write(F), write('.'), nl, | ||||||
|  |    write_list(R). | ||||||
|  | write_list([]). | ||||||
							
								
								
									
										287
									
								
								samples/Prolog/puzzle.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								samples/Prolog/puzzle.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,287 @@ | |||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | %%% | ||||||
|  | %%%     A* Algorithm | ||||||
|  | %%% | ||||||
|  | %%% | ||||||
|  | %%%     Nodes have form    S#D#F#A | ||||||
|  | %%%            where S describes the state or configuration | ||||||
|  | %%%                  D is the depth of the node | ||||||
|  | %%%                  F is the evaluation function value | ||||||
|  | %%%                  A is the ancestor list for the node | ||||||
|  |  | ||||||
|  | :- op(400,yfx,'#').    /* Node builder notation */ | ||||||
|  |  | ||||||
|  | solve(State,Soln) :- f_function(State,0,F), | ||||||
|  |                      search([State#0#F#[]],S), reverse(S,Soln). | ||||||
|  |  | ||||||
|  | f_function(State,D,F) :- h_function(State,H), | ||||||
|  |                          F is D + H. | ||||||
|  |  | ||||||
|  | search([State#_#_#Soln|_], Soln) :- goal(State). | ||||||
|  | search([B|R],S) :- expand(B,Children), | ||||||
|  |                    insert_all(Children,R,Open), | ||||||
|  |                    search(Open,S). | ||||||
|  |  | ||||||
|  | insert_all([F|R],Open1,Open3) :- insert(F,Open1,Open2), | ||||||
|  |                                  insert_all(R,Open2,Open3). | ||||||
|  | insert_all([],Open,Open). | ||||||
|  |  | ||||||
|  | insert(B,Open,Open) :- repeat_node(B,Open), ! . | ||||||
|  | insert(B,[C|R],[B,C|R]) :- cheaper(B,C), ! . | ||||||
|  | insert(B,[B1|R],[B1|S]) :- insert(B,R,S), !. | ||||||
|  | insert(B,[],[B]). | ||||||
|  |  | ||||||
|  | repeat_node(P#_#_#_, [P#_#_#_|_]). | ||||||
|  |  | ||||||
|  | cheaper( _#_#F1#_ , _#_#F2#_ ) :- F1 < F2. | ||||||
|  |  | ||||||
|  | expand(State#D#_#S,All_My_Children) :- | ||||||
|  |      bagof(Child#D1#F#[Move|S], | ||||||
|  |            (D1 is D+1, | ||||||
|  |              move(State,Child,Move), | ||||||
|  |              f_function(Child,D1,F)), | ||||||
|  |            All_My_Children). | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | %%% | ||||||
|  | %%%     8-puzzle solver | ||||||
|  | %%% | ||||||
|  | %%% | ||||||
|  | %%%     State have form    A/B/C/D/E/F/G/H/I | ||||||
|  | %%%            where {A,...,I} = {0,...,8} | ||||||
|  | %%%               0 represents the empty tile | ||||||
|  | %%% | ||||||
|  |  | ||||||
|  | goal(1/2/3/8/0/4/7/6/5). | ||||||
|  |  | ||||||
|  | %%% The puzzle moves | ||||||
|  |  | ||||||
|  | left( A/0/C/D/E/F/H/I/J , 0/A/C/D/E/F/H/I/J ). | ||||||
|  | left( A/B/C/D/0/F/H/I/J , A/B/C/0/D/F/H/I/J ). | ||||||
|  | left( A/B/C/D/E/F/H/0/J , A/B/C/D/E/F/0/H/J ). | ||||||
|  | left( A/B/0/D/E/F/H/I/J , A/0/B/D/E/F/H/I/J ). | ||||||
|  | left( A/B/C/D/E/0/H/I/J , A/B/C/D/0/E/H/I/J ). | ||||||
|  | left( A/B/C/D/E/F/H/I/0 , A/B/C/D/E/F/H/0/I ). | ||||||
|  |  | ||||||
|  | up( A/B/C/0/E/F/H/I/J , 0/B/C/A/E/F/H/I/J ). | ||||||
|  | up( A/B/C/D/0/F/H/I/J , A/0/C/D/B/F/H/I/J ). | ||||||
|  | up( A/B/C/D/E/0/H/I/J , A/B/0/D/E/C/H/I/J ). | ||||||
|  | up( A/B/C/D/E/F/0/I/J , A/B/C/0/E/F/D/I/J ). | ||||||
|  | up( A/B/C/D/E/F/H/0/J , A/B/C/D/0/F/H/E/J ). | ||||||
|  | up( A/B/C/D/E/F/H/I/0 , A/B/C/D/E/0/H/I/F ). | ||||||
|  |  | ||||||
|  | right( A/0/C/D/E/F/H/I/J , A/C/0/D/E/F/H/I/J ). | ||||||
|  | right( A/B/C/D/0/F/H/I/J , A/B/C/D/F/0/H/I/J ). | ||||||
|  | right( A/B/C/D/E/F/H/0/J , A/B/C/D/E/F/H/J/0 ). | ||||||
|  | right( 0/B/C/D/E/F/H/I/J , B/0/C/D/E/F/H/I/J ). | ||||||
|  | right( A/B/C/0/E/F/H/I/J , A/B/C/E/0/F/H/I/J ). | ||||||
|  | right( A/B/C/D/E/F/0/I/J , A/B/C/D/E/F/I/0/J ). | ||||||
|  |  | ||||||
|  | down( A/B/C/0/E/F/H/I/J , A/B/C/H/E/F/0/I/J ). | ||||||
|  | down( A/B/C/D/0/F/H/I/J , A/B/C/D/I/F/H/0/J ). | ||||||
|  | down( A/B/C/D/E/0/H/I/J , A/B/C/D/E/J/H/I/0 ). | ||||||
|  | down( 0/B/C/D/E/F/H/I/J , D/B/C/0/E/F/H/I/J ). | ||||||
|  | down( A/0/C/D/E/F/H/I/J , A/E/C/D/0/F/H/I/J ). | ||||||
|  | down( A/B/0/D/E/F/H/I/J , A/B/F/D/E/0/H/I/J ). | ||||||
|  |  | ||||||
|  | %%% the heuristic function | ||||||
|  | h_function(Puzz,H) :- p_fcn(Puzz,P), | ||||||
|  |                       s_fcn(Puzz,S), | ||||||
|  |                       H is P + 3*S. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%% the move | ||||||
|  | move(P,C,left) :-  left(P,C). | ||||||
|  | move(P,C,up) :-  up(P,C). | ||||||
|  | move(P,C,right) :-  right(P,C). | ||||||
|  | move(P,C,down) :-  down(P,C). | ||||||
|  |  | ||||||
|  | %%% the Manhattan distance function | ||||||
|  | p_fcn(A/B/C/D/E/F/G/H/I, P) :- | ||||||
|  |      a(A,Pa), b(B,Pb), c(C,Pc), | ||||||
|  |      d(D,Pd), e(E,Pe), f(F,Pf), | ||||||
|  |      g(G,Pg), h(H,Ph), i(I,Pi), | ||||||
|  |      P is Pa+Pb+Pc+Pd+Pe+Pf+Pg+Ph+Pg+Pi. | ||||||
|  |  | ||||||
|  | a(0,0). a(1,0). a(2,1). a(3,2). a(4,3). a(5,4). a(6,3). a(7,2). a(8,1). | ||||||
|  | b(0,0). b(1,1). b(2,0). b(3,1). b(4,2). b(5,3). b(6,2). b(7,3). b(8,2). | ||||||
|  | c(0,0). c(1,2). c(2,1). c(3,0). c(4,1). c(5,2). c(6,3). c(7,4). c(8,3). | ||||||
|  | d(0,0). d(1,1). d(2,2). d(3,3). d(4,2). d(5,3). d(6,2). d(7,2). d(8,0). | ||||||
|  | e(0,0). e(1,2). e(2,1). e(3,2). e(4,1). e(5,2). e(6,1). e(7,2). e(8,1). | ||||||
|  | f(0,0). f(1,3). f(2,2). f(3,1). f(4,0). f(5,1). f(6,2). f(7,3). f(8,2). | ||||||
|  | g(0,0). g(1,2). g(2,3). g(3,4). g(4,3). g(5,2). g(6,2). g(7,0). g(8,1). | ||||||
|  | h(0,0). h(1,3). h(2,3). h(3,3). h(4,2). h(5,1). h(6,0). h(7,1). h(8,2). | ||||||
|  | i(0,0). i(1,4). i(2,3). i(3,2). i(4,1). i(5,0). i(6,1). i(7,2). i(8,3). | ||||||
|  |  | ||||||
|  | %%% the out-of-cycle function | ||||||
|  | s_fcn(A/B/C/D/E/F/G/H/I, S) :- | ||||||
|  |      s_aux(A,B,S1), s_aux(B,C,S2), s_aux(C,F,S3), | ||||||
|  |      s_aux(F,I,S4), s_aux(I,H,S5), s_aux(H,G,S6), | ||||||
|  |      s_aux(G,D,S7), s_aux(D,A,S8), s_aux(E,S9), | ||||||
|  |      S is S1+S2+S3+S4+S5+S6+S7+S8+S9. | ||||||
|  |  | ||||||
|  | s_aux(0,0) :- !. | ||||||
|  | s_aux(_,1). | ||||||
|  |  | ||||||
|  | s_aux(X,Y,0) :- Y is X+1, !. | ||||||
|  | s_aux(8,1,0) :- !. | ||||||
|  | s_aux(_,_,2). | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | %%% | ||||||
|  | %%%     8-puzzle animation -- using VT100 character graphics | ||||||
|  | %%% | ||||||
|  | %%% | ||||||
|  | %%% | ||||||
|  |  | ||||||
|  | puzzle(P) :- solve(P,S), | ||||||
|  |              animate(P,S), | ||||||
|  |              message. | ||||||
|  |  | ||||||
|  | animate(P,S) :- initialize(P), | ||||||
|  |                 cursor(1,2), write(S), | ||||||
|  |                 cursor(1,22), write('Hit ENTER to step solver.'), | ||||||
|  |                 get0(_X), | ||||||
|  |                 play_back(S). | ||||||
|  |  | ||||||
|  | :- dynamic location/3. | ||||||
|  |  | ||||||
|  | initialize(A/B/C/D/E/F/H/I/J) :- | ||||||
|  |   cls, | ||||||
|  |   retractall(location(_,_,_)), | ||||||
|  |   assert(location(A,20,5)), | ||||||
|  |   assert(location(B,30,5)), | ||||||
|  |   assert(location(C,40,5)), | ||||||
|  |   assert(location(F,40,10)), | ||||||
|  |   assert(location(J,40,15)), | ||||||
|  |   assert(location(I,30,15)), | ||||||
|  |   assert(location(H,20,15)), | ||||||
|  |   assert(location(D,20,10)), | ||||||
|  |   assert(location(E,30,10)), draw_all. | ||||||
|  |  | ||||||
|  | draw_all :- draw(1), draw(2), draw(3), draw(4), | ||||||
|  |             draw(5), draw(6), draw(7), draw(8). | ||||||
|  |  | ||||||
|  | %%% play_back([left,right,up,...]). | ||||||
|  | play_back([M|R]) :- call(M), get0(_X), play_back(R). | ||||||
|  | play_back([]) :- cursor(1,24).  %%% Put cursor out of the way | ||||||
|  |  | ||||||
|  | message :- nl,nl, | ||||||
|  |    write('    ********************************************'), nl, | ||||||
|  |    write('    *  Enter 8-puzzle goals in the form ...    *'), nl, | ||||||
|  |    write('    *     ?-  puzzle(0/8/1/2/4/3/7/6/5).       *'), nl, | ||||||
|  |    write('    *   Enter goal ''message'' to reread this.   *'), nl, | ||||||
|  |    write('    ********************************************'), nl, nl. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | cursor(X,Y) :- put(27), put(91), %%% ESC [ | ||||||
|  |                write(Y), | ||||||
|  |                put(59),           %%%   ; | ||||||
|  |                write(X), | ||||||
|  |                put(72).           %%%   M | ||||||
|  |  | ||||||
|  | %%% clear the screen, quickly | ||||||
|  | cls :-  put(27), put("["), put("2"), put("J"). | ||||||
|  |  | ||||||
|  | %%% video attributes -- bold and blink not working | ||||||
|  | plain         :- put(27), put("["), put("0"), put("m"). | ||||||
|  | reverse_video :- put(27), put("["), put("7"), put("m"). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%% Tile objects, character map(s) | ||||||
|  | %%% Each tile should be drawn using the character map, | ||||||
|  | %%%   drawn at 'location', which is asserted and retracted | ||||||
|  | %%%   by 'playback'. | ||||||
|  | character_map(N, [ [' ',' ',' ',' ',' ',' ',' '], | ||||||
|  |                    [' ',' ',' ', N ,' ',' ',' '], | ||||||
|  |                    [' ',' ',' ',' ',' ',' ',' '] ]). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%% move empty tile (spot) to the left | ||||||
|  | left :- retract(location(0,X0,Y0)), | ||||||
|  |         Xnew is X0 - 10, | ||||||
|  |         location(Tile,Xnew,Y0), | ||||||
|  |         assert(location(0,Xnew,Y0)), | ||||||
|  |         right(Tile),right(Tile),right(Tile), | ||||||
|  |         right(Tile),right(Tile), | ||||||
|  |         right(Tile),right(Tile),right(Tile), | ||||||
|  |         right(Tile),right(Tile). | ||||||
|  |  | ||||||
|  | up :- retract(location(0,X0,Y0)), | ||||||
|  |       Ynew is Y0 - 5, | ||||||
|  |       location(Tile,X0,Ynew), | ||||||
|  |       assert(location(0,X0,Ynew)), | ||||||
|  |       down(Tile),down(Tile),down(Tile),down(Tile),down(Tile). | ||||||
|  |  | ||||||
|  | right :- retract(location(0,X0,Y0)), | ||||||
|  |          Xnew is X0 + 10, | ||||||
|  |          location(Tile,Xnew,Y0), | ||||||
|  |          assert(location(0,Xnew,Y0)), | ||||||
|  |          left(Tile),left(Tile),left(Tile),left(Tile),left(Tile), | ||||||
|  |          left(Tile),left(Tile),left(Tile),left(Tile),left(Tile). | ||||||
|  |  | ||||||
|  | down :- retract(location(0,X0,Y0)), | ||||||
|  |         Ynew is Y0 + 5, | ||||||
|  |         location(Tile,X0,Ynew), | ||||||
|  |         assert(location(0,X0,Ynew)), | ||||||
|  |         up(Tile),up(Tile),up(Tile),up(Tile),up(Tile). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | draw(Obj) :- reverse_video, character_map(Obj,M), | ||||||
|  |              location(Obj,X,Y), | ||||||
|  |              draw(X,Y,M), plain. | ||||||
|  |  | ||||||
|  | %%% hide tile | ||||||
|  | hide(Obj) :- character_map(Obj,M), | ||||||
|  |              location(Obj,X,Y), | ||||||
|  |              hide(X,Y,M). | ||||||
|  |  | ||||||
|  | hide(_,_,[]). | ||||||
|  | hide(X,Y,[R|G]) :- hide_row(X,Y,R), | ||||||
|  |                    Y1 is Y + 1, | ||||||
|  |                    hide(X,Y1,G). | ||||||
|  |  | ||||||
|  | hide_row(_,_,[]). | ||||||
|  | hide_row(X,Y,[_|R]) :- cursor(X,Y), | ||||||
|  |                        write(' '), | ||||||
|  |                        X1 is X + 1, | ||||||
|  |                        hide_row(X1,Y,R). | ||||||
|  |  | ||||||
|  | %%% draw tile | ||||||
|  | draw(_,_,[]). | ||||||
|  | draw(X,Y,[R|G]) :- draw_row(X,Y,R), | ||||||
|  |                    Y1 is Y + 1, | ||||||
|  |                    draw(X,Y1,G). | ||||||
|  |  | ||||||
|  | draw_row(_,_,[]). | ||||||
|  | draw_row(X,Y,[P|R]) :- cursor(X,Y), | ||||||
|  |                        write(P), | ||||||
|  |                        X1 is X + 1, | ||||||
|  |                        draw_row(X1,Y,R). | ||||||
|  |  | ||||||
|  | %%% Move an Object up | ||||||
|  | up(Obj)    :- hide(Obj), | ||||||
|  |               retract(location(Obj,X,Y)), | ||||||
|  |               Y1 is Y - 1, | ||||||
|  |               assert(location(Obj,X,Y1)), | ||||||
|  |               draw(Obj). | ||||||
|  |  | ||||||
|  | down(Obj)  :- hide(Obj), | ||||||
|  |               retract(location(Obj,X,Y)), | ||||||
|  |               Y1 is Y + 1, | ||||||
|  |               assert(location(Obj,X,Y1)), | ||||||
|  |               draw(Obj). | ||||||
|  |  | ||||||
|  | left(Obj)  :- hide(Obj), | ||||||
|  |               retract(location(Obj,X,Y)), | ||||||
|  |               X1 is X - 1, | ||||||
|  |               assert(location(Obj,X1,Y)), | ||||||
|  |               draw(Obj). | ||||||
|  |  | ||||||
|  | right(Obj) :- hide(Obj), | ||||||
|  |               retract(location(Obj,X,Y)), | ||||||
|  |               X1 is X + 1, | ||||||
|  |               assert(location(Obj,X1,Y)), | ||||||
|  |               draw(Obj). | ||||||
|  |  | ||||||
|  | :- message. | ||||||
							
								
								
									
										13
									
								
								samples/Prolog/quicksort.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Prolog/quicksort.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | partition([], _, [], []). | ||||||
|  | partition([X|Xs], Pivot, Smalls, Bigs) :- | ||||||
|  |     (   X @< Pivot -> | ||||||
|  |         Smalls = [X|Rest], | ||||||
|  |         partition(Xs, Pivot, Rest, Bigs) | ||||||
|  |     ;   Bigs = [X|Rest], | ||||||
|  |         partition(Xs, Pivot, Smalls, Rest) | ||||||
|  |     ). | ||||||
|  |  | ||||||
|  | quicksort([])     --> []. | ||||||
|  | quicksort([X|Xs]) --> | ||||||
|  |     { partition(Xs, X, Smaller, Bigger) }, | ||||||
|  |     quicksort(Smaller), [X], quicksort(Bigger). | ||||||
							
								
								
									
										21
									
								
								samples/Prolog/turing.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Prolog/turing.pl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | turing(Tape0, Tape) :- | ||||||
|  |     perform(q0, [], Ls, Tape0, Rs), | ||||||
|  |     reverse(Ls, Ls1), | ||||||
|  |     append(Ls1, Rs, Tape). | ||||||
|  |  | ||||||
|  | perform(qf, Ls, Ls, Rs, Rs) :- !. | ||||||
|  | perform(Q0, Ls0, Ls, Rs0, Rs) :- | ||||||
|  |     symbol(Rs0, Sym, RsRest), | ||||||
|  |     once(rule(Q0, Sym, Q1, NewSym, Action)), | ||||||
|  |     action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), | ||||||
|  |     perform(Q1, Ls1, Ls, Rs1, Rs). | ||||||
|  |  | ||||||
|  | symbol([], b, []). | ||||||
|  | symbol([Sym|Rs], Sym, Rs). | ||||||
|  |  | ||||||
|  | action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs). | ||||||
|  | action(stay, Ls, Ls, Rs, Rs). | ||||||
|  | action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs). | ||||||
|  |  | ||||||
|  | left([], [], Rs0, [b|Rs0]). | ||||||
|  | left([L|Ls], Ls, Rs, [L|Rs]). | ||||||
							
								
								
									
										55
									
								
								samples/Shell/plugin.script!
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								samples/Shell/plugin.script!
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # | ||||||
|  | #	Bash script to "plugin" to the dotfile repository, does a lot of fun stuff | ||||||
|  | #		like turning the normal dotfiles (eg .bashrc) into symlinks to this | ||||||
|  | #		repository's versions of those files (ensure that updates are just a | ||||||
|  | #		'git pull' away), optionally moving old files so that they can be | ||||||
|  | #		preserved, setting up a cron job to automate the aforementioned git | ||||||
|  | #		pull, and maybe some more fun stuff | ||||||
|  | # | ||||||
|  |  | ||||||
|  | shopt -s nocasematch	# This makes pattern matching case-insensitive | ||||||
|  |  | ||||||
|  | POSTFIX="local" | ||||||
|  | URL="https://github.com/brcooley/.f.git" | ||||||
|  | PUSHURL="git@github.com:brcooley/.f.git" | ||||||
|  |  | ||||||
|  | overwrite=true | ||||||
|  |  | ||||||
|  | print_help () { | ||||||
|  | 	echo -e "\nA script to keep dotfiles up to date\n" | ||||||
|  | 	echo "Options:" | ||||||
|  | 	echo "    -k, --keep-local    Keeps local copies of dotfiles by appending" | ||||||
|  | 	echo "                        \"$POSTFIX\" to them" | ||||||
|  | 	exit 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | for opt in $@; do | ||||||
|  | 	case $opt in | ||||||
|  | 		-k | --keep-local) overwrite=false;; | ||||||
|  | 		-h | --help) print_help;; | ||||||
|  | 	esac | ||||||
|  | done | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | for f in .*; do | ||||||
|  | 	if [ "$f" = ".git" -o "$f" = "." -o "$f" = ".." -o "$f" = ".f" ]; then continue; fi | ||||||
|  | 	if [ -f "$HOME/$f" ]; then | ||||||
|  | 		if [ $overwrite = false ]; then | ||||||
|  | 			mv "$HOME/$f" "$HOME/${f}_$POSTFIX" | ||||||
|  | 		else | ||||||
|  | 			rm "$HOME/$f" | ||||||
|  | 		fi | ||||||
|  | 		# echo "Moving ~/$f to $HOME/${f}_$POSTFIX" | ||||||
|  | 	fi | ||||||
|  | 	ln -s "$PWD/$f" "$HOME/$f" | ||||||
|  | done | ||||||
|  |  | ||||||
|  | # Git versions prior to 1.7.? (1.7.1 confirmed) do not have a --local option | ||||||
|  | git config --local remote.origin.url "$URL" | ||||||
|  | git config --local remote.origin.pushurl "$PUSHURL" | ||||||
|  | crontab .jobs.cron | ||||||
|  | source ~/.bashrc | ||||||
|  | echo "Plugin succesful" | ||||||
							
								
								
									
										432
									
								
								samples/Shell/sbt.script!
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										432
									
								
								samples/Shell/sbt.script!
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,432 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # | ||||||
|  | # A more capable sbt runner, coincidentally also called sbt. | ||||||
|  | # Author: Paul Phillips <paulp@typesafe.com> | ||||||
|  |  | ||||||
|  | # todo - make this dynamic | ||||||
|  | declare -r sbt_release_version=0.11.3 | ||||||
|  | declare -r sbt_snapshot_version=0.13.0-SNAPSHOT | ||||||
|  |  | ||||||
|  | unset sbt_jar sbt_dir sbt_create sbt_snapshot sbt_launch_dir | ||||||
|  | unset scala_version java_home sbt_explicit_version | ||||||
|  | unset verbose debug quiet | ||||||
|  |  | ||||||
|  | build_props_sbt () { | ||||||
|  |   if [[ -f project/build.properties ]]; then | ||||||
|  |     versionLine=$(grep ^sbt.version project/build.properties) | ||||||
|  |     versionString=${versionLine##sbt.version=} | ||||||
|  |     echo "$versionString" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | update_build_props_sbt () { | ||||||
|  |   local ver="$1" | ||||||
|  |   local old=$(build_props_sbt) | ||||||
|  |  | ||||||
|  |   if [[ $ver == $old ]]; then | ||||||
|  |     return | ||||||
|  |   elif [[ -f project/build.properties ]]; then | ||||||
|  |     perl -pi -e "s/^sbt\.version=.*\$/sbt.version=${ver}/" project/build.properties | ||||||
|  |     grep -q '^sbt.version=' project/build.properties || echo "sbt.version=${ver}" >> project/build.properties | ||||||
|  |  | ||||||
|  |     echo !!! | ||||||
|  |     echo !!! Updated file project/build.properties setting sbt.version to: $ver | ||||||
|  |     echo !!! Previous value was: $old | ||||||
|  |     echo !!! | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sbt_version () { | ||||||
|  |   if [[ -n $sbt_explicit_version ]]; then | ||||||
|  |     echo $sbt_explicit_version | ||||||
|  |   else | ||||||
|  |     local v=$(build_props_sbt) | ||||||
|  |     if [[ -n $v ]]; then | ||||||
|  |       echo $v | ||||||
|  |     else | ||||||
|  |       echo $sbt_release_version | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | echoerr () { | ||||||
|  |   echo 1>&2 "$@" | ||||||
|  | } | ||||||
|  | vlog () { | ||||||
|  |   [[ $verbose || $debug ]] && echoerr "$@" | ||||||
|  | } | ||||||
|  | dlog () { | ||||||
|  |   [[ $debug ]] && echoerr "$@" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # this seems to cover the bases on OSX, and someone will | ||||||
|  | # have to tell me about the others. | ||||||
|  | get_script_path () { | ||||||
|  |   local path="$1" | ||||||
|  |   [[ -L "$path" ]] || { echo "$path" ; return; } | ||||||
|  |  | ||||||
|  |   local target=$(readlink "$path") | ||||||
|  |   if [[ "${target:0:1}" == "/" ]]; then | ||||||
|  |     echo "$target" | ||||||
|  |   else | ||||||
|  |     echo "$(dirname $path)/$target" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # a ham-fisted attempt to move some memory settings in concert | ||||||
|  | # so they need not be dicked around with individually. | ||||||
|  | get_mem_opts () { | ||||||
|  |   local mem=${1:-1536} | ||||||
|  |   local perm=$(( $mem / 4 )) | ||||||
|  |   (( $perm > 256 )) || perm=256 | ||||||
|  |   (( $perm < 1024 )) || perm=1024 | ||||||
|  |   local codecache=$(( $perm / 2 )) | ||||||
|  |    | ||||||
|  |   echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | die() { | ||||||
|  |   echo "Aborting: $@" | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | make_url () { | ||||||
|  |   groupid="$1" | ||||||
|  |   category="$2" | ||||||
|  |   version="$3" | ||||||
|  |    | ||||||
|  |   echo "http://typesafe.artifactoryonline.com/typesafe/ivy-$category/$groupid/sbt-launch/$version/sbt-launch.jar" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | declare -r default_jvm_opts="-Dfile.encoding=UTF8" | ||||||
|  | declare -r default_sbt_opts="-XX:+CMSClassUnloadingEnabled" | ||||||
|  | declare -r default_sbt_mem=1536 | ||||||
|  | declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" | ||||||
|  | declare -r sbt_opts_file=".sbtopts" | ||||||
|  | declare -r jvm_opts_file=".jvmopts" | ||||||
|  | declare -r latest_28="2.8.2" | ||||||
|  | declare -r latest_29="2.9.1" | ||||||
|  | declare -r latest_210="2.10.0-SNAPSHOT" | ||||||
|  |  | ||||||
|  | declare -r script_path=$(get_script_path "$BASH_SOURCE") | ||||||
|  | declare -r script_dir="$(dirname $script_path)" | ||||||
|  | declare -r script_name="$(basename $script_path)" | ||||||
|  |  | ||||||
|  | # some non-read-onlies set with defaults | ||||||
|  | declare java_cmd=java | ||||||
|  | declare sbt_launch_dir="$script_dir/.lib" | ||||||
|  | declare sbt_mem=$default_sbt_mem | ||||||
|  |  | ||||||
|  | # pull -J and -D options to give to java. | ||||||
|  | declare -a residual_args | ||||||
|  | declare -a java_args | ||||||
|  | declare -a scalac_args | ||||||
|  | declare -a sbt_commands | ||||||
|  |  | ||||||
|  | build_props_scala () { | ||||||
|  |   if [[ -f project/build.properties ]]; then | ||||||
|  |     versionLine=$(grep ^build.scala.versions project/build.properties) | ||||||
|  |     versionString=${versionLine##build.scala.versions=} | ||||||
|  |     echo ${versionString%% .*} | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | execRunner () { | ||||||
|  |   # print the arguments one to a line, quoting any containing spaces | ||||||
|  |   [[ $verbose || $debug ]] && echo "# Executing command line:" && { | ||||||
|  |     for arg; do | ||||||
|  |       if printf "%s\n" "$arg" | grep -q ' '; then | ||||||
|  |         printf "\"%s\"\n" "$arg" | ||||||
|  |       else | ||||||
|  |         printf "%s\n" "$arg" | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  |     echo "" | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   exec "$@" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sbt_groupid () { | ||||||
|  |   case $(sbt_version) in | ||||||
|  |         0.7.*) echo org.scala-tools.sbt ;; | ||||||
|  |        0.10.*) echo org.scala-tools.sbt ;; | ||||||
|  |     0.11.[12]) echo org.scala-tools.sbt ;; | ||||||
|  |             *) echo org.scala-sbt ;; | ||||||
|  |   esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sbt_artifactory_list () { | ||||||
|  |   local version0=$(sbt_version) | ||||||
|  |   local version=${version0%-SNAPSHOT} | ||||||
|  |   local url="http://typesafe.artifactoryonline.com/typesafe/ivy-snapshots/$(sbt_groupid)/sbt-launch/" | ||||||
|  |   dlog "Looking for snapshot list at: $url " | ||||||
|  |    | ||||||
|  |   curl -s --list-only "$url" | \ | ||||||
|  |     grep -F $version | \ | ||||||
|  |     perl -e 'print reverse <>' | \ | ||||||
|  |     perl -pe 's#^<a href="([^"/]+).*#$1#;' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | make_release_url () { | ||||||
|  |   make_url $(sbt_groupid) releases $(sbt_version) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # argument is e.g. 0.13.0-SNAPSHOT | ||||||
|  | # finds the actual version (with the build id) at artifactory | ||||||
|  | make_snapshot_url () { | ||||||
|  |   for ver in $(sbt_artifactory_list); do | ||||||
|  |     local url=$(make_url $(sbt_groupid) snapshots $ver) | ||||||
|  |     dlog "Testing $url" | ||||||
|  |     curl -s --head "$url" >/dev/null | ||||||
|  |     dlog "curl returned: $?" | ||||||
|  |     echo "$url" | ||||||
|  |     return | ||||||
|  |   done | ||||||
|  | } | ||||||
|  |  | ||||||
|  | jar_url () { | ||||||
|  |   case $(sbt_version) in | ||||||
|  |              0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;; | ||||||
|  |         *-SNAPSHOT) make_snapshot_url ;; | ||||||
|  |                  *) make_release_url ;; | ||||||
|  |   esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  | jar_file () { | ||||||
|  |   echo "$sbt_launch_dir/$1/sbt-launch.jar" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | download_url () { | ||||||
|  |   local url="$1" | ||||||
|  |   local jar="$2" | ||||||
|  |    | ||||||
|  |   echo "Downloading sbt launcher $(sbt_version):" | ||||||
|  |   echo "  From  $url" | ||||||
|  |   echo "    To  $jar" | ||||||
|  |  | ||||||
|  |   mkdir -p $(dirname "$jar") && { | ||||||
|  |     if which curl >/dev/null; then | ||||||
|  |       curl --fail --silent "$url" --output "$jar" | ||||||
|  |     elif which wget >/dev/null; then | ||||||
|  |       wget --quiet -O "$jar" "$url" | ||||||
|  |     fi | ||||||
|  |   } && [[ -f "$jar" ]] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | acquire_sbt_jar () { | ||||||
|  |   sbt_url="$(jar_url)" | ||||||
|  |   sbt_jar="$(jar_file $(sbt_version))" | ||||||
|  |  | ||||||
|  |   [[ -f "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | usage () { | ||||||
|  |   cat <<EOM | ||||||
|  | Usage: $script_name [options] | ||||||
|  |  | ||||||
|  |   -h | -help         print this message | ||||||
|  |   -v | -verbose      this runner is chattier | ||||||
|  |   -d | -debug        set sbt log level to Debug | ||||||
|  |   -q | -quiet        set sbt log level to Error | ||||||
|  |   -no-colors         disable ANSI color codes | ||||||
|  |   -sbt-create        start sbt even if current directory contains no sbt project | ||||||
|  |   -sbt-dir   <path>  path to global settings/plugins directory (default: ~/.sbt/<version>) | ||||||
|  |   -sbt-boot  <path>  path to shared boot directory (default: ~/.sbt/boot in 0.11 series) | ||||||
|  |   -ivy       <path>  path to local Ivy repository (default: ~/.ivy2) | ||||||
|  |   -mem    <integer>  set memory options (default: $sbt_mem, which is | ||||||
|  |                        $(get_mem_opts $sbt_mem) ) | ||||||
|  |   -no-share          use all local caches; no sharing | ||||||
|  |   -offline           put sbt in offline mode | ||||||
|  |   -jvm-debug <port>  Turn on JVM debugging, open at the given port. | ||||||
|  |   -batch             Disable interactive mode | ||||||
|  |  | ||||||
|  |   # sbt version (default: from project/build.properties if present, else latest release) | ||||||
|  |   !!! The only way to accomplish this pre-0.12.0 if there is a build.properties file which | ||||||
|  |   !!! contains an sbt.version property is to update the file on disk.  That's what this does. | ||||||
|  |   -sbt-version  <version>   use the specified version of sbt  | ||||||
|  |   -sbt-jar      <path>      use the specified jar as the sbt launcher | ||||||
|  |   -sbt-snapshot             use a snapshot version of sbt | ||||||
|  |   -sbt-launch-dir <path>    directory to hold sbt launchers (default: $sbt_launch_dir) | ||||||
|  |  | ||||||
|  |   # scala version (default: as chosen by sbt) | ||||||
|  |   -28                       use $latest_28 | ||||||
|  |   -29                       use $latest_29 | ||||||
|  |   -210                      use $latest_210 | ||||||
|  |   -scala-home <path>        use the scala build at the specified directory | ||||||
|  |   -scala-version <version>  use the specified version of scala | ||||||
|  |  | ||||||
|  |   # java version (default: java from PATH, currently $(java -version |& grep version)) | ||||||
|  |   -java-home <path>         alternate JAVA_HOME | ||||||
|  |  | ||||||
|  |   # jvm options and output control | ||||||
|  |   JAVA_OPTS     environment variable holding jvm args, if unset uses "$default_jvm_opts" | ||||||
|  |   SBT_OPTS      environment variable holding jvm args, if unset uses "$default_sbt_opts" | ||||||
|  |   .jvmopts      if file is in sbt root, it is prepended to the args given to the jvm | ||||||
|  |   .sbtopts      if file is in sbt root, it is prepended to the args given to **sbt** | ||||||
|  |   -Dkey=val     pass -Dkey=val directly to the jvm | ||||||
|  |   -J-X          pass option -X directly to the jvm (-J is stripped) | ||||||
|  |   -S-X          add -X to sbt's scalacOptions (-S is stripped) | ||||||
|  |  | ||||||
|  | In the case of duplicated or conflicting options, the order above | ||||||
|  | shows precedence: JAVA_OPTS lowest, command line options highest. | ||||||
|  | EOM | ||||||
|  | } | ||||||
|  |  | ||||||
|  | addJava () { | ||||||
|  |   dlog "[addJava] arg = '$1'" | ||||||
|  |   java_args=( "${java_args[@]}" "$1" ) | ||||||
|  | } | ||||||
|  | addSbt () { | ||||||
|  |   dlog "[addSbt] arg = '$1'" | ||||||
|  |   sbt_commands=( "${sbt_commands[@]}" "$1" ) | ||||||
|  | } | ||||||
|  | addScalac () { | ||||||
|  |   dlog "[addScalac] arg = '$1'" | ||||||
|  |   scalac_args=( "${scalac_args[@]}" "$1" ) | ||||||
|  | } | ||||||
|  | addResidual () { | ||||||
|  |   dlog "[residual] arg = '$1'" | ||||||
|  |   residual_args=( "${residual_args[@]}" "$1" ) | ||||||
|  | } | ||||||
|  | addResolver () { | ||||||
|  |   addSbt "set resolvers in ThisBuild += $1" | ||||||
|  | } | ||||||
|  | addDebugger () { | ||||||
|  |   addJava "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" | ||||||
|  | } | ||||||
|  | get_jvm_opts () { | ||||||
|  |   # echo "${JAVA_OPTS:-$default_jvm_opts}" | ||||||
|  |   # echo "${SBT_OPTS:-$default_sbt_opts}" | ||||||
|  |  | ||||||
|  |   [[ -f "$jvm_opts_file" ]] && cat "$jvm_opts_file" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | process_args () | ||||||
|  | { | ||||||
|  |   require_arg () { | ||||||
|  |     local type="$1" | ||||||
|  |     local opt="$2" | ||||||
|  |     local arg="$3" | ||||||
|  |      | ||||||
|  |     if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then | ||||||
|  |       die "$opt requires <$type> argument" | ||||||
|  |     fi | ||||||
|  |   } | ||||||
|  |   while [[ $# -gt 0 ]]; do | ||||||
|  |     case "$1" in | ||||||
|  |        -h|-help) usage; exit 1 ;; | ||||||
|  |     -v|-verbose) verbose=1 && shift ;; | ||||||
|  |       -d|-debug) debug=1 && shift ;; | ||||||
|  |       -q|-quiet) quiet=1 && shift ;; | ||||||
|  |  | ||||||
|  |            -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; | ||||||
|  |            -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;; | ||||||
|  |      -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; | ||||||
|  |       -no-share) addJava "$noshare_opts" && shift ;; | ||||||
|  |       -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; | ||||||
|  |        -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; | ||||||
|  |      -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; | ||||||
|  |        -offline) addSbt "set offline := true" && shift ;; | ||||||
|  |      -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; | ||||||
|  |          -batch) exec </dev/null && shift ;; | ||||||
|  |  | ||||||
|  |     -sbt-create) sbt_create=true && shift ;; | ||||||
|  |   -sbt-snapshot) sbt_explicit_version=$sbt_snapshot_version && shift ;; | ||||||
|  |        -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; | ||||||
|  |    -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; | ||||||
|  | -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; | ||||||
|  |  -scala-version) require_arg version "$1" "$2" && addSbt "set scalaVersion := \"$2\"" && shift 2 ;; | ||||||
|  |     -scala-home) require_arg path "$1" "$2" && addSbt "set scalaHome in ThisBuild := Some(file(\"$2\"))" && shift 2 ;; | ||||||
|  |      -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; | ||||||
|  |  | ||||||
|  |             -D*) addJava "$1" && shift ;; | ||||||
|  |             -J*) addJava "${1:2}" && shift ;; | ||||||
|  |             -S*) addScalac "${1:2}" && shift ;; | ||||||
|  |             -28) addSbt "++ $latest_28" && shift ;; | ||||||
|  |             -29) addSbt "++ $latest_29" && shift ;; | ||||||
|  |            -210) addSbt "++ $latest_210" && shift ;; | ||||||
|  |  | ||||||
|  |               *) addResidual "$1" && shift ;; | ||||||
|  |     esac | ||||||
|  |   done | ||||||
|  |    | ||||||
|  |   [[ $debug ]] && { | ||||||
|  |     case $(sbt_version) in | ||||||
|  |      0.7.*) addSbt "debug" ;;  | ||||||
|  |          *) addSbt "set logLevel in Global := Level.Debug" ;; | ||||||
|  |     esac | ||||||
|  |   } | ||||||
|  |   [[ $quiet ]] && { | ||||||
|  |     case $(sbt_version) in | ||||||
|  |      0.7.*) ;;  | ||||||
|  |          *) addSbt "set logLevel in Global := Level.Error" ;; | ||||||
|  |     esac | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # if .sbtopts exists, prepend its contents to $@ so it can be processed by this runner | ||||||
|  | [[ -f "$sbt_opts_file" ]] && { | ||||||
|  |   sbtargs=() | ||||||
|  |   while IFS= read -r arg; do | ||||||
|  |     sbtargs=( "${sbtargs[@]}" "$arg" ) | ||||||
|  |   done <"$sbt_opts_file" | ||||||
|  |  | ||||||
|  |   set -- "${sbtargs[@]}" "$@" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # process the combined args, then reset "$@" to the residuals | ||||||
|  | process_args "$@" | ||||||
|  | set -- "${residual_args[@]}" | ||||||
|  | argumentCount=$# | ||||||
|  |  | ||||||
|  | # set scalacOptions if we were given any -S opts | ||||||
|  | [[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[@]}\"" | ||||||
|  |  | ||||||
|  | # Update build.properties no disk to set explicit version - sbt gives us no choice | ||||||
|  | [[ -n "$sbt_explicit_version" ]] && update_build_props_sbt "$sbt_explicit_version" | ||||||
|  | echo "Detected sbt version $(sbt_version)" | ||||||
|  |  | ||||||
|  | [[ -n "$scala_version" ]] && echo "Overriding scala version to $scala_version" | ||||||
|  |  | ||||||
|  | # no args - alert them there's stuff in here | ||||||
|  | (( $argumentCount > 0 )) || echo "Starting $script_name: invoke with -help for other options" | ||||||
|  |  | ||||||
|  | # verify this is an sbt dir or -create was given | ||||||
|  | [[ -f ./build.sbt || -d ./project || -n "$sbt_create" ]] || { | ||||||
|  |   cat <<EOM | ||||||
|  | $(pwd) doesn't appear to be an sbt project. | ||||||
|  | If you want to start sbt anyway, run: | ||||||
|  |   $0 -sbt-create | ||||||
|  |  | ||||||
|  | EOM | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # pick up completion if present; todo | ||||||
|  | [[ -f .sbt_completion.sh ]] && source .sbt_completion.sh | ||||||
|  |  | ||||||
|  | # no jar? download it. | ||||||
|  | [[ -f "$sbt_jar" ]] || acquire_sbt_jar || { | ||||||
|  |   # still no jar? uh-oh. | ||||||
|  |   echo "Download failed. Obtain the jar manually and place it at $sbt_jar" | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [[ -n "$sbt_dir" ]] || { | ||||||
|  |   sbt_dir=~/.sbt/$(sbt_version) | ||||||
|  |   addJava "-Dsbt.global.base=$sbt_dir" | ||||||
|  |   echo "Using $sbt_dir as sbt dir, -sbt-dir to override." | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # since sbt 0.7 doesn't understand iflast | ||||||
|  | (( ${#residual_args[@]} == 0 )) && residual_args=( "shell" ) | ||||||
|  |  | ||||||
|  | # run sbt | ||||||
|  | execRunner "$java_cmd" \ | ||||||
|  |   $(get_mem_opts $sbt_mem) \ | ||||||
|  |   $(get_jvm_opts) \ | ||||||
|  |   ${java_args[@]} \ | ||||||
|  |   -jar "$sbt_jar" \ | ||||||
|  |   "${sbt_commands[@]}" \ | ||||||
|  |   "${residual_args[@]}" | ||||||
| @@ -2,6 +2,7 @@ require 'linguist/file_blob' | |||||||
| require 'linguist/samples' | require 'linguist/samples' | ||||||
|  |  | ||||||
| require 'test/unit' | require 'test/unit' | ||||||
|  | require 'mocha' | ||||||
| require 'mime/types' | require 'mime/types' | ||||||
| require 'pygments' | require 'pygments' | ||||||
|  |  | ||||||
| @@ -30,19 +31,17 @@ class TestBlob < Test::Unit::TestCase | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_mime_type |   def test_mime_type | ||||||
|     assert_equal "application/octet-stream", blob("Binary/dog.o").mime_type |  | ||||||
|     assert_equal "application/ogg", blob("Binary/foo.ogg").mime_type |  | ||||||
|     assert_equal "application/postscript", blob("Binary/octocat.ai").mime_type |     assert_equal "application/postscript", blob("Binary/octocat.ai").mime_type | ||||||
|     assert_equal "application/x-ruby", blob("Ruby/grit.rb").mime_type |     assert_equal "application/x-ruby", blob("Ruby/grit.rb").mime_type | ||||||
|     assert_equal "application/x-sh", blob("Shell/script.sh").mime_type |     assert_equal "application/x-sh", blob("Shell/script.sh").mime_type | ||||||
|     assert_equal "application/xml", blob("XML/bar.xml").mime_type |     assert_equal "application/xml", blob("XML/bar.xml").mime_type | ||||||
|  |     assert_equal "audio/ogg", blob("Binary/foo.ogg").mime_type | ||||||
|     assert_equal "text/plain", blob("Text/README").mime_type |     assert_equal "text/plain", blob("Text/README").mime_type | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_content_type |   def test_content_type | ||||||
|     assert_equal "application/octet-stream", blob("Binary/dog.o").content_type |  | ||||||
|     assert_equal "application/ogg", blob("Binary/foo.ogg").content_type |  | ||||||
|     assert_equal "application/pdf", blob("Binary/foo.pdf").content_type |     assert_equal "application/pdf", blob("Binary/foo.pdf").content_type | ||||||
|  |     assert_equal "audio/ogg", blob("Binary/foo.ogg").content_type | ||||||
|     assert_equal "image/png", blob("Binary/foo.png").content_type |     assert_equal "image/png", blob("Binary/foo.png").content_type | ||||||
|     assert_equal "text/plain; charset=iso-8859-2", blob("Text/README").content_type |     assert_equal "text/plain; charset=iso-8859-2", blob("Text/README").content_type | ||||||
|   end |   end | ||||||
| @@ -263,11 +262,18 @@ class TestBlob < Test::Unit::TestCase | |||||||
|     assert !blob("Text/dump.sql").indexable? |     assert !blob("Text/dump.sql").indexable? | ||||||
|     assert !blob("Binary/github.po").indexable? |     assert !blob("Binary/github.po").indexable? | ||||||
|     assert !blob("Binary/linguist.gem").indexable? |     assert !blob("Binary/linguist.gem").indexable? | ||||||
|  |  | ||||||
|  |     # large binary blobs should fail on size check first, not call  | ||||||
|  |     # into charlock_holmes and alloc big buffers for testing encoding | ||||||
|  |     b = blob("Binary/octocat.ai") | ||||||
|  |     b.expects(:binary?).never | ||||||
|  |     assert !b.indexable? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_language |   def test_language | ||||||
|     Samples.each do |sample| |     Samples.each do |sample| | ||||||
|       blob = blob(sample[:path]) |       blob = blob(sample[:path]) | ||||||
|  |       assert blob.language, "No language for #{sample[:path]}" | ||||||
|       assert_equal sample[:language], blob.language.name, blob.name |       assert_equal sample[:language], blob.language.name, blob.name | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|   | |||||||
| @@ -1,71 +0,0 @@ | |||||||
| require 'linguist/mime' |  | ||||||
|  |  | ||||||
| require 'test/unit' |  | ||||||
|  |  | ||||||
| class TestMime < Test::Unit::TestCase |  | ||||||
|   include Linguist |  | ||||||
|  |  | ||||||
|   def test_extension_lookup |  | ||||||
|     # Default to plain text if we have no idea. |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for(nil) |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('') |  | ||||||
|  |  | ||||||
|     # Add an assertion to this list if you add/change any extensions |  | ||||||
|     # in mimes.yml. Its still useful to test even trivial cases since |  | ||||||
|     # MIME::Type's extension lookup may return multiple matches and we |  | ||||||
|     # only pick one of them. Please keep this list alphabetized. |  | ||||||
|     assert_equal 'application/javascript', Mime.mime_for('.js') |  | ||||||
|     assert_equal 'application/octet-stream', Mime.mime_for('.dll') |  | ||||||
|     assert_equal 'application/octet-stream', Mime.mime_for('.dmg') |  | ||||||
|     assert_equal 'application/octet-stream', Mime.mime_for('.exe') |  | ||||||
|     assert_equal 'application/ogg', Mime.mime_for('.ogg') |  | ||||||
|     assert_equal 'application/postscript', Mime.mime_for('.ai') |  | ||||||
|     assert_equal 'application/postscript', Mime.mime_for('.eps') |  | ||||||
|     assert_equal 'application/postscript', Mime.mime_for('.ps') |  | ||||||
|     assert_equal 'application/vnd.adobe.air-application-installer-package+zip', Mime.mime_for('.air') |  | ||||||
|     assert_equal 'application/vnd.oasis.opendocument.presentation', Mime.mime_for('.odp') |  | ||||||
|     assert_equal 'application/vnd.oasis.opendocument.spreadsheet', Mime.mime_for('.ods') |  | ||||||
|     assert_equal 'application/vnd.oasis.opendocument.text', Mime.mime_for('.odt') |  | ||||||
|     assert_equal 'application/vnd.openofficeorg.extension', Mime.mime_for('.oxt') |  | ||||||
|     assert_equal 'application/vnd.openxmlformats-officedocument.presentationml.presentation', Mime.mime_for('.pptx') |  | ||||||
|     assert_equal 'application/x-chrome-extension', Mime.mime_for('.crx') |  | ||||||
|     assert_equal 'application/x-debian-package', Mime.mime_for('.deb') |  | ||||||
|     assert_equal 'application/x-iwork-keynote-sffkey', Mime.mime_for('.key') |  | ||||||
|     assert_equal 'application/x-iwork-numbers-sffnumbers', Mime.mime_for('.numbers') |  | ||||||
|     assert_equal 'application/x-iwork-pages-sffpages', Mime.mime_for('.pages') |  | ||||||
|     assert_equal 'application/x-java-archive', Mime.mime_for('.ear') |  | ||||||
|     assert_equal 'application/x-java-archive', Mime.mime_for('.jar') |  | ||||||
|     assert_equal 'application/x-java-archive', Mime.mime_for('.war') |  | ||||||
|     assert_equal 'application/x-latex', Mime.mime_for('.latex') |  | ||||||
|     assert_equal 'application/x-ms-xbap', Mime.mime_for('.xbap') |  | ||||||
|     assert_equal 'application/x-perl', Mime.mime_for('.pl') |  | ||||||
|     assert_equal 'application/x-perl', Mime.mime_for('.pm') |  | ||||||
|     assert_equal 'application/x-python', Mime.mime_for('.py') |  | ||||||
|     assert_equal 'application/x-ruby', Mime.mime_for('.rb') |  | ||||||
|     assert_equal 'application/x-sh', Mime.mime_for('.sh') |  | ||||||
|     assert_equal 'application/x-shockwave-flash', Mime.mime_for('.swf') |  | ||||||
|     assert_equal 'application/x-silverlight-app', Mime.mime_for('.xap') |  | ||||||
|     assert_equal 'application/x-supercollider', Mime.mime_for('.sc') |  | ||||||
|     assert_equal 'application/xaml+xml', Mime.mime_for('.xaml') |  | ||||||
|     assert_equal 'text/cache-manifest', Mime.mime_for('.manifest') |  | ||||||
|     assert_equal 'text/html', Mime.mime_for('.html') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.c') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.cc') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.cpp') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.cu') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.cxx') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.h') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.hh') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.hpp') |  | ||||||
|     assert_equal 'text/plain', Mime.mime_for('.kt') |  | ||||||
|     assert_equal 'text/x-logtalk', Mime.mime_for('.lgt') |  | ||||||
|     assert_equal 'text/x-nemerle', Mime.mime_for('.n') |  | ||||||
|     assert_equal 'text/x-nimrod', Mime.mime_for('.nim') |  | ||||||
|     assert_equal 'text/x-ocaml', Mime.mime_for('.ml') |  | ||||||
|     assert_equal 'text/x-ocaml', Mime.mime_for('.sig') |  | ||||||
|     assert_equal 'text/x-ocaml', Mime.mime_for('.sml') |  | ||||||
|     assert_equal 'text/x-rust', Mime.mime_for('.rc') |  | ||||||
|     assert_equal 'text/x-rust', Mime.mime_for('.rs') |  | ||||||
|     assert_equal 'video/quicktime', Mime.mime_for('.mov') |  | ||||||
|   end |  | ||||||
| end |  | ||||||
| @@ -34,15 +34,15 @@ class TestTokenizer < Test::Unit::TestCase | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_skip_comments |   def test_skip_comments | ||||||
|     assert_equal %w(foo #), tokenize("foo\n# Comment") |     assert_equal %w(foo), tokenize("foo\n# Comment") | ||||||
|     assert_equal %w(foo # bar), tokenize("foo\n# Comment\nbar") |     assert_equal %w(foo bar), tokenize("foo\n# Comment\nbar") | ||||||
|     assert_equal %w(foo //), tokenize("foo\n// Comment") |     assert_equal %w(foo), tokenize("foo\n// Comment") | ||||||
|     assert_equal %w(foo /* */), tokenize("foo /* Comment */") |     assert_equal %w(foo), tokenize("foo /* Comment */") | ||||||
|     assert_equal %w(foo /* */), tokenize("foo /* \nComment\n */") |     assert_equal %w(foo), tokenize("foo /* \nComment\n */") | ||||||
|     assert_equal %w(foo <!-- -->), tokenize("foo <!-- Comment -->") |     assert_equal %w(foo), tokenize("foo <!-- Comment -->") | ||||||
|     assert_equal %w(foo {- -}), tokenize("foo {- Comment -}") |     assert_equal %w(foo), tokenize("foo {- Comment -}") | ||||||
|     assert_equal %w(foo \(* *\)), tokenize("foo (* Comment *)") |     assert_equal %w(foo), tokenize("foo (* Comment *)") | ||||||
|     assert_equal %w(% %), tokenize("2 % 10\n% Comment") |     assert_equal %w(%), tokenize("2 % 10\n% Comment") | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def test_sgml_tags |   def test_sgml_tags | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user