Merge branch 'master' into 815

Conflicts:
	lib/linguist/samples.json
This commit is contained in:
Arfon Smith
2014-04-21 11:37:49 -05:00
142 changed files with 29547 additions and 1870 deletions

View File

@@ -1,4 +1,6 @@
before_install: sudo apt-get install libicu-dev -y
before_install:
- sudo apt-get install libicu-dev -y
- gem update --system 2.1.11
rvm:
- 1.8.7
- 1.9.2

View File

@@ -1,4 +1,4 @@
Copyright (c) 2011-2013 GitHub, Inc.
Copyright (c) 2011-2014 GitHub, Inc.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation

View File

@@ -1,18 +1,17 @@
# Linguist
We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs and generate language breakdown graphs.
We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.
## Features
### Language detection
Linguist defines the list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and lexer must be defined there.
Linguist defines a list of all languages known to GitHub in a [yaml file](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml). In order for a file to be highlighted, a language and a lexer must be defined there.
Most languages are detected by their file extension. This is the fastest and most common situation.
For disambiguating between files with common extensions, we use a [Bayesian classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb). For an example, this helps us tell the difference between `.h` files which could be either C, C++, or Obj-C.
In the actual GitHub app we deal with `Grit::Blob` objects. For testing, there is a simple `FileBlob` API.
Most languages are detected by their file extension. For disambiguating between files with common extensions, we first apply some common-sense heuristics to pick out obvious languages. After that, we use a
[statistical
classifier](https://github.com/github/linguist/blob/master/lib/linguist/classifier.rb).
This process can help us tell the difference between, for example, `.h` files which could be either C, C++, or Obj-C.
```ruby
@@ -27,12 +26,9 @@ See [lib/linguist/language.rb](https://github.com/github/linguist/blob/master/li
The actual syntax highlighting is handled by our Pygments wrapper, [pygments.rb](https://github.com/tmm1/pygments.rb). It also provides a [Lexer abstraction](https://github.com/tmm1/pygments.rb/blob/master/lib/pygments/lexer.rb) that determines which highlighter should be used on a file.
We typically run on a pre-release version of Pygments, [pygments.rb](https://github.com/tmm1/pygments.rb), to get early access to new lexers. The [languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml) file is a dump of the lexers we have available on our server.
### Stats
The Language Graph you see on every repository is built by aggregating the languages of each file in that repository.
The top language in the graph determines the project's primary language. Collectively, these stats make up the [Top Languages](https://github.com/languages) page.
The Language stats bar that you see on every repository is built by aggregating the languages of each file in that repository. The top language in the graph determines the project's primary language.
The repository stats API, accessed through `#languages`, can be used on a directory:
@@ -42,10 +38,27 @@ project.language.name #=> "Ruby"
project.languages #=> { "Ruby" => 0.98, "Shell" => 0.02 }
```
These stats are also printed out by the `linguist` binary. Try running `linguist` on itself:
These stats are also printed out by the `linguist` binary. You can use the
`--breakdown` flag, and the binary will also output the breakdown of files by language.
$ bundle exec linguist lib/
100% Ruby
You can try running `linguist` on the `lib/` directory in this repository itself:
$ bundle exec linguist lib/ --breakdown
100.00% Ruby
Ruby:
linguist/blob_helper.rb
linguist/classifier.rb
linguist/file_blob.rb
linguist/generated.rb
linguist/heuristics.rb
linguist/language.rb
linguist/md5.rb
linguist/repository.rb
linguist/samples.rb
linguist/tokenizer.rb
linguist.rb
#### Ignore vendored files

View File

@@ -1,5 +1,7 @@
require 'json'
require 'rake/clean'
require 'rake/testtask'
require 'yaml'
task :default => :test
@@ -13,6 +15,13 @@ task :samples do
File.open('lib/linguist/samples.json', 'w') { |io| io.write json }
end
task :build_gem do
languages = YAML.load_file("lib/linguist/languages.yml")
File.write("lib/linguist/languages.json", JSON.dump(languages))
`gem build github-linguist.gemspec`
File.delete("lib/linguist/languages.json")
end
namespace :classifier do
LIMIT = 1_000

View File

@@ -1,14 +1,22 @@
#!/usr/bin/env ruby
# linguist — detect language type for a file, or, given a directory, determine language breakdown
#
# usage: linguist <path>
# usage: linguist <path> [<--breakdown>]
require 'linguist/file_blob'
require 'linguist/repository'
path = ARGV[0] || Dir.pwd
# special case if not given a directory but still given the --breakdown option
if path == "--breakdown"
path = Dir.pwd
breakdown = true
end
ARGV.shift
breakdown = true if ARGV[0] == "--breakdown"
if File.directory?(path)
repo = Linguist::Repository.from_directory(path)
repo.languages.sort_by { |_, size| size }.reverse.each do |language, size|
@@ -16,6 +24,17 @@ if File.directory?(path)
percentage = sprintf '%.2f' % percentage
puts "%-7s %s" % ["#{percentage}%", language]
end
if breakdown
puts
file_breakdown = repo.breakdown_by_file
file_breakdown.each do |lang, files|
puts "#{lang}:"
files.each do |file|
puts file
end
puts
end
end
elsif File.file?(path)
blob = Linguist::FileBlob.new(path, Dir.pwd)
type = if blob.text?

View File

@@ -1,10 +1,12 @@
Gem::Specification.new do |s|
s.name = 'github-linguist'
s.version = '2.9.8'
s.version = '2.10.12'
s.summary = "GitHub Language detection"
s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'
s.authors = "GitHub"
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
s.files = Dir['lib/**/*']
s.executables << 'linguist'
@@ -12,8 +14,8 @@ Gem::Specification.new do |s|
s.add_dependency 'charlock_holmes', '~> 0.6.6'
s.add_dependency 'escape_utils', '>= 0.3.1'
s.add_dependency 'mime-types', '~> 1.19'
s.add_dependency 'pygments.rb', '~> 0.5.2'
s.add_dependency 'pygments.rb', '~> 0.5.4'
s.add_development_dependency 'json'
s.add_development_dependency 'mocha'
s.add_development_dependency 'rake'

View File

@@ -1,5 +1,6 @@
require 'linguist/blob_helper'
require 'linguist/generated'
require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/repository'
require 'linguist/samples'

View File

@@ -190,9 +190,9 @@ module Linguist
# Public: Is the blob safe to colorize?
#
# We use Pygments for syntax highlighting blobs. Pygments
# can be too slow for very large blobs or for certain
# can be too slow for very large blobs or for certain
# corner-case blobs.
#
#
# Return true or false
def safe_to_colorize?
!large? && text? && !high_ratio_of_long_lines?

View File

@@ -78,18 +78,13 @@ module Linguist
def classify(tokens, languages)
return [] if tokens.nil?
tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)
scores = {}
if verbosity >= 2
dump_all_tokens(tokens, languages)
end
debug_dump_all_tokens(tokens, languages) if verbosity >= 2
languages.each do |language|
scores[language] = tokens_probability(tokens, language) +
language_probability(language)
if verbosity >= 1
printf "%10s = %10.3f + %7.3f = %10.3f\n",
language, tokens_probability(tokens, language), language_probability(language), scores[language]
end
scores[language] = tokens_probability(tokens, language) + language_probability(language)
debug_dump_probabilities(tokens, language, scores[language]) if verbosity >= 1
end
scores.sort { |a, b| b[1] <=> a[1] }.map { |score| [score[0], score[1]] }
@@ -135,6 +130,11 @@ module Linguist
@verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i
end
def debug_dump_probabilities(tokens, language, score)
printf("%10s = %10.3f + %7.3f = %10.3f\n",
language, tokens_probability(tokens, language), language_probability(language), score)
end
# Internal: show a table of probabilities for each <token,language> pair.
#
# The number in each table entry is the number of "points" that each
@@ -145,22 +145,22 @@ module Linguist
# how much more likely (log of probability ratio) that token is to
# appear in one language vs. the least-likely language. Dashes
# indicate the least-likely language (and zero points) for each token.
def dump_all_tokens(tokens, languages)
def debug_dump_all_tokens(tokens, languages)
maxlen = tokens.map { |tok| tok.size }.max
printf "%#{maxlen}s", ""
puts " #" + languages.map { |lang| sprintf("%10s", lang) }.join
token_map = Hash.new(0)
tokens.each { |tok| token_map[tok] += 1 }
token_map.sort.each { |tok, count|
arr = languages.map { |lang| [lang, token_probability(tok, lang)] }
min = arr.map { |a,b| b }.min
minlog = Math.log(min)
if !arr.inject(true) { |result, n| result && n[1] == arr[0][1] }
printf "%#{maxlen}s%5d", tok, count
puts arr.map { |ent|
ent[1] == min ? " -" : sprintf("%10.3f", count * (Math.log(ent[1]) - minlog))
}.join

View File

@@ -58,9 +58,12 @@ module Linguist
generated_parser? ||
generated_net_docfile? ||
generated_net_designer_file? ||
generated_postscript? ||
generated_protocol_buffer? ||
generated_jni_header? ||
node_modules?
composer_lock? ||
node_modules? ||
vcr_cassette?
end
# Internal: Is the blob an XCode project file?
@@ -175,6 +178,29 @@ module Linguist
false
end
# Internal: Is the blob of PostScript generated?
#
# PostScript files are often generated by other programs. If they tell us so,
# we can detect them.
#
# Returns true or false.
def generated_postscript?
return false unless ['.ps', '.eps'].include? extname
# We analyze the "%%Creator:" comment, which contains the author/generator
# of the file. If there is one, it should be in one of the first few lines.
creator = lines[0..9].find {|line| line =~ /^%%Creator: /}
return false if creator.nil?
# Most generators write their version number, while human authors' or companies'
# names don't contain numbers. So look if the line contains digits. Also
# look for some special cases without version numbers.
return creator =~ /[0-9]/ ||
creator.include?("mpage") ||
creator.include?("draw") ||
creator.include?("ImageMagick")
end
# Internal: Is the blob a C++, Java or Python source file generated by the
# Protocol Buffer compiler?
#
@@ -197,12 +223,28 @@ module Linguist
lines[1].include?("#include <jni.h>")
end
# node_modules/ can contain large amounts of files, in general not meant
# for humans in pull requests.
# Internal: Is the blob part of node_modules/, which are not meant for humans in pull requests.
#
# Returns true or false.
def node_modules?
!!name.match(/node_modules\//)
end
# Internal: Is the blob a generated php composer lock file?
#
# Returns true or false.
def composer_lock?
!!name.match(/composer.lock/)
end
# Is the blob a VCR Cassette file?
#
# Returns true or false
def vcr_cassette?
return false unless extname == '.yml'
return false unless lines.count > 2
# VCR Cassettes have "recorded_with: VCR" in the second last line.
return lines[-2].include?("recorded_with: VCR")
end
end
end

View File

@@ -0,0 +1,80 @@
module Linguist
# A collection of simple heuristics that can be used to better analyze languages.
class Heuristics
ACTIVE = false
# Public: Given an array of String language names,
# apply heuristics against the given data and return an array
# of matching languages, or nil.
#
# data - Array of tokens or String data to analyze.
# languages - Array of language name Strings to restrict to.
#
# Returns an array of Languages or []
def self.find_by_heuristics(data, languages)
if active?
if languages.all? { |l| ["Objective-C", "C++"].include?(l) }
disambiguate_c(data, languages)
end
if languages.all? { |l| ["Perl", "Prolog"].include?(l) }
disambiguate_pl(data, languages)
end
if languages.all? { |l| ["ECL", "Prolog"].include?(l) }
disambiguate_ecl(data, languages)
end
if languages.all? { |l| ["TypeScript", "XML"].include?(l) }
disambiguate_ts(data, languages)
end
if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) }
disambiguate_cl(data, languages)
end
end
end
# .h extensions are ambigious between C, C++, and Objective-C.
# We want to shortcut look for Objective-C _and_ now C++ too!
#
# Returns an array of Languages or []
def self.disambiguate_c(data, languages)
matches = []
matches << Language["Objective-C"] if data.include?("@interface")
matches << Language["C++"] if data.include?("#include <cstdint>")
matches
end
def self.disambiguate_pl(data, languages)
matches = []
matches << Language["Prolog"] if data.include?(":-")
matches << Language["Perl"] if data.include?("use strict")
matches
end
def self.disambiguate_ecl(data, languages)
matches = []
matches << Language["Prolog"] if data.include?(":-")
matches << Language["ECL"] if data.include?(":=")
matches
end
def self.disambiguate_ts(data, languages)
matches = []
if (data.include?("</translation>"))
matches << Language["XML"]
else
matches << Language["TypeScript"]
end
matches
end
def self.disambiguate_cl(data, languages)
matches = []
matches << Language["Common Lisp"] if data.include?("(defun ")
matches << Language["OpenCL"] if /\/\* |\/\/ |^\}/.match(data)
matches
end
def self.active?
!!ACTIVE
end
end
end

View File

@@ -1,8 +1,13 @@
require 'escape_utils'
require 'pygments'
require 'yaml'
begin
require 'json'
rescue LoadError
end
require 'linguist/classifier'
require 'linguist/heuristics'
require 'linguist/samples'
module Linguist
@@ -17,17 +22,27 @@ module Linguist
@alias_index = {}
@extension_index = Hash.new { |h,k| h[k] = [] }
@interpreter_index = Hash.new { |h,k| h[k] = [] }
@filename_index = Hash.new { |h,k| h[k] = [] }
@primary_extension_index = {}
# Valid Languages types
TYPES = [:data, :markup, :programming]
TYPES = [:data, :markup, :programming, :prose]
# Names of non-programming languages that we will still detect
#
# Returns an array
def self.detectable_markup
["CSS", "Less", "Sass", "TeX"]
["CSS", "Less", "Sass", "SCSS", "Stylus", "TeX"]
end
# Detect languages by a specific type
#
# type - A symbol that exists within TYPES
#
# Returns an array
def self.by_type(type)
all.select { |h| h.type == type }
end
# Internal: Create a new Language object
@@ -71,6 +86,10 @@ module Linguist
@primary_extension_index[language.primary_extension] = language
language.interpreters.each do |interpreter|
@interpreter_index[interpreter] << language
end
language.filenames.each do |filename|
@filename_index[filename] << language
end
@@ -95,16 +114,32 @@ module Linguist
name += ".script!"
end
# First try to find languages that match based on filename.
possible_languages = find_by_filename(name)
# If there is more than one possible language with that extension (or no
# extension at all, in the case of extensionless scripts), we need to continue
# our detection work
if possible_languages.length > 1
data = data.call() if data.respond_to?(:call)
possible_language_names = possible_languages.map(&:name)
# Don't bother with emptiness
if data.nil? || data == ""
nil
elsif result = Classifier.classify(Samples::DATA, data, possible_languages.map(&:name)).first
Language[result[0]]
# Check if there's a shebang line and use that as authoritative
elsif (result = find_by_shebang(data)) && !result.empty?
result.first
# No shebang. Still more work to do. Try to find it with our heuristics.
elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty?
determined.first
# Lastly, fall back to the probablistic classifier.
elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first
# Return the actual Language object based of the string language name (i.e., first element of `#classify`)
Language[classified[0]]
end
else
# Simplest and most common case, we can just return the one match based on extension
possible_languages.first
end
end
@@ -162,6 +197,20 @@ module Linguist
langs.compact.uniq
end
# Public: Look up Languages by shebang line.
#
# data - Array of tokens or String data to analyze.
#
# Examples
#
# Language.find_by_shebang("#!/bin/bash\ndate;")
# # => [#<Language name="Bash">]
#
# Returns the matching Language
def self.find_by_shebang(data)
@interpreter_index[Linguist.interpreter_from_shebang(data)]
end
# Public: Look up Language by its name or lexer.
#
# name - The String name of the Language
@@ -247,6 +296,7 @@ module Linguist
# Set extensions or default to [].
@extensions = attributes[:extensions] || []
@interpreters = attributes[:interpreters] || []
@filenames = attributes[:filenames] || []
unless @primary_extension = attributes[:primary_extension]
@@ -359,6 +409,15 @@ module Linguist
# Returns the extension String.
attr_reader :primary_extension
# Public: Get interpreters
#
# Examples
#
# # => ['awk', 'gawk', 'mawk' ...]
#
# Returns the interpreters Array
attr_reader :interpreters
# Public: Get filenames
#
# Examples
@@ -426,7 +485,7 @@ module Linguist
#
# Returns html String
def colorize(text, options = {})
lexer.highlight(text, options = {})
lexer.highlight(text, options)
end
# Public: Return name as String representation
@@ -452,11 +511,22 @@ module Linguist
end
extensions = Samples::DATA['extnames']
interpreters = Samples::DATA['interpreters']
filenames = Samples::DATA['filenames']
popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
YAML.load_file(File.expand_path("../languages.yml", __FILE__)).each do |name, options|
languages_yml = File.expand_path("../languages.yml", __FILE__)
languages_json = File.expand_path("../languages.json", __FILE__)
if File.exist?(languages_json) && defined?(JSON)
languages = JSON.load(File.read(languages_json))
else
languages = YAML.load_file(languages_yml)
end
languages.each do |name, options|
options['extensions'] ||= []
options['interpreters'] ||= []
options['filenames'] ||= []
if extnames = extensions[name]
@@ -467,6 +537,18 @@ module Linguist
end
end
if interpreters == nil
interpreters = {}
end
if interpreter_names = interpreters[name]
interpreter_names.each do |interpreter|
if !options['interpreters'].include?(interpreter)
options['interpreters'] << interpreter
end
end
end
if fns = filenames[name]
fns.each do |filename|
if !options['filenames'].include?(filename)
@@ -487,6 +569,7 @@ module Linguist
:searchable => options.key?('searchable') ? options['searchable'] : true,
:search_term => options['search_term'],
:extensions => options['extensions'].sort,
:interpreters => options['interpreters'].sort,
:primary_extension => options['primary_extension'],
:filenames => options['filenames'],
:popular => popular.include?(name)

View File

@@ -10,6 +10,7 @@
# ace_mode - A String name of Ace Mode (if available)
# wrap - Boolean wrap to enable line wrapping (default: false)
# extension - An Array of associated extensions
# interpreters - An Array of associated interpreters
# primary_extension - A String for the main extension associated with
# the language. Must be unique. Used when a Language is picked
# from a dropdown and we need to automatically choose an
@@ -22,7 +23,7 @@
# Any additions or modifications (even trivial) should have corresponding
# test change in `test/test_blob.rb`.
#
# Please keep this list alphabetized.
# Please keep this list alphabetized. Capitalization comes before lower case.
ABAP:
type: programming
@@ -52,6 +53,18 @@ ASP:
- .aspx
- .axd
ATS:
type: programming
color: "#1ac620"
primary_extension: .dats
lexer: OCaml
aliases:
- ats2
extensions:
- .atxt
- .hats
- .sats
ActionScript:
type: programming
lexer: ActionScript 3
@@ -70,6 +83,7 @@ Ada:
Agda:
type: programming
color: "#467C91"
primary_extension: .agda
ApacheConf:
@@ -88,6 +102,10 @@ AppleScript:
aliases:
- osascript
primary_extension: .applescript
extensions:
- .scpt
interpreters:
- osascript
Arc:
type: programming
@@ -101,6 +119,22 @@ Arduino:
lexer: C++
primary_extension: .ino
AsciiDoc:
type: prose
lexer: Text only
ace_mode: asciidoc
wrap: true
primary_extension: .asciidoc
extensions:
- .adoc
- .asc
AspectJ:
type: programming
lexer: AspectJ
color: "#1957b0"
primary_extension: .aj
Assembly:
type: programming
lexer: NASM
@@ -140,6 +174,11 @@ Awk:
- .gawk
- .mawk
- .nawk
interpreters:
- awk
- gawk
- mawk
- nawk
Batchfile:
type: programming
@@ -181,6 +220,11 @@ Brainfuck:
extensions:
- .bf
Brightscript:
type: programming
lexer: Text only
primary_extension: .brs
Bro:
type: programming
primary_extension: .bro
@@ -190,6 +234,7 @@ C:
color: "#555"
primary_extension: .c
extensions:
- .cats
- .w
C#:
@@ -201,6 +246,7 @@ C#:
- csharp
primary_extension: .cs
extensions:
- .cshtml
- .csx
C++:
@@ -214,6 +260,7 @@ C++:
extensions:
- .C
- .c++
- .cc
- .cxx
- .H
- .h++
@@ -259,7 +306,7 @@ COBOL:
CSS:
ace_mode: css
color: "#1f085e"
color: "#563d7c"
primary_extension: .css
Ceylon:
@@ -271,6 +318,16 @@ ChucK:
lexer: Java
primary_extension: .ck
Cirru:
type: programming
color: "#aaaaff"
primary_extension: .cirru
# ace_mode: cirru
# lexer: Cirru
lexer: Text only
extensions:
- .cr
Clean:
type: programming
color: "#3a81ad"
@@ -291,6 +348,7 @@ Clojure:
- .cljscm
- .cljx
- .hic
- .cljs.hl
filenames:
- riemann.config
@@ -308,6 +366,8 @@ CoffeeScript:
- .iced
filenames:
- Cakefile
interpreters:
- coffee
ColdFusion:
type: programming
@@ -333,6 +393,12 @@ Common Lisp:
- .lsp
- .ny
- .podsl
interpreters:
- lisp
- sbcl
- ccl
- clisp
- ecl
Coq:
type: programming
@@ -346,6 +412,18 @@ Cpp-ObjDump:
- .c++objdump
- .cxx-objdump
Creole:
type: prose
lexer: Text only
wrap: true
primary_extension: .creole
Crystal:
type: programming
lexer: Ruby
primary_extension: .cr
ace_mode: ruby
Cucumber:
lexer: Gherkin
primary_extension: .feature
@@ -379,7 +457,7 @@ D-ObjDump:
DM:
type: programming
color: "#075ff1"
lexer: Text only
lexer: C++
primary_extension: .dm
aliases:
- byond
@@ -416,10 +494,19 @@ DCPU-16 ASM:
Diff:
primary_extension: .diff
Dogescript:
type: programming
lexer: Text only
color: "#cca760"
primary_extension: .djs
Dylan:
type: programming
color: "#3ebc27"
primary_extension: .dylan
extensions:
- .intr
- .lid
Ecere Projects:
type: data
@@ -485,6 +572,14 @@ F#:
- .fsi
- .fsx
FLUX:
type: programming
color: "#33CCFF"
primary_extension: .fx
lexer: Text only
extensions:
- .flux
FORTRAN:
type: programming
lexer: Fortran
@@ -537,6 +632,17 @@ Forth:
extensions:
- .4th
Frege:
type: programming
color: "#00cafe"
lexer: Haskell
primary_extension: .fr
Game Maker Language:
type: programming
lexer: JavaScript
primary_extension: .gml
GAS:
type: programming
group: Assembly
@@ -584,6 +690,17 @@ Glyph:
lexer: Tcl
primary_extension: .glf
Gnuplot:
type: programming
color: "#f0a9f0"
lexer: Gnuplot
primary_extension: .gp
extensions:
- .gnu
- .gnuplot
- .plot
- .plt
Go:
type: programming
color: "#a89b4d"
@@ -610,6 +727,8 @@ Groovy:
ace_mode: groovy
color: "#e69f56"
primary_extension: .groovy
interpreters:
- groovy
Groovy Server Pages:
group: Groovy
@@ -627,6 +746,7 @@ HTML:
extensions:
- .htm
- .xhtml
- .html.hl
HTML+Django:
type: markup
@@ -675,6 +795,12 @@ Handlebars:
- .html.handlebars
- .html.hbs
Harbour:
type: programming
lexer: Text only
color: "#0e60e3"
primary_extension: .hb
Haskell:
type: programming
color: "#29b544"
@@ -690,6 +816,19 @@ Haxe:
extensions:
- .hxsl
Hy:
type: programming
lexer: Clojure
ace_mode: clojure
color: "#7891b1"
primary_extension: .hy
IDL:
type: programming
lexer: Text only
color: "#e3592c"
primary_extension: .pro
INI:
type: data
extensions:
@@ -748,8 +887,21 @@ JSON:
- .sublime-settings
- .sublime-workspace
filenames:
- .jshintrc
- composer.lock
JSON5:
type: data
lexer: JavaScript
primary_extension: .json5
JSONLD:
type: data
group: JavaScript
ace_mode: json
lexer: JavaScript
primary_extension: .jsonld
Jade:
group: HTML
type: markup
@@ -772,7 +924,7 @@ Java Server Pages:
JavaScript:
type: programming
ace_mode: javascript
color: "#f15501"
color: "#f7df1e"
aliases:
- js
- node
@@ -780,16 +932,20 @@ JavaScript:
extensions:
- ._js
- .bones
- .es6
- .jake
- .jsfl
- .jsm
- .jss
- .jsx
- .njs
- .pac
- .sjs
- .ssjs
filenames:
- Jakefile
interpreters:
- node
Julia:
type: programming
@@ -878,10 +1034,6 @@ LiveScript:
Logos:
type: programming
primary_extension: .xm
extensions:
- .x
- .xi
- .xmi
Logtalk:
type: programming
@@ -897,6 +1049,8 @@ Lua:
extensions:
- .nse
- .rbxs
interpreters:
- lua
M:
type: programming
@@ -918,6 +1072,8 @@ Makefile:
- makefile
- Makefile
- GNUmakefile
interpreters:
- make
Mako:
primary_extension: .mako
@@ -925,7 +1081,7 @@ Mako:
- .mao
Markdown:
type: markup
type: prose
lexer: Text only
ace_mode: markdown
wrap: true
@@ -936,6 +1092,18 @@ Markdown:
- .mkdown
- .ron
Mask:
type: markup
lexer: SCSS
color: "#f97732"
ace_mode: scss
primary_extension: .mask
Mathematica:
type: programming
primary_extension: .mathematica
lexer: Text only
Matlab:
type: programming
color: "#bb92ac"
@@ -956,6 +1124,12 @@ Max:
- .mxt
- .pat
MediaWiki:
type: prose
lexer: Text only
wrap: true
primary_extension: .mediawiki
MiniD: # Legacy
searchable: false
primary_extension: .minid # Dummy extension
@@ -1037,6 +1211,7 @@ OCaml:
primary_extension: .ml
extensions:
- .eliomi
- .ml4
- .mli
- .mll
- .mly
@@ -1091,12 +1266,24 @@ OpenEdge ABL:
- abl
primary_extension: .p
Org:
type: prose
lexer: Text only
wrap: true
primary_extension: .org
Oxygene:
type: programming
lexer: Text only
color: "#5a63a3"
primary_extension: .oxygene
PAWN:
type: programming
lexer: C++
color: "#dbb284"
primary_extension: .pwn
PHP:
type: programming
ace_mode: php
@@ -1150,13 +1337,27 @@ Perl:
primary_extension: .pl
extensions:
- .PL
- .nqp
- .perl
- .ph
- .plx
- .pm6
- .pm
- .pod
- .psgi
interpreters:
- perl
Perl6:
type: programming
color: "#0298c3"
primary_extension: .p6
extensions:
- .6pl
- .6pm
- .nqp
- .p6l
- .p6m
- .pl6
- .pm6
Pike:
type: programming
@@ -1166,12 +1367,25 @@ Pike:
extensions:
- .pmod
Pod:
type: prose
lexer: Text only
ace_mode: perl
wrap: true
primary_extension: .pod
PogoScript:
type: programming
color: "#d80074"
lexer: Text only
primary_extension: .pogo
PostScript:
type: markup
primary_extension: .ps
extensions:
- .eps
PowerShell:
type: programming
ace_mode: powershell
@@ -1193,7 +1407,8 @@ Prolog:
color: "#74283c"
primary_extension: .prolog
extensions:
- .pro
- .ecl
- .pl
Protocol Buffer:
type: markup
@@ -1224,12 +1439,17 @@ Python:
primary_extension: .py
extensions:
- .gyp
- .lmi
- .pyt
- .pyw
- .wsgi
- .xpy
filenames:
- wscript
- SConstruct
- SConscript
interpreters:
- python
Python traceback:
type: data
@@ -1247,11 +1467,23 @@ R:
type: programming
color: "#198ce7"
lexer: S
aliases:
- R
primary_extension: .r
extensions:
- .R
- .rsx
filenames:
- .Rprofile
interpreters:
- Rscript
RDoc:
type: prose
lexer: Text only
ace_mode: rdoc
wrap: true
primary_extension: .rdoc
REALbasic:
type: programming
@@ -1269,6 +1501,15 @@ RHTML:
group: HTML
primary_extension: .rhtml
RMarkdown:
type: prose
lexer: Text only
wrap: true
ace_mode: markdown
primary_extension: .rmd
extensions:
- .Rmd
Racket:
type: programming
lexer: Racket
@@ -1339,10 +1580,13 @@ Ruby:
- .ru
- .thor
- .watchr
interpreters:
- ruby
filenames:
- Appraisals
- Berksfile
- Gemfile
- Gemfile.lock
- Guardfile
- Podfile
- Thorfile
@@ -1386,6 +1630,8 @@ Scala:
ace_mode: scala
color: "#7dd3b0"
primary_extension: .scala
extensions:
- .sc
Scaml:
group: HTML
@@ -1397,8 +1643,14 @@ Scheme:
color: "#1e4aec"
primary_extension: .scm
extensions:
- .sld
- .sls
- .ss
interpreters:
- guile
- racket
- bigloo
- chicken
Scilab:
type: programming
@@ -1423,9 +1675,19 @@ Shell:
extensions:
- .bats
- .tmux
interpreters:
- bash
- sh
- zsh
filenames:
- Dockerfile
Shen:
type: programming
color: "#120F14"
lexer: Text only
primary_extension: .shen
Slash:
type: programming
color: "#007eff"
@@ -1450,12 +1712,29 @@ Standard ML:
aliases:
- sml
primary_extension: .sml
extensions:
- .fun
Stylus:
type: markup
group: CSS
lexer: Text only
primary_extension: .styl
SuperCollider:
type: programming
color: "#46390b"
lexer: Text only
primary_extension: .sc
primary_extension: .scd
SystemVerilog:
type: programming
color: "#343761"
lexer: systemverilog
primary_extension: .sv
extensions:
- .svh
- .vh
TOML:
type: data
@@ -1472,6 +1751,7 @@ Tcl:
primary_extension: .tcl
extensions:
- .adp
- .tm
Tcsh:
type: programming
@@ -1482,13 +1762,16 @@ Tcsh:
TeX:
type: markup
color: "#3D6117"
ace_mode: latex
wrap: true
aliases:
- latex
primary_extension: .tex
extensions:
- .aux
- .bib
- .cls
- .dtx
- .ins
- .ltx
@@ -1503,7 +1786,7 @@ Tea:
primary_extension: .tea
Textile:
type: markup
type: prose
lexer: Text only
ace_mode: textile
wrap: true
@@ -1549,6 +1832,14 @@ VHDL:
lexer: vhdl
color: "#543978"
primary_extension: .vhdl
extensions:
- .vhd
- .vhf
- .vhi
- .vho
- .vhs
- .vht
- .vhw
Vala:
type: programming
@@ -1587,6 +1878,7 @@ Visual Basic:
- .frm
- .frx
- .vba
- .vbhtml
- .vbs
Volt:
@@ -1622,6 +1914,7 @@ XML:
- .kml
- .launch
- .mxml
- .osm
- .plist
- .pluginspec
- .ps1xml
@@ -1738,7 +2031,7 @@ ooc:
primary_extension: .ooc
reStructuredText:
type: markup
type: prose
wrap: true
search_term: rst
aliases:

View File

@@ -29,6 +29,7 @@ module Linguist
@computed_stats = false
@language = @size = nil
@sizes = Hash.new { 0 }
@file_breakdown = Hash.new { |h,k| h[k] = Array.new }
end
# Public: Returns a breakdown of language stats.
@@ -60,6 +61,12 @@ module Linguist
@size
end
# Public: Return the language breakdown of this repository by file
def breakdown_by_file
compute_stats
@file_breakdown
end
# Internal: Compute language breakdown for each blob in the Repository.
#
# Returns nothing
@@ -75,6 +82,10 @@ module Linguist
# Only include programming languages and acceptable markup languages
if blob.language.type == :programming || Language.detectable_markup.include?(blob.language.name)
# Build up the per-file breakdown stats
@file_breakdown[blob.language.group.name] << blob.name
@sizes[blob.language.group] += blob.size
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -57,6 +57,7 @@ module Linguist
yield({
:path => File.join(dirname, filename),
:language => category,
:interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil,
:extname => File.extname(filename)
})
end
@@ -72,6 +73,7 @@ module Linguist
def self.data
db = {}
db['extnames'] = {}
db['interpreters'] = {}
db['filenames'] = {}
each do |sample|
@@ -85,6 +87,14 @@ module Linguist
end
end
if sample[:interpreter]
db['interpreters'][language_name] ||= []
if !db['interpreters'][language_name].include?(sample[:interpreter])
db['interpreters'][language_name] << sample[:interpreter]
db['interpreters'][language_name].sort!
end
end
if sample[:filename]
db['filenames'][language_name] ||= []
db['filenames'][language_name] << sample[:filename]
@@ -100,4 +110,40 @@ module Linguist
db
end
end
# Used to retrieve the interpreter from the shebang line of a file's
# data.
def self.interpreter_from_shebang(data)
lines = data.lines.to_a
if lines.any? && (match = lines[0].match(/(.+)\n?/)) && (bang = match[0]) =~ /^#!/
bang.sub!(/^#! /, '#!')
tokens = bang.split(' ')
pieces = tokens.first.split('/')
if pieces.size > 1
script = pieces.last
else
script = pieces.first.sub('#!', '')
end
script = script == 'env' ? tokens[1] : script
# "python2.6" -> "python"
if script =~ /((?:\d+\.?)+)/
script.sub! $1, ''
end
# Check for multiline shebang hacks that call `exec`
if script == 'sh' &&
lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
script = $1
end
script
else
nil
end
end
end

View File

@@ -10,7 +10,7 @@
## Vendor Conventions ##
# Caches
- cache/
- (^|/)cache/
# Dependencies
- ^[Dd]ependencies/
@@ -27,11 +27,18 @@
# Node dependencies
- node_modules/
# Bower Components
- bower_components/
# Erlang bundles
- ^rebar$
# Bootstrap minified css and js
- (^|/)bootstrap([^.]*)(\.min)\.(js|css)$
- (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$
# Foundation css
- foundation.min.css
- foundation.css
# Vendored dependencies
- thirdparty/
@@ -40,6 +47,9 @@
# Debian packaging
- ^debian/
# Haxelib projects often contain a neko bytecode file named run.n
- run.n$
## Commonly Bundled JavaScript frameworks ##
# jQuery
@@ -56,6 +66,9 @@
- (^|/)controls\.js$
- (^|/)dragdrop\.js$
# Typescript definition files
- (.*?)\.d\.ts$
# MooTools
- (^|/)mootools([^.]*)\d+\.\d+.\d+([^.]*)\.js$
@@ -82,6 +95,12 @@
- (^|/)shCore\.js$
- (^|/)shLegacy\.js$
# AngularJS
- (^|/)angular([^.]*)(\.min)?\.js$
# React
- (^|/)react(-[^.]*)?(\.min)?\.js$
## Python ##
# django
@@ -101,6 +120,13 @@
# Sparkle
- (^|/)Sparkle/
## Groovy ##
# Gradle
- (^|/)gradlew$
- (^|/)gradlew\.bat$
- (^|/)gradle/wrapper/
## .NET ##
# Visual Studio IntelliSense
@@ -140,6 +166,7 @@
# LICENSE, README, git config files
- ^COPYING$
- LICENSE$
- License$
- gitattributes$
- gitignore$
- gitmodules$

View File

@@ -0,0 +1,110 @@
(* ****** ****** *)
//
// HX-2014-01
// CoYoneda Lemma:
//
(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
staload
"libats/ML/SATS/basis.sats"
staload
"libats/ML/SATS/list0.sats"
(* ****** ****** *)
staload _ = "libats/ML/DATS/list0.dats"
(* ****** ****** *)
sortdef ftype = type -> type
(* ****** ****** *)
infixr (->) ->>
typedef ->> (a:type, b:type) = a -<cloref1> b
(* ****** ****** *)
typedef
functor(F:ftype) =
{a,b:type} (a ->> b) ->> F(a) ->> F(b)
(* ****** ****** *)
typedef
list0 (a:type) = list0 (a)
extern
val functor_list0 : functor (list0)
(* ****** ****** *)
implement
functor_list0{a,b}
(f) = lam xs => list0_map<a><b> (xs, f)
(* ****** ****** *)
datatype
CoYoneda
(F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a))
// end of [CoYoneda]
(* ****** ****** *)
//
extern
fun CoYoneda_phi
: {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r))
extern
fun CoYoneda_psi
: {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r))
//
(* ****** ****** *)
implement
CoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx)
implement
CoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx)
(* ****** ****** *)
datatype int0 = I of (int)
datatype bool = True | False // boxed boolean
(* ****** ****** *)
//
fun bool2string
(x:bool): string =
(
case+ x of True() => "True" | False() => "False"
)
//
implement
fprint_val<bool> (out, x) = fprint (out, bool2string(x))
//
(* ****** ****** *)
fun int2bool (i: int0): bool =
let val+I(i) = i in if i > 0 then True else False end
(* ****** ****** *)
val myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0))
val myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0)
val myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0)
(* ****** ****** *)
val ((*void*)) = fprintln! (stdout_ref, "myboolist0 = ", myboolist0)
(* ****** ****** *)
implement main0 () = ()
(* ****** ****** *)
(* end of [CoYonedaLemma.dats] *)

View File

@@ -0,0 +1,178 @@
(* ****** ****** *)
//
// HX-2013-11
//
// Implementing a variant of
// the problem of Dining Philosophers
//
(* ****** ****** *)
//
#include
"share/atspre_define.hats"
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
staload
UN = "prelude/SATS/unsafe.sats"
(* ****** ****** *)
staload "libc/SATS/stdlib.sats"
staload "libc/SATS/unistd.sats"
(* ****** ****** *)
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
(* ****** ****** *)
staload _ = "libats/DATS/deqarray.dats"
staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats"
(* ****** ****** *)
staload "./DiningPhil2.sats"
(* ****** ****** *)
implement phil_left (n) = n
implement phil_right (n) = (n+1) \nmod NPHIL
(* ****** ****** *)
//
extern
fun randsleep (n: intGte(1)): void
//
implement
randsleep (n) =
ignoret (sleep($UN.cast{uInt}(rand() mod n + 1)))
// end of [randsleep]
//
(* ****** ****** *)
implement
phil_think (n) =
{
val () = println! ("phil_think(", n, ") starts")
val () = randsleep (6)
val () = println! ("phil_think(", n, ") finishes")
}
(* ****** ****** *)
implement
phil_dine (n, lf, rf) =
{
val () = println! ("phil_dine(", n, ") starts")
val () = randsleep (3)
val () = println! ("phil_dine(", n, ") finishes")
}
(* ****** ****** *)
implement
phil_loop (n) = let
//
val () = phil_think (n)
//
val nl = phil_left (n)
val nr = phil_right (n)
//
val ch_lfork = fork_changet (nl)
val ch_rfork = fork_changet (nr)
//
val lf = channel_takeout (ch_lfork)
val () = println! ("phil_loop(", n, ") picks left fork")
//
val () = randsleep (2) // HX: try to actively induce deadlock
//
val rf = channel_takeout (ch_rfork)
val () = println! ("phil_loop(", n, ") picks right fork")
//
val () = phil_dine (n, lf, rf)
//
val ch_forktray = forktray_changet ()
val () = channel_insert (ch_forktray, lf)
val () = channel_insert (ch_forktray, rf)
//
in
phil_loop (n)
end // end of [phil_loop]
(* ****** ****** *)
implement
cleaner_wash (f) =
{
val f = fork_get_num (f)
val () = println! ("cleaner_wash(", f, ") starts")
val () = randsleep (1)
val () = println! ("cleaner_wash(", f, ") finishes")
}
(* ****** ****** *)
implement
cleaner_return (f) =
{
val n = fork_get_num (f)
val ch = fork_changet (n)
val () = channel_insert (ch, f)
}
(* ****** ****** *)
implement
cleaner_loop () = let
//
val ch = forktray_changet ()
val f0 = channel_takeout (ch)
//
val () = cleaner_wash (f0)
val () = cleaner_return (f0)
//
in
cleaner_loop ()
end // end of [cleaner_loop]
(* ****** ****** *)
dynload "DiningPhil2.sats"
dynload "DiningPhil2_fork.dats"
dynload "DiningPhil2_thread.dats"
(* ****** ****** *)
local
//
staload
"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats"
//
in (* in of [local] *)
//
val () = mythread_create_cloptr (llam () => phil_loop (0))
val () = mythread_create_cloptr (llam () => phil_loop (1))
val () = mythread_create_cloptr (llam () => phil_loop (2))
val () = mythread_create_cloptr (llam () => phil_loop (3))
val () = mythread_create_cloptr (llam () => phil_loop (4))
//
val () = mythread_create_cloptr (llam () => cleaner_loop ())
//
end // end of [local]
(* ****** ****** *)
implement
main0 () =
{
//
val () = println! ("DiningPhil2: starting")
val ((*void*)) = while (true) ignoret (sleep(1))
//
} (* end of [main0] *)
(* ****** ****** *)
(* end of [DiningPhil2.dats] *)

View File

@@ -0,0 +1,71 @@
(* ****** ****** *)
//
// HX-2013-11
//
// Implementing a variant of
// the problem of Dining Philosophers
//
(* ****** ****** *)
#include
"share/atspre_define.hats"
(* ****** ****** *)
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
(* ****** ****** *)
%{#
#define NPHIL 5
%} // end of [%{#]
#define NPHIL 5
(* ****** ****** *)
typedef nphil = natLt(NPHIL)
(* ****** ****** *)
fun phil_left (n: nphil): nphil
fun phil_right (n: nphil): nphil
(* ****** ****** *)
//
fun phil_loop (n: nphil): void
//
(* ****** ****** *)
fun cleaner_loop ((*void*)): void
(* ****** ****** *)
absvtype fork_vtype = ptr
vtypedef fork = fork_vtype
(* ****** ****** *)
fun fork_get_num (!fork): nphil
(* ****** ****** *)
fun phil_dine
(n: nphil, lf: !fork, rf: !fork): void
// end of [phil_dine]
fun phil_think (n: nphil): void
(* ****** ****** *)
fun cleaner_wash (f: !fork): void
fun cleaner_return (f: fork): void
(* ****** ****** *)
//
fun fork_changet (n: nphil): channel(fork)
//
fun forktray_changet ((*void*)): channel(fork)
//
(* ****** ****** *)
(* end of [DiningPhil2.sats] *)

View File

@@ -0,0 +1,89 @@
(* ****** ****** *)
//
// HX-2013-11
//
// Implementing a variant of
// the problem of Dining Philosophers
//
(* ****** ****** *)
//
#include
"share/atspre_define.hats"
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
staload
UN = "prelude/SATS/unsafe.sats"
(* ****** ****** *)
staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats"
(* ****** ****** *)
staload _ = "libats/DATS/deqarray.dats"
staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats"
(* ****** ****** *)
staload "./DiningPhil2.sats"
(* ****** ****** *)
datavtype fork = FORK of (nphil)
(* ****** ****** *)
assume fork_vtype = fork
(* ****** ****** *)
implement
fork_get_num (f) = let val FORK(n) = f in n end
(* ****** ****** *)
local
val
the_forkarray = let
//
typedef t = channel(fork)
//
implement
array_tabulate$fopr<t>
(n) = ch where
{
val n = $UN.cast{nphil}(n)
val ch = channel_create_exn<fork> (i2sz(2))
val () = channel_insert (ch, FORK (n))
}
//
in
arrayref_tabulate<t> (i2sz(NPHIL))
end // end of [val]
in (* in of [local] *)
implement fork_changet (n) = the_forkarray[n]
end // end of [local]
(* ****** ****** *)
local
val the_forktray =
channel_create_exn<fork> (i2sz(NPHIL+1))
in (* in of [local] *)
implement forktray_changet () = the_forktray
end // end of [local]
(* ****** ****** *)
(* end of [DiningPhil2_fork.dats] *)

View File

@@ -0,0 +1,43 @@
(* ****** ****** *)
//
// HX-2013-11
//
// Implementing a variant of
// the problem of Dining Philosophers
//
(* ****** ****** *)
//
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
//
(* ****** ****** *)
staload "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats"
(* ****** ****** *)
local
//
#include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats"
//
in (* in of [local] *)
//
// HX: it is intentionally left to be empty
//
end // end of [local]
(* ****** ****** *)
local
//
#include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats"
//
in (* in of [local] *)
//
// HX: it is intentionally left to be empty
//
end // end of [local]
(* ****** ****** *)
(* end of [DiningPhil2_thread.dats] *)

View File

@@ -0,0 +1,178 @@
(* ****** ****** *)
//
// HX-2014-01
// Yoneda Lemma:
// The hardest "trivial" theorem :)
//
(* ****** ****** *)
//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)
staload
"libats/ML/SATS/basis.sats"
staload
"libats/ML/SATS/list0.sats"
staload
"libats/ML/SATS/option0.sats"
(* ****** ****** *)
staload _ = "libats/ML/DATS/list0.dats"
staload _ = "libats/ML/DATS/option0.dats"
(* ****** ****** *)
sortdef ftype = type -> type
(* ****** ****** *)
infixr (->) ->>
typedef ->> (a:type, b:type) = a -<cloref1> b
(* ****** ****** *)
typedef
functor(F:ftype) =
{a,b:type} (a ->> b) ->> F(a) ->> F(b)
(* ****** ****** *)
typedef
list0 (a:type) = list0 (a)
extern
val functor_list0 : functor (list0)
(* ****** ****** *)
implement
functor_list0{a,b}
(f) = lam xs => list0_map<a><b> (xs, f)
(* ****** ****** *)
typedef
option0 (a:type) = option0 (a)
extern
val functor_option0 : functor (option0)
(* ****** ****** *)
implement
functor_option0{a,b}
(f) = lam opt => option0_map<a><b> (opt, f)
(* ****** ****** *)
extern
val functor_homres
: {c:type} functor (lam(r:type) => c ->> r)
(* ****** ****** *)
implement
functor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x))
(* ****** ****** *)
//
extern
fun Yoneda_phi : {F:ftype}functor(F) ->
{a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r))
extern
fun Yoneda_psi : {F:ftype}functor(F) ->
{a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a)
//
(* ****** ****** *)
//
implement
Yoneda_phi
(ftor) = lam(fx) => lam (m) => ftor(m)(fx)
//
implement
Yoneda_psi (ftor) = lam(mf) => mf(lam x => x)
//
(* ****** ****** *)
(*
(* ****** ****** *)
//
// HX-2014-01-05:
// Another version based on Natural Transformation
//
(* ****** ****** *)
typedef
natrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x))
(* ****** ****** *)
//
extern
fun Yoneda_phi_nat : {F:ftype}functor(F) ->
{a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F)
extern
fun Yoneda_psi_nat : {F:ftype}functor(F) ->
{a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a)
//
(* ****** ****** *)
//
implement
Yoneda_phi_nat
(ftor) = lam(fx) => lam (m) => ftor(m)(fx)
//
implement
Yoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x)
//
(* ****** ****** *)
*)
(* ****** ****** *)
datatype bool = True | False // boxed boolean
(* ****** ****** *)
//
fun bool2string
(x:bool): string =
(
case+ x of True() => "True" | False() => "False"
)
//
implement
fprint_val<bool> (out, x) = fprint (out, bool2string(x))
//
(* ****** ****** *)
//
val myboolist0 =
$list_t{bool}(True, False, True, False, False)
val myboolist0 = g0ofg1_list (myboolist0)
//
(* ****** ****** *)
//
extern
val Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r)
//
implement
Yoneda_bool_list0 =
Yoneda_phi(functor_list0){bool}(myboolist0)
//
(* ****** ****** *)
//
val myboolist1 =
Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0)
//
(* ****** ****** *)
val () = fprintln! (stdout_ref, "myboolist0 = ", myboolist0)
val () = fprintln! (stdout_ref, "myboolist1 = ", myboolist1)
(* ****** ****** *)
implement main0 () = ()
(* ****** ****** *)
(* end of [YonedaLemma.dats] *)

187
samples/ATS/linset.hats Normal file
View File

@@ -0,0 +1,187 @@
(***********************************************************************)
(* *)
(* Applied Type System *)
(* *)
(***********************************************************************)
(*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software; you can redistribute it and/or modify it under
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at your option) any
** later version.
**
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License
** along with ATS; see the file COPYING. If not, please write to the
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*)
(* ****** ****** *)
(* Author: Hongwei Xi *)
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
(* Start time: December, 2012 *)
(* ****** ****** *)
//
// HX: shared by linset_listord (* ordered list *)
// HX: shared by linset_avltree (* AVL-tree-based *)
//
(* ****** ****** *)
//
// HX-2013-02:
// for sets of nonlinear elements
//
absvtype set_vtype (a:t@ype+) = ptr
//
(* ****** ****** *)
vtypedef set (a:t0p) = set_vtype (a)
(* ****** ****** *)
fun{a:t0p}
compare_elt_elt (x1: a, x2: a):<> int
(* ****** ****** *)
fun{} linset_nil{a:t0p} ():<> set(a)
fun{} linset_make_nil{a:t0p} ():<> set(a)
(* ****** ****** *)
fun{a:t0p} linset_sing (x: a):<!wrt> set(a)
fun{a:t0p} linset_make_sing (x: a):<!wrt> set(a)
(* ****** ****** *)
fun{a:t0p}
linset_make_list (xs: List(INV(a))):<!wrt> set(a)
(* ****** ****** *)
fun{}
linset_is_nil {a:t0p} (xs: !set(INV(a))):<> bool
fun{}
linset_isnot_nil {a:t0p} (xs: !set(INV(a))):<> bool
(* ****** ****** *)
fun{a:t0p} linset_size (!set(INV(a))): size_t
(* ****** ****** *)
fun{a:t0p}
linset_is_member (xs: !set(INV(a)), x0: a):<> bool
fun{a:t0p}
linset_isnot_member (xs: !set(INV(a)), x0: a):<> bool
(* ****** ****** *)
fun{a:t0p}
linset_copy (!set(INV(a))):<!wrt> set(a)
fun{a:t0p}
linset_free (xs: set(INV(a))):<!wrt> void
(* ****** ****** *)
//
fun{a:t0p}
linset_insert
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
//
(* ****** ****** *)
//
fun{a:t0p}
linset_takeout
(
&set(INV(a)) >> _, a, res: &(a?) >> opt(a, b)
) :<!wrt> #[b:bool] bool(b) // endfun
fun{a:t0p}
linset_takeout_opt (&set(INV(a)) >> _, a):<!wrt> Option_vt(a)
//
(* ****** ****** *)
//
fun{a:t0p}
linset_remove
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
//
(* ****** ****** *)
//
// HX: choosing an element in an unspecified manner
//
fun{a:t0p}
linset_choose
(
xs: !set(INV(a)), x: &a? >> opt (a, b)
) :<!wrt> #[b:bool] bool(b)
//
fun{a:t0p}
linset_choose_opt (xs: !set(INV(a))):<!wrt> Option_vt(a)
//
(* ****** ****** *)
fun{a:t0p}
linset_takeoutmax
(
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
) :<!wrt> #[b:bool] bool (b)
fun{a:t0p}
linset_takeoutmax_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
(* ****** ****** *)
fun{a:t0p}
linset_takeoutmin
(
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
) :<!wrt> #[b:bool] bool (b)
fun{a:t0p}
linset_takeoutmin_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
(* ****** ****** *)
//
fun{}
fprint_linset$sep (FILEref): void // ", "
//
fun{a:t0p}
fprint_linset (out: FILEref, xs: !set(INV(a))): void
//
overload fprint with fprint_linset
//
(* ****** ****** *)
//
fun{
a:t0p}{env:vt0p
} linset_foreach$fwork
(x: a, env: &(env) >> _): void
//
fun{a:t0p}
linset_foreach (set: !set(INV(a))): void
fun{
a:t0p}{env:vt0p
} linset_foreach_env
(set: !set(INV(a)), env: &(env) >> _): void
// end of [linset_foreach_env]
//
(* ****** ****** *)
fun{a:t0p}
linset_listize (xs: set(INV(a))): List0_vt (a)
(* ****** ****** *)
fun{a:t0p}
linset_listize1 (xs: !set(INV(a))): List0_vt (a)
(* ****** ****** *)
(* end of [linset.hats] *)

View File

@@ -0,0 +1,504 @@
(***********************************************************************)
(* *)
(* Applied Type System *)
(* *)
(***********************************************************************)
(*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software; you can redistribute it and/or modify it under
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at your option) any
** later version.
**
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License
** along with ATS; see the file COPYING. If not, please write to the
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*)
(* ****** ****** *)
(* Author: Hongwei Xi *)
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
(* Start time: February, 2013 *)
(* ****** ****** *)
//
// HX-2013-08:
// a set is represented as a sorted list in descending order;
// note that descending order is chosen to faciliate set comparison
//
(* ****** ****** *)
staload
UN = "prelude/SATS/unsafe.sats"
(* ****** ****** *)
staload "libats/SATS/linset_listord.sats"
(* ****** ****** *)
#include "./SHARE/linset.hats" // code reuse
#include "./SHARE/linset_node.hats" // code reuse
(* ****** ****** *)
assume
set_vtype (elt:t@ype) = List0_vt (elt)
(* ****** ****** *)
implement{}
linset_nil () = list_vt_nil ()
implement{}
linset_make_nil () = list_vt_nil ()
(* ****** ****** *)
implement
{a}(*tmp*)
linset_sing
(x) = list_vt_cons{a}(x, list_vt_nil)
// end of [linset_sing]
implement{a}
linset_make_sing
(x) = list_vt_cons{a}(x, list_vt_nil)
// end of [linset_make_sing]
(* ****** ****** *)
implement{}
linset_is_nil (xs) = list_vt_is_nil (xs)
implement{}
linset_isnot_nil (xs) = list_vt_is_cons (xs)
(* ****** ****** *)
implement{a}
linset_size (xs) =
let val n = list_vt_length(xs) in i2sz(n) end
// end of [linset_size]
(* ****** ****** *)
implement{a}
linset_is_member
(xs, x0) = let
//
fun aux
{n:nat} .<n>.
(
xs: !list_vt (a, n)
) :<> bool = let
in
//
case+ xs of
| list_vt_cons (x, xs) => let
val sgn = compare_elt_elt<a> (x0, x) in
if sgn > 0 then false else (if sgn < 0 then aux (xs) else true)
end // end of [list_vt_cons]
| list_vt_nil ((*void*)) => false
//
end // end of [aux]
//
in
aux (xs)
end // end of [linset_is_member]
(* ****** ****** *)
implement{a}
linset_copy (xs) = list_vt_copy<a> (xs)
implement{a}
linset_free (xs) = list_vt_free<a> (xs)
(* ****** ****** *)
implement{a}
linset_insert
(xs, x0) = let
//
fun
mynode_cons
{n:nat} .<>.
(
nx: mynode1 (a), xs: list_vt (a, n)
) : list_vt (a, n+1) = let
//
val xs1 =
$UN.castvwtp0{List1_vt(a)}(nx)
val+@list_vt_cons (_, xs2) = xs1
prval () = $UN.cast2void (xs2); val () = (xs2 := xs)
//
in
fold@ (xs1); xs1
end // end of [mynode_cons]
//
fun ins
{n:nat} .<n>. // tail-recursive
(
xs: &list_vt (a, n) >> list_vt (a, n1)
) : #[n1:nat | n <= n1; n1 <= n+1] bool =
(
case+ xs of
| @list_vt_cons
(x, xs1) => let
val sgn =
compare_elt_elt<a> (x0, x)
// end of [val]
in
if sgn > 0 then let
prval () = fold@ (xs)
val nx = mynode_make_elt<a> (x0)
val ((*void*)) = xs := mynode_cons (nx, xs)
in
false
end else if sgn < 0 then let
val ans = ins (xs1)
prval () = fold@ (xs)
in
ans
end else let // [x0] is found
prval () = fold@ (xs)
in
true (* [x0] in [xs] *)
end (* end of [if] *)
end // end of [list_vt_cons]
| list_vt_nil () => let
val nx = mynode_make_elt<a> (x0)
val ((*void*)) = xs := mynode_cons (nx, xs)
in
false
end // end of [list_vt_nil]
) (* end of [ins] *)
//
in
$effmask_all (ins (xs))
end // end of [linset_insert]
(* ****** ****** *)
(*
//
HX-2013-08:
[linset_remove] moved up
//
implement{a}
linset_remove
(xs, x0) = let
//
fun rem
{n:nat} .<n>. // tail-recursive
(
xs: &list_vt (a, n) >> list_vt (a, n1)
) : #[n1:nat | n1 <= n; n <= n1+1] bool =
(
case+ xs of
| @list_vt_cons
(x, xs1) => let
val sgn =
compare_elt_elt<a> (x0, x)
// end of [val]
in
if sgn > 0 then let
prval () = fold@ (xs)
in
false
end else if sgn < 0 then let
val ans = rem (xs1)
prval () = fold@ (xs)
in
ans
end else let // x0 = x
val xs1_ = xs1
val ((*void*)) = free@{a}{0}(xs)
val () = xs := xs1_
in
true // [x0] in [xs]
end (* end of [if] *)
end // end of [list_vt_cons]
| list_vt_nil () => false
) (* end of [rem] *)
//
in
$effmask_all (rem (xs))
end // end of [linset_remove]
*)
(* ****** ****** *)
(*
** By Brandon Barker
*)
implement
{a}(*tmp*)
linset_choose
(xs, x0) = let
in
//
case+ xs of
| list_vt_cons
(x, xs1) => let
val () = x0 := x
prval () = opt_some{a}(x0)
in
true
end // end of [list_vt_cons]
| list_vt_nil () => let
prval () = opt_none{a}(x0)
in
false
end // end of [list_vt_nil]
//
end // end of [linset_choose]
(* ****** ****** *)
implement
{a}{env}
linset_foreach_env (xs, env) = let
//
implement
list_vt_foreach$fwork<a><env>
(x, env) = linset_foreach$fwork<a><env> (x, env)
//
in
list_vt_foreach_env<a><env> (xs, env)
end // end of [linset_foreach_env]
(* ****** ****** *)
implement{a}
linset_listize (xs) = xs
(* ****** ****** *)
implement{a}
linset_listize1 (xs) = list_vt_copy (xs)
(* ****** ****** *)
//
// HX: functions for processing mynodes
//
(* ****** ****** *)
implement{
} mynode_null{a} () =
$UN.castvwtp0{mynode(a,null)}(the_null_ptr)
// end of [mynode_null]
(* ****** ****** *)
implement
{a}(*tmp*)
mynode_make_elt
(x) = let
//
val nx = list_vt_cons{a}{0}(x, _ )
//
in
$UN.castvwtp0{mynode1(a)}(nx)
end // end of [mynode_make_elt]
(* ****** ****** *)
implement{
} mynode_free
{a}(nx) = () where {
val nx =
$UN.castvwtp0{List1_vt(a)}(nx)
//
val+~list_vt_cons (_, nx2) = nx
//
prval ((*void*)) = $UN.cast2void (nx2)
//
} (* end of [mynode_free] *)
(* ****** ****** *)
implement
{a}(*tmp*)
mynode_get_elt
(nx) = (x) where {
//
val nx1 =
$UN.castvwtp1{List1_vt(a)}(nx)
//
val+list_vt_cons (x, _) = nx1
//
prval ((*void*)) = $UN.cast2void (nx1)
//
} (* end of [mynode_get_elt] *)
(* ****** ****** *)
implement
{a}(*tmp*)
mynode_set_elt
{l} (nx, x0) =
{
//
val nx1 =
$UN.castvwtp1{List1_vt(a)}(nx)
//
val+@list_vt_cons (x, _) = nx1
//
val () = x := x0
//
prval () = fold@ (nx1)
prval () = $UN.cast2void (nx1)
//
prval () = __assert (nx) where
{
extern praxi __assert (nx: !mynode(a?, l) >> mynode (a, l)): void
} (* end of [prval] *)
//
} (* end of [mynode_set_elt] *)
(* ****** ****** *)
implement
{a}(*tmp*)
mynode_getfree_elt
(nx) = (x) where {
//
val nx =
$UN.castvwtp0{List1_vt(a)}(nx)
//
val+~list_vt_cons (x, nx2) = nx
//
prval ((*void*)) = $UN.cast2void (nx2)
//
} (* end of [mynode_getfree_elt] *)
(* ****** ****** *)
(*
fun{a:t0p}
linset_takeout_ngc
(set: &set(INV(a)) >> _, x0: a):<!wrt> mynode0 (a)
// end of [linset_takeout_ngc]
*)
implement
{a}(*tmp*)
linset_takeout_ngc
(set, x0) = let
//
fun takeout
(
xs: &List0_vt (a) >> _
) : mynode0(a) = let
in
//
case+ xs of
| @list_vt_cons
(x, xs1) => let
prval pf_x = view@x
prval pf_xs1 = view@xs1
val sgn =
compare_elt_elt<a> (x0, x)
// end of [val]
in
if sgn > 0 then let
prval () = fold@ (xs)
in
mynode_null{a}((*void*))
end else if sgn < 0 then let
val res = takeout (xs1)
prval ((*void*)) = fold@ (xs)
in
res
end else let // x0 = x
val xs1_ = xs1
val res = $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs))
val () = xs := xs1_
in
res // [x0] in [xs]
end (* end of [if] *)
end // end of [list_vt_cons]
| list_vt_nil () => mynode_null{a}((*void*))
//
end (* end of [takeout] *)
//
in
$effmask_all (takeout (set))
end // end of [linset_takeout_ngc]
(* ****** ****** *)
implement
{a}(*tmp*)
linset_takeoutmax_ngc
(xs) = let
in
//
case+ xs of
| @list_vt_cons
(x, xs1) => let
prval pf_x = view@x
prval pf_xs1 = view@xs1
val xs_ = xs
val () = xs := xs1
in
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
end // end of [list_vt_cons]
| @list_vt_nil () => let
prval () = fold@ (xs)
in
mynode_null{a}((*void*))
end // end of [list_vt_nil]
//
end // end of [linset_takeoutmax_ngc]
(* ****** ****** *)
implement
{a}(*tmp*)
linset_takeoutmin_ngc
(xs) = let
//
fun unsnoc
{n:pos} .<n>.
(
xs: &list_vt (a, n) >> list_vt (a, n-1)
) :<!wrt> mynode1 (a) = let
//
val+@list_vt_cons (x, xs1) = xs
//
prval pf_x = view@x and pf_xs1 = view@xs1
//
in
//
case+ xs1 of
| list_vt_cons _ =>
let val res = unsnoc(xs1) in fold@xs; res end
// end of [list_vt_cons]
| list_vt_nil () => let
val xs_ = xs
val () = xs := list_vt_nil{a}()
in
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
end // end of [list_vt_nil]
//
end // end of [unsnoc]
//
in
//
case+ xs of
| list_vt_cons _ => unsnoc (xs)
| list_vt_nil () => mynode_null{a}((*void*))
//
end // end of [linset_takeoutmin_ngc]
(* ****** ****** *)
(* end of [linset_listord.dats] *)

View File

@@ -0,0 +1,51 @@
(***********************************************************************)
(* *)
(* Applied Type System *)
(* *)
(***********************************************************************)
(*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software; you can redistribute it and/or modify it under
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at your option) any
** later version.
**
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License
** along with ATS; see the file COPYING. If not, please write to the
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*)
(* ****** ****** *)
//
// Author: Hongwei Xi
// Authoremail: hwxiATcsDOTbuDOTedu
// Time: October, 2010
//
(* ****** ****** *)
#define ATS_PACKNAME "ATSLIB.libats.linset_listord"
#define ATS_STALOADFLAG 0 // no static loading at run-time
(* ****** ****** *)
#include "./SHARE/linset.hats"
#include "./SHARE/linset_node.hats"
(* ****** ****** *)
castfn
linset2list {a:t0p} (xs: set (INV(a))):<> List0_vt (a)
(* ****** ****** *)
(* end of [linset_listord.sats] *)

215
samples/ATS/main.atxt Normal file
View File

@@ -0,0 +1,215 @@
%{
#include "./../ATEXT/atextfun.hats"
%}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>EFFECTIVATS-DiningPhil2</title>
#patscode_style()
</head>
<body>
<h1>
Effective ATS: Dining Philosophers
</h1>
In this article, I present an implementation of a slight variant of the
famous problem of 5-Dining-Philosophers by Dijkstra that makes simple but
convincing use of linear types.
<h2>
The Original Problem
</h2>
There are five philosophers sitting around a table and there are also 5
forks placed on the table such that each fork is located between the left
hand of a philosopher and the right hand of another philosopher. Each
philosopher does the following routine repeatedly: thinking and dining. In
order to dine, a philosopher needs to first acquire two forks: one located
on his left-hand side and the other on his right-hand side. After
finishing dining, a philosopher puts the two acquired forks onto the table:
one on his left-hand side and the other on his right-hand side.
<h2>
A Variant of the Original Problem
</h2>
The following twist is added to the original version:
<p>
After a fork is used, it becomes a "dirty" fork and needs to be put in a
tray for dirty forks. There is a cleaner who cleans dirty forks and then
puts them back on the table.
<h2>
Channels for Communication
</h2>
A channel is just a shared queue of fixed capacity. The following two
functions are for inserting an element into and taking an element out of a
given channel:
<pre
class="patsyntax">
#pats2xhtml_sats("\
fun{a:vt0p} channel_insert (channel (a), a): void
fun{a:vt0p} channel_takeout (chan: channel (a)): (a)
")</pre>
If [channel_insert] is called on a channel that is full, then the caller is
blocked until an element is taken out of the channel. If [channel_takeout]
is called on a channel that is empty, then the caller is blocked until an
element is inserted into the channel.
<h2>
A Channel for Each Fork
</h2>
Forks are resources given a linear type. Each fork is initially stored in a
channel, which can be obtained by calling the following function:
<pre
class="patsyntax">
#pats2xhtml_sats("\
fun fork_changet (n: nphil): channel(fork)
")</pre>
where the type [nphil] is defined to be [natLt(5)] (for natural numbers
less than 5). The channels for storing forks are chosen to be of capacity
2. The reason that channels of capacity 2 are chosen to store at most one
element (in each of them) is to guarantee that these channels can never be
full (so that there is no attempt made to send signals to awake callers
supposedly being blocked due to channels being full).
<h2>
A Channel for the Fork Tray
</h2>
A tray for storing "dirty" forks is also a channel, which can be obtained
by calling the following function:
<pre
class="patsyntax">
#pats2xhtml_sats("\
fun forktray_changet ((*void*)): channel(fork)
")</pre>
The capacity chosen for the channel is 6 (instead of 5) so that it can
never become full (as there are only 5 forks in total).
<h2>
Philosopher Loop
</h2>
Each philosopher is implemented as a loop:
<pre
class="patsyntax">
#pats2xhtml_dats('\
implement
phil_loop (n) = let
//
val () = phil_think (n)
//
val nl = phil_left (n) // = n
val nr = phil_right (n) // = (n+1) % 5
//
val ch_lfork = fork_changet (nl)
val ch_rfork = fork_changet (nr)
//
val lf = channel_takeout (ch_lfork)
val () = println! ("phil_loop(", n, ") picks left fork")
//
val () = randsleep (2) // sleep up to 2 seconds
//
val rf = channel_takeout (ch_rfork)
val () = println! ("phil_loop(", n, ") picks right fork")
//
val () = phil_dine (n, lf, rf)
//
val ch_forktray = forktray_changet ()
val () = channel_insert (ch_forktray, lf) // left fork to dirty tray
val () = channel_insert (ch_forktray, rf) // right fork to dirty tray
//
in
phil_loop (n)
end // end of [phil_loop]
')</pre>
It should be straighforward to follow the code for [phil_loop].
<h2>
Fork Cleaner Loop
</h2>
A cleaner is implemented as a loop:
<pre
class="patsyntax">
#pats2xhtml_dats('\
implement
cleaner_loop () = let
//
val ch = forktray_changet ()
val f0 = channel_takeout (ch) // [f0] is dirty
//
val () = cleaner_wash (f0) // washes dirty [f0]
val () = cleaner_return (f0) // puts back cleaned [f0]
//
in
cleaner_loop ()
end // end of [cleaner_loop]
')</pre>
The function [cleaner_return] first finds out the number of a given fork
and then uses the number to locate the channel for storing the fork. Its
actual implementation is given as follows:
<pre
class="patsyntax">
#pats2xhtml_dats('\
implement
cleaner_return (f) =
{
val n = fork_get_num (f)
val ch = fork_changet (n)
val () = channel_insert (ch, f)
}
')</pre>
It should now be straighforward to follow the code for [cleaner_loop].
<h2>
Testing
</h2>
The entire code of this implementation is stored in the following files:
<pre>
DiningPhil2.sats
DiningPhil2.dats
DiningPhil2_fork.dats
DiningPhil2_thread.dats
</pre>
There is also a Makefile available for compiling the ATS source code into
an excutable for testing. One should be able to encounter a deadlock after
running the simulation for a while.
<hr size="2">
This article is written by <a href="http://www.cs.bu.edu/~hwxi/">Hongwei Xi</a>.
</body>
</html>
%{
implement main () = fprint_filsub (stdout_ref, "main_atxt.txt")
%}

View File

@@ -0,0 +1,13 @@
Gregory Romé has written an AsciiDoc plugin for the Redmine project management application.
https://github.com/foo-users/foo
へと `vicmd` キーマップを足してみている試み、
アニメーションgifです。
tag::romé[]
Gregory Romé has written an AsciiDoc plugin for the Redmine project management application.
end::romé[]
== Überschrift
* Codierungen sind verrückt auf älteren Versionen von Ruby

10
samples/AsciiDoc/list.asc Normal file
View File

@@ -0,0 +1,10 @@
AsciiDoc Home Page
==================
Example Articles
~~~~~~~~~~~~~~~~
- Item 1
- Item 2
- Item 3

View File

@@ -0,0 +1,25 @@
Document Title
==============
Doc Writer <thedoc@asciidoctor.org>
:idprefix: id_
Preamble paragraph.
NOTE: This is test, only a test.
== Section A
*Section A* paragraph.
=== Section A Subsection
*Section A* 'subsection' paragraph.
== Section B
*Section B* paragraph.
.Section B list
* Item 1
* Item 2
* Item 3

View File

@@ -0,0 +1,41 @@
package com.blogspot.miguelinlas3.aspectj.cache;
import java.util.Map;
import java.util.WeakHashMap;
import org.aspectj.lang.JoinPoint;
import com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable;
/**
* This simple aspect simulates the behaviour of a very simple cache
*
* @author migue
*
*/
public aspect CacheAspect {
public pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable);
Object around(Cachable cachable): cache(cachable){
String evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint);
if(cache.containsKey(evaluatedKey)){
System.out.println("Cache hit for key " + evaluatedKey);
return this.cache.get(evaluatedKey);
}
System.out.println("Cache miss for key " + evaluatedKey);
Object value = proceed(cachable);
cache.put(evaluatedKey, value);
return value;
}
protected String evaluateKey(String key, JoinPoint joinPoint) {
// TODO add some smart staff to allow simple scripting in @Cachable annotation
return key;
}
protected Map<String, Object> cache = new WeakHashMap<String, Object>();
}

View File

@@ -0,0 +1,50 @@
package aspects.caching;
import java.util.Map;
/**
* Cache aspect for optimize recursive functions.
*
* @author Migueli
* @date 05/11/2013
* @version 1.0
*
*/
public abstract aspect OptimizeRecursionCache {
@SuppressWarnings("rawtypes")
private Map _cache;
public OptimizeRecursionCache() {
_cache = getCache();
}
@SuppressWarnings("rawtypes")
abstract public Map getCache();
abstract public pointcut operation(Object o);
pointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object));
before(Object o) : topLevelOperation(o) {
System.out.println("Seeking value for " + o);
}
Object around(Object o) : operation(o) {
Object cachedValue = _cache.get(o);
if (cachedValue != null) {
System.out.println("Found cached value for " + o + ": " + cachedValue);
return cachedValue;
}
return proceed(o);
}
@SuppressWarnings("unchecked")
after(Object o) returning(Object result) : topLevelOperation(o) {
_cache.put(o, result);
}
after(Object o) returning(Object result) : topLevelOperation(o) {
System.out.println("cache size: " + _cache.size());
}
}

View File

@@ -0,0 +1,305 @@
' *********************************************************
' ** Simple Grid Screen Demonstration App
' ** Jun 2010
' ** Copyright (c) 2010 Roku Inc. All Rights Reserved.
' *********************************************************
'************************************************************
'** Application startup
'************************************************************
Sub Main()
'initialize theme attributes like titles, logos and overhang color
initTheme()
gridstyle = "Flat-Movie"
'set to go, time to get started
while gridstyle <> ""
print "starting grid style= ";gridstyle
screen=preShowGridScreen(gridstyle)
gridstyle = showGridScreen(screen, gridstyle)
end while
End Sub
'*************************************************************
'** Set the configurable theme attributes for the application
'**
'** Configure the custom overhang and Logo attributes
'** These attributes affect the branding of the application
'** and are artwork, colors and offsets specific to the app
'*************************************************************
Sub initTheme()
app = CreateObject("roAppManager")
app.SetTheme(CreateDefaultTheme())
End Sub
'******************************************************
'** @return The default application theme.
'** Screens can make slight adjustments to the default
'** theme by getting it from here and then overriding
'** individual theme attributes.
'******************************************************
Function CreateDefaultTheme() as Object
theme = CreateObject("roAssociativeArray")
theme.ThemeType = "generic-dark"
' All these are greyscales
theme.GridScreenBackgroundColor = "#363636"
theme.GridScreenMessageColor = "#808080"
theme.GridScreenRetrievingColor = "#CCCCCC"
theme.GridScreenListNameColor = "#FFFFFF"
' Color values work here
theme.GridScreenDescriptionTitleColor = "#001090"
theme.GridScreenDescriptionDateColor = "#FF005B"
theme.GridScreenDescriptionRuntimeColor = "#5B005B"
theme.GridScreenDescriptionSynopsisColor = "#606000"
'used in the Grid Screen
theme.CounterTextLeft = "#FF0000"
theme.CounterSeparator = "#00FF00"
theme.CounterTextRight = "#0000FF"
theme.GridScreenLogoHD = "pkg:/images/Overhang_Test_HD.png"
theme.GridScreenLogoOffsetHD_X = "0"
theme.GridScreenLogoOffsetHD_Y = "0"
theme.GridScreenOverhangHeightHD = "99"
theme.GridScreenLogoSD = "pkg:/images/Overhang_Test_SD43.png"
theme.GridScreenOverhangHeightSD = "66"
theme.GridScreenLogoOffsetSD_X = "0"
theme.GridScreenLogoOffsetSD_Y = "0"
' to use your own focus ring artwork
'theme.GridScreenFocusBorderSD = "pkg:/images/GridCenter_Border_Movies_SD43.png"
'theme.GridScreenBorderOffsetSD = "(-26,-25)"
'theme.GridScreenFocusBorderHD = "pkg:/images/GridCenter_Border_Movies_HD.png"
'theme.GridScreenBorderOffsetHD = "(-28,-20)"
' to use your own description background artwork
'theme.GridScreenDescriptionImageSD = "pkg:/images/Grid_Description_Background_SD43.png"
'theme.GridScreenDescriptionOffsetSD = "(125,170)"
'theme.GridScreenDescriptionImageHD = "pkg:/images/Grid_Description_Background_HD.png"
'theme.GridScreenDescriptionOffsetHD = "(190,255)"
return theme
End Function
'******************************************************
'** Perform any startup/initialization stuff prior to
'** initially showing the screen.
'******************************************************
Function preShowGridScreen(style as string) As Object
m.port=CreateObject("roMessagePort")
screen = CreateObject("roGridScreen")
screen.SetMessagePort(m.port)
' screen.SetDisplayMode("best-fit")
screen.SetDisplayMode("scale-to-fill")
screen.SetGridStyle(style)
return screen
End Function
'******************************************************
'** Display the gird screen and wait for events from
'** the screen. The screen will show retreiving while
'** we fetch and parse the feeds for the show posters
'******************************************************
Function showGridScreen(screen As Object, gridstyle as string) As string
print "enter showGridScreen"
categoryList = getCategoryList()
categoryList[0] = "GridStyle: " + gridstyle
screen.setupLists(categoryList.count())
screen.SetListNames(categoryList)
StyleButtons = getGridControlButtons()
screen.SetContentList(0, StyleButtons)
for i = 1 to categoryList.count()-1
screen.SetContentList(i, getShowsForCategoryItem(categoryList[i]))
end for
screen.Show()
while true
print "Waiting for message"
msg = wait(0, m.port)
'msg = wait(0, screen.GetMessagePort()) ' getmessageport does not work on gridscreen
print "Got Message:";type(msg)
if type(msg) = "roGridScreenEvent" then
print "msg= "; msg.GetMessage() " , index= "; msg.GetIndex(); " data= "; msg.getData()
if msg.isListItemFocused() then
print"list item focused | current show = "; msg.GetIndex()
else if msg.isListItemSelected() then
row = msg.GetIndex()
selection = msg.getData()
print "list item selected row= "; row; " selection= "; selection
' Did we get a selection from the gridstyle selection row?
if (row = 0)
' yes, return so we can come back with new style
return StyleButtons[selection].Title
endif
'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()])
else if msg.isScreenClosed() then
return ""
end if
end If
end while
End Function
'**********************************************************
'** When a poster on the home screen is selected, we call
'** this function passing an roAssociativeArray with the
'** ContentMetaData for the selected show. This data should
'** be sufficient for the springboard to display
'**********************************************************
Function displayShowDetailScreen(category as Object, showIndex as Integer) As Integer
'add code to create springboard, for now we do nothing
return 1
End Function
'**************************************************************
'** Return the list of categories to display in the filter
'** banner. The result is an roArray containing the names of
'** all of the categories. All just static data for the example.
'***************************************************************
Function getCategoryList() As Object
categoryList = [ "GridStyle", "Reality", "History", "News", "Comedy", "Drama"]
return categoryList
End Function
'********************************************************************
'** Given the category from the filter banner, return an array
'** of ContentMetaData objects (roAssociativeArray's) representing
'** the shows for the category. For this example, we just cheat and
'** create and return a static array with just the minimal items
'** set, but ideally, you'd go to a feed service, fetch and parse
'** this data dynamically, so content for each category is dynamic
'********************************************************************
Function getShowsForCategoryItem(category As Object) As Object
print "getting shows for category "; category
showList = [
{
Title: category + ": Header",
releaseDate: "1976",
length: 3600-600,
Description:"This row is category " + category,
hdBranded: true,
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif",
Description:"Short Synopsis #1",
Synopsis:"Length",
StarRating:10,
}
{
Title: category + ": Beverly Hillbillies",
releaseDate: "1969",
rating: "PG",
Description:"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.",
numEpisodes:42,
contentType:"season",
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg",
StarRating:80,
UserStarRating:40
}
{
Title: category + ": Babylon 5",
releaseDate: "1996",
rating: "PG",
Description:"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.",
numEpisodes:102,
contentType:"season",
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg",
StarRating:80,
UserStarRating:40
}
{
Title: category + ": John F. Kennedy",
releaseDate: "1961",
rating: "PG",
Description:"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.",
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg",
StarRating:100
}
{
Title: category + ": Man on the Moon",
releaseDate: "1969",
rating: "PG",
Description:"That's one small step for a man, one giant leap for mankind.",
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg",
StarRating:100
}
{
Title: category + ": I have a Dream",
releaseDate: "1963",
rating: "PG",
Description:"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.",
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg",
StarRating:100
}
]
return showList
End Function
function getGridControlButtons() as object
buttons = [
{ Title: "Flat-Movie"
ReleaseDate: "HD:5x2 SD:5x2"
Description: "Flat-Movie (Netflix) style"
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif"
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif"
}
{ Title: "Flat-Landscape"
ReleaseDate: "HD:5x3 SD:4x3"
Description: "Channel Store"
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg",
}
{ Title: "Flat-Portrait"
ReleaseDate: "HD:5x2 SD:5x2"
Description: "3x4 style posters"
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg",
}
{ Title: "Flat-Square"
ReleaseDate: "HD:7x3 SD:6x3"
Description: "1x1 style posters"
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png",
}
{ Title: "Flat-16x9"
ReleaseDate: "HD:5x3 SD:4x3"
Description: "HD style posters"
HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png",
SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png",
}
]
return buttons
End Function

45
samples/C#/Index.cshtml Normal file
View File

@@ -0,0 +1,45 @@
@{
ViewBag.Title = "Home Page";
}
@section featured {
<section class="featured">
<div class="content-wrapper">
<hgroup class="title">
<h1>@ViewBag.Title.</h1>
<h2>@ViewBag.Message</h2>
</hgroup>
<p>
To learn more about ASP.NET MVC visit
<a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.
If you have any questions about ASP.NET MVC visit
<a href="http://forums.asp.net/1146.aspx/1?MVC" title="ASP.NET MVC Forum">our forums</a>.
</p>
</div>
</section>
}
<h3>We suggest the following:</h3>
<ol class="round">
<li class="one">
<h5>Getting Started</h5>
ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that
enables a clean separation of concerns and that gives you full control over markup
for enjoyable, agile development. ASP.NET MVC includes many features that enable
fast, TDD-friendly development for creating sophisticated applications that use
the latest web standards.
<a href="http://go.microsoft.com/fwlink/?LinkId=245151">Learn more…</a>
</li>
<li class="two">
<h5>Add NuGet packages and jump-start your coding</h5>
NuGet makes it easy to install and update free libraries and tools.
<a href="http://go.microsoft.com/fwlink/?LinkId=245153">Learn more…</a>
</li>
<li class="three">
<h5>Find Web Hosting</h5>
You can easily find a web hosting company that offers the right mix of features
and price for your applications.
<a href="http://go.microsoft.com/fwlink/?LinkId=245157">Learn more…</a>
</li>
</ol>

21
samples/C#/Program.cs Normal file
View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LittleSampleApp
{
/// <summary>
/// Just what it says on the tin. A little sample application for Linguist to try out.
///
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, I am a little sample application to test GitHub's Linguist module.");
Console.WriteLine("I also include a Razor MVC file just to prove it handles cshtml files now.");
}
}
}

42
samples/C++/CsvStreamer.h Normal file
View File

@@ -0,0 +1,42 @@
#pragma once
#include <string>
#include <vector>
#include <fstream>
#include "util.h"
using namespace std;
#define DEFAULT_DELIMITER ','
class CsvStreamer
{
private:
ofstream file; // File output stream
vector<string> row_buffer; // Buffer which stores a row's data before being flushed/written
int fields; // Number of fields (columns)
long rows; // Number of rows (records) including header row
char delimiter; // Delimiter character; comma by default
string sanitize(string); // Returns a string ready for output into the file
public:
CsvStreamer(); // Empty CSV streamer... be sure to open the file before writing!
CsvStreamer(string, char); // Same as open(string, char)...
CsvStreamer(string); // Opens an output CSV file given a file path/name
~CsvStreamer(); // Ensures the output file is closed and saved
void open(string); // Opens an output CSV file given a file path/name (default delimiter)
void open(string, char); // Opens an output CSV file given a file path/name and a delimiting character (default comma)
void add_field(string); // If still on first line, adds a new field to the header row
void save_fields(); // Call this to save the header row; all new writes should be through append()
void append(string); // Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed)
void append(string, bool); // Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces)
void append(float); // Appends the current row with this number
void append(double); // Appends the current row with this number
void append(long); // Appends the current row with this number
void append(int); // Appends the current row with this number
void writeln(); // Flushes what was in the row buffer into the file (writes the row)
void close(); // Saves and closes the file
int field_count(); // Gets the number of fields (columns)
long row_count(); // Gets the number of records (rows) -- NOT including the header row
};

32
samples/C++/Field.h Normal file
View File

@@ -0,0 +1,32 @@
/*****************************************************************************
* Dwarf Mine - The 13-11 Benchmark
*
* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,
* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;
* Zimmermann, Florian
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#pragma once
enum Field { Free, Black, White, Illegal };
typedef Field Player;

32
samples/C++/Types.h Normal file
View File

@@ -0,0 +1,32 @@
/*****************************************************************************
* Dwarf Mine - The 13-11 Benchmark
*
* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,
* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;
* Zimmermann, Florian
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#pragma once
#include <cstdint>
typedef uint32_t smallPrime_t;

1129
samples/C++/bcm2835.h Normal file

File diff suppressed because it is too large Load Diff

138
samples/C++/libcanister.h Normal file
View File

@@ -0,0 +1,138 @@
#ifndef LIBCANIH
#define LIBCANIH
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstring>
#define int64 unsigned long long
//#define DEBUG
#ifdef DEBUG
#define dout cout
#else
#define dout if (0) cerr
#endif
using namespace std;
namespace libcanister
{
//the canmem object is a generic memory container used commonly
//throughout the canister framework to hold memory of uncertain
//length which may or may not contain null bytes.
class canmem
{
public:
char* data; //the raw memory block
int size; //the absolute length of the block
canmem(); //creates an unallocated canmem
canmem(int allocsize); //creates an allocated, blank canmem of size
canmem(char* strdata); //automates the creation of zero-limited canmems
~canmem(); //cleans up the canmem
void zeromem(); //overwrites this canmem
void fragmem(); //overwrites this canmem with fragment notation
void countlen(); //counts length of zero-limited strings and stores it in size
void trim(); //removes any nulls from the end of the string
static canmem null(); //returns a singleton null canmem
};
//contains information about the canister
class caninfo
{
public:
canmem path; //physical path
canmem internalname; //a name for the canister
int numfiles; //the number of files in the canister
};
//necessary for the use of this class as a type in canfile
class canister;
//this object holds the definition of a 'file' within the
//canister 'filesystem.'
class canfile
{
public:
libcanister::canister* parent; //the canister that holds this file
canmem path; //internal path ('filename')
canmem data; //the file's decompressed contents
int isfrag; //0 = probably not fragment, 1 = definitely a fragment (ignore)
int cfid; //'canfile id' -- a unique ID for this file
int64 dsize; //ondisk size (compressed form size)
int cachestate; //0 = not in memory, 1 = in memory, 2 = in memory and needs flush
//-1 = error, check the data for the message
void cache(); //pull the file from disk and cache it in memory
void cachedump(); //deletes the contents of this file from the memory cache after assuring the on disk copy is up to date
void cachedumpfinal(fstream& infile); //same as cachedump, but more efficient during closing procedures
void flush(); //updates the on disk copy, but retains the memory cache
};
//the primary class
//this defines and controls a single canister
class canister
{
//table of contents
//absolutely worthless to the control code in the canister
//but quite useful to programs using the API, as they may
//desire to enumerate the files in a canister for a user's
//use or for their own.
//contains a newline-delimited list of files in the container.
canfile TOC;
public:
caninfo info; //the general info about this canister
//the raw canfiles -- recommended that programs do not modify
//these files directly, but not enforced.
canfile* files;
bool readonly; //if true then no write routines will do anything
//maximum number of files to have in memory at any given
//time, change this to whatever suits your application.
int cachemax;
int cachecnt; //number of files in the cache (should not be modified)
//both initialize the canister from a physical location
canister (canmem fspath);
canister (char* fspath);
//destroys the canister (after flushing the modded buffers, of course)
~canister();
//open the fspath
//does it exist?
// | --- yes --- opening it (return 1)
// | --- yes --- file is corrupted, halting (return -1)
// | --- no --- making a new one (return 0)
int open();
//close the canister, flush all buffers, clean up
int close();
//deletes the file at path inside this canister
int delFile(canmem path);
//pulls the contents of the file from disk or memory and returns it as a file
canfile getFile(canmem path);
//creates a file if it does not exist, otherwise overwrites
//returns whether operation succeeded
bool writeFile(canmem path, canmem data);
bool writeFile(canfile file);
//get the 'table of contents', a file containing a newline delimited
//list of the file paths in the container which have contents
canfile getTOC();
//brings the cache back within the cachemax limit
//important: sCFID is the safe CFID
//(the CFID of the file we want to avoid uncaching)
//really just used internally, but it can't do any harm.
void cacheclean(int sCFID, bool dFlush = false);
};
}
#endif

92
samples/C++/metrics.h Normal file
View File

@@ -0,0 +1,92 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef NINJA_METRICS_H_
#define NINJA_METRICS_H_
#include <string>
#include <vector>
using namespace std;
#include "util.h" // For int64_t.
/// The Metrics module is used for the debug mode that dumps timing stats of
/// various actions. To use, see METRIC_RECORD below.
/// A single metrics we're tracking, like "depfile load time".
struct Metric {
string name;
/// Number of times we've hit the code path.
int count;
/// Total time (in micros) we've spent on the code path.
int64_t sum;
};
/// A scoped object for recording a metric across the body of a function.
/// Used by the METRIC_RECORD macro.
struct ScopedMetric {
explicit ScopedMetric(Metric* metric);
~ScopedMetric();
private:
Metric* metric_;
/// Timestamp when the measurement started.
/// Value is platform-dependent.
int64_t start_;
};
/// The singleton that stores metrics and prints the report.
struct Metrics {
Metric* NewMetric(const string& name);
/// Print a summary report to stdout.
void Report();
private:
vector<Metric*> metrics_;
};
/// Get the current time as relative to some epoch.
/// Epoch varies between platforms; only useful for measuring elapsed time.
int64_t GetTimeMillis();
/// A simple stopwatch which returns the time
/// in seconds since Restart() was called.
struct Stopwatch {
public:
Stopwatch() : started_(0) {}
/// Seconds since Restart() call.
double Elapsed() const {
return 1e-6 * static_cast<double>(Now() - started_);
}
void Restart() { started_ = Now(); }
private:
uint64_t started_;
uint64_t Now() const;
};
/// The primary interface to metrics. Use METRIC_RECORD("foobar") at the top
/// of a function to get timing stats recorded for each call of the function.
#define METRIC_RECORD(name) \
static Metric* metrics_h_metric = \
g_metrics ? g_metrics->NewMetric(name) : NULL; \
ScopedMetric metrics_h_scoped(metrics_h_metric);
extern Metrics* g_metrics;
#endif // NINJA_METRICS_H_

View File

@@ -0,0 +1,6 @@
#include <cstdint>
namespace Gui
{
}

26
samples/C++/rpc.h Normal file
View File

@@ -0,0 +1,26 @@
// Copyright (C) 2013 Simon Que
//
// This file is part of DuinoCube.
//
// DuinoCube is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// DuinoCube is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with DuinoCube. If not, see <http://www.gnu.org/licenses/>.
// DuinoCube remote procedure call functions.
#include <stdint.h>
// Initializes RPC system.
void rpc_init();
// Runs the RPC server loop forever.
void rpc_server_loop();

102
samples/C/bootstrap.h Normal file
View File

@@ -0,0 +1,102 @@
#ifndef BOOTSTRAP_H
#define BOOTSTRAP_H
#include <stdio.h>
#include "cxrs.h"
/* If we're not using GNU C, elide __attribute__ */
#ifndef __GNUC__
# define __attribute__(x) /*NOTHING*/
#endif
typedef struct object object;
object *true;
object *false;
object *eof;
object *empty_list;
object *global_enviroment;
enum obj_type {
scm_bool,
scm_empty_list,
scm_eof,
scm_char,
scm_int,
scm_pair,
scm_symbol,
scm_prim_fun,
scm_lambda,
scm_str,
scm_file
};
typedef object *(*prim_proc)(object *args);
object *read(FILE *in);
object *eval(object *code, object *env);
void print(FILE *out, object *obj, int display);
int check_type(enum obj_type type, object *obj, int err_on_false);
static inline int is_true(object *obj)
{
return obj != false;
}
object *make_int(int value);
int obj2int(object *i);
object *make_bool(int value);
int obj2bool(object *b);
object *make_char(char c);
char obj2char(object *ch);
object *make_str(char *str);
char *obj2str(object *str);
object *cons(object *car, object *cdr);
object *car(object *pair);
object *cdr(object *pair);
void set_car(object *pair, object *new);
void set_cdr(object *pair, object *new);
object *make_symbol(char *name);
char *sym2str(object *sym);
object *get_symbol(char *name) __attribute__((pure));
object *make_prim_fun(prim_proc fun);
prim_proc obj2prim_proc(object *proc);
object *make_lambda(object *args, object *code, object *env);
object *lambda_code(object *lambda);
object *lambda_args(object *lambda);
object *make_port(FILE *handle, int direction);
int port_direction(object *port);
FILE *port_handle(object *port);
void set_port_handle_to_null(object *port);
/*both of these should never be called*/
object *apply_proc(object *);
object *eval_proc(object *);
object *maybe_add_begin(object *code);
void init_enviroment(object *env);
void eval_err(char *msg, object *code) __attribute__((noreturn));
void define_var(object *var, object *val, object *env);
void set_var(object *var, object *val, object *env);
object *get_var(object *var, object *env);
object *cond2nested_if(object *cond);
object *let2lambda(object *let);
object *and2nested_if(object *and);
object *or2nested_if(object *or);
#endif /*include guard*/

56
samples/C/dynarray.cats Normal file
View File

@@ -0,0 +1,56 @@
/* ******************************************************************* */
/* */
/* Applied Type System */
/* */
/* ******************************************************************* */
/*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-20?? Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software; you can redistribute it and/or modify it under
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at your option) any
** later version.
**
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License
** along with ATS; see the file COPYING. If not, please write to the
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*/
/* ****** ****** */
/*
(* Author: Hongwei Xi *)
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
(* Start time: March, 2013 *)
*/
/* ****** ****** */
#ifndef ATSHOME_LIBATS_DYNARRAY_CATS
#define ATSHOME_LIBATS_DYNARRAY_CATS
/* ****** ****** */
#include <string.h>
/* ****** ****** */
#define atslib_dynarray_memcpy memcpy
#define atslib_dynarray_memmove memmove
/* ****** ****** */
#endif // ifndef ATSHOME_LIBATS_DYNARRAY_CATS
/* ****** ****** */
/* end of [dynarray.cats] */

47
samples/C/readline.cats Normal file
View File

@@ -0,0 +1,47 @@
/*
** API in ATS for GNU-readline
*/
/* ****** ****** */
/*
** Permission to use, copy, modify, and distribute this software for any
** purpose with or without fee is hereby granted, provided that the above
** copyright notice and this permission notice appear in all copies.
**
** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
** ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* ****** ****** */
#ifndef READLINE_READLINE_CATS
#define READLINE_READLINE_CATS
/* ****** ****** */
#include <readline/readline.h>
/* ****** ****** */
//
#define \
atscntrb_readline_rl_library_version() ((char*)rl_library_version)
//
#define atscntrb_readline_rl_readline_version() (rl_readline_version)
//
/* ****** ****** */
#define atscntrb_readline_readline readline
/* ****** ****** */
#endif // ifndef READLINE_READLINE_CATS
/* ****** ****** */
/* end of [readline.cats] */

12
samples/Cirru/array.cirru Normal file
View File

@@ -0,0 +1,12 @@
print $ array
int 1
string 2
print $ array
int 1
array
int 2
string 3
array
string 4

View File

@@ -0,0 +1,7 @@
set f $ block (a b c)
print a b c
call f (int 1) (int 2) (int 3)
f (int 1) (int 2) (int 3)

7
samples/Cirru/bool.cirru Normal file
View File

@@ -0,0 +1,7 @@
print $ bool true
print $ bool false
print $ bool yes
print $ bool no
print $ bool 1
print $ bool 0

14
samples/Cirru/map.cirru Normal file
View File

@@ -0,0 +1,14 @@
print $ map
a $ int 5
b $ array (int 1) (int 2)
c $ map
int 1
array (int 4)
set m $ map
a $ int 1
set m b $ int 2
print m

View File

@@ -0,0 +1,3 @@
print $ int 1
print $ float 1.2

View File

@@ -0,0 +1,2 @@
require ./stdio.cr

23
samples/Cirru/scope.cirru Normal file
View File

@@ -0,0 +1,23 @@
set a (int 2)
print (self)
set c (child)
under c
under parent
print a
print $ get c a
set c x (int 3)
print $ get c x
set just-print $ code
print a
print just-print
eval (self) just-print
eval just-print

55
samples/Cirru/stdio.cirru Normal file
View File

@@ -0,0 +1,55 @@
set a $ string 1
print a
print (string 1)
print nothing
print
map
a (int 4)
b $ map
a $ int 5
b $ int 6
c $ map
int 7
print
array
int 1
int 2
array
int 3
int 4
print
array
int 1
map
a $ int 2
b $ array
int 3
print
int 1
int 2
print $ code
set a 1
print (get a)
print $ array
int a
array
int a
set container (map)
set container code $ code
set a 1
print (get a)
print $ array
int a
array
int a
print container

View File

@@ -0,0 +1,3 @@
print $ string a
print $ string "a b"

View File

@@ -0,0 +1,47 @@
= Creole
Creole is a Creole-to-HTML converter for Creole, the lightweight markup
language (http://wikicreole.org/). Github uses this converter to render *.creole files.
Project page on github:
* http://github.com/minad/creole
Travis-CI:
* https://travis-ci.org/minad/creole
RDOC:
* http://rdoc.info/projects/minad/creole
== INSTALLATION
{{{
gem install creole
}}}
== SYNOPSIS
{{{
require 'creole'
html = Creole.creolize('== Creole text')
}}}
== BUGS
If you found a bug, please report it at the Creole project's tracker
on GitHub:
http://github.com/minad/creole/issues
== AUTHORS
* Lars Christensen (larsch)
* Daniel Mendler (minad)
== LICENSE
Creole is Copyright (c) 2008 - 2013 Lars Christensen, Daniel Mendler. It is free software, and
may be redistributed under the terms specified in the README file of
the Ruby distribution.

View File

@@ -1,15 +1,19 @@
import 'dart:math' as math;
class Point {
num x, y;
Point(this.x, this.y);
distanceTo(Point other) {
num distanceTo(Point other) {
var dx = x - other.x;
var dy = y - other.y;
return Math.sqrt(dx * dx + dy * dy);
return math.sqrt(dx * dx + dy * dy);
}
var x, y;
}
main() {
Point p = new Point(2, 3);
Point q = new Point(3, 4);
void main() {
var p = new Point(2, 3);
var q = new Point(3, 4);
print('distance from p to q = ${p.distanceTo(q)}');
}

View File

@@ -0,0 +1,16 @@
quiet
wow
such language
very syntax
github recognized wow
loud
such language much friendly
rly friendly is true
plz console.loge with 'such friend, very inclusive'
but
plz console.loge with 'no love for doge'
wow
wow
module.exports is language

View File

@@ -0,0 +1,44 @@
{--
This program displays the
current time on stdandard output
every other second.
-}
module examples.CommandLineClock where
data Date = native java.util.Date where
native new :: () -> IO (MutableIO Date) -- new Date()
native toString :: Mutable s Date -> ST s String -- d.toString()
--- 'IO' action to give us the current time as 'String'
current :: IO String
current = do
d <- Date.new ()
d.toString
{-
"java.lang.Thread.sleep" takes a "long" and
returns nothing, but may throw an InterruptedException.
This is without doubt an IO action.
public static void sleep(long millis)
throws InterruptedException
Encoded in Frege:
- argument type long Long
- result void ()
- does IO IO ()
- throws ... throws ....
-}
-- .... defined in frege.java.Lang
-- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException
main args =
forever do
current >>= print
print "\r"
stdout.flush
Thread.sleep 999

147
samples/Frege/Concurrent.fr Normal file
View File

@@ -0,0 +1,147 @@
module examples.Concurrent where
import System.Random
import Java.Net (URL)
import Control.Concurrent as C
main2 args = do
m <- newEmptyMVar
forkIO do
m.put 'x'
m.put 'y'
m.put 'z'
replicateM_ 3 do
c <- m.take
print "got: "
println c
example1 = do
forkIO (replicateM_ 100000 (putChar 'a'))
replicateM_ 100000 (putChar 'b')
example2 = do
s <- getLine
case s.long of
Right n -> forkIO (setReminder n) >> example2
Left _ -> println ("exiting ...")
setReminder :: Long -> IO ()
setReminder n = do
println ("Ok, I remind you in " ++ show n ++ " seconds")
Thread.sleep (1000L*n)
println (show n ++ " seconds is up!")
table = "table"
mainPhil _ = do
[fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5]
forkIO (philosopher "Kant" fork5 fork1)
forkIO (philosopher "Locke" fork1 fork2)
forkIO (philosopher "Wittgenstein" fork2 fork3)
forkIO (philosopher "Nozick" fork3 fork4)
forkIO (philosopher "Mises" fork4 fork5)
return ()
philosopher :: String -> MVar Int -> MVar Int -> IO ()
philosopher me left right = do
g <- Random.newStdGen
let phil g = do
let (tT,g1) = Random.randomR (60L, 120L) g
(eT, g2) = Random.randomR (80L, 160L) g1
thinkTime = 300L * tT
eatTime = 300L * eT
println(me ++ " is going to the dining room and takes his seat.")
fl <- left.take
println (me ++ " takes up left fork (" ++ show fl ++ ")")
rFork <- right.poll
case rFork of
Just fr -> do
println (me ++ " takes up right fork. (" ++ show fr ++ ")")
println (me ++ " is going to eat for " ++ show eatTime ++ "ms")
Thread.sleep eatTime
println (me ++ " finished eating.")
right.put fr
println (me ++ " took down right fork.")
left.put fl
println (me ++ " took down left fork.")
table.notifyAll
println(me ++ " is going to think for " ++ show thinkTime ++ "ms.")
Thread.sleep thinkTime
phil g2
Nothing -> do
println (me ++ " finds right fork is already in use.")
left.put fl
println (me ++ " took down left fork.")
table.notifyAll
println (me ++ " is going to the bar to await notifications from table.")
table.wait
println (me ++ " got notice that something changed at the table.")
phil g2
inter :: InterruptedException -> IO ()
inter _ = return ()
phil g `catch` inter
getURL xx = do
url <- URL.new xx
con <- url.openConnection
con.connect
is <- con.getInputStream
typ <- con.getContentType
-- stderr.println ("content-type is " ++ show typ)
ir <- InputStreamReader.new is (fromMaybe "UTF-8" (charset typ))
`catch` unsupportedEncoding is
br <- BufferedReader.new ir
br.getLines
where
unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader
unsupportedEncoding is x = do
stderr.println x.catched
InputStreamReader.new is "UTF-8"
charset ctyp = do
typ <- ctyp
case typ of
m~´charset=(\S+)´ -> m.group 1
_ -> Nothing
type SomeException = Throwable
main ["dining"] = mainPhil []
main _ = do
m1 <- MVar.newEmpty
m2 <- MVar.newEmpty
m3 <- MVar.newEmpty
forkIO do
r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Haskell"
m1.put r
forkIO do
r <- (catchAll . getURL) "htto://www.wikipedia.org/wiki/Java"
m2.put r
forkIO do
r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Frege"
m3.put r
r1 <- m1.take
r2 <- m2.take
r3 <- m3.take
println (result r1, result r2, result r3)
-- case r3 of
-- Right ss -> mapM_ putStrLn ss
-- Left _ -> return ()
where
result :: (SomeException|[String]) -> (String|Int)
result (Left x) = Left x.getClass.getName
result (Right y) = (Right . sum . map length) y
-- mapM_ putStrLn r2

561
samples/Frege/Sudoku.fr Normal file
View File

@@ -0,0 +1,561 @@
package examples.Sudoku where
import Data.TreeMap (Tree, keys)
import Data.List as DL hiding (find, union)
type Element = Int -- 1,2,3,4,5,6,7,8,9
type Zelle = [Element] -- set of candidates
type Position = Int -- 0..80
type Feld = (Position, Zelle)
type Brett = [Feld]
--- data type for assumptions and conclusions
data Assumption =
!ISNOT Position Element
| !IS Position Element
derive Eq Assumption
derive Ord Assumption
instance Show Assumption where
show (IS p e) = pname p ++ "=" ++ e.show
show (ISNOT p e) = pname p ++ "/" ++ e.show
showcs cs = joined " " (map Assumption.show cs)
elements :: [Element] -- all possible elements
elements = [1 .. 9]
{-
a b c d e f g h i
0 1 2 | 3 4 5 | 6 7 8 1
9 10 11 |12 13 14 |15 16 17 2
18 19 20 |21 22 23 |24 25 26 3
---------|---------|--------
27 28 29 |30 31 32 |33 34 35 4
36 37 38 |39 40 41 |42 43 44 5
45 46 47 |48 49 50 |51 52 53 6
---------|---------|--------
54 55 56 |57 58 59 |60 61 62 7
63 64 65 |66 67 68 |69 70 71 8
72 73 74 |75 76 77 |78 79 80 9
-}
positions :: [Position] -- all possible positions
positions = [0..80]
rowstarts :: [Position] -- all positions where a row is starting
rowstarts = [0,9,18,27,36,45,54,63,72]
colstarts :: [Position] -- all positions where a column is starting
colstarts = [0,1,2,3,4,5,6,7,8]
boxstarts :: [Position] -- all positions where a box is starting
boxstarts = [0,3,6,27,30,33,54,57,60]
boxmuster :: [Position] -- pattern for a box, by adding upper left position results in real box
boxmuster = [0,1,2,9,10,11,18,19,20]
--- extract field for position
getf :: Brett -> Position -> Feld
getf (f:fs) p
| fst f == p = f
| otherwise = getf fs p
getf [] p = (p,[])
--- extract cell for position
getc :: Brett -> Position -> Zelle
getc b p = snd (getf b p)
--- compute the list of all positions that belong to the same row as a given position
row :: Position -> [Position]
row p = [z..(z+8)] where z = (p `quot` 9) * 9
--- compute the list of all positions that belong to the same col as a given position
col :: Position -> [Position]
col p = map (c+) rowstarts where c = p `mod` 9
--- compute the list of all positions that belong to the same box as a given position
box :: Position -> [Position]
box p = map (z+) boxmuster where
ri = p `div` 27 * 27 -- 0, 27 or 54, depending on row
ci = p `mod` 9 -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right
cs = ci `div` 3 * 3 -- 0, 3 or 6
z = ri + cs
--- check if candidate set has exactly one member, i.e. field has been solved
single :: Zelle -> Bool
single [_] = true
single _ = false
unsolved :: Zelle -> Bool
unsolved [_] = false
unsolved _ = true
-- list of rows, cols, boxes
allrows = map row rowstarts
allcols = map col colstarts
allboxs = map box boxstarts
allrcb = zip (repeat "row") allrows
++ zip (repeat "col") allcols
++ zip (repeat "box") allboxs
containers :: [(Position -> [Position], String)]
containers = [(row, "row"), (col, "col"), (box, "box")]
-- ----------------- PRINTING ------------------------------------
-- printable coordinate of field, upper left is a1, lower right is i9
pname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)]
-- print board
printb b = mapM_ p1line allrows >> println ""
where
p1line row = do
print (joined "" (map pfld line))
where line = map (getc b) row
-- print field (brief)
-- ? = no candidate
-- 5 = field is 5
-- . = some candidates
pfld [] = "?"
pfld [x] = show x
pfld zs = "0"
-- print initial/final board
result msg b = do
println ("Result: " ++ msg)
print ("Board: ")
printb b
return b
res012 b = case concatMap (getc b) [0,1,2] of
[a,b,c] -> a*100+b*10+c
_ -> 9999999
-- -------------------------- BOARD ALTERATION ACTIONS ---------------------------------
-- print a message about what is done to the board and return the new board
turnoff1 :: Position -> Zelle -> Brett -> IO Brett
turnoff1 i off b
| single nc = do
-- print (pname i)
-- print ": set to "
-- print (head nc)
-- println " (naked single)"
return newb
| otherwise = return newb
where
cell = getc b i
nc = filter (`notElem` off) cell
newb = (i, nc) : [ f | f <- b, fst f != i ]
turnoff :: Int -> Zelle -> String -> Brett -> IO Brett
turnoff i off msg b = do
-- print (pname i)
-- print ": set to "
-- print nc
-- print " by clearing "
-- print off
-- print " "
-- println msg
return newb
where
cell = getc b i
nc = filter (`notElem` off) cell
newb = (i, nc) : [ f | f <- b, fst f != i ]
turnoffh ps off msg b = foldM toh b ps
where
toh b p = turnoff p off msg b
setto :: Position -> Element -> String -> Brett -> IO Brett
setto i n cname b = do
-- print (pname i)
-- print ": set to "
-- print n
-- print " (hidden single in "
-- print cname
-- println ")"
return newb
where
nf = [n]
newb = (i, nf) : [ f | f <- b, fst f != i ]
-- ----------------------------- SOLVING STRATEGIES ---------------------------------------------
-- reduce candidate sets that contains numbers already in same row, col or box
-- This finds (and logs) NAKED SINGLEs in passing.
reduce b = [ turnoff1 p sss | (p,cell) <- b, -- for each field
unsolved cell, -- with more than 1 candidate
-- single fields in containers that are candidates of that field
sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell],
sss != [] ] -- collect field index, elements to remove from candidate set
-- look for a number that appears in exactly 1 candidate set of a container
-- this number can go in no other place (HIDDEN SINGLE)
hiddenSingle b = [ setto i n cname | -- select index, number, containername
(cname, rcb) <- allrcb, -- FOR rcb IN allrcb
n <- elements, -- FOR n IN elements
fs = filter (unsolved • snd) (map (getf b) rcb),
occurs = filter ((n `elem`) • snd) fs,
length occurs == 1,
(i, _) <- occurs ]
-- look for NAKED PAIRS, TRIPLES, QUADS
nakedPair n b = [ turnoff p t ("(naked tuple in " ++ nm ++ ")") | -- SELECT pos, tuple, name
-- n <- [2,3,4], // FOR n IN [2,3,4]
(nm, rcb) <- allrcb, -- FOR rcb IN containers
fs = map (getf b) rcb, -- let fs = fields for rcb positions
u = (fold union [] . filter unsolved . map snd) fs, -- let u = union of non single candidates
t <- n `outof` u, -- FOR t IN n-tuples
hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs,
length hit == n,
(p, cell) <- fs,
p `notElem` map fst hit,
any (`elem` cell) t
]
-- look for HIDDEN PAIRS, TRIPLES or QUADS
hiddenPair n b = [ turnoff p off ("(hidden " ++ show t ++ " in " ++ nm ++ ")") | -- SELECT pos, tuple, name
-- n <- [2,3,4], // FOR n IN [2,3,4]
(nm, rcb) <- allrcb, -- FOR rcb IN containers
fs = map (getf b) rcb, -- let fs = fields for rcb positions
u = (fold union [] . filter ((>1) . length) . map snd) fs, -- let u = union of non single candidates
t <- n `outof` u, -- FOR t IN n-tuples
hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs,
length hit == n,
off = (fold union [] . map snd) hit `minus` t,
off != [],
(p, cell) <- hit,
! (cell `subset` t)
]
a `subset` b = all (`elem` b) a
a `union` b = uniq (sort (a ++ b))
a `minus` b = filter (`notElem` b) a
a `common` b = filter (`elem` b) a
n `outof` as
| length as < n = []
| [] <- as = []
| 1 >= n = map (:[]) as
| (a:bs) <- as = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs)
| otherwise = undefined -- cannot happen because either as is empty or not
same f a b = b `elem` f a
intersectionlist = [(allboxs, row, "box/row intersection"), (allboxs, col, "box/col intersection"),
(allrows ++ allcols, box, "line/box intersection")]
intersections b = [
turnoff pos [c] reason | -- SELECT position, candidate, reson
(from, container, reason) <- intersectionlist,
rcb <- from,
fs = (filter (unsolved . snd) . map (getf b)) rcb, -- fs = fields in from with more than 1 candidate
c <- (fold union [] • map snd) fs, -- FOR c IN union of candidates
cpos = (map fst • filter ((c `elem`) • snd)) fs, -- cpos = positions where c occurs
cpos != [], -- WHERE cpos is not empty
all (same container (head cpos)) (tail cpos), -- WHERE all positions are in the intersection
-- we can remove all occurences of c that are in container, but not in from
(pos, cell) <- map (getf b) (container (head cpos)),
c `elem` cell,
pos `notElem` rcb ]
-- look for an XY Wing
-- - there exists a cell A with candidates X and Y
-- - there exists a cell B with candidates X and Z that shares a container with A
-- - there exists a cell C with candidates Y and Z that shares a container with A
-- reasoning
-- - if A is X, B will be Z
-- - if A is Y, C will be Z
-- - since A will indeed be X or Y -> B or C will be Z
-- - thus, no cell that can see B and C can be Z
xyWing board = [ turnoff p [z] ("xy wing " ++ pname b ++ " " ++ pname c ++ " because of " ++ pname a) |
(a, [x,y]) <- board, -- there exists a cell a with candidates x and y
rcba = map (getf board) (row a ++ col a ++ box a), -- rcba = all fields that share a container with a
(b, [b1, b2]) <- rcba,
b != a,
b1 == x && b2 != y || b2 == x && b1 != y, -- there exists a cell B with candidates x and z
z = if b1 == x then b2 else b1,
(c, [c1, c2]) <- rcba,
c != a, c!= b,
c1 == y && c2 == z || c1 == z && c2 == y, -- there exists a cell C with candidates y and z
ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)),
-- remove z in ps
(p, cs) <- map (getf board) ps,
p != b, p != c,
z `elem` cs ]
-- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish)
-- When all candidates for a particular digit in N rows are located
-- in only N columns, we can eliminate all candidates from those N columns
-- which are not located on those N rows
fish n board = fish "row" allrows row col ++ fish "col" allcols col row where
fishname 2 = "X-Wing"
fishname 3 = "Swordfish"
fishname 4 = "Jellyfish"
fishname _ = "unknown fish"
fish nm allrows row col = [ turnoff p [x] (fishname n ++ " in " ++ nm ++ " " ++ show (map (pname . head) rset)) |
rset <- n `outof` allrows, -- take n rows (or cols)
x <- elements, -- look for certain number
rflds = map (filter ((>1) . length . snd) . map (getf board)) rset, -- unsolved fields in the rowset
colss = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds), -- where x occurs in candidates
all ((>1) . length) colss, -- x must appear in at least 2 cols
cols = fold union [] colss,
length cols == n,
cstart <- cols,
(p, cell) <- map (getf board) (col cstart),
x `elem` cell,
all (p `notElem`) rset]
-- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e)
conseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++
[ a `ISNOT` e |
(a,cs) <- map (getf board) (row p ++ col p ++ box p),
a != p,
e `elem` cs
]))
conseq board (ISNOT p e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++
[ a `IS` e |
cp <- [row p, box p, col p],
as = (filter ((e `elem`) . getc board) . filter (p!=)) cp,
length as == 1,
a = head as
]))
-- check if two assumptions contradict each other
contradicts (IS a x) (IS b y) = a==b && x!=y
contradicts (IS a x) (ISNOT b y) = a==b && x==y
contradicts (ISNOT a x) (IS b y) = a==b && x==y
contradicts (ISNOT _ _) (ISNOT _ _) = false
-- get the Position of an Assumption
aPos (IS p _) = p
aPos (ISNOT p _) = p
-- get List of elements that must be turned off when assumption is true/false
toClear board true (IS p x) = filter (x!=) (getc board p)
toClear board false (IS p x) = [x]
toClear board true (ISNOT p x) = [x]
toClear board false (ISNOT p x) = filter (x!=) (getc board p)
-- look for assumptions whose implications contradict themself
chain board paths = [ solution a (head cs) (reverse cs) |
(a, css) <- paths,
cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ]
]
where
solution a c cs = turnoff (aPos a) (toClear board false a) reason where
reason = "Assumption " ++ show a ++ " implies " ++ show c ++ "\n\t"
++ showcs cs ++ "\n\t"
++ "Therefore, " ++ show a ++ " must be false."
-- look for an assumption that yields to contradictory implications
-- this assumption must be false
chainContra board paths = [ solution a (reverse pro) (reverse contra) |
(a, css) <- paths, -- FOR ALL assumptions "a" with list of conlusions "css"
(pro, contra) <- take 1 [ (pro, contra) |
pro <- (uniqBy (using head) . sortBy (comparing head)) css, -- FOR ALL conslusion chains "pro"
c = head pro, -- LET "c" BE the final conclusion
contra <- take 1 (filter ((contradicts c) . head) css) -- THE FIRST conclusion that contradicts c
]
]
where
solution a pro con = turnoff (aPos a) (toClear board false a) reason where
reason = ("assumption " ++ show a ++ " leads to contradictory conclusions\n\t"
++ showcs pro ++ "\n\t" ++ showcs con)
-- look for a common implication c of some assumptions ai, where at least 1 ai is true
-- so that (a0 OR a1 OR a2 OR ...) IMPLIES c
-- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x)
-- For a cell p with candidates ci, we can construct (p==c0 OR p==c1)
cellRegionChain board paths = [ solution b as (map head os) |
as <- cellas ++ regionas, -- one of as must be true
iss = filter ((`elem` as) . fst) paths, -- the implications for as
(a, ass) <- take 1 iss, -- implications for first assumption
fs <- (uniqBy (using head) . sortBy (comparing head)) ass,
b = head fs, -- final conclusions of first assumption
os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion
all ([]!=) os]
where
cellas = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ]
regionas = [ map (`IS` e) ps |
region <- map (map (getf board)) (allrows ++ allcols ++ allboxs),
e <- elements,
ps = map fst (filter ((e `elem`) . snd) region),
length ps > 1 ]
solution b as oss = turnoff (aPos b) (toClear board true b) reason where
reason = "all of the assumptions " ++ joined ", " (map show as) ++ " imply " ++ show b ++ "\n\t"
++ joined "\n\t" (map (showcs . reverse) oss) ++ "\n\t"
++ "One of them must be true, so " ++ show b ++ " must be true."
{-
Wir brauchen für einige Funktionen eine Datenstruktur wie
[ (Assumption, [[Assumption]]) ]
d.i. eine Liste von möglichen Annahmen samt aller Schlußketten.
Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen,
dann kann man einfach finden:
- Annahmen, die zum Selbstwiderspruch führen.
- alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]])
-...
-}
--- Liste aller Annahmen für ein bestimmtes Brett
assumptions :: Brett -> [Assumption]
assumptions board = [ a |
(p, cs) <- board,
!(single cs),
a <- map (ISNOT p) cs ++ map (IS p) cs ]
consequences :: Brett -> [Assumption] -> [[Assumption]]
consequences board as = map (conseq board) as
acstree :: Brett -> Tree Assumption [Assumption]
acstree board = Tree.fromList (zip as cs)
where
as = assumptions board
cs = consequences board as
-- bypass maybe on tree lookup
find :: Tree Assumption [Assumption] -> Assumption -> [Assumption]
find t a
| Just cs <- t.lookup a = cs
| otherwise = error ("no consequences for " ++ show a)
-- for performance resons, we confine ourselves to implication chains of length 20 per assumption
mkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ]
mkPaths acst = map impl (keys acst) -- {[a1], [a2], [a3] ]
where
-- [Assumption] -> [(a, [chains, ordered by length]
impl a = (a, impls [[a]])
impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns
-- expandchain :: [[Assumption]] -> [[Assumption]]
expandchain css = [ (n:a:as) |
(a : as) <- css, -- list of assumptions
n <- find acst a, -- consequences of a
n `notElem` as -- avoid loops
]
-- uni (a:as) = a : uni (filter ((head a !=) • head) as)
-- uni [] = empty
-- empty = []
-- ------------------ SOLVE A SUDOKU --------------------------
-- Apply all available strategies until nothing changes anymore
-- Strategy functions are supposed to return a list of
-- functions, which, when applied to a board, give a changed board.
-- When a strategy does not find anything to alter,
-- it returns [], and the next strategy can be tried.
solve b
| all (single . snd) b = result "Solved" b
| any (([]==) . snd) b = result "not solvable" b
| res@(_:_) <- reduce b = apply b res >>=solve -- compute smallest candidate sets
-- comment "candidate sets are up to date" = ()
| res@(_:_) <- hiddenSingle b = apply b res >>= solve -- find HIDDEN SINGLES
-- comment "no more hidden singles" = ()
| res@(_:_) <- intersections b = apply b res >>= solve -- find locked candidates
-- comment "no more intersections" = ()
| res@(_:_) <- nakedPair 2 b = apply b res >>= solve -- find NAKED PAIRS, TRIPLES or QUADRUPELS
-- comment "no more naked pairs" = ()
| res@(_:_) <- hiddenPair 2 b = apply b res >>= solve -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS
-- comment "no more hidden pairs" = ()
-- res@(_:_) <- nakedPair 3 b = apply b res >>= solve // find NAKED PAIRS, TRIPLES or QUADRUPELS
-- | comment "no more naked triples" = ()
-- res@(_:_) <- hiddenPair 3 b = apply b res >>= solve // find HIDDEN PAIRS, TRIPLES or QUADRUPELS
-- | comment "no more hidden triples" = ()
-- res@(_:_) <- nakedPair 4 b = apply b res >>=solve // find NAKED PAIRS, TRIPLES or QUADRUPELS
-- | comment "no more naked quadruples" = ()
-- res@(_:_) <- hiddenPair 4 b = apply b res >>=solve // find HIDDEN PAIRS, TRIPLES or QUADRUPELS
-- | comment "no more hidden quadruples" = ()
| res@(_:_) <- xyWing b = apply b res >>=solve -- find XY WINGS
-- comment "no more xy wings" = ()
| res@(_:_) <- fish 2 b = apply b res >>=solve -- find 2-FISH
-- comment "no more x-wings" = ()
-- res@(_:_) <- fish 3 b = apply b res >>=solve // find 3-FISH
-- | comment "no more swordfish" = ()
-- res@(_:_) <- fish 4 b = apply b res >>=solve // find 4-FISH
-- | comment "no more jellyfish" = ()
-- | comment pcomment = ()
| res@(_:_) <- chain b paths = apply b (take 9 res) >>= solve -- find forcing chains
| res@(_:_) <- cellRegionChain b paths = apply b (take 9 res) >>= solve -- find common conclusion for true assumption
| res@(_:_) <- chainContra b paths = apply b (take 9 res) >>= solve -- find assumptions that allow to infer both a and !a
-- comment "consistent conclusions only" = ()
| otherwise = result "ambiguous" b
where
apply brd fs = foldM (\b\f -> f b) brd fs
paths = mkPaths (acstree b)
-- pcomment = show (length paths) ++ " assumptions with " ++ show (fold (+) 0 (map (length <~ snd) paths))
-- ++ " implication chains"
-- comment com = do stderr << com << "\n" for false
-- log com = do stderr << com << "\n" for true
--- turn a string into a row
mkrow :: String -> [Zelle]
mkrow s = mkrow1 xs
where
xs = s ++ "---------" -- make sure at least 9 elements
mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs
f x | x >= '1' && x <= '9' = [ord x - ord '0']
| x == ' ' = [] -- ignored
| otherwise = elements
main ["-h"] = main []
main ["-help"] = main []
main [] = do
mapM_ stderr.println [
"usage: java Sudoku file ...",
" java Sudoku position",
"where position is a 81 char string consisting of digits",
"One can get such a string by going to",
"http://www.sudokuoftheday.com/pages/s-o-t-d.php",
"Right click on the puzzle and open it in new tab",
"Copy the 81 digits from the URL in the address field of your browser.",
"",
"There is also a file with hard sudokus in examples/top95.txt\n"]
return ()
main [s@#^[0-9\W]{81}$#] = solve board >> return ()
where
board = zip positions felder
felder = decode s
main files = forM_ files sudoku
where
sudoku file = do
br <- openReader file
lines <- BufferedReader.getLines br
bs <- process lines
ss <- mapM (\b -> print "Puzzle: " >> printb b >> solve b) bs
println ("Euler: " ++ show (sum (map res012 ss)))
return ()
-- "--3-" => [1..9, 1..9, [3], 1..9]
decode s = map candi (unpacked s) where
candi c | c >= '1' && c <= '9' = [(ord c - ord '0')]
| otherwise = elements
process [] = return []
process (s:ss)
| length s == 81 = consider b1
| length s == 9,
length acht == 8,
all ((9==) • length) acht = consider b2
| otherwise = do
stderr.println ("skipped line: " ++ s)
process ss
where
acht = take 8 ss
neun = fold (++) "" (s:acht)
b1 = zip positions (decode s)
b2 = zip positions (decode neun)
consider b = do
-- print "Puzzle: "
-- printb b
bs <- process ss
return (b:bs)

View File

@@ -0,0 +1,79 @@
package examples.SwingExamples where
import Java.Awt (ActionListener)
import Java.Swing
main _ = do
rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI]
mapM_ invokeLater rs
println "Hit enter to end ...."
s <- getLine
return ()
celsiusConverterGUI = do
tempTextField <- JTextField.new()
celsiusLabel <- JLabel.new ()
convertButton <- JButton.new ()
fahrenheitLabel <- JLabel.new ()
frame <- JFrame.new ()
frame.setDefaultCloseOperation JFrame.dispose_on_close
frame.setTitle "Celsius Converter"
celsiusLabel.setText "Celsius"
convertButton.setText "Convert"
let convertButtonActionPerformed _ = do
celsius <- tempTextField.getText
case celsius.double of
Left _ -> fahrenheitLabel.setText ("not a valid number: " ++ celsius)
Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ " Fahrenheit")
return ()
ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener
fahrenheitLabel.setText "Fahrenheit"
contentPane <- frame.getContentPane
layout <- GroupLayout.new contentPane
contentPane.setLayout layout
-- TODO continue
-- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java
frame.pack
frame.setVisible true
helloWorldGUI = do
frame <- JFrame.new "Hello World Frege"
frame.setDefaultCloseOperation(JFrame.dispose_on_close)
label <- JLabel.new "Hello World!"
cp <- frame.getContentPane
cp.add label
frame.pack
frame.setVisible true
buttonDemoGUI = do
frame <- JFrame.new "Button Demo"
frame.setDefaultCloseOperation(JFrame.dispose_on_close)
newContentPane <- JPanel.new ()
b1::JButton <- JButton.new "Disable middle button"
b1.setVerticalTextPosition SwingConstants.center
b1.setHorizontalTextPosition SwingConstants.leading
b2::JButton <- JButton.new "Middle button"
b2.setVerticalTextPosition SwingConstants.center
b2.setHorizontalTextPosition SwingConstants.leading
b3::JButton <- JButton.new "Enable middle button"
b3.setVerticalTextPosition SwingConstants.center
b3.setHorizontalTextPosition SwingConstants.leading
b3.setEnabled false
let action1 _ = do
b2.setEnabled false
b1.setEnabled false
b3.setEnabled true
action3 _ = do
b2.setEnabled true
b1.setEnabled true
b3.setEnabled false
ActionListener.new action1 >>= b1.addActionListener
ActionListener.new action3 >>= b3.addActionListener
newContentPane.add b1
newContentPane.add b2
newContentPane.add b3
newContentPane.setOpaque true
frame.setContentPane newContentPane
frame.pack
frame.setVisible true

View File

@@ -0,0 +1,642 @@
/*
Originally from /Source/gg2/Scripts/Client/ClientBeginStep.gml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
// receive and interpret the server's message(s)
var i, playerObject, playerID, player, otherPlayerID, otherPlayer, sameVersion, buffer, plugins, pluginsRequired, usePlugins;
if(tcp_eof(global.serverSocket)) {
if(gotServerHello)
show_message("You have been disconnected from the server.");
else
show_message("Unable to connect to the server.");
instance_destroy();
exit;
}
if(room == DownloadRoom and keyboard_check(vk_escape))
{
instance_destroy();
exit;
}
if(downloadingMap)
{
while(tcp_receive(global.serverSocket, min(1024, downloadMapBytes-buffer_size(downloadMapBuffer))))
{
write_buffer(downloadMapBuffer, global.serverSocket);
if(buffer_size(downloadMapBuffer) == downloadMapBytes)
{
write_buffer_to_file(downloadMapBuffer, "Maps/" + downloadMapName + ".png");
downloadingMap = false;
buffer_destroy(downloadMapBuffer);
downloadMapBuffer = -1;
exit;
}
}
exit;
}
roomchange = false;
do {
if(tcp_receive(global.serverSocket,1)) {
switch(read_ubyte(global.serverSocket)) {
case HELLO:
gotServerHello = true;
global.joinedServerName = receivestring(global.serverSocket, 1);
downloadMapName = receivestring(global.serverSocket, 1);
advertisedMapMd5 = receivestring(global.serverSocket, 1);
receiveCompleteMessage(global.serverSocket, 1, global.tempBuffer);
pluginsRequired = read_ubyte(global.tempBuffer);
plugins = receivestring(global.serverSocket, 1);
if(string_pos("/", downloadMapName) != 0 or string_pos("\", downloadMapName) != 0)
{
show_message("Server sent illegal map name: "+downloadMapName);
instance_destroy();
exit;
}
if (!noReloadPlugins && string_length(plugins))
{
usePlugins = pluginsRequired || !global.serverPluginsPrompt;
if (global.serverPluginsPrompt)
{
var prompt;
if (pluginsRequired)
{
prompt = show_question(
"This server requires the following plugins to play on it: "
+ string_replace_all(plugins, ",", "#")
+ '#They are downloaded from the source: "'
+ PLUGIN_SOURCE
+ '"#The source states: "'
+ PLUGIN_SOURCE_NOTICE
+ '"#Do you wish to download them and continue connecting?'
);
if (!prompt)
{
instance_destroy();
exit;
}
}
else
{
prompt = show_question(
"This server suggests the following optional plugins to play on it: "
+ string_replace_all(plugins, ",", "#")
+ '#They are downloaded from the source: "'
+ PLUGIN_SOURCE
+ '"#The source states: "'
+ PLUGIN_SOURCE_NOTICE
+ '"#Do you wish to download them and use them?'
);
if (prompt)
{
usePlugins = true;
}
}
}
if (usePlugins)
{
if (!loadserverplugins(plugins))
{
show_message("Error ocurred loading server-sent plugins.");
instance_destroy();
exit;
}
global.serverPluginsInUse = true;
}
}
noReloadPlugins = false;
if(advertisedMapMd5 != "")
{
var download;
download = not file_exists("Maps/" + downloadMapName + ".png");
if(!download and CustomMapGetMapMD5(downloadMapName) != advertisedMapMd5)
{
if(show_question("The server's copy of the map (" + downloadMapName + ") differs from ours.#Would you like to download this server's version of the map?"))
download = true;
else
{
instance_destroy();
exit;
}
}
if(download)
{
write_ubyte(global.serverSocket, DOWNLOAD_MAP);
socket_send(global.serverSocket);
receiveCompleteMessage(global.serverSocket,4,global.tempBuffer);
downloadMapBytes = read_uint(global.tempBuffer);
downloadMapBuffer = buffer_create();
downloadingMap = true;
roomchange=true;
}
}
ClientPlayerJoin(global.serverSocket);
if(global.rewardKey != "" and global.rewardId != "")
{
var rewardId;
rewardId = string_copy(global.rewardId, 0, 255);
write_ubyte(global.serverSocket, REWARD_REQUEST);
write_ubyte(global.serverSocket, string_length(rewardId));
write_string(global.serverSocket, rewardId);
}
if(global.queueJumping == true)
{
write_ubyte(global.serverSocket, CLIENT_SETTINGS);
write_ubyte(global.serverSocket, global.queueJumping);
}
socket_send(global.serverSocket);
break;
case JOIN_UPDATE:
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
global.playerID = read_ubyte(global.tempBuffer);
global.currentMapArea = read_ubyte(global.tempBuffer);
break;
case FULL_UPDATE:
deserializeState(FULL_UPDATE);
break;
case QUICK_UPDATE:
deserializeState(QUICK_UPDATE);
break;
case CAPS_UPDATE:
deserializeState(CAPS_UPDATE);
break;
case INPUTSTATE:
deserializeState(INPUTSTATE);
break;
case PLAYER_JOIN:
player = instance_create(0,0,Player);
player.name = receivestring(global.serverSocket, 1);
ds_list_add(global.players, player);
if(ds_list_size(global.players)-1 == global.playerID) {
global.myself = player;
instance_create(0,0,PlayerControl);
}
break;
case PLAYER_LEAVE:
// Delete player from the game, adjust own ID accordingly
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
playerID = read_ubyte(global.tempBuffer);
player = ds_list_find_value(global.players, playerID);
removePlayer(player);
if(playerID < global.playerID) {
global.playerID -= 1;
}
break;
case PLAYER_DEATH:
var causeOfDeath, assistantPlayerID, assistantPlayer;
receiveCompleteMessage(global.serverSocket,4,global.tempBuffer);
playerID = read_ubyte(global.tempBuffer);
otherPlayerID = read_ubyte(global.tempBuffer);
assistantPlayerID = read_ubyte(global.tempBuffer);
causeOfDeath = read_ubyte(global.tempBuffer);
player = ds_list_find_value(global.players, playerID);
otherPlayer = noone;
if(otherPlayerID != 255)
otherPlayer = ds_list_find_value(global.players, otherPlayerID);
assistantPlayer = noone;
if(assistantPlayerID != 255)
assistantPlayer = ds_list_find_value(global.players, assistantPlayerID);
doEventPlayerDeath(player, otherPlayer, assistantPlayer, causeOfDeath);
break;
case BALANCE:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
balanceplayer=read_ubyte(global.tempBuffer);
if balanceplayer == 255 {
if !instance_exists(Balancer) instance_create(x,y,Balancer);
with(Balancer) notice=0;
} else {
player = ds_list_find_value(global.players, balanceplayer);
if(player.object != -1) {
with(player.object) {
instance_destroy();
}
player.object = -1;
}
if(player.team==TEAM_RED) {
player.team = TEAM_BLUE;
} else {
player.team = TEAM_RED;
}
if !instance_exists(Balancer) instance_create(x,y,Balancer);
Balancer.name=player.name;
with (Balancer) notice=1;
}
break;
case PLAYER_CHANGETEAM:
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if(player.object != -1) {
with(player.object) {
instance_destroy();
}
player.object = -1;
}
player.team = read_ubyte(global.tempBuffer);
break;
case PLAYER_CHANGECLASS:
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if(player.object != -1) {
with(player.object) {
instance_destroy();
}
player.object = -1;
}
player.class = read_ubyte(global.tempBuffer);
break;
case PLAYER_CHANGENAME:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
player.name = receivestring(global.serverSocket, 1);
if player=global.myself {
global.playerName=player.name
}
break;
case PLAYER_SPAWN:
receiveCompleteMessage(global.serverSocket,3,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventSpawn(player, read_ubyte(global.tempBuffer), read_ubyte(global.tempBuffer));
break;
case CHAT_BUBBLE:
var bubbleImage;
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
setChatBubble(player, read_ubyte(global.tempBuffer));
break;
case BUILD_SENTRY:
receiveCompleteMessage(global.serverSocket,6,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
buildSentry(player, read_ushort(global.tempBuffer)/5, read_ushort(global.tempBuffer)/5, read_byte(global.tempBuffer));
break;
case DESTROY_SENTRY:
receiveCompleteMessage(global.serverSocket,4,global.tempBuffer);
playerID = read_ubyte(global.tempBuffer);
otherPlayerID = read_ubyte(global.tempBuffer);
assistantPlayerID = read_ubyte(global.tempBuffer);
causeOfDeath = read_ubyte(global.tempBuffer);
player = ds_list_find_value(global.players, playerID);
if(otherPlayerID == 255) {
doEventDestruction(player, noone, noone, causeOfDeath);
} else {
otherPlayer = ds_list_find_value(global.players, otherPlayerID);
if (assistantPlayerID == 255) {
doEventDestruction(player, otherPlayer, noone, causeOfDeath);
} else {
assistantPlayer = ds_list_find_value(global.players, assistantPlayerID);
doEventDestruction(player, otherPlayer, assistantPlayer, causeOfDeath);
}
}
break;
case GRAB_INTEL:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventGrabIntel(player);
break;
case SCORE_INTEL:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventScoreIntel(player);
break;
case DROP_INTEL:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventDropIntel(player);
break;
case RETURN_INTEL:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
doEventReturnIntel(read_ubyte(global.tempBuffer));
break;
case GENERATOR_DESTROY:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
team = read_ubyte(global.tempBuffer);
doEventGeneratorDestroy(team);
break;
case UBER_CHARGED:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventUberReady(player);
break;
case UBER:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
doEventUber(player);
break;
case OMNOMNOMNOM:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if(player.object != -1) {
with(player.object) {
omnomnomnom=true;
if(hp < 200)
{
canEat = false;
alarm[6] = eatCooldown; //10 second cooldown
}
if(player.team == TEAM_RED) {
omnomnomnomindex=0;
omnomnomnomend=31;
} else if(player.team==TEAM_BLUE) {
omnomnomnomindex=32;
omnomnomnomend=63;
}
xscale=image_xscale;
}
}
break;
case TOGGLE_ZOOM:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if player.object != -1 {
toggleZoom(player.object);
}
break;
case PASSWORD_REQUEST:
if(!usePreviousPwd)
global.clientPassword = get_string("Enter Password:", "");
write_ubyte(global.serverSocket, string_length(global.clientPassword));
write_string(global.serverSocket, global.clientPassword);
socket_send(global.serverSocket);
break;
case PASSWORD_WRONG:
show_message("Incorrect Password.");
instance_destroy();
exit;
case INCOMPATIBLE_PROTOCOL:
show_message("Incompatible server protocol version.");
instance_destroy();
exit;
case KICK:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
reason = read_ubyte(global.tempBuffer);
if reason == KICK_NAME kickReason = "Name Exploit";
else if reason == KICK_BAD_PLUGIN_PACKET kickReason = "Invalid plugin packet ID";
else if reason == KICK_MULTI_CLIENT kickReason = "There are too many connections from your IP";
else kickReason = "";
show_message("You have been kicked from the server. "+kickReason+".");
instance_destroy();
exit;
case ARENA_STARTROUND:
doEventArenaStartRound();
break;
case ARENA_ENDROUND:
with ArenaHUD clientArenaEndRound();
break;
case ARENA_RESTART:
doEventArenaRestart();
break;
case UNLOCKCP:
doEventUnlockCP();
break;
case MAP_END:
global.nextMap=receivestring(global.serverSocket, 1);
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
global.winners=read_ubyte(global.tempBuffer);
global.currentMapArea=read_ubyte(global.tempBuffer);
global.mapchanging = true;
if !instance_exists(ScoreTableController) instance_create(0,0,ScoreTableController);
instance_create(0,0,WinBanner);
break;
case CHANGE_MAP:
roomchange=true;
global.mapchanging = false;
global.currentMap = receivestring(global.serverSocket, 1);
global.currentMapMD5 = receivestring(global.serverSocket, 1);
if(global.currentMapMD5 == "") { // if this is an internal map (signified by the lack of an md5)
if(findInternalMapRoom(global.currentMap))
room_goto_fix(findInternalMapRoom(global.currentMap));
else
{
show_message("Error:#Server went to invalid internal map: " + global.currentMap + "#Exiting.");
instance_destroy();
exit;
}
} else { // it's an external map
if(string_pos("/", global.currentMap) != 0 or string_pos("\", global.currentMap) != 0)
{
show_message("Server sent illegal map name: "+global.currentMap);
instance_destroy();
exit;
}
if(!file_exists("Maps/" + global.currentMap + ".png") or CustomMapGetMapMD5(global.currentMap) != global.currentMapMD5)
{ // Reconnect to the server to download the map
var oldReturnRoom;
oldReturnRoom = returnRoom;
returnRoom = DownloadRoom;
if (global.serverPluginsInUse)
noUnloadPlugins = true;
event_perform(ev_destroy,0);
ClientCreate();
if (global.serverPluginsInUse)
noReloadPlugins = true;
returnRoom = oldReturnRoom;
usePreviousPwd = true;
exit;
}
room_goto_fix(CustomMapRoom);
}
for(i=0; i<ds_list_size(global.players); i+=1) {
player = ds_list_find_value(global.players, i);
if global.currentMapArea == 1 {
player.stats[KILLS] = 0;
player.stats[DEATHS] = 0;
player.stats[CAPS] = 0;
player.stats[ASSISTS] = 0;
player.stats[DESTRUCTION] = 0;
player.stats[STABS] = 0;
player.stats[HEALING] = 0;
player.stats[DEFENSES] = 0;
player.stats[INVULNS] = 0;
player.stats[BONUS] = 0;
player.stats[DOMINATIONS] = 0;
player.stats[REVENGE] = 0;
player.stats[POINTS] = 0;
player.roundStats[KILLS] = 0;
player.roundStats[DEATHS] = 0;
player.roundStats[CAPS] = 0;
player.roundStats[ASSISTS] = 0;
player.roundStats[DESTRUCTION] = 0;
player.roundStats[STABS] = 0;
player.roundStats[HEALING] = 0;
player.roundStats[DEFENSES] = 0;
player.roundStats[INVULNS] = 0;
player.roundStats[BONUS] = 0;
player.roundStats[DOMINATIONS] = 0;
player.roundStats[REVENGE] = 0;
player.roundStats[POINTS] = 0;
player.team = TEAM_SPECTATOR;
}
}
break;
case SERVER_FULL:
show_message("The server is full.");
instance_destroy();
exit;
case REWARD_CHALLENGE_CODE:
var challengeData;
receiveCompleteMessage(global.serverSocket,16,global.tempBuffer);
challengeData = read_binstring(global.tempBuffer, buffer_size(global.tempBuffer));
challengeData += socket_remote_ip(global.serverSocket);
write_ubyte(global.serverSocket, REWARD_CHALLENGE_RESPONSE);
write_binstring(global.serverSocket, hmac_md5_bin(global.rewardKey, challengeData));
socket_send(global.serverSocket);
break;
case REWARD_UPDATE:
receiveCompleteMessage(global.serverSocket,1,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
var rewardString;
rewardString = receivestring(global.serverSocket, 2);
doEventUpdateRewards(player, rewardString);
break;
case MESSAGE_STRING:
var message, notice;
message = receivestring(global.serverSocket, 1);
with NoticeO instance_destroy();
notice = instance_create(0, 0, NoticeO);
notice.notice = NOTICE_CUSTOM;
notice.message = message;
break;
case SENTRY_POSITION:
receiveCompleteMessage(global.serverSocket,5,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if(player.sentry)
{
player.sentry.x = read_ushort(global.tempBuffer) / 5;
player.sentry.y = read_ushort(global.tempBuffer) / 5;
player.sentry.xprevious = player.sentry.x;
player.sentry.yprevious = player.sentry.y;
player.sentry.vspeed = 0;
}
break;
case WEAPON_FIRE:
receiveCompleteMessage(global.serverSocket,9,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
if(player.object)
{
with(player.object)
{
x = read_ushort(global.tempBuffer)/5;
y = read_ushort(global.tempBuffer)/5;
hspeed = read_byte(global.tempBuffer)/8.5;
vspeed = read_byte(global.tempBuffer)/8.5;
xprevious = x;
yprevious = y;
}
doEventFireWeapon(player, read_ushort(global.tempBuffer));
}
break;
case PLUGIN_PACKET:
var packetID, packetLen, buf, success;
// fetch full packet
receiveCompleteMessage(global.serverSocket, 2, global.tempBuffer);
packetLen = read_ushort(global.tempBuffer);
receiveCompleteMessage(global.serverSocket, packetLen, global.tempBuffer);
packetID = read_ubyte(global.tempBuffer);
// get packet data
buf = buffer_create();
write_buffer_part(buf, global.tempBuffer, packetLen - 1);
// try to enqueue
// give "noone" value for client since received from server
success = _PluginPacketPush(packetID, buf, noone);
// if it returned false, packetID was invalid
if (!success)
{
// clear up buffer
buffer_destroy(buf);
show_error("ERROR when reading plugin packet: no such plugin packet ID " + string(packetID), true);
}
break;
case CLIENT_SETTINGS:
receiveCompleteMessage(global.serverSocket,2,global.tempBuffer);
player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer));
player.queueJump = read_ubyte(global.tempBuffer);
break;
default:
promptRestartOrQuit("The Server sent unexpected data.");
exit;
}
} else {
break;
}
} until(roomchange);

View File

@@ -0,0 +1,141 @@
/*
Originally from /Source/gg2/Objects/Updater.events/Create.xml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
// Downloading code.
var downloadHandle, url, tmpfile, window_oldshowborder, window_oldfullscreen;
timeLeft = 0;
counter = 0;
AudioControlPlaySong(-1, false);
window_oldshowborder = window_get_showborder();
window_oldfullscreen = window_get_fullscreen();
window_set_fullscreen(false);
window_set_showborder(false);
if(global.updaterBetaChannel)
url = UPDATE_SOURCE_BETA;
else
url = UPDATE_SOURCE;
tmpfile = temp_directory + "\gg2update.zip";
downloadHandle = httpGet(url, -1);
while(!httpRequestStatus(downloadHandle))
{ // while download isn't finished
sleep(floor(1000/30)); // sleep for the equivalent of one frame
io_handle(); // this prevents GameMaker from appearing locked-up
httpRequestStep(downloadHandle);
// check if the user cancelled the download with the esc key
if(keyboard_check(vk_escape))
{
httpRequestDestroy(downloadHandle);
window_set_showborder(window_oldshowborder);
window_set_fullscreen(window_oldfullscreen);
room_goto_fix(Menu);
exit;
}
if(counter == 0 || counter mod 60 == 0)
timer = random(359)+1;
draw_sprite(UpdaterBackgroundS,0,0,0);
draw_set_color(c_white);
draw_set_halign(fa_left);
draw_set_valign(fa_center);
minutes=floor(timer/60);
seconds=floor(timer-minutes*60);
draw_text(x,y-20,string(minutes) + " minutes " + string(seconds) + " seconds Remaining...");
counter+=1;
var progress, size;
progress = httpRequestResponseBodyProgress(downloadHandle);
size = httpRequestResponseBodySize(downloadHandle);
if (size != -1)
{
progressBar = floor((progress/size) * 20);
offset = 3;
for(i=0;i<progressBar;i+=1){
draw_sprite(UpdaterProgressS,0,x+offset,y);
offset+=12;
}
}
screen_refresh();
}
// Errored
if (httpRequestStatus(downloadHandle) == 2)
{
show_message("Downloading update failed!#" + httpRequestError(downloadHandle));
httpRequestDestroy(downloadHandle);
window_set_showborder(window_oldshowborder);
window_set_fullscreen(window_oldfullscreen);
room_goto_fix(Menu);
exit;
}
// Request failed
if (httpRequestStatusCode(downloadHandle) != 200)
{
show_message("Downloading update failed!#" + string(httpRequestStatusCode(downloadHandle)) + " " + httpRequestReasonPhrase(downloadHandle));
httpRequestDestroy(downloadHandle);
window_set_showborder(window_oldshowborder);
window_set_fullscreen(window_oldfullscreen);
room_goto_fix(Menu);
exit;
}
write_buffer_to_file(httpRequestResponseBody(downloadHandle), tmpfile);
httpRequestDestroy(downloadHandle);
if(!file_exists(tmpfile))
{
window_set_showborder(window_oldshowborder);
window_set_fullscreen(window_oldfullscreen);
show_message("Error updating: Missing gg2update.zip in temp directory, download failed(?)");
room_goto_fix(Menu);
exit;
}
// rename existing "Gang Garrison 2.exe" to avoid conflict when extracting
if (file_exists("Gang Garrison 2.exe"))
{
var newName, n;
n = 1;
// increment until unused name found
do
{
newName = "gg2-old.delete.me." + string(n);
n += 1;
}
until(!file_exists(newName));
file_rename("Gang Garrison 2.exe", newName);
}
// let's extract the downloaded file now.
extractzip(tmpfile, working_directory);
// run new version
execute_program("Gang Garrison 2.exe", "", false);
// exit
game_end();

View File

@@ -0,0 +1,161 @@
/*
Originally from /Source/gg2/Objects/InGameElements/Character.events/Draw.xml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
xoffset = view_xview[0];
yoffset = view_yview[0];
xsize = view_wview[0];
ysize = view_hview[0];
if (distance_to_point(xoffset+xsize/2,yoffset+ysize/2) > 800)
exit;
var xr, yr;
xr = round(x);
yr = round(y);
image_alpha = cloakAlpha;
if (global.myself.team == team and canCloak)
image_alpha = cloakAlpha/2 + 0.5;
if (invisible)
exit;
if(stabbing)
image_alpha -= power(currentWeapon.stab.alpha, 2);
if team == global.myself.team && (player != global.myself || global.showHealthBar == 1){
draw_set_alpha(1);
draw_healthbar(xr-10, yr-30, xr+10, yr-25,hp*100/maxHp,c_black,c_red,c_green,0,true,true);
}
if(distance_to_point(mouse_x, mouse_y)<25) {
if cloak && team!=global.myself.team exit;
draw_set_alpha(1);
draw_set_halign(fa_center);
draw_set_valign(fa_bottom);
if(team==TEAM_RED) {
draw_set_color(c_red);
} else {
draw_set_color(c_blue);
}
draw_text(xr, yr-35, player.name);
if(team == global.myself.team && global.showTeammateStats)
{
if(weapons[0] == Medigun)
draw_text(xr,yr+50, "Superburst: " + string(currentWeapon.uberCharge/20) + "%");
else if(weapons[0] == Shotgun)
draw_text(xr,yr+50, "Nuts 'N' Bolts: " + string(nutsNBolts));
else if(weapons[0] == Minegun)
draw_text(xr,yr+50, "Lobbed Mines: " + string(currentWeapon.lobbed));
}
}
draw_set_alpha(1);
if team == TEAM_RED ubercolour = c_red;
if team == TEAM_BLUE ubercolour = c_blue;
var sprite, overlaySprite;
if zoomed
{
if (team == TEAM_RED)
sprite = SniperCrouchRedS;
else
sprite = SniperCrouchBlueS;
overlaySprite = sniperCrouchOverlay;
}
else
{
sprite = sprite_index;
overlaySprite = overlay;
}
if (omnomnomnom)
{
draw_sprite_ext_overlay(omnomnomnomSprite,omnomnomnomOverlay,omnomnomnomindex,xr,yr,image_xscale,image_yscale,image_angle,c_white,1);
if (ubered)
draw_sprite_ext_overlay(omnomnomnomSprite,omnomnomnomOverlay,omnomnomnomindex,xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7);
}
else if (taunting)
{
draw_sprite_ext_overlay(tauntsprite,tauntOverlay,tauntindex,xr,yr,image_xscale,image_yscale,image_angle,c_white,1);
if (ubered)
draw_sprite_ext_overlay(tauntsprite,tauntOverlay,tauntindex,xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7);
}
else if (player.humiliated)
draw_sprite_ext(humiliationPoses,floor(animationImage)+humiliationOffset,xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha);
else if (!taunting)
{
if (cloak)
{
if (!ubered)
draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha);
else if (ubered)
{
draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,1);
draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7);
}
}
else
{
if (!ubered)
draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha);
else if (ubered)
{
draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,1);
draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7);
}
}
}
if (burnDuration > 0 or burnIntensity > 0) {
for(i = 0; i < numFlames * burnIntensity / maxIntensity; i += 1)
{
draw_sprite_ext(FlameS, alarm[5] + i + random(2), x + flameArray_x[i], y + flameArray_y[i], 1, 1, 0, c_white, burnDuration / maxDuration * 0.71 + 0.35);
}
}
// Copied from Lorgan's itemserver "angels" with slight modifications
// All credit be upon him
if (demon != -1)
{
demonX = median(x-40,demonX,x+40);
demonY = median(y-40,demonY,y);
demonOffset += demonDir;
if (abs(demonOffset) > 15)
demonDir *= -1;
var dir;
if (demonX > x)
dir = -1;
else
dir = 1;
if (demonFrame > sprite_get_number(demon))
demonFrame = 0;
if (stabbing || ubered)
draw_sprite_ext(demon,demonFrame+floor(animationImage)+7*player.team,demonX,demonY+demonOffset,dir*1,1,0,c_white,1);
else
draw_sprite_ext(demon,demonFrame+floor(animationImage)+7*player.team,demonX,demonY+demonOffset,dir*1,1,0,c_white,image_alpha);
demonFrame += 1;
}

View File

@@ -0,0 +1,80 @@
// Originally from /spelunky/Scripts/Platform Engine/characterDrawEvent.gml in the Spelunky Community Update Project
/**********************************************************************************
Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
This file is part of Spelunky.
You can redistribute and/or modify Spelunky, including its source code, under
the terms of the Spelunky User License.
Spelunky is distributed in the hope that it will be entertaining and useful,
but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
The Spelunky User License should be available in "Game Information", which
can be found in the Resource Explorer, or as an external file called COPYING.
If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
***********************************************************************************/
/*
This event should be placed in the draw event of the platform character.
*/
//draws the sprite
draw = true;
if (facing == RIGHT) image_xscale = -1;
else image_xscale = 1;
if (blinkToggle != 1)
{
if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping)
{
draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
//draw_sprite(sprite_index,-1,x,y);
draw_sprite(sJetpackBack,-1,x,y);
draw = false;
}
else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1);
else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1);
if (draw)
{
if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha);
else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
}
if (facing == RIGHT)
{
if (holdArrow == ARROW_NORM)
{
draw_sprite(sArrowRight, -1, x+4, y+1);
}
else if (holdArrow == ARROW_BOMB)
{
if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2);
else draw_sprite(sBombArrowRight, 1, x+4, y+2);
}
}
else if (facing == LEFT)
{
if (holdArrow == ARROW_NORM)
{
draw_sprite(sArrowLeft, -1, x-4, y+1);
}
else if (holdArrow == ARROW_BOMB)
{
if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2);
else draw_sprite(sBombArrowLeft, 1, x-4, y+2);
}
}
}
/*
if canRun
{
xOffset=80
if player=1
yOffset=120
else
yOffset=143
//draw the "flySpeed" bar, which shows how much speed the character has acquired while holding the "run" button
//draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1)
}
*/

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,251 @@
/*
Originally from /Source/gg2/Scripts/Events/doEventPlayerDeath.gml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
/**
* Perform the "player death" event, i.e. change the appropriate scores,
* destroy the character object to much splattering and so on.
*
* argument0: The player whose character died
* argument1: The player who inflicted the fatal damage (or noone for unknown)
* argument2: The player who assisted the kill (or noone for no assist)
* argument3: The source of the fatal damage
*/
var victim, killer, assistant, damageSource;
victim = argument0;
killer = argument1;
assistant = argument2;
damageSource = argument3;
if(!instance_exists(killer))
killer = noone;
if(!instance_exists(assistant))
assistant = noone;
//*************************************
//* Scoring and Kill log
//*************************************
recordKillInLog(victim, killer, assistant, damageSource);
victim.stats[DEATHS] += 1;
if(killer)
{
if(damageSource == WEAPON_KNIFE || damageSource == WEAPON_BACKSTAB)
{
killer.stats[STABS] += 1;
killer.roundStats[STABS] += 1;
killer.stats[POINTS] += 1;
killer.roundStats[POINTS] +=1;
}
if (victim.object.currentWeapon.object_index == Medigun)
{
if (victim.object.currentWeapon.uberReady)
{
killer.stats[BONUS] += 1;
killer.roundStats[BONUS] += 1;
killer.stats[POINTS] += 1;
killer.roundStats[POINTS] += 1;
}
}
if (killer != victim)
{
killer.stats[KILLS] += 1;
killer.roundStats[KILLS] += 1;
killer.stats[POINTS] += 1;
killer.roundStats[POINTS] += 1;
if(victim.object.intel)
{
killer.stats[DEFENSES] += 1;
killer.roundStats[DEFENSES] += 1;
killer.stats[POINTS] += 1;
killer.roundStats[POINTS] += 1;
recordEventInLog(4, killer.team, killer.name, global.myself == killer);
}
}
}
if (assistant)
{
assistant.stats[ASSISTS] += 1;
assistant.roundStats[ASSISTS] += 1;
assistant.stats[POINTS] += .5;
assistant.roundStats[POINTS] += .5;
}
//SPEC
if (victim == global.myself)
instance_create(victim.object.x, victim.object.y, Spectator);
//*************************************
//* Gibbing
//*************************************
var xoffset, yoffset, xsize, ysize;
xoffset = view_xview[0];
yoffset = view_yview[0];
xsize = view_wview[0];
ysize = view_hview[0];
randomize();
with(victim.object) {
if((damageSource == WEAPON_ROCKETLAUNCHER
or damageSource == WEAPON_MINEGUN or damageSource == FRAG_BOX
or damageSource == WEAPON_REFLECTED_STICKY or damageSource == WEAPON_REFLECTED_ROCKET
or damageSource == FINISHED_OFF_GIB or damageSource == GENERATOR_EXPLOSION)
and (player.class != CLASS_QUOTE) and (global.gibLevel>1)
and distance_to_point(xoffset+xsize/2,yoffset+ysize/2) < 900) {
if (hasReward(victim, 'PumpkinGibs'))
{
repeat(global.gibLevel * 2) {
createGib(x,y,PumpkinGib,hspeed,vspeed,random(145)-72, choose(0,1,1,2,2,3), false, true)
}
}
else
{
repeat(global.gibLevel) {
createGib(x,y,Gib,hspeed,vspeed,random(145)-72, 0, false)
}
switch(player.team)
{
case TEAM_BLUE :
repeat(global.gibLevel - 1) {
createGib(x,y,BlueClump,hspeed,vspeed,random(145)-72, 0, false)
}
break;
case TEAM_RED :
repeat(global.gibLevel - 1) {
createGib(x,y,RedClump,hspeed,vspeed,random(145)-72, 0, false)
}
break;
}
}
repeat(global.gibLevel * 14) {
var blood;
blood = instance_create(x+random(23)-11,y+random(23)-11,BloodDrop);
blood.hspeed=(random(21)-10);
blood.vspeed=(random(21)-13);
if (hasReward(victim, 'PumpkinGibs'))
{
blood.sprite_index = PumpkinJuiceS;
}
}
if (!hasReward(victim, 'PumpkinGibs'))
{
//All Classes gib head, hands, and feet
if(global.gibLevel > 2 || choose(0,1) == 1)
createGib(x,y,Headgib,0,0,random(105)-52, player.class, false);
repeat(global.gibLevel -1){
//Medic has specially colored hands
if (player.class == CLASS_MEDIC){
if (player.team == TEAM_RED)
createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , 9, false);
else
createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , 10, false);
}else{
createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , player.class, false);
}
createGib(x,y,Feet,random(5)-2,random(3),random(13)-6 , player.class, true);
}
}
//Class specific gibs
switch(player.class) {
case CLASS_PYRO :
if(global.gibLevel > 2 || choose(0,1) == 1)
createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 4, false)
break;
case CLASS_SOLDIER :
if(global.gibLevel > 2 || choose(0,1) == 1){
switch(player.team) {
case TEAM_BLUE :
createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 2, false);
break;
case TEAM_RED :
createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 1, false);
break;
}
}
break;
case CLASS_ENGINEER :
if(global.gibLevel > 2 || choose(0,1) == 1)
createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 3, false)
break;
case CLASS_SNIPER :
if(global.gibLevel > 2 || choose(0,1) == 1)
createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 0, false)
break;
}
playsound(x,y,Gibbing);
} else {
var deadbody;
if player.class != CLASS_QUOTE playsound(x,y,choose(DeathSnd1, DeathSnd2));
deadbody = instance_create(x,y-30,DeadGuy);
// 'GS' reward - *G*olden *S*tatue
if(hasReward(player, 'GS'))
{
deadbody.sprite_index = haxxyStatue;
deadbody.image_index = 0;
}
else
{
deadbody.sprite_index = sprite_index;
deadbody.image_index = CHARACTER_ANIMATION_DEAD;
}
deadbody.hspeed=hspeed;
deadbody.vspeed=vspeed;
if(hspeed>0) {
deadbody.image_xscale = -1;
}
}
}
if (global.gg_birthday){
myHat = instance_create(victim.object.x,victim.object.y,PartyHat);
myHat.image_index = victim.team;
}
if (global.xmas){
myHat = instance_create(victim.object.x,victim.object.y,XmasHat);
myHat.image_index = victim.team;
}
with(victim.object) {
instance_destroy();
}
//*************************************
//* Deathcam
//*************************************
if( global.killCam and victim == global.myself and killer and killer != victim and !(damageSource == KILL_BOX || damageSource == FRAG_BOX || damageSource == FINISHED_OFF || damageSource == FINISHED_OFF_GIB || damageSource == GENERATOR_EXPLOSION)) {
instance_create(0,0,DeathCam);
DeathCam.killedby=killer;
DeathCam.name=killer.name;
DeathCam.oldxview=view_xview[0];
DeathCam.oldyview=view_yview[0];
DeathCam.lastDamageSource=damageSource;
DeathCam.team = global.myself.team;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,484 @@
/*
Originally from /Source/gg2/Scripts/game_init.gml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
// Returns true if the game is successfully initialized, false if there was an error and we should quit.
{
instance_create(0,0,RoomChangeObserver);
set_little_endian_global(true);
if file_exists("game_errors.log") file_delete("game_errors.log");
if file_exists("last_plugin.log") file_delete("last_plugin.log");
// Delete old left-over files created by the updater
var backupFilename;
backupFilename = file_find_first("gg2-old.delete.me.*", 0);
while(backupFilename != "")
{
file_delete(backupFilename);
backupFilename = file_find_next();
}
file_find_close();
var customMapRotationFile, restart;
restart = false;
//import wav files for music
global.MenuMusic=sound_add(choose("Music/menumusic1.wav","Music/menumusic2.wav","Music/menumusic3.wav","Music/menumusic4.wav","Music/menumusic5.wav","Music/menumusic6.wav"), 1, true);
global.IngameMusic=sound_add("Music/ingamemusic.wav", 1, true);
global.FaucetMusic=sound_add("Music/faucetmusic.wav", 1, true);
if(global.MenuMusic != -1)
sound_volume(global.MenuMusic, 0.8);
if(global.IngameMusic != -1)
sound_volume(global.IngameMusic, 0.8);
if(global.FaucetMusic != -1)
sound_volume(global.FaucetMusic, 0.8);
global.sendBuffer = buffer_create();
global.tempBuffer = buffer_create();
global.HudCheck = false;
global.map_rotation = ds_list_create();
global.CustomMapCollisionSprite = -1;
window_set_region_scale(-1, false);
ini_open("gg2.ini");
global.playerName = ini_read_string("Settings", "PlayerName", "Player");
if string_count("#",global.playerName) > 0 global.playerName = "Player";
global.playerName = string_copy(global.playerName, 0, min(string_length(global.playerName), MAX_PLAYERNAME_LENGTH));
global.fullscreen = ini_read_real("Settings", "Fullscreen", 0);
global.useLobbyServer = ini_read_real("Settings", "UseLobby", 1);
global.hostingPort = ini_read_real("Settings", "HostingPort", 8190);
global.music = ini_read_real("Settings", "Music", ini_read_real("Settings", "IngameMusic", MUSIC_BOTH));
global.playerLimit = ini_read_real("Settings", "PlayerLimit", 10);
//thy playerlimit shalt not exceed 48!
if (global.playerLimit > 48)
{
if (global.dedicatedMode != 1)
show_message("Warning: Player Limit cannot exceed 48. It has been set to 48");
global.playerLimit = 48;
ini_write_real("Settings", "PlayerLimit", 48);
}
global.multiClientLimit = ini_read_real("Settings", "MultiClientLimit", 3);
global.particles = ini_read_real("Settings", "Particles", PARTICLES_NORMAL);
global.gibLevel = ini_read_real("Settings", "Gib Level", 3);
global.killCam = ini_read_real("Settings", "Kill Cam", 1);
global.monitorSync = ini_read_real("Settings", "Monitor Sync", 0);
if global.monitorSync == 1 set_synchronization(true);
else set_synchronization(false);
global.medicRadar = ini_read_real("Settings", "Healer Radar", 1);
global.showHealer = ini_read_real("Settings", "Show Healer", 1);
global.showHealing = ini_read_real("Settings", "Show Healing", 1);
global.showHealthBar = ini_read_real("Settings", "Show Healthbar", 0);
global.showTeammateStats = ini_read_real("Settings", "Show Extra Teammate Stats", 0);
global.serverPluginsPrompt = ini_read_real("Settings", "ServerPluginsPrompt", 1);
global.restartPrompt = ini_read_real("Settings", "RestartPrompt", 1);
//user HUD settings
global.timerPos=ini_read_real("Settings","Timer Position", 0)
global.killLogPos=ini_read_real("Settings","Kill Log Position", 0)
global.kothHudPos=ini_read_real("Settings","KoTH HUD Position", 0)
global.clientPassword = "";
// for admin menu
customMapRotationFile = ini_read_string("Server", "MapRotation", "");
global.shuffleRotation = ini_read_real("Server", "ShuffleRotation", 1);
global.timeLimitMins = max(1, min(255, ini_read_real("Server", "Time Limit", 15)));
global.serverPassword = ini_read_string("Server", "Password", "");
global.mapRotationFile = customMapRotationFile;
global.dedicatedMode = ini_read_real("Server", "Dedicated", 0);
global.serverName = ini_read_string("Server", "ServerName", "My Server");
global.welcomeMessage = ini_read_string("Server", "WelcomeMessage", "");
global.caplimit = max(1, min(255, ini_read_real("Server", "CapLimit", 5)));
global.caplimitBkup = global.caplimit;
global.autobalance = ini_read_real("Server", "AutoBalance",1);
global.Server_RespawntimeSec = ini_read_real("Server", "Respawn Time", 5);
global.rewardKey = unhex(ini_read_string("Haxxy", "RewardKey", ""));
global.rewardId = ini_read_string("Haxxy", "RewardId", "");
global.mapdownloadLimitBps = ini_read_real("Server", "Total bandwidth limit for map downloads in bytes per second", 50000);
global.updaterBetaChannel = ini_read_real("General", "UpdaterBetaChannel", isBetaVersion());
global.attemptPortForward = ini_read_real("Server", "Attempt UPnP Forwarding", 0);
global.serverPluginList = ini_read_string("Server", "ServerPluginList", "");
global.serverPluginsRequired = ini_read_real("Server", "ServerPluginsRequired", 0);
if (string_length(global.serverPluginList) > 254) {
show_message("Error: Server plugin list cannot exceed 254 characters");
return false;
}
var CrosshairFilename, CrosshairRemoveBG;
CrosshairFilename = ini_read_string("Settings", "CrosshairFilename", "");
CrosshairRemoveBG = ini_read_real("Settings", "CrosshairRemoveBG", 1);
global.queueJumping = ini_read_real("Settings", "Queued Jumping", 0);
global.backgroundHash = ini_read_string("Background", "BackgroundHash", "default");
global.backgroundTitle = ini_read_string("Background", "BackgroundTitle", "");
global.backgroundURL = ini_read_string("Background", "BackgroundURL", "");
global.backgroundShowVersion = ini_read_real("Background", "BackgroundShowVersion", true);
readClasslimitsFromIni();
global.currentMapArea=1;
global.totalMapAreas=1;
global.setupTimer=1800;
global.joinedServerName="";
global.serverPluginsInUse=false;
// Create plugin packet maps
global.pluginPacketBuffers = ds_map_create();
global.pluginPacketPlayers = ds_map_create();
ini_write_string("Settings", "PlayerName", global.playerName);
ini_write_real("Settings", "Fullscreen", global.fullscreen);
ini_write_real("Settings", "UseLobby", global.useLobbyServer);
ini_write_real("Settings", "HostingPort", global.hostingPort);
ini_key_delete("Settings", "IngameMusic");
ini_write_real("Settings", "Music", global.music);
ini_write_real("Settings", "PlayerLimit", global.playerLimit);
ini_write_real("Settings", "MultiClientLimit", global.multiClientLimit);
ini_write_real("Settings", "Particles", global.particles);
ini_write_real("Settings", "Gib Level", global.gibLevel);
ini_write_real("Settings", "Kill Cam", global.killCam);
ini_write_real("Settings", "Monitor Sync", global.monitorSync);
ini_write_real("Settings", "Healer Radar", global.medicRadar);
ini_write_real("Settings", "Show Healer", global.showHealer);
ini_write_real("Settings", "Show Healing", global.showHealing);
ini_write_real("Settings", "Show Healthbar", global.showHealthBar);
ini_write_real("Settings", "Show Extra Teammate Stats", global.showTeammateStats);
ini_write_real("Settings", "Timer Position", global.timerPos);
ini_write_real("Settings", "Kill Log Position", global.killLogPos);
ini_write_real("Settings", "KoTH HUD Position", global.kothHudPos);
ini_write_real("Settings", "ServerPluginsPrompt", global.serverPluginsPrompt);
ini_write_real("Settings", "RestartPrompt", global.restartPrompt);
ini_write_string("Server", "MapRotation", customMapRotationFile);
ini_write_real("Server", "ShuffleRotation", global.shuffleRotation);
ini_write_real("Server", "Dedicated", global.dedicatedMode);
ini_write_string("Server", "ServerName", global.serverName);
ini_write_string("Server", "WelcomeMessage", global.welcomeMessage);
ini_write_real("Server", "CapLimit", global.caplimit);
ini_write_real("Server", "AutoBalance", global.autobalance);
ini_write_real("Server", "Respawn Time", global.Server_RespawntimeSec);
ini_write_real("Server", "Total bandwidth limit for map downloads in bytes per second", global.mapdownloadLimitBps);
ini_write_real("Server", "Time Limit", global.timeLimitMins);
ini_write_string("Server", "Password", global.serverPassword);
ini_write_real("General", "UpdaterBetaChannel", global.updaterBetaChannel);
ini_write_real("Server", "Attempt UPnP Forwarding", global.attemptPortForward);
ini_write_string("Server", "ServerPluginList", global.serverPluginList);
ini_write_real("Server", "ServerPluginsRequired", global.serverPluginsRequired);
ini_write_string("Settings", "CrosshairFilename", CrosshairFilename);
ini_write_real("Settings", "CrosshairRemoveBG", CrosshairRemoveBG);
ini_write_real("Settings", "Queued Jumping", global.queueJumping);
ini_write_string("Background", "BackgroundHash", global.backgroundHash);
ini_write_string("Background", "BackgroundTitle", global.backgroundTitle);
ini_write_string("Background", "BackgroundURL", global.backgroundURL);
ini_write_real("Background", "BackgroundShowVersion", global.backgroundShowVersion);
ini_write_real("Classlimits", "Scout", global.classlimits[CLASS_SCOUT])
ini_write_real("Classlimits", "Pyro", global.classlimits[CLASS_PYRO])
ini_write_real("Classlimits", "Soldier", global.classlimits[CLASS_SOLDIER])
ini_write_real("Classlimits", "Heavy", global.classlimits[CLASS_HEAVY])
ini_write_real("Classlimits", "Demoman", global.classlimits[CLASS_DEMOMAN])
ini_write_real("Classlimits", "Medic", global.classlimits[CLASS_MEDIC])
ini_write_real("Classlimits", "Engineer", global.classlimits[CLASS_ENGINEER])
ini_write_real("Classlimits", "Spy", global.classlimits[CLASS_SPY])
ini_write_real("Classlimits", "Sniper", global.classlimits[CLASS_SNIPER])
ini_write_real("Classlimits", "Quote", global.classlimits[CLASS_QUOTE])
//screw the 0 index we will start with 1
//map_truefort
maps[1] = ini_read_real("Maps", "ctf_truefort", 1);
//map_2dfort
maps[2] = ini_read_real("Maps", "ctf_2dfort", 2);
//map_conflict
maps[3] = ini_read_real("Maps", "ctf_conflict", 3);
//map_classicwell
maps[4] = ini_read_real("Maps", "ctf_classicwell", 4);
//map_waterway
maps[5] = ini_read_real("Maps", "ctf_waterway", 5);
//map_orange
maps[6] = ini_read_real("Maps", "ctf_orange", 6);
//map_dirtbowl
maps[7] = ini_read_real("Maps", "cp_dirtbowl", 7);
//map_egypt
maps[8] = ini_read_real("Maps", "cp_egypt", 8);
//arena_montane
maps[9] = ini_read_real("Maps", "arena_montane", 9);
//arena_lumberyard
maps[10] = ini_read_real("Maps", "arena_lumberyard", 10);
//gen_destroy
maps[11] = ini_read_real("Maps", "gen_destroy", 11);
//koth_valley
maps[12] = ini_read_real("Maps", "koth_valley", 12);
//koth_corinth
maps[13] = ini_read_real("Maps", "koth_corinth", 13);
//koth_harvest
maps[14] = ini_read_real("Maps", "koth_harvest", 14);
//dkoth_atalia
maps[15] = ini_read_real("Maps", "dkoth_atalia", 15);
//dkoth_sixties
maps[16] = ini_read_real("Maps", "dkoth_sixties", 16);
//Server respawn time calculator. Converts each second to a frame. (read: multiply by 30 :hehe:)
if (global.Server_RespawntimeSec == 0)
{
global.Server_Respawntime = 1;
}
else
{
global.Server_Respawntime = global.Server_RespawntimeSec * 30;
}
// I have to include this, or the client'll complain about an unknown variable.
global.mapchanging = false;
ini_write_real("Maps", "ctf_truefort", maps[1]);
ini_write_real("Maps", "ctf_2dfort", maps[2]);
ini_write_real("Maps", "ctf_conflict", maps[3]);
ini_write_real("Maps", "ctf_classicwell", maps[4]);
ini_write_real("Maps", "ctf_waterway", maps[5]);
ini_write_real("Maps", "ctf_orange", maps[6]);
ini_write_real("Maps", "cp_dirtbowl", maps[7]);
ini_write_real("Maps", "cp_egypt", maps[8]);
ini_write_real("Maps", "arena_montane", maps[9]);
ini_write_real("Maps", "arena_lumberyard", maps[10]);
ini_write_real("Maps", "gen_destroy", maps[11]);
ini_write_real("Maps", "koth_valley", maps[12]);
ini_write_real("Maps", "koth_corinth", maps[13]);
ini_write_real("Maps", "koth_harvest", maps[14]);
ini_write_real("Maps", "dkoth_atalia", maps[15]);
ini_write_real("Maps", "dkoth_sixties", maps[16]);
ini_close();
// parse the protocol version UUID for later use
global.protocolUuid = buffer_create();
parseUuid(PROTOCOL_UUID, global.protocolUuid);
global.gg2lobbyId = buffer_create();
parseUuid(GG2_LOBBY_UUID, global.gg2lobbyId);
// Create abbreviations array for rewards use
initRewards()
var a, IPRaw, portRaw;
doubleCheck=0;
global.launchMap = "";
for(a = 1; a <= parameter_count(); a += 1)
{
if (parameter_string(a) == "-dedicated")
{
global.dedicatedMode = 1;
}
else if (parameter_string(a) == "-restart")
{
restart = true;
}
else if (parameter_string(a) == "-server")
{
IPRaw = parameter_string(a+1);
if (doubleCheck == 1)
{
doubleCheck = 2;
}
else
{
doubleCheck = 1;
}
}
else if (parameter_string(a) == "-port")
{
portRaw = parameter_string(a+1);
if (doubleCheck == 1)
{
doubleCheck = 2;
}
else
{
doubleCheck = 1;
}
}
else if (parameter_string(a) == "-map")
{
global.launchMap = parameter_string(a+1);
global.dedicatedMode = 1;
}
}
if (doubleCheck == 2)
{
global.serverPort = real(portRaw);
global.serverIP = IPRaw;
global.isHost = false;
instance_create(0,0,Client);
}
global.customMapdesginated = 0;
// if the user defined a valid map rotation file, then load from there
if(customMapRotationFile != "" && file_exists(customMapRotationFile) && global.launchMap == "") {
global.customMapdesginated = 1;
var fileHandle, i, mapname;
fileHandle = file_text_open_read(customMapRotationFile);
for(i = 1; !file_text_eof(fileHandle); i += 1) {
mapname = file_text_read_string(fileHandle);
// remove leading whitespace from the string
while(string_char_at(mapname, 0) == " " || string_char_at(mapname, 0) == chr(9)) { // while it starts with a space or tab
mapname = string_delete(mapname, 0, 1); // delete that space or tab
}
if(mapname != "" && string_char_at(mapname, 0) != "#") { // if it's not blank and it's not a comment (starting with #)
ds_list_add(global.map_rotation, mapname);
}
file_text_readln(fileHandle);
}
file_text_close(fileHandle);
}
else if (global.launchMap != "") && (global.dedicatedMode == 1)
{
ds_list_add(global.map_rotation, global.launchMap);
}
else { // else load from the ini file Maps section
//Set up the map rotation stuff
var i, sort_list;
sort_list = ds_list_create();
for(i=1; i <= 16; i += 1) {
if(maps[i] != 0) ds_list_add(sort_list, ((100*maps[i])+i));
}
ds_list_sort(sort_list, 1);
// translate the numbers back into the names they represent
for(i=0; i < ds_list_size(sort_list); i += 1) {
switch(ds_list_find_value(sort_list, i) mod 100) {
case 1:
ds_list_add(global.map_rotation, "ctf_truefort");
break;
case 2:
ds_list_add(global.map_rotation, "ctf_2dfort");
break;
case 3:
ds_list_add(global.map_rotation, "ctf_conflict");
break;
case 4:
ds_list_add(global.map_rotation, "ctf_classicwell");
break;
case 5:
ds_list_add(global.map_rotation, "ctf_waterway");
break;
case 6:
ds_list_add(global.map_rotation, "ctf_orange");
break;
case 7:
ds_list_add(global.map_rotation, "cp_dirtbowl");
break;
case 8:
ds_list_add(global.map_rotation, "cp_egypt");
break;
case 9:
ds_list_add(global.map_rotation, "arena_montane");
break;
case 10:
ds_list_add(global.map_rotation, "arena_lumberyard");
break;
case 11:
ds_list_add(global.map_rotation, "gen_destroy");
break;
case 12:
ds_list_add(global.map_rotation, "koth_valley");
break;
case 13:
ds_list_add(global.map_rotation, "koth_corinth");
break;
case 14:
ds_list_add(global.map_rotation, "koth_harvest");
break;
case 15:
ds_list_add(global.map_rotation, "dkoth_atalia");
break;
case 16:
ds_list_add(global.map_rotation, "dkoth_sixties");
break;
}
}
ds_list_destroy(sort_list);
}
window_set_fullscreen(global.fullscreen);
global.gg2Font = font_add_sprite(gg2FontS,ord("!"),false,0);
global.countFont = font_add_sprite(countFontS, ord("0"),false,2);
draw_set_font(global.gg2Font);
cursor_sprite = CrosshairS;
if(!directory_exists(working_directory + "\Maps")) directory_create(working_directory + "\Maps");
instance_create(0, 0, AudioControl);
instance_create(0, 0, SSControl);
// custom dialog box graphics
message_background(popupBackgroundB);
message_button(popupButtonS);
message_text_font("Century",9,c_white,1);
message_button_font("Century",9,c_white,1);
message_input_font("Century",9,c_white,0);
//Key Mapping
ini_open("controls.gg2");
global.jump = ini_read_real("Controls", "jump", ord("W"));
global.down = ini_read_real("Controls", "down", ord("S"));
global.left = ini_read_real("Controls", "left", ord("A"));
global.right = ini_read_real("Controls", "right", ord("D"));
global.attack = ini_read_real("Controls", "attack", MOUSE_LEFT);
global.special = ini_read_real("Controls", "special", MOUSE_RIGHT);
global.taunt = ini_read_real("Controls", "taunt", ord("F"));
global.chat1 = ini_read_real("Controls", "chat1", ord("Z"));
global.chat2 = ini_read_real("Controls", "chat2", ord("X"));
global.chat3 = ini_read_real("Controls", "chat3", ord("C"));
global.medic = ini_read_real("Controls", "medic", ord("E"));
global.drop = ini_read_real("Controls", "drop", ord("B"));
global.changeTeam = ini_read_real("Controls", "changeTeam", ord("N"));
global.changeClass = ini_read_real("Controls", "changeClass", ord("M"));
global.showScores = ini_read_real("Controls", "showScores", vk_shift);
ini_close();
calculateMonthAndDay();
if(!directory_exists(working_directory + "\Plugins")) directory_create(working_directory + "\Plugins");
loadplugins();
/* Windows 8 is known to crash GM when more than three (?) sounds play at once
* We'll store the kernel version (Win8 is 6.2, Win7 is 6.1) and check it there.
***/
registry_set_root(1); // HKLM
global.NTKernelVersion = real(registry_read_string_ext("\SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "CurrentVersion")); // SIC
if (file_exists(CrosshairFilename))
{
sprite_replace(CrosshairS,CrosshairFilename,1,CrosshairRemoveBG,false,0,0);
sprite_set_offset(CrosshairS,sprite_get_width(CrosshairS)/2,sprite_get_height(CrosshairS)/2);
}
if(global.dedicatedMode == 1) {
AudioControlToggleMute();
room_goto_fix(Menu);
} else if(restart) {
room_goto_fix(Menu);
}
return true;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,252 @@
/*
Originally from /Source/gg2/Scripts/Plugins/loadserverplugins.gml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
// loads plugins from ganggarrison.com asked for by server
// argument0 - comma separated plugin list (pluginname@md5hash)
// returns true on success, false on failure
var list, hashList, text, i, pluginname, pluginhash, realhash, url, handle, filesize, progress, tempfile, tempdir, failed, lastContact, isCached;
failed = false;
list = ds_list_create();
lastContact = 0;
isCached = false;
isDebug = false;
hashList = ds_list_create();
// split plugin list string
list = split(argument0, ',');
// Split hashes from plugin names
for (i = 0; i < ds_list_size(list); i += 1)
{
text = ds_list_find_value(list, i);
pluginname = string_copy(text, 0, string_pos("@", text) - 1);
pluginhash = string_copy(text, string_pos("@", text) + 1, string_length(text) - string_pos("@", text));
ds_list_replace(list, i, pluginname);
ds_list_add(hashList, pluginhash);
}
// Check plugin names and check for duplicates
for (i = 0; i < ds_list_size(list); i += 1)
{
pluginname = ds_list_find_value(list, i);
// invalid plugin name
if (!checkpluginname(pluginname))
{
show_message('Error loading server-sent plugins - invalid plugin name:#"' + pluginname + '"');
return false;
}
// is duplicate
else if (ds_list_find_index(list, pluginname) != i)
{
show_message('Error loading server-sent plugins - duplicate plugin:#"' + pluginname + '"');
return false;
}
}
// Download plugins
for (i = 0; i < ds_list_size(list); i += 1)
{
pluginname = ds_list_find_value(list, i);
pluginhash = ds_list_find_value(hashList, i);
isDebug = file_exists(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip");
isCached = file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
tempfile = temp_directory + "\" + pluginname + ".zip.tmp";
tempdir = temp_directory + "\" + pluginname + ".tmp";
// check to see if we have a local copy for debugging
if (isDebug)
{
file_copy(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip", tempfile);
// show warning
if (global.isHost)
{
show_message(
"Warning: server-sent plugin '"
+ pluginname
+ "' is being loaded from ServerPluginsDebug. Make sure clients have the same version, else they may be unable to connect."
);
}
else
{
show_message(
"Warning: server-sent plugin '"
+ pluginname
+ "' is being loaded from ServerPluginsDebug. Make sure the server has the same version, else you may be unable to connect."
);
}
}
// otherwise, check if we have it cached
else if (isCached)
{
file_copy(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash, tempfile);
}
// otherwise, download as usual
else
{
// construct the URL
// http://www.ganggarrison.com/plugins/$PLUGINNAME$@$PLUGINHASH$.zip)
url = PLUGIN_SOURCE + pluginname + "@" + pluginhash + ".zip";
// let's make the download handle
handle = httpGet(url, -1);
// download it
while (!httpRequestStatus(handle)) {
// prevent game locking up
io_handle();
httpRequestStep(handle);
if (!global.isHost) {
// send ping if we haven't contacted server in 20 seconds
// we need to do this to keep the connection open
if (current_time-lastContact > 20000) {
write_byte(global.serverSocket, PING);
socket_send(global.serverSocket);
lastContact = current_time;
}
}
// draw progress bar since they may be waiting a while
filesize = httpRequestResponseBodySize(handle);
progress = httpRequestResponseBodyProgress(handle);
draw_background_ext(background_index[0], 0, 0, background_xscale[0], background_yscale[0], 0, c_white, 1);
draw_set_color(c_white);
draw_set_alpha(1);
draw_set_halign(fa_left);
draw_rectangle(50, 550, 300, 560, 2);
draw_text(50, 530, "Downloading server-sent plugin " + string(i + 1) + "/" + string(ds_list_size(list)) + ' - "' + pluginname + '"');
if (filesize != -1)
draw_rectangle(50, 550, 50 + progress / filesize * 250, 560, 0);
screen_refresh();
}
// errored
if (httpRequestStatus(handle) == 2)
{
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + httpRequestError(handle));
failed = true;
break;
}
// request failed
if (httpRequestStatusCode(handle) != 200)
{
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + string(httpRequestStatusCode(handle)) + ' ' + httpRequestReasonPhrase(handle));
failed = true;
break;
}
else
{
write_buffer_to_file(httpRequestResponseBody(handle), tempfile);
if (!file_exists(tempfile))
{
show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":# No such file?');
failed = true;
break;
}
}
httpRequestDestroy(handle);
}
// check file integrity
realhash = GG2DLL_compute_MD5(tempfile);
if (realhash != pluginhash)
{
show_message('Error loading server-sent plugins - integrity check failed (MD5 hash mismatch) for:#"' + pluginname + '"');
failed = true;
break;
}
// don't try to cache debug plugins
if (!isDebug)
{
// add to cache if we don't already have it
if (!file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash))
{
// make sure directory exists
if (!directory_exists(working_directory + "\ServerPluginsCache"))
{
directory_create(working_directory + "\ServerPluginsCache");
}
// store in cache
file_copy(tempfile, working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash);
}
}
// let's get 7-zip to extract the files
extractzip(tempfile, tempdir);
// if the directory doesn't exist, extracting presumably failed
if (!directory_exists(tempdir))
{
show_message('Error loading server-sent plugins - extracting zip failed for:#"' + pluginname + '"');
failed = true;
break;
}
}
if (!failed)
{
// Execute plugins
for (i = 0; i < ds_list_size(list); i += 1)
{
pluginname = ds_list_find_value(list, i);
tempdir = temp_directory + "\" + pluginname + ".tmp";
// Debugging facility, so we know *which* plugin caused compile/execute error
fp = file_text_open_write(working_directory + "\last_plugin.log");
file_text_write_string(fp, pluginname);
file_text_close(fp);
// packetID is (i), so make queues for it
ds_map_add(global.pluginPacketBuffers, i, ds_queue_create());
ds_map_add(global.pluginPacketPlayers, i, ds_queue_create());
// Execute plugin
execute_file(
// the plugin's main gml file must be in the root of the zip
// it is called plugin.gml
tempdir + "\plugin.gml",
// the plugin needs to know where it is
// so the temporary directory is passed as first argument
tempdir,
// the plugin needs to know its packetID
// so it is passed as the second argument
i
);
}
}
// Delete last plugin log
file_delete(working_directory + "\last_plugin.log");
// Get rid of plugin list
ds_list_destroy(list);
// Get rid of plugin hash list
ds_list_destroy(hashList);
return !failed;

View File

@@ -0,0 +1,384 @@
/*
Originally from /Source/gg2/Scripts/GameServer/processClientCommands.gml in Gang Garrison 2
Copyright (C) 2008-2013 Faucet Software
http://www.ganggarrison.com
This program is free software;
you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
see <http://www.gnu.org/licenses>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,
the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries,
the licensors of this Program grant you additional permission to convey the resulting work.
*/
var player, playerId, commandLimitRemaining;
player = argument0;
playerId = argument1;
// To prevent players from flooding the server, limit the number of commands to process per step and player.
commandLimitRemaining = 10;
with(player) {
if(!variable_local_exists("commandReceiveState")) {
// 0: waiting for command byte.
// 1: waiting for command data length (1 byte)
// 2: waiting for command data.
commandReceiveState = 0;
commandReceiveExpectedBytes = 1;
commandReceiveCommand = 0;
}
}
while(commandLimitRemaining > 0) {
var socket;
socket = player.socket;
if(!tcp_receive(socket, player.commandReceiveExpectedBytes)) {
return 0;
}
switch(player.commandReceiveState)
{
case 0:
player.commandReceiveCommand = read_ubyte(socket);
switch(commandBytes[player.commandReceiveCommand]) {
case commandBytesInvalidCommand:
// Invalid byte received. Wait for another command byte.
break;
case commandBytesPrefixLength1:
player.commandReceiveState = 1;
player.commandReceiveExpectedBytes = 1;
break;
case commandBytesPrefixLength2:
player.commandReceiveState = 3;
player.commandReceiveExpectedBytes = 2;
break;
default:
player.commandReceiveState = 2;
player.commandReceiveExpectedBytes = commandBytes[player.commandReceiveCommand];
break;
}
break;
case 1:
player.commandReceiveState = 2;
player.commandReceiveExpectedBytes = read_ubyte(socket);
break;
case 3:
player.commandReceiveState = 2;
player.commandReceiveExpectedBytes = read_ushort(socket);
break;
case 2:
player.commandReceiveState = 0;
player.commandReceiveExpectedBytes = 1;
commandLimitRemaining -= 1;
switch(player.commandReceiveCommand)
{
case PLAYER_LEAVE:
socket_destroy(player.socket);
player.socket = -1;
break;
case PLAYER_CHANGECLASS:
var class;
class = read_ubyte(socket);
if(getCharacterObject(player.team, class) != -1)
{
if(player.object != -1)
{
with(player.object)
{
if (collision_point(x,y,SpawnRoom,0,0) < 0)
{
if (!instance_exists(lastDamageDealer) || lastDamageDealer == player)
{
sendEventPlayerDeath(player, player, noone, BID_FAREWELL);
doEventPlayerDeath(player, player, noone, BID_FAREWELL);
}
else
{
var assistant;
assistant = secondToLastDamageDealer;
if (lastDamageDealer.object)
if (lastDamageDealer.object.healer)
assistant = lastDamageDealer.object.healer;
sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
}
}
else
instance_destroy();
}
}
else if(player.alarm[5]<=0)
player.alarm[5] = 1;
class = checkClasslimits(player, player.team, class);
player.class = class;
ServerPlayerChangeclass(playerId, player.class, global.sendBuffer);
}
break;
case PLAYER_CHANGETEAM:
var newTeam, balance, redSuperiority;
newTeam = read_ubyte(socket);
redSuperiority = 0 //calculate which team is bigger
with(Player)
{
if(team == TEAM_RED)
redSuperiority += 1;
else if(team == TEAM_BLUE)
redSuperiority -= 1;
}
if(redSuperiority > 0)
balance = TEAM_RED;
else if(redSuperiority < 0)
balance = TEAM_BLUE;
else
balance = -1;
if(balance != newTeam)
{
if(getCharacterObject(newTeam, player.class) != -1 or newTeam==TEAM_SPECTATOR)
{
if(player.object != -1)
{
with(player.object)
{
if (!instance_exists(lastDamageDealer) || lastDamageDealer == player)
{
sendEventPlayerDeath(player, player, noone, BID_FAREWELL);
doEventPlayerDeath(player, player, noone, BID_FAREWELL);
}
else
{
var assistant;
assistant = secondToLastDamageDealer;
if (lastDamageDealer.object)
if (lastDamageDealer.object.healer)
assistant = lastDamageDealer.object.healer;
sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF);
}
}
player.alarm[5] = global.Server_Respawntime;
}
else if(player.alarm[5]<=0)
player.alarm[5] = 1;
var newClass;
newClass = checkClasslimits(player, newTeam, player.class);
if newClass != player.class
{
player.class = newClass;
ServerPlayerChangeclass(playerId, player.class, global.sendBuffer);
}
player.team = newTeam;
ServerPlayerChangeteam(playerId, player.team, global.sendBuffer);
ServerBalanceTeams();
}
}
break;
case CHAT_BUBBLE:
var bubbleImage;
bubbleImage = read_ubyte(socket);
if(global.aFirst) {
bubbleImage = 0;
}
write_ubyte(global.sendBuffer, CHAT_BUBBLE);
write_ubyte(global.sendBuffer, playerId);
write_ubyte(global.sendBuffer, bubbleImage);
setChatBubble(player, bubbleImage);
break;
case BUILD_SENTRY:
if(player.object != -1)
{
if(player.class == CLASS_ENGINEER
and collision_circle(player.object.x, player.object.y, 50, Sentry, false, true) < 0
and player.object.nutsNBolts == 100
and (collision_point(player.object.x,player.object.y,SpawnRoom,0,0) < 0)
and !player.sentry
and !player.object.onCabinet)
{
write_ubyte(global.sendBuffer, BUILD_SENTRY);
write_ubyte(global.sendBuffer, playerId);
write_ushort(global.serializeBuffer, round(player.object.x*5));
write_ushort(global.serializeBuffer, round(player.object.y*5));
write_byte(global.serializeBuffer, player.object.image_xscale);
buildSentry(player, player.object.x, player.object.y, player.object.image_xscale);
}
}
break;
case DESTROY_SENTRY:
with(player.sentry)
instance_destroy();
break;
case DROP_INTEL:
if (player.object != -1)
{
if (player.object.intel)
{
sendEventDropIntel(player);
doEventDropIntel(player);
}
}
break;
case OMNOMNOMNOM:
if(player.object != -1) {
if(!player.humiliated
and !player.object.taunting
and !player.object.omnomnomnom
and player.object.canEat
and player.class==CLASS_HEAVY)
{
write_ubyte(global.sendBuffer, OMNOMNOMNOM);
write_ubyte(global.sendBuffer, playerId);
with(player.object)
{
omnomnomnom = true;
if player.team == TEAM_RED {
omnomnomnomindex=0;
omnomnomnomend=31;
} else if player.team==TEAM_BLUE {
omnomnomnomindex=32;
omnomnomnomend=63;
}
xscale=image_xscale;
}
}
}
break;
case TOGGLE_ZOOM:
if player.object != -1 {
if player.class == CLASS_SNIPER {
write_ubyte(global.sendBuffer, TOGGLE_ZOOM);
write_ubyte(global.sendBuffer, playerId);
toggleZoom(player.object);
}
}
break;
case PLAYER_CHANGENAME:
var nameLength;
nameLength = socket_receivebuffer_size(socket);
if(nameLength > MAX_PLAYERNAME_LENGTH)
{
write_ubyte(player.socket, KICK);
write_ubyte(player.socket, KICK_NAME);
socket_destroy(player.socket);
player.socket = -1;
}
else
{
with(player)
{
if(variable_local_exists("lastNamechange"))
if(current_time - lastNamechange < 1000)
break;
lastNamechange = current_time;
name = read_string(socket, nameLength);
if(string_count("#",name) > 0)
{
name = "I <3 Bacon";
}
write_ubyte(global.sendBuffer, PLAYER_CHANGENAME);
write_ubyte(global.sendBuffer, playerId);
write_ubyte(global.sendBuffer, string_length(name));
write_string(global.sendBuffer, name);
}
}
break;
case INPUTSTATE:
if(player.object != -1)
{
with(player.object)
{
keyState = read_ubyte(socket);
netAimDirection = read_ushort(socket);
aimDirection = netAimDirection*360/65536;
event_user(1);
}
}
break;
case REWARD_REQUEST:
player.rewardId = read_string(socket, socket_receivebuffer_size(socket));
player.challenge = rewardCreateChallenge();
write_ubyte(socket, REWARD_CHALLENGE_CODE);
write_binstring(socket, player.challenge);
break;
case REWARD_CHALLENGE_RESPONSE:
var answer, i, authbuffer;
answer = read_binstring(socket, 16);
with(player)
if(variable_local_exists("challenge") and variable_local_exists("rewardId"))
rewardAuthStart(player, answer, challenge, true, rewardId);
break;
case PLUGIN_PACKET:
var packetID, buf, success;
packetID = read_ubyte(socket);
// get packet data
buf = buffer_create();
write_buffer_part(buf, socket, socket_receivebuffer_size(socket));
// try to enqueue
success = _PluginPacketPush(packetID, buf, player);
// if it returned false, packetID was invalid
if (!success)
{
// clear up buffer
buffer_destroy(buf);
// kick player
write_ubyte(player.socket, KICK);
write_ubyte(player.socket, KICK_BAD_PLUGIN_PACKET);
socket_destroy(player.socket);
player.socket = -1;
}
break;
case CLIENT_SETTINGS:
var mirror;
mirror = read_ubyte(player.socket);
player.queueJump = mirror;
write_ubyte(global.sendBuffer, CLIENT_SETTINGS);
write_ubyte(global.sendBuffer, playerId);
write_ubyte(global.sendBuffer, mirror);
break;
}
break;
}
}

View File

@@ -0,0 +1,298 @@
// Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project
//
// scrInitLevel()
//
// Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level.
//
/**********************************************************************************
Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
This file is part of Spelunky.
You can redistribute and/or modify Spelunky, including its source code, under
the terms of the Spelunky User License.
Spelunky is distributed in the hope that it will be entertaining and useful,
but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
The Spelunky User License should be available in "Game Information", which
can be found in the Resource Explorer, or as an external file called COPYING.
If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
***********************************************************************************/
global.levelType = 0;
//global.currLevel = 16;
if (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1;
if (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2;
if (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3;
if (global.currLevel == 16) global.levelType = 4;
if (global.currLevel <= 1 or
global.currLevel == 5 or
global.currLevel == 9 or
global.currLevel == 13)
{
global.hadDarkLevel = false;
}
// global.levelType = 3; // debug
// DEBUG MODE //
/*
if (global.currLevel == 2) global.levelType = 4;
if (global.currLevel == 3) global.levelType = 2;
if (global.currLevel == 4) global.levelType = 3;
if (global.currLevel == 5) global.levelType = 4;
*/
// global.levelType = 0;
global.startRoomX = 0;
global.startRoomY = 0;
global.endRoomX = 0;
global.endRoomY = 0;
oGame.levelGen = false;
// this is used to determine the path to the exit (generally no bombs required)
for (i = 0; i < 4; i += 1)
{
for (j = 0; j < 4; j += 1)
{
global.roomPath[i,j] = 0;
}
}
// side walls
if (global.levelType == 4)
k = 54;
else if (global.levelType == 2)
k = 38;
else if (global.lake)
k = 41;
else
k = 33;
for (i = 0; i <= 42; i += 1)
{
for (j = 0; j <= k; j += 1)
{
if (not isLevel())
{
i = 999;
j = 999;
}
else if (global.levelType == 2)
{
if (i*16 == 0 or
i*16 == 656 or
j*16 == 0)
{
obj = instance_create(i*16, j*16, oDark);
obj.invincible = true;
obj.sprite_index = sDark;
}
}
else if (global.levelType == 4)
{
if (i*16 == 0 or
i*16 == 656 or
j*16 == 0)
{
obj = instance_create(i*16, j*16, oTemple);
obj.invincible = true;
if (not global.cityOfGold) obj.sprite_index = sTemple;
}
}
else if (global.lake)
{
if (i*16 == 0 or
i*16 == 656 or
j*16 == 0 or
j*16 >= 656)
{
obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush;
obj.invincible = true;
}
}
else if (i*16 == 0 or
i*16 == 656 or
j*16 == 0 or
j*16 >= 528)
{
if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; }
else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; }
else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; }
obj.invincible = true;
}
}
}
if (global.levelType == 2)
{
for (i = 0; i <= 42; i += 1)
{
instance_create(i*16, 40*16, oDark);
//instance_create(i*16, 35*16, oSpikes);
}
}
if (global.levelType == 3)
{
background_index = bgTemple;
}
global.temp1 = global.gameStart;
scrLevelGen();
global.cemetary = false;
if (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true;
with oRoom
{
if (global.levelType == 0) scrRoomGen();
else if (global.levelType == 1)
{
if (global.blackMarket) scrRoomGenMarket();
else scrRoomGen2();
}
else if (global.levelType == 2)
{
if (global.yetiLair) scrRoomGenYeti();
else scrRoomGen3();
}
else if (global.levelType == 3) scrRoomGen4();
else scrRoomGen5();
}
global.darkLevel = false;
//if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1)
if (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1)
{
global.darkLevel = true;
global.hadDarkLevel = true;
//instance_create(oPlayer1.x, oPlayer1.y, oFlare);
}
if (global.blackMarket) global.darkLevel = false;
global.genUdjatEye = false;
if (not global.madeUdjatEye)
{
if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true;
else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true;
else if (global.currLevel == 4) global.genUdjatEye = true;
}
global.genMarketEntrance = false;
if (not global.madeMarketEntrance)
{
if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true;
else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true;
else if (global.currLevel == 7) global.genMarketEntrance = true;
}
////////////////////////////
// ENTITY / TREASURES
////////////////////////////
global.temp2 = global.gameStart;
if (not isRoom("rTutorial") and not isRoom("rLoadLevel")) scrEntityGen();
if (instance_exists(oEntrance) and not global.customLevel)
{
oPlayer1.x = oEntrance.x+8;
oPlayer1.y = oEntrance.y+8;
}
if (global.darkLevel or
global.blackMarket or
global.snakePit or
global.cemetary or
global.lake or
global.yetiLair or
global.alienCraft or
global.sacrificePit or
global.cityOfGold)
{
if (not isRoom("rLoadLevel"))
{
with oPlayer1 { alarm[0] = 10; }
}
}
if (global.levelType == 4) scrSetupWalls(864);
else if (global.lake) scrSetupWalls(656);
else scrSetupWalls(528);
// add background details
if (global.graphicsHigh)
{
repeat(20)
{
// bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG);
if (global.levelType == 1 and rand(1,3) < 3)
tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
else if (global.levelType == 2 and rand(1,3) < 3)
tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
else if (global.levelType == 3 and rand(1,3) < 3)
tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
else
tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
}
}
oGame.levelGen = true;
// generate angry shopkeeper at exit if murderer or thief
if ((global.murderer or global.thiefLevel > 0) and isRealLevel())
{
with oExit
{
if (type == "Exit")
{
obj = instance_create(x, y, oShopkeeper);
obj.status = 4;
}
}
// global.thiefLevel -= 1;
}
with oTreasure
{
if (collision_point(x, y, oSolid, 0, 0))
{
obj = instance_place(x, y, oSolid);
if (obj.invincible) instance_destroy();
}
}
with oWater
{
if (sprite_index == sWaterTop or sprite_index == sLavaTop)
{
scrCheckWaterTop();
}
/*
obj = instance_place(x-16, y, oWater);
if (instance_exists(obj))
{
if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)
{
if (type == "Lava") sprite_index = sLavaTop;
else sprite_index = sWaterTop;
}
}
obj = instance_place(x+16, y, oWater);
if (instance_exists(obj))
{
if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)
{
if (type == "Lava") sprite_index = sLavaTop;
else sprite_index = sWaterTop;
}
}
*/
}
global.temp3 = global.gameStart;

View File

@@ -0,0 +1,22 @@
# set terminal pngcairo background "#ffffff" fontscale 1.0 dashed size 640, 480
# set output 'dashcolor.1.png'
set label 1 "set style line 1 lt 2 lc rgb \"red\" lw 3" at -0.4, -0.25, 0 left norotate back textcolor rgb "red" nopoint offset character 0, 0, 0
set label 2 "set style line 2 lt 2 lc rgb \"orange\" lw 2" at -0.4, -0.35, 0 left norotate back textcolor rgb "orange" nopoint offset character 0, 0, 0
set label 3 "set style line 3 lt 2 lc rgb \"yellow\" lw 3" at -0.4, -0.45, 0 left norotate back textcolor rgb "yellow" nopoint offset character 0, 0, 0
set label 4 "set style line 4 lt 2 lc rgb \"green\" lw 2" at -0.4, -0.55, 0 left norotate back textcolor rgb "green" nopoint offset character 0, 0, 0
set label 5 "plot ... lt 1 lc 3 " at -0.4, -0.65, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0
set label 6 "plot ... lt 3 lc 3 " at -0.4, -0.75, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0
set label 7 "plot ... lt 5 lc 3 " at -0.4, -0.85, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0
set style line 1 linetype 2 linecolor rgb "red" linewidth 3.000 pointtype 2 pointsize default pointinterval 0
set style line 2 linetype 2 linecolor rgb "orange" linewidth 2.000 pointtype 2 pointsize default pointinterval 0
set style line 3 linetype 2 linecolor rgb "yellow" linewidth 3.000 pointtype 2 pointsize default pointinterval 0
set style line 4 linetype 2 linecolor rgb "green" linewidth 2.000 pointtype 2 pointsize default pointinterval 0
set noxtics
set noytics
set title "Independent colors and dot/dash styles"
set xlabel "You will only see dashed lines if your current terminal setting permits it"
set xrange [ -0.500000 : 3.50000 ] noreverse nowriteback
set yrange [ -1.00000 : 1.40000 ] noreverse nowriteback
set bmargin 7
unset colorbox
plot cos(x) ls 1 title 'ls 1', cos(x-.2) ls 2 title 'ls 2', cos(x-.4) ls 3 title 'ls 3', cos(x-.6) ls 4 title 'ls 4', cos(x-.8) lt 1 lc 3 title 'lt 1 lc 3', cos(x-1.) lt 3 lc 3 title 'lt 3 lc 3', cos(x-1.2) lt 5 lc 3 title 'lt 5 lc 3'

View File

@@ -0,0 +1,15 @@
# set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350
# set output 'histograms.2.png'
set boxwidth 0.9 absolute
set style fill solid 1.00 border lt -1
set key inside right top vertical Right noreverse noenhanced autotitles nobox
set style histogram clustered gap 1 title offset character 0, 0, 0
set datafile missing '-'
set style data histograms
set xtics border in scale 0,0 nomirror rotate by -45 offset character 0, 0, 0 autojustify
set xtics norangelimit font ",8"
set xtics ()
set title "US immigration from Northern Europe\nPlot selected data columns as histogram of clustered boxes"
set yrange [ 0.00000 : 300000. ] noreverse nowriteback
i = 22
plot 'immigration.dat' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col

14
samples/Gnuplot/rates.gp Normal file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env gnuplot
reset
set terminal png
set output 'rates100.png'
set xlabel "A2A price"
set ylabel "Response Rate"
#set xr [0:5]
#set yr [0:6]
plot 'rates100.dat' pt 7 notitle

View File

@@ -0,0 +1,40 @@
# set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350
# set output 'surface1.16.png'
set dummy u,v
set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0
set label 2 "u=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0
set label 3 "u=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0
set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000
set arrow 2 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000
set arrow 3 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000
set parametric
set view 70, 20, 1, 1
set samples 51, 51
set isosamples 2, 33
set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover
set ztics -1.00000,0.25,1.00000 norangelimit
set title "\"fence plot\" using separate parametric surfaces"
set xlabel "X axis"
set xlabel offset character -3, -2, 0 font "" textcolor lt -1 norotate
set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback
set ylabel "Y axis"
set ylabel offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270
set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback
set zlabel "Z axis"
set zlabel offset character -5, 0, 0 font "" textcolor lt -1 norotate
set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback
sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)
GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)"
xx = 6.08888888888889
dx = 1.10888888888889
x0 = -5
x1 = -3.89111111111111
x2 = -2.78222222222222
x3 = -1.67333333333333
x4 = -0.564444444444444
x5 = 0.544444444444445
x6 = 1.65333333333333
x7 = 2.76222222222222
x8 = 3.87111111111111
x9 = 4.98
splot [u=0:1][v=-4.99:4.99] x0, v, (u<0.5) ? -1 : sinc(x0,v) notitle, x1, v, (u<0.5) ? -1 : sinc(x1,v) notitle, x2, v, (u<0.5) ? -1 : sinc(x2,v) notitle, x3, v, (u<0.5) ? -1 : sinc(x3,v) notitle, x4, v, (u<0.5) ? -1 : sinc(x4,v) notitle, x5, v, (u<0.5) ? -1 : sinc(x5,v) notitle, x6, v, (u<0.5) ? -1 : sinc(x6,v) notitle, x7, v, (u<0.5) ? -1 : sinc(x7,v) notitle, x8, v, (u<0.5) ? -1 : sinc(x8,v) notitle, x9, v, (u<0.5) ? -1 : sinc(x9,v) notitle

View File

@@ -0,0 +1,46 @@
# set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350
# set output 'surface1.17.png'
set dummy u,v
set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0
set label 2 "increasing u" at 0, -5, -1.5 left norotate back nopoint offset character 0, 0, 0
set label 3 "floor(u)%3=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0
set label 4 "floor(u)%3=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0
set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000
set arrow 2 from -5, -5, -1.2 to 5, -5, -1.2 head back nofilled linetype -1 linewidth 1.000
set arrow 3 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000
set arrow 4 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000
set parametric
set view 70, 20, 1, 1
set samples 51, 51
set isosamples 30, 33
set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover
set ztics -1.00000,0.25,1.00000 norangelimit
set title "\"fence plot\" using single parametric surface with undefined points"
set xlabel "X axis"
set xlabel offset character -3, -2, 0 font "" textcolor lt -1 norotate
set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback
set ylabel "Y axis"
set ylabel offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270
set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback
set zlabel "Z axis"
set zlabel offset character -5, 0, 0 font "" textcolor lt -1 norotate
set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback
sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)
GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)"
xx = 6.08888888888889
dx = 1.11
x0 = -5
x1 = -3.89111111111111
x2 = -2.78222222222222
x3 = -1.67333333333333
x4 = -0.564444444444444
x5 = 0.544444444444445
x6 = 1.65333333333333
x7 = 2.76222222222222
x8 = 3.87111111111111
x9 = 4.98
xmin = -4.99
xmax = 5
n = 10
zbase = -1
splot [u=.5:3*n-.5][v=-4.99:4.99] xmin+floor(u/3)*dx, v, ((floor(u)%3)==0) ? zbase : (((floor(u)%3)==1) ? sinc(xmin+u/3.*dx,v) : 1/0) notitle

View File

@@ -0,0 +1,21 @@
# set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350
# set output 'world2.1.png'
unset border
set dummy u,v
set angles degrees
set parametric
set view 60, 136, 1.22, 1.26
set samples 64, 64
set isosamples 13, 13
set mapping spherical
set noxtics
set noytics
set noztics
set title "Labels colored by GeV plotted in spherical coordinate system"
set urange [ -90.0000 : 90.0000 ] noreverse nowriteback
set vrange [ 0.00000 : 360.000 ] noreverse nowriteback
set cblabel "GeV"
set cbrange [ 0.00000 : 8.00000 ] noreverse nowriteback
set colorbox user
set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.02, 0.75, 0 front bdefault
splot cos(u)*cos(v),cos(u)*sin(v),sin(u) notitle with lines lt 5, 'world.dat' notitle with lines lt 2, 'srl.dat' using 3:2:(1):1:4 with labels notitle point pt 6 lw .1 left offset 1,0 font "Helvetica,7" tc pal

View File

@@ -1 +0,0 @@
print("hello")

9
samples/Hy/fibonacci.hy Normal file
View File

@@ -0,0 +1,9 @@
;; Fibonacci example in Hy.
(defn fib [n]
(if (<= n 2) n
(+ (fib (- n 1)) (fib (- n 2)))))
(if (= __name__ "__main__")
(for [x [1 2 3 4 5 6 7 8]]
(print (fib x))))

13
samples/Hy/hello-world.hy Normal file
View File

@@ -0,0 +1,13 @@
;; The concurrent.futures example in Hy.
(import [concurrent.futures [ThreadPoolExecutor as-completed]]
[random [randint]]
[sh [sleep]])
(defn task-to-do []
(sleep (randint 1 5)))
(with-as (ThreadPoolExecutor 10) executor
(setv jobs (list-comp (.submit executor task-to-do) (x (range 0 10))))
(for (future (as-completed jobs))
(.result future)))

29
samples/IDL/mg_acosh.pro Normal file
View File

@@ -0,0 +1,29 @@
; docformat = 'rst'
;+
; Inverse hyperbolic cosine. Uses the formula:
;
; $$\text{acosh}(z) = \ln(z + \sqrt{z + 1} \sqrt{z - 1})$$
;
; :Examples:
; The arc hyperbolic sine function looks like::
;
; IDL> x = 2.5 * findgen(1000) / 999. + 1.
; IDL> plot, x, mg_acosh(x), xstyle=1
;
; This should look like:
;
; .. image:: acosh.png
;
; :Returns:
; float, double, complex, or double complex depending on the input
;
; :Params:
; z : in, required, type=numeric
; input
;-
function mg_acosh, z
compile_opt strictarr
return, alog(z + sqrt(z + 1) * sqrt(z - 1))
end

View File

@@ -0,0 +1,9 @@
MODULE mg_analysis
DESCRIPTION Tools for analysis
VERSION 1.0
SOURCE mgalloy
BUILD_DATE January 18, 2011
FUNCTION MG_ARRAY_EQUAL 2 2 KEYWORDS
FUNCTION MG_TOTAL 1 1

35
samples/IDL/mg_gcd.pro Normal file
View File

@@ -0,0 +1,35 @@
; docformat = 'rst'
;+
; Find the greatest common denominator (GCD) for two positive integers.
;
; :Returns:
; integer
;
; :Params:
; a : in, required, type=integer
; first integer
; b : in, required, type=integer
; second integer
;-
function mg_gcd, a, b
compile_opt strictarr
on_error, 2
if (n_params() ne 2) then message, 'incorrect number of arguments'
if (~mg_isinteger(a) || ~mg_isinteger(b)) then begin
message, 'integer arguments required'
endif
_a = abs(a)
_b = abs(b)
minArg = _a < _b
maxArg = _a > _b
if (minArg eq 0) then return, maxArg
remainder = maxArg mod minArg
if (remainder eq 0) then return, minArg
return, mg_gcd(minArg, remainder)
end

42
samples/IDL/mg_trunc.pro Normal file
View File

@@ -0,0 +1,42 @@
; docformat = 'rst'
;+
; Truncate argument towards 0.0, i.e., takes the `FLOOR` of positive values
; and the `CEIL` of negative values.
;
; :Examples:
; Try the main-level program at the end of this file. It does::
;
; IDL> print, mg_trunc([1.2, -1.2, 0.0])
; 1 -1 0
; IDL> print, floor([1.2, -1.2, 0.0])
; 1 -2 0
; IDL> print, ceil([1.2, -1.2, 0.0])
; 2 -1 0
;
; :Returns:
; array of same type as argument
;
; :Params:
; x : in, required, type=float/double
; array containing values to truncate
;-
function mg_trunc, x
compile_opt strictarr
result = ceil(x)
posInd = where(x gt 0, nposInd)
if (nposInd gt 0L) then begin
result[posInd] = floor(x[posInd])
endif
return, result
end
; main-level example program
print, mg_trunc([1.2, -1.2, 0.0])
end

267
samples/JSON/composer.lock generated Normal file
View File

@@ -0,0 +1,267 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
],
"hash": "d8ff8fcb71824f5199f3499bf71862f1",
"packages": [
{
"name": "arbit/system-process",
"version": "1.0",
"source": {
"type": "git",
"url": "https://github.com/Arbitracker/system-process.git",
"reference": "1.0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Arbitracker/system-process/zipball/1.0",
"reference": "1.0",
"shasum": ""
},
"type": "library",
"autoload": {
"psr-0": {
"SystemProcess": "src/main/php/"
}
},
"notification-url": "http://packagist.org/downloads/",
"description": "System process execution library",
"time": "2013-03-31 12:42:56"
},
{
"name": "pdepend/staticReflection",
"version": "0.1",
"source": {
"type": "git",
"url": "https://github.com/manuelpichler/staticReflection.git",
"reference": "origin/master"
},
"type": "library"
},
{
"name": "qafoo/rmf",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/Qafoo/REST-Micro-Framework.git",
"reference": "5f43983f15a8aa12be42ad6068675d4008bfb9ed"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Qafoo/REST-Micro-Framework/zipball/5f43983f15a8aa12be42ad6068675d4008bfb9ed",
"reference": "5f43983f15a8aa12be42ad6068675d4008bfb9ed",
"shasum": ""
},
"type": "library",
"autoload": {
"psr-0": {
"Qafoo\\RMF": "src/main/"
}
},
"description": "Very simple VC framework which makes it easy to build HTTP applications / REST webservices",
"support": {
"source": "https://github.com/Qafoo/REST-Micro-Framework/tree/master",
"issues": "https://github.com/Qafoo/REST-Micro-Framework/issues"
},
"time": "2012-12-07 13:33:01"
},
{
"name": "twig/twig",
"version": "1.6.0",
"source": {
"type": "git",
"url": "git://github.com/fabpot/Twig.git",
"reference": "v1.6.0"
},
"dist": {
"type": "zip",
"url": "https://github.com/fabpot/Twig/zipball/v1.6.0",
"reference": "v1.6.0",
"shasum": ""
},
"require": {
"php": ">=5.2.4"
},
"type": "library",
"autoload": {
"psr-0": {
"Twig_": "lib/"
}
},
"license": [
"BSD"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Armin Ronacher",
"email": "armin.ronacher@active-4.com"
}
],
"description": "Twig, the flexible, fast, and secure template language for PHP",
"homepage": "http://twig.sensiolabs.org",
"keywords": [
"templating"
],
"time": "2012-02-03 23:34:52"
},
{
"name": "twitter/bootstrap",
"version": "0.1",
"source": {
"type": "git",
"url": "https://github.com/twitter/bootstrap/",
"reference": "origin/master"
},
"type": "library"
},
{
"name": "zetacomponents/base",
"version": "1.8",
"source": {
"type": "git",
"url": "https://github.com/zetacomponents/Base.git",
"reference": "1.8"
},
"dist": {
"type": "zip",
"url": "https://github.com/zetacomponents/Base/zipball/1.8",
"reference": "1.8",
"shasum": ""
},
"type": "library",
"autoload": {
"classmap": [
"src"
]
},
"license": [
"apache2"
],
"authors": [
{
"name": "Sergey Alexeev"
},
{
"name": "Sebastian Bergmann"
},
{
"name": "Jan Borsodi"
},
{
"name": "Raymond Bosman"
},
{
"name": "Frederik Holljen"
},
{
"name": "Kore Nordmann"
},
{
"name": "Derick Rethans"
},
{
"name": "Vadym Savchuk"
},
{
"name": "Tobias Schlitt"
},
{
"name": "Alexandru Stanoi"
}
],
"description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.",
"homepage": "https://github.com/zetacomponents",
"time": "2009-12-21 04:14:16"
},
{
"name": "zetacomponents/graph",
"version": "1.5",
"source": {
"type": "git",
"url": "https://github.com/zetacomponents/Graph.git",
"reference": "1.5"
},
"dist": {
"type": "zip",
"url": "https://github.com/zetacomponents/Graph/zipball/1.5",
"reference": "1.5",
"shasum": ""
},
"type": "library",
"autoload": {
"classmap": [
"src"
]
},
"license": [
"apache2"
],
"authors": [
{
"name": "Sergey Alexeev"
},
{
"name": "Sebastian Bergmann"
},
{
"name": "Jan Borsodi"
},
{
"name": "Raymond Bosman"
},
{
"name": "Frederik Holljen"
},
{
"name": "Kore Nordmann"
},
{
"name": "Derick Rethans"
},
{
"name": "Vadym Savchuk"
},
{
"name": "Tobias Schlitt"
},
{
"name": "Alexandru Stanoi"
},
{
"name": "Lars Jankowski"
},
{
"name": "Elger Thiele"
},
{
"name": "Michael Maclean"
}
],
"description": "A component for creating pie charts, line graphs and other kinds of diagrams.",
"homepage": "https://github.com/zetacomponents",
"time": "2009-12-21 04:26:17"
}
],
"packages-dev": [
],
"aliases": [
],
"minimum-stability": "stable",
"stability-flags": {
"qafoo/rmf": 20,
"arbit/system-process": 0
},
"platform": [
],
"platform-dev": [
]
}

View File

@@ -0,0 +1,29 @@
/*
* The following is a contrived example, but it illustrates most of the features:
*/
{
foo: 'bar',
while: true,
this: 'is a \
multi-line string',
// this is an inline comment
here: 'is another', // inline comment
/* this is a block comment
that continues on another line */
hex: 0xDEADbeef,
half: .5,
delta: +10,
to: Infinity, // and beyond!
finally: 'a trailing comma',
oh: [
"we shouldn't forget",
'arrays can have',
'trailing commas too',
],
}

View File

@@ -0,0 +1,28 @@
// This file is written in JSON5 syntax, naturally, but npm needs a regular
// JSON file, so compile via `npm run build`. Be sure to keep both in sync!
{
name: 'json5',
version: '0.2.0',
description: 'JSON for the ES5 era.',
keywords: ['json', 'es5'],
author: 'Aseem Kishore <aseem.kishore@gmail.com>',
contributors: [
'Max Nanasy <max.nanasy@gmail.com>',
],
main: 'lib/json5.js',
bin: 'lib/cli.js',
dependencies: {},
devDependencies: {
mocha: '~1.0.3',
},
scripts: {
build: './lib/cli.js -c package.json5',
test: 'mocha --ui exports --reporter spec',
},
homepage: 'http://json5.org/',
repository: {
type: 'git',
url: 'https://github.com/aseemk/json5.git',
},
}

View File

@@ -0,0 +1,30 @@
{
"@context": {
"property": "http://example.com/vocab#property"
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": {
"@context": {
"@base": "http://example.org/test/"
},
"@id": "../document-base-overwritten",
"@type": "#document-base-overwritten",
"property": [
{
"@context": null,
"@id": "../document-relative",
"@type": "#document-relative",
"property": "context completely reset, drops property"
},
{
"@context": {
"@base": null
},
"@id": "../document-relative",
"@type": "#document-relative",
"property": "only @base is cleared"
}
]
}
}

36
samples/M/Comment.m Normal file
View File

@@ -0,0 +1,36 @@
Comment ;
; this is a comment block
; comments always start with a semicolon
; the next line, while not a comment, is a legal blank line
;whitespace alone is a valid line in a routine
;** Comments can have any graphic character, but no "control"
;** characters
;graphic characters such as: !@#$%^&*()_+=-{}[]|\:"?/>.<,
;the space character is considered a graphic character, even
;though you can't see it.
; ASCII characters whose numeric code is above 128 and below 32
; are NOT allowed on a line in a routine.
;; multiple semicolons are okay
; a line that has a tag must have whitespace after the tag, bug
; does not have to have a comment or a command on it
Tag1
;
;Tags can start with % or an uppercase or lowercase alphabetic
; or can be a series of numeric characters
%HELO ;
;
0123 ;
;
%987 ;
; the most common label is uppercase alphabetic
LABEL ;
;
; Tags can be followed directly by an open parenthesis and a
; formal list of variables, and a close parenthesis
ANOTHER(X) ;
;
;Normally, a subroutine would be ended by a QUIT command, but we
; are taking advantage of the rule that the END of routine is an
; implicit QUIT

61
samples/Mask/view.mask Normal file
View File

@@ -0,0 +1,61 @@
// HTML Elements
header {
img .logo src='/images/~[currentLogo].png' alt=logo;
h4 > 'Bar View'
if (currentUser) {
.account >
a href='/acount' >
'Hello, ~[currentUser.username]'
}
}
.view {
ul {
// Iteration
for ((user, index) of users) {
li.user data-id='~[user.id]' {
// interpolation
.name > '~[ user.username ]'
// expression
.count > '~[: user.level.toFixed(2) ]'
// util
/* Localization sample
* lastActivity: "Am {0:dd. MM} war der letzte Eintrag"
*/
.date > '~[ L: "lastActivity", user.date]'
}
}
}
// Component
:countdownComponent {
input type = text >
:dualbind value='number';
button x-signal='click: countdownStart' > 'Start';
h5 {
'~[bind: number]'
:animation x-slot='countdownStart' {
@model > 'transition | scale(0) > scale(1) | 500ms'
@next > 'background-color | red > blue | 2s linear'
}
}
}
}
footer > :bazCompo {
'Component generated at ~[: $u.format($c.date, "HH-mm") ]'
}

View File

@@ -0,0 +1,3 @@
(* Mathematica Init File *)
Get[ "Foobar`Foobar`"]

View File

@@ -0,0 +1,17 @@
(* Paclet Info File *)
(* created 2014/02/07*)
Paclet[
Name -> "Foobar",
Version -> "0.0.1",
MathematicaVersion -> "8+",
Description -> "Example of an automatically generated PacletInfo file.",
Creator -> "Chris Granade",
Extensions ->
{
{"Documentation", Language -> "English", MainPage -> "Guides/Foobar"}
}
]

View File

@@ -0,0 +1,150 @@
(* ::Package:: *)
BeginPackage["Predicates`"];
(* ::Title:: *)
(*Predicates*)
(* ::Section::Closed:: *)
(*Fuzzy Logic*)
(* ::Subsection:: *)
(*Documentation*)
PossiblyTrueQ::usage="Returns True if the argument is not definitely False.";
PossiblyFalseQ::usage="Returns True if the argument is not definitely True.";
PossiblyNonzeroQ::usage="Returns True if and only if its argument is not definitely zero.";
(* ::Subsection:: *)
(*Implimentation*)
Begin["`Private`"];
PossiblyTrueQ[expr_]:=\[Not]TrueQ[\[Not]expr]
PossiblyFalseQ[expr_]:=\[Not]TrueQ[expr]
End[];
(* ::Section::Closed:: *)
(*Numbers and Lists*)
(* ::Subsection:: *)
(*Documentation*)
AnyQ::usage="Given a predicate and a list, retuns True if and only if that predicate is True for at least one element of the list.";
AnyElementQ::usage="Returns True if cond matches any element of L.";
AllQ::usage="Given a predicate and a list, retuns True if and only if that predicate is True for all elements of the list.";
AllElementQ::usage="Returns True if cond matches any element of L.";
AnyNonzeroQ::usage="Returns True if L is a list such that at least one element is definitely not zero.";
AnyPossiblyNonzeroQ::usage="Returns True if expr is a list such that at least one element is not definitely zero.";
RealQ::usage="Returns True if and only if the argument is a real number";
PositiveQ::usage="Returns True if and only if the argument is a positive real number";
NonnegativeQ::usage="Returns True if and only if the argument is a non-negative real number";
PositiveIntegerQ::usage="Returns True if and only if the argument is a positive integer";
NonnegativeIntegerQ::usage="Returns True if and only if the argument is a non-negative integer";
IntegerListQ::usage="Returns True if and only if the input is a list of integers.";
PositiveIntegerListQ::usage="Returns True if and only if the input is a list of positive integers.";
NonnegativeIntegerListQ::usage="Returns True if and only if the input is a list of non-negative integers.";
IntegerOrListQ::usage="Returns True if and only if the input is a list of integers or an integer.";
PositiveIntegerOrListQ::usage="Returns True if and only if the input is a list of positive integers or a positive integer.";
NonnegativeIntegerOrListQ::usage="Returns True if and only if the input is a list of positive integers or a positive integer.";
SymbolQ::usage="Returns True if argument is an unassigned symbol.";
SymbolOrNumberQ::usage="Returns True if argument is a number of has head 'Symbol'";
(* ::Subsection:: *)
(*Implimentation*)
Begin["`Private`"];
AnyQ[cond_, L_] := Fold[Or, False, cond /@ L]
AnyElementQ[cond_,L_]:=AnyQ[cond,Flatten[L]]
AllQ[cond_, L_] := Fold[And, True, cond /@ L]
AllElementQ[cond_, L_] := Fold[And, True, cond /@ L]
AnyNonzeroQ[L_]:=AnyElementQ[#!=0&,L]
PossiblyNonzeroQ[expr_]:=PossiblyTrueQ[expr!=0]
AnyPossiblyNonzeroQ[expr_]:=AnyElementQ[PossiblyNonzeroQ,expr]
RealQ[n_]:=TrueQ[Im[n]==0];
PositiveQ[n_]:=Positive[n];
PositiveIntegerQ[n_]:=PositiveQ[n]\[And]IntegerQ[n];
NonnegativeQ[n_]:=TrueQ[RealQ[n]&&n>=0];
NonnegativeIntegerQ[n_]:=NonnegativeQ[n]\[And]IntegerQ[n];
IntegerListQ[input_]:=ListQ[input]&&Not[MemberQ[IntegerQ/@input,False]];
IntegerOrListQ[input_]:=IntegerListQ[input]||IntegerQ[input];
PositiveIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[Positive[input],False]];
PositiveIntegerOrListQ[input_]:=PositiveIntegerListQ[input]||PositiveIntegerQ[input];
NonnegativeIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[NonnegativeIntegerQ[input],False]];
NonnegativeIntegerOrListQ[input_]:=NonnegativeIntegerListQ[input]||NonnegativeIntegerQ[input];
SymbolQ[a_]:=Head[a]===Symbol;
SymbolOrNumberQ[a_]:=NumericQ[a]||Head[a]===Symbol;
End[];
(* ::Section:: *)
(*Epilogue*)
EndPackage[];

View File

@@ -0,0 +1,90 @@
= Overview =
The GDB Tracepoint Analysis feature is an extension to the Tracing and Monitoring Framework that allows the visualization and analysis of C/C++ tracepoint data collected by GDB and stored to a log file.
= Getting Started =
The feature can be installed from the Eclipse update site by selecting '''Linux Tools''' > '''GDB Tracepoint Analysis'''.
The feature requires GDB version 7.2 or later to be installed on the local host. The executable program 'gdb' must be found in the path.
= GDB Trace Perspective =
To open the perspective, select '''Window''' > '''Open Perspective''' > '''Other...''' > '''GDB Trace'''.
The perspective includes the following views by default:
* '''Project Explorer''': This view shows the projects in the workspace and is used to create and manage Tracing projects.
* '''Debug''': This view shows the running C/C++ Postmortem Debugger instances and displays the thread and stack trace associated with a tracepoint.
* '''Trace Control''': This view shows the status of the debugger and allows navigation of trace records.
* '''Console''': This view displays console output of the C/C++ Postmortem Debugger.
The editor area contains the '''Events''' and '''C/C++''' editors when a GDB Trace is opened.
[[Image:images/GDBTracePerspective.png]]
= Collecting Tracepoint Data =
Collecting the C/C++ tracepoint data is outside the scope of this feature. It can be done from the GDB command line or by using the CDT debug component within Eclipse. See the CDT FAQ entry in the [[#References | References]] section.
= Importing Tracepoint Data =
Some information in this section is redundant with the LTTng User Guide. For further details, see the LTTng User Guide entry in the [[#References | References]] section.
== Creating a Tracing Project ==
In the '''Project Explorer''' view, right-click and select '''New''' > '''Project...''' from the context menu. In the '''New Project''' dialog, select '''Tracing''' > '''Tracing Project''', click '''Next''', name your project and click '''Finish'''.
== Importing a GDB Trace ==
In your tracing project, right-click on the '''Traces''' folder and select '''Import...'''. Browse to, or enter, a source directory. Select the trace file in the tree. Optionally set the trace type to '''GDB : GDB Trace'''. Click '''Finish'''.
Alternatively, the trace can be drag & dropped to the '''Traces''' folder from any external file manager.
== Selecting the GDB Trace Type ==
Right-click the imported trace in the '''Traces''' folder and choose '''Select Trace Type...''' > '''GDB''' > '''GDB Trace''' from the context menu. This step can be omitted if the trace type was selected at import.
The trace will be updated with the GDB icon [[Image:images/gdb_icon16.png]].
== Selecting the Trace Executable ==
The executable file that created the tracepoint data must be identified so that the C/C++ Postmortem Debugger can be launched properly.
Right-click the GDB trace in the '''Traces''' folder and choose '''Select Trace Executable...''' from the context menu. Browse to, or enter, the path of the executable file and press '''OK'''.
The selected file must be recognized by GDB as an executable.
= Visualizing Tracepoint Data =
== Opening a GDB Trace ==
In the '''Traces''' folder, double-click the GDB trace or right-click it and select '''Open''' from the context menu.
The tracepoint data will be opened in an Events editor, and a C/C++ Postmortem Debugger instance will be launched.
If available in the workspace, the source code corresponding to the first trace record will also be opened in a C/C++ editor.
At this point it is recommended to relocate the Events editor outside of the default editor area, so that it is not hidden by the C/C++ editor.
== Viewing Trace Data ==
In the Events editor, a table is shown with one row for each trace record. The '''Trace Frame''' column shows the sequential trace record number. The '''Tracepoint''' column shows the number assigned by GDB at collection time for this tracepoint. The '''File''' column shows the file name, line number and method where the tracepoint was set. The '''Content''' column shows the data collected at run-time by the tracepoint.
Searching and filtering can be done on any column by entering a regular expression in the column header.
== Navigating the GDB Trace ==
Trace records can be selected in the Events editor using the keyboard or mouse. The C/C++ Postmortem Debugger in the '''Debug''' view will be updated to show the stack trace of the current trace record.
The trace can also be navigated from the '''Trace Control''' view by clicking the '''Next Trace Record''' or '''Previous Trace Record''' buttons. The Events editor and '''Debug''' views will be updated.
= References =
* [http://wiki.eclipse.org/index.php/Linux_Tools_Project/LTTng2/User_Guide LTTng User Guide]
* [http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_trace_my_application_using_C.2FC.2B.2B_Tracepoints.3F CDT FAQ - How can I trace my application using C/C++ Tracepoints?]
= Updating This Document =
This document is maintained in a collaborative wiki. If you wish to update or modify this document please visit [http://wiki.eclipse.org/index.php/Linux_Tools_Project/GDB_Tracepoint_Analysis/User_Guide http://wiki.eclipse.org/Linux_Tools_Project/GDB_Tracepoint_Analysis/User_Guide]

164
samples/Org/org.org Normal file
View File

@@ -0,0 +1,164 @@
#+OPTIONS: H:3 num:nil toc:nil \n:nil @:t ::t |:t ^:t -:t f:t *:t TeX:t LaTeX:t skip:nil d:(HIDE) tags:not-in-toc
#+STARTUP: align fold nodlcheck hidestars oddeven lognotestate
#+SEQ_TODO: TODO(t) INPROGRESS(i) WAITING(w@) | DONE(d) CANCELED(c@)
#+TAGS: Write(w) Update(u) Fix(f) Check(c)
#+TITLE: org-ruby
#+AUTHOR: Brian Dewey
#+EMAIL: bdewey@gmail.com
#+LANGUAGE: en
#+PRIORITIES: A C B
#+CATEGORY: worg
{Back to Worg's index}
* Motivation
The dominant simple plain-text markup languages for the web are
Textile and Markdown. A factor for the popularity of those markup
formats is the widespread availability of simple, free packages for
converting the formats to HTML. For example, the world of
Ruby-powered websites has settled on RedCloth for converting Textile
to HTML.
The default way to convert org-mode files to HTML is the powerful
publishing functionality provided by =emacs=. However, =emacs= does
not easiliy integrate into many existing website frameworks.
=Org-ruby= tries to make it easier to use org-mode files in both
dyanmic and static website generation tools written in
Ruby. =Org-ruby= is a simple Ruby gem to convert org-mode files to
HTML.
* Using Org-ruby
=Org-ruby= follows the same model as other Ruby markup
libraries. You install the gem:
#+BEGIN_EXAMPLE
sudo gem install org-ruby
#+END_EXAMPLE
Then, to convert an org-file to HTML in your Ruby code:
#+BEGIN_EXAMPLE
require 'rubygems'
require 'org-ruby'
data = IO.read(filename)
puts Orgmode::Parser.new(data).to_html
#+END_EXAMPLE
* Walkthrough: Using org-ruby with Webby
Here is an example of how to integrate =org-ruby= into Webby, a
static website generation tool written in Ruby.
Webby follows a similar pattern to other static site generation
tools (like nanoc, Jekyll, and webgen):
- You author website content in text with simple markup
- Each page is fed through one or more /filters/ to produce HTML
- The HTML is mixed in with layouts to produce the final pages
For a Webby site, a the source for a page may look like this:
#+BEGIN_EXAMPLE
---
title: Special Directories
created_at: 2009-12-17
status: Complete
filter:
- erb
- maruku
tags:
- powershell
---
<%= @page.title %>
==================
Special Directories are a set of directories, each of which has a
function that will navigate you to the appropriate directory using
the push-location cmdlet. For example, the function `home` might
navigate to `c:\users\bdewey.`
Install
-------
Copy the module to somewhere in `ENV:PSModulePath`. Then,
InstallModule SpecialDirectories
#+END_EXAMPLE
In the above example, the text is written in Markdown. At the top of
the file, metadata informs Webby to pass the text through two
/filters/ to produce HTML. The first filter, =erb=, handles embedded
Ruby. In this case, it will replace ~<%= @page.title %>~ with the
page title (=Special Directories=). The second filter uses Maruku to
translate Markdown into HTML.
You can use the exact same pattern to include org-mode files in a
Webby site. For this walkthrough, I assume you already have Webby
installed, and that you've already created a site.
1. Make sure you have =org-ruby= installed: =sudo gem install
org-ruby=.
2. You need to register a new Webby filter to handle org-mode
content. Webby makes this easy. In the =lib/= folder of your
site, create a file =orgmode.rb=:
#+BEGIN_EXAMPLE
require 'org-ruby'
Webby::Filters.register :org do |input|
Orgmode::Parser.new(input).to_html
end
#+END_EXAMPLE
This code creates a new filter, =org=, that will use the
=org-ruby= parser to translate org-mode input into HTML.
3. Create your content. For example:
#+BEGIN_EXAMPLE
---
title: Orgmode Parser
created_at: 2009-12-21
status: Under development
filter:
- erb
- org
tags:
- orgmode
- ruby
---
<%= @page.title %>
Status: <%= @page.status %>
* Description
Helpful Ruby routines for parsing orgmode files. The most
significant thing this library does today is convert orgmode files
to textile. Currently, you cannot do much to customize the
conversion. The supplied textile conversion is optimized for
extracting "content" from the orgfile as opposed to "metadata."
* History
** 2009-12-29: Version 0.4
- The first thing output in HTML gets the class "title"
- HTML output is now indented
- Proper support for multi-paragraph list items.
See? This paragraph is part of the last bullet.
- Fixed bugs:
- "rake spec" wouldn't work on Linux. Needed "require 'rubygems'".
#+END_EXAMPLE
This file will go through the =erb= and =org= filters; as defined
in the previous step, the =org= filter will use =org-ruby= to
generate HTML.
That's all there is to it!

View File

@@ -1,125 +0,0 @@
namespace Loops;
interface
uses System.Linq;
type
ConsoleApp = class
public
class method Main;
method loopsTesting;
method fillData : sequence of Country;
var
Countries : sequence of Country;
end;
type
Country = public class
public
property Name : String;
property Capital : String;
constructor (setName : String; setCapital : String);
end;
implementation
class method ConsoleApp.Main;
begin
Console.WriteLine('Loops example');
Console.WriteLine();
with myConsoleApp := new ConsoleApp() do
myConsoleApp.loopsTesting;
end;
method ConsoleApp.loopsTesting;
begin
{---------------------------------}
{"for" loop, taking every 5th item}
for i : Int32 :=0 to 50 step 5 do
begin
Console.Write(i); Console.Write(' ');
end;
Console.WriteLine(); Console.WriteLine();
{---------------------------------}
{"for" loop, going from high to low value}
for i : Int32 := 10 downto 1 do
begin
Console.Write(i); Console.Write(' ');
end;
Console.WriteLine(); Console.WriteLine();
Countries := fillData;
{---------------------------------}
{loop with defined "index" variable, which will count from 0 through the number of elements looped}
Console.WriteLine('Countries: ');
for each c in Countries index num do
Console.WriteLine(Convert.ToString(num + 1) + ') ' + c.Name);
Console.WriteLine();
Console.WriteLine('Cities: ');
var ind : Integer :=0;
{---------------------------------}
{simple "loop" construct that loops endlessly, until broken out of}
loop
begin
Console.WriteLine(Countries.ElementAt(ind).Capital);
Inc(ind);
if ind = Countries.Count then break;
end;
Console.WriteLine();
{---------------------------------}
{the type of 'c' is inferred automatically}
for each c in Countries do
Console.WriteLine(c.Capital + ' is the capital of ' + c.Name);
Console.WriteLine();
ind := 0;
Console.WriteLine('Cities: ');
{"repeat ... until" loop}
repeat
Console.WriteLine(Countries.ElementAt(ind).Capital);
Inc(ind);
until ind = Countries.Count;
Console.WriteLine();
ind := 0;
Console.WriteLine('Countries: ');
{---------------------------------}
{"while ... do" loop}
while ind < Countries.Count do
begin
Console.WriteLine(Countries.ElementAt(ind).Name);
Inc(ind);
end;
Console.ReadLine();
end;
method ConsoleApp.fillData: sequence of Country;
begin
result := [new Country('UK', 'London'), new Country('USA', 'Washington'), new Country('Germany', 'Berlin'),
new Country('Ukraine', 'Kyiv'), new Country('Russia', 'Moscow'), new Country('France', 'Paris')];
end;
constructor Country (setName :String; setCapital: String);
begin
Name := setName;
Capital := setCapital;
end;
end.

Some files were not shown because too many files have changed in this diff Show More