Merge branch 'master' into 989

Conflicts:
	lib/linguist/languages.yml
This commit is contained in:
Arfon Smith
2014-04-21 15:43:49 -05:00
118 changed files with 31207 additions and 183 deletions

View File

@@ -6,6 +6,7 @@ rvm:
- 1.9.2
- 1.9.3
- 2.0.0
- 2.1.1
- ree
notifications:
disabled: true

View File

@@ -1,6 +1,6 @@
Gem::Specification.new do |s|
s.name = 'github-linguist'
s.version = '2.10.11'
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.'

View File

@@ -28,6 +28,9 @@ module Linguist
if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) }
disambiguate_cl(data, languages)
end
if languages.all? { |l| ["Rebol", "R"].include?(l) }
disambiguate_r(data, languages)
end
end
end
@@ -73,6 +76,13 @@ module Linguist
matches
end
def self.disambiguate_r(data, languages)
matches = []
matches << Language["Rebol"] if /\bRebol\b/i.match(data)
matches << Language["R"] if data.include?("<-")
matches
end
def self.active?
!!ACTIVE
end

View File

@@ -485,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

View File

@@ -10,7 +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
# interpreter - An Array of associated interpreters
# 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
@@ -86,6 +86,12 @@ Agda:
color: "#467C91"
primary_extension: .agda
Alloy:
type: programming # 'modeling' would be more appropiate
lexer: Text only
color: "#cc5c24"
primary_extension: .als
ApacheConf:
type: markup
aliases:
@@ -129,6 +135,12 @@ AsciiDoc:
- .adoc
- .asc
AspectJ:
type: programming
lexer: AspectJ
color: "#1957b0"
primary_extension: .aj
Assembly:
type: programming
lexer: NASM
@@ -261,6 +273,7 @@ C++:
- .hh
- .hpp
- .hxx
- .inl
- .tcc
- .tpp
@@ -300,7 +313,7 @@ COBOL:
CSS:
ace_mode: css
color: "#1f085e"
color: "#563d7c"
primary_extension: .css
Ceylon:
@@ -488,10 +501,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
@@ -507,6 +529,14 @@ ECL:
extensions:
- .eclxml
Eagle:
type: markup
color: "#3994bc"
lexer: XML
primary_extension: .sch
extensions:
- .brd
Eiffel:
type: programming
lexer: Text only
@@ -617,6 +647,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
@@ -664,6 +705,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"
@@ -674,6 +726,16 @@ Gosu:
color: "#82937f"
primary_extension: .gs
Grammatical Framework:
type: programming
lexer: Haskell
aliases:
- gf
wrap: false
primary_extension: .gf
searchable: true
color: "#ff0000"
Groff:
primary_extension: .man
extensions:
@@ -865,6 +927,12 @@ JSONLD:
lexer: JavaScript
primary_extension: .jsonld
JSONiq:
type: programming
ace_mode: jsoniq
lexer: XQuery
primary_extension: .jq
Jade:
group: HTML
type: markup
@@ -887,7 +955,7 @@ Java Server Pages:
JavaScript:
type: programming
ace_mode: javascript
color: "#f15501"
color: "#f7df1e"
aliases:
- js
- node
@@ -907,6 +975,8 @@ JavaScript:
- .ssjs
filenames:
- Jakefile
interpreters:
- node
Julia:
type: programming
@@ -1060,6 +1130,11 @@ Mask:
ace_mode: scss
primary_extension: .mask
Mathematica:
type: programming
primary_extension: .mathematica
lexer: Text only
Matlab:
type: programming
color: "#bb92ac"
@@ -1186,9 +1261,14 @@ Objective-C:
- obj-c
- objc
primary_extension: .m
extensions:
- .h
- .mm
Objective-C++:
type: programming
color: "#4886FC"
aliases:
- obj-c++
- objc++
primary_extension: .mm
Objective-J:
type: programming
@@ -1391,6 +1471,12 @@ Pure Data:
lexer: Text only
primary_extension: .pd
PureScript:
type: programming
color: "#f3ce45"
lexer: Haskell
primary_extension: .purs
Python:
type: programming
ace_mode: python
@@ -1494,10 +1580,12 @@ Rebol:
type: programming
lexer: REBOL
color: "#358a5b"
primary_extension: .rebol
primary_extension: .reb
extensions:
- .r
- .r2
- .r3
- .rebol
Redcode:
primary_extension: .cw
@@ -1636,6 +1724,11 @@ Shell:
filenames:
- Dockerfile
ShellSession:
type: programming
lexer: Bash Session
primary_extension: .sh-session
Shen:
type: programming
color: "#120F14"
@@ -1655,6 +1748,13 @@ Smalltalk:
Smarty:
primary_extension: .tpl
SourcePawn:
type: programming
color: "#f69e1d"
aliases:
- sourcemod
primary_extension: .sp
Squirrel:
type: programming
lexer: C++
@@ -1669,6 +1769,19 @@ Standard ML:
extensions:
- .fun
Stata:
type: programming
lexer: Text only
extensions:
- .ado
- .do
- .doh
- .ihlp
- .mata
- .matah
- .sthlp
primary_extension: .do
Stylus:
type: markup
group: CSS
@@ -1681,6 +1794,15 @@ SuperCollider:
lexer: Text only
primary_extension: .scd
SystemVerilog:
type: programming
color: "#343761"
lexer: systemverilog
primary_extension: .sv
extensions:
- .svh
- .vh
TOML:
type: data
primary_extension: .toml
@@ -1696,6 +1818,7 @@ Tcl:
primary_extension: .tcl
extensions:
- .adp
- .tm
Tcsh:
type: programming
@@ -1858,6 +1981,7 @@ XML:
- .kml
- .launch
- .mxml
- .osm
- .plist
- .pluginspec
- .ps1xml
@@ -1938,6 +2062,12 @@ YAML:
- .rviz
- .yaml
Zephir:
type: programming
lexer: PHP
color: "#118f9e"
primary_extension: .zep
eC:
type: programming
search_term: ec

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@
## Vendor Conventions ##
# Caches
- cache/
- (^|/)cache/
# Dependencies
- ^[Dd]ependencies/
@@ -98,6 +98,9 @@
# AngularJS
- (^|/)angular([^.]*)(\.min)?\.js$
# React
- (^|/)react(-[^.]*)?(\.min)?\.js$
## Python ##
# django
@@ -128,6 +131,7 @@
# Visual Studio IntelliSense
- -vsdoc\.js$
- \.intellisense\.js$
# jQuery validation plugin (MS bundles this with asp.net mvc)
- (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$

View File

@@ -0,0 +1,59 @@
module examples/systems/file_system
/*
* Model of a generic file system.
*/
abstract sig Object {}
sig Name {}
sig File extends Object {} { some d: Dir | this in d.entries.contents }
sig Dir extends Object {
entries: set DirEntry,
parent: lone Dir
} {
parent = this.~@contents.~@entries
all e1, e2 : entries | e1.name = e2.name => e1 = e2
this !in this.^@parent
this != Root => Root in this.^@parent
}
one sig Root extends Dir {} { no parent }
lone sig Cur extends Dir {}
sig DirEntry {
name: Name,
contents: Object
} {
one this.~entries
}
/**
* all directories besides root have one parent
*/
pred OneParent_buggyVersion {
all d: Dir - Root | one d.parent
}
/**
* all directories besides root have one parent
*/
pred OneParent_correctVersion {
all d: Dir - Root | (one d.parent && one contents.d)
}
/**
* Only files may be linked (that is, have more than one entry)
* That is, all directories are the contents of at most one directory entry
*/
pred NoDirAliases {
all o: Dir | lone o.~contents
}
check { OneParent_buggyVersion => NoDirAliases } for 5 expect 1
check { OneParent_correctVersion => NoDirAliases } for 5 expect 0

View File

@@ -0,0 +1,83 @@
module examples/systems/marksweepgc
/*
* Model of mark and sweep garbage collection.
*/
// a node in the heap
sig Node {}
sig HeapState {
left, right : Node -> lone Node,
marked : set Node,
freeList : lone Node
}
pred clearMarks[hs, hs' : HeapState] {
// clear marked set
no hs'.marked
// left and right fields are unchanged
hs'.left = hs.left
hs'.right = hs.right
}
/**
* simulate the recursion of the mark() function using transitive closure
*/
fun reachable[hs: HeapState, n: Node] : set Node {
n + n.^(hs.left + hs.right)
}
pred mark[hs: HeapState, from : Node, hs': HeapState] {
hs'.marked = hs.reachable[from]
hs'.left = hs.left
hs'.right = hs.right
}
/**
* complete hack to simulate behavior of code to set freeList
*/
pred setFreeList[hs, hs': HeapState] {
// especially hackish
hs'.freeList.*(hs'.left) in (Node - hs.marked)
all n: Node |
(n !in hs.marked) => {
no hs'.right[n]
hs'.left[n] in (hs'.freeList.*(hs'.left))
n in hs'.freeList.*(hs'.left)
} else {
hs'.left[n] = hs.left[n]
hs'.right[n] = hs.right[n]
}
hs'.marked = hs.marked
}
pred GC[hs: HeapState, root : Node, hs': HeapState] {
some hs1, hs2: HeapState |
hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs']
}
assert Soundness1 {
all h, h' : HeapState, root : Node |
h.GC[root, h'] =>
(all live : h.reachable[root] | {
h'.left[live] = h.left[live]
h'.right[live] = h.right[live]
})
}
assert Soundness2 {
all h, h' : HeapState, root : Node |
h.GC[root, h'] =>
no h'.reachable[root] & h'.reachable[h'.freeList]
}
assert Completeness {
all h, h' : HeapState, root : Node |
h.GC[root, h'] =>
(Node - h'.reachable[root]) in h'.reachable[h'.freeList]
}
check Soundness1 for 3 expect 0
check Soundness2 for 3 expect 0
check Completeness for 3 expect 0

217
samples/Alloy/views.als Normal file
View File

@@ -0,0 +1,217 @@
module examples/systems/views
/*
* Model of views in object-oriented programming.
*
* Two object references, called the view and the backing,
* are related by a view mechanism when changes to the
* backing are automatically propagated to the view. Note
* that the state of a view need not be a projection of the
* state of the backing; the keySet method of Map, for
* example, produces two view relationships, and for the
* one in which the map is modified by changes to the key
* set, the value of the new map cannot be determined from
* the key set. Note that in the iterator view mechanism,
* the iterator is by this definition the backing object,
* since changes are propagated from iterator to collection
* and not vice versa. Oddly, a reference may be a view of
* more than one backing: there can be two iterators on the
* same collection, eg. A reference cannot be a view under
* more than one view type.
*
* A reference is made dirty when it is a backing for a view
* with which it is no longer related by the view invariant.
* This usually happens when a view is modified, either
* directly or via another backing. For example, changing a
* collection directly when it has an iterator invalidates
* it, as does changing the collection through one iterator
* when there are others.
*
* More work is needed if we want to model more closely the
* failure of an iterator when its collection is invalidated.
*
* As a terminological convention, when there are two
* complementary view relationships, we will give them types
* t and t'. For example, KeySetView propagates from map to
* set, and KeySetView' propagates from set to map.
*
* author: Daniel Jackson
*/
open util/ordering[State] as so
open util/relation as rel
sig Ref {}
sig Object {}
-- t->b->v in views when v is view of type t of backing b
-- dirty contains refs that have been invalidated
sig State {
refs: set Ref,
obj: refs -> one Object,
views: ViewType -> refs -> refs,
dirty: set refs
-- , anyviews: Ref -> Ref -- for visualization
}
-- {anyviews = ViewType.views}
sig Map extends Object {
keys: set Ref,
map: keys -> one Ref
}{all s: State | keys + Ref.map in s.refs}
sig MapRef extends Ref {}
fact {State.obj[MapRef] in Map}
sig Iterator extends Object {
left, done: set Ref,
lastRef: lone done
}{all s: State | done + left + lastRef in s.refs}
sig IteratorRef extends Ref {}
fact {State.obj[IteratorRef] in Iterator}
sig Set extends Object {
elts: set Ref
}{all s: State | elts in s.refs}
sig SetRef extends Ref {}
fact {State.obj[SetRef] in Set}
abstract sig ViewType {}
one sig KeySetView, KeySetView', IteratorView extends ViewType {}
fact ViewTypes {
State.views[KeySetView] in MapRef -> SetRef
State.views[KeySetView'] in SetRef -> MapRef
State.views[IteratorView] in IteratorRef -> SetRef
all s: State | s.views[KeySetView] = ~(s.views[KeySetView'])
}
/**
* mods is refs modified directly or by view mechanism
* doesn't handle possibility of modifying an object and its view at once?
* should we limit frame conds to non-dirty refs?
*/
pred modifies [pre, post: State, rs: set Ref] {
let vr = pre.views[ViewType], mods = rs.*vr {
all r: pre.refs - mods | pre.obj[r] = post.obj[r]
all b: mods, v: pre.refs, t: ViewType |
b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]
post.dirty = pre.dirty +
{b: pre.refs | some v: Ref, t: ViewType |
b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]
}
}
}
pred allocates [pre, post: State, rs: set Ref] {
no rs & pre.refs
post.refs = pre.refs + rs
}
/**
* models frame condition that limits change to view object from v to v' when backing object changes to b'
*/
pred viewFrame [t: ViewType, v, v', b': Object] {
t in KeySetView => v'.elts = dom [b'.map]
t in KeySetView' => b'.elts = dom [v'.map]
t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map)
t in IteratorView => v'.elts = b'.left + b'.done
}
pred MapRef.keySet [pre, post: State, setRefs: SetRef] {
post.obj[setRefs].elts = dom [pre.obj[this].map]
modifies [pre, post, none]
allocates [pre, post, setRefs]
post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this
}
pred MapRef.put [pre, post: State, k, v: Ref] {
post.obj[this].map = pre.obj[this].map ++ k->v
modifies [pre, post, this]
allocates [pre, post, none]
post.views = pre.views
}
pred SetRef.iterator [pre, post: State, iterRef: IteratorRef] {
let i = post.obj[iterRef] {
i.left = pre.obj[this].elts
no i.done + i.lastRef
}
modifies [pre,post,none]
allocates [pre, post, iterRef]
post.views = pre.views + IteratorView->iterRef->this
}
pred IteratorRef.remove [pre, post: State] {
let i = pre.obj[this], i' = post.obj[this] {
i'.left = i.left
i'.done = i.done - i.lastRef
no i'.lastRef
}
modifies [pre,post,this]
allocates [pre, post, none]
pre.views = post.views
}
pred IteratorRef.next [pre, post: State, ref: Ref] {
let i = pre.obj[this], i' = post.obj[this] {
ref in i.left
i'.left = i.left - ref
i'.done = i.done + ref
i'.lastRef = ref
}
modifies [pre, post, this]
allocates [pre, post, none]
pre.views = post.views
}
pred IteratorRef.hasNext [s: State] {
some s.obj[this].left
}
assert zippishOK {
all
ks, vs: SetRef,
m: MapRef,
ki, vi: IteratorRef,
k, v: Ref |
let s0=so/first,
s1=so/next[s0],
s2=so/next[s1],
s3=so/next[s2],
s4=so/next[s3],
s5=so/next[s4],
s6=so/next[s5],
s7=so/next[s6] |
({
precondition [s0, ks, vs, m]
no s0.dirty
ks.iterator [s0, s1, ki]
vs.iterator [s1, s2, vi]
ki.hasNext [s2]
vi.hasNext [s2]
ki.this/next [s2, s3, k]
vi.this/next [s3, s4, v]
m.put [s4, s5, k, v]
ki.remove [s5, s6]
vi.remove [s6, s7]
} => no State.dirty)
}
pred precondition [pre: State, ks, vs, m: Ref] {
// all these conditions and other errors discovered in scope of 6 but 8,3
// in initial state, must have view invariants hold
(all t: ViewType, b, v: pre.refs |
b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]])
// sets are not aliases
-- ks != vs
// sets are not views of map
-- no (ks+vs)->m & ViewType.pre.views
// no iterator currently on either set
-- no Ref->(ks+vs) & ViewType.pre.views
}
check zippishOK for 6 but 8 State, 3 ViewType expect 1
/**
* experiment with controlling heap size
*/
fact {all s: State | #s.obj < 5}

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());
}
}

530
samples/C++/Math.inl Normal file
View File

@@ -0,0 +1,530 @@
/*
===========================================================================
The Open Game Libraries.
Copyright (C) 2007-2010 Lusito Software
Author: Santo Pfingsten (TTK-Bandit)
Purpose: Math namespace
-----------------------------------------
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
===========================================================================
*/
#ifndef __OG_MATH_INL__
#define __OG_MATH_INL__
namespace og {
/*
==============================================================================
Math
==============================================================================
*/
/*
================
Math::Abs
================
*/
OG_INLINE int Math::Abs( int i ) {
#if 1
if ( i & 0x80000000 )
return 0x80000000 - (i & MASK_SIGNED);
return i;
#else
int y = x >> 31;
return ( ( x ^ y ) - y );
#endif
}
/*
================
Math::Fabs
================
*/
OG_INLINE float Math::Fabs( float f ) {
#if 1
uInt *pf = reinterpret_cast<uInt*>(&f);
*(pf) &= MASK_SIGNED;
return f;
#else
return fabsf( f );
#endif
}
/*
================
Math::Round
================
*/
OG_INLINE float Math::Round( float f ) {
return floorf( f + 0.5f );
}
/*
================
Math::Floor
================
*/
OG_INLINE float Math::Floor( float f ) {
return floorf( f );
}
/*
================
Math::Ceil
================
*/
OG_INLINE float Math::Ceil( float f ) {
return ceilf( f );
}
/*
================
Math::Ftoi
ok since this is SSE, why should the other ftoi be the faster one ?
and: we might need to add a check for SSE extensions..
because sse isn't *really* faster (I actually read that GCC does not handle
SSE extensions perfectly. I'll find the link and send it to you when you're online)
================
*/
OG_INLINE int Math::Ftoi( float f ) {
//! @todo needs testing
// note: sse function cvttss2si
#if OG_ASM_MSVC
int i;
#if defined(OG_FTOI_USE_SSE)
if( SysInfo::cpu.general.SSE ) {
__asm cvttss2si eax, f
__asm mov i, eax
return i;
} else
#endif
{
__asm fld f
__asm fistp i
//__asm mov eax, i // do we need this ? O_o
}
return i;
#elif OG_ASM_GNU
int i;
#if defined(OG_FTOI_USE_SSE)
if( SysInfo::cpu.general.SSE ) {
__asm__ __volatile__( "cvttss2si %1 \n\t"
: "=m" (i)
: "m" (f)
);
} else
#endif
{
__asm__ __volatile__( "flds %1 \n\t"
"fistpl %0 \n\t"
: "=m" (i)
: "m" (f)
);
}
return i;
#else
// we use c++ cast instead of c cast (not sure why id did that)
return static_cast<int>(f);
#endif
}
/*
================
Math::FtoiFast
================
*/
OG_INLINE int Math::FtoiFast( float f ) {
#if OG_ASM_MSVC
int i;
__asm fld f
__asm fistp i
//__asm mov eax, i // do we need this ? O_o
return i;
#elif OG_ASM_GNU
int i;
__asm__ __volatile__( "flds %1 \n\t"
"fistpl %0 \n\t"
: "=m" (i)
: "m" (f)
);
return i;
#else
// we use c++ cast instead of c cast (not sure why id did that)
return static_cast<int>(f);
#endif
}
/*
================
Math::Ftol
================
*/
OG_INLINE long Math::Ftol( float f ) {
#if OG_ASM_MSVC
long i;
__asm fld f
__asm fistp i
//__asm mov eax, i // do we need this ? O_o
return i;
#elif OG_ASM_GNU
long i;
__asm__ __volatile__( "flds %1 \n\t"
"fistpl %0 \n\t"
: "=m" (i)
: "m" (f)
);
return i;
#else
// we use c++ cast instead of c cast (not sure why id did that)
return static_cast<long>(f);
#endif
}
/*
================
Math::Sign
================
*/
OG_INLINE float Math::Sign( float f ) {
if ( f > 0.0f )
return 1.0f;
if ( f < 0.0f )
return -1.0f;
return 0.0f;
}
/*
================
Math::Fmod
================
*/
OG_INLINE float Math::Fmod( float numerator, float denominator ) {
return fmodf( numerator, denominator );
}
/*
================
Math::Modf
================
*/
OG_INLINE float Math::Modf( float f, float& i ) {
return modff( f, &i );
}
OG_INLINE float Math::Modf( float f ) {
float i;
return modff( f, &i );
}
/*
================
Math::Sqrt
================
*/
OG_INLINE float Math::Sqrt( float f ) {
return sqrtf( f );
}
/*
================
Math::InvSqrt
Cannot be 0.0f
================
*/
OG_INLINE float Math::InvSqrt( float f ) {
OG_ASSERT( f != 0.0f );
return 1.0f / sqrtf( f );
}
/*
================
Math::RSqrt
Can be 0.0f
================
*/
OG_INLINE float Math::RSqrt( float f ) {
float g = 0.5f * f;
int i = *reinterpret_cast<int *>(&f);
// do a guess
i = 0x5f375a86 - ( i>>1 );
f = *reinterpret_cast<float *>(&i);
// Newtons calculation
f = f * ( 1.5f - g * f * f );
return f;
}
/*
================
Math::Log/Log2/Log10
Log of 0 is bad.
I've also heard you're not really
supposed to do log of negatives, yet
they work fine.
================
*/
OG_INLINE float Math::Log( float f ) {
OG_ASSERT( f != 0.0f );
return logf( f );
}
OG_INLINE float Math::Log2( float f ) {
OG_ASSERT( f != 0.0f );
return INV_LN_2 * logf( f );
}
OG_INLINE float Math::Log10( float f ) {
OG_ASSERT( f != 0.0f );
return INV_LN_10 * logf( f );
}
/*
================
Math::Pow
================
*/
OG_INLINE float Math::Pow( float base, float exp ) {
return powf( base, exp );
}
/*
================
Math::Exp
================
*/
OG_INLINE float Math::Exp( float f ) {
return expf( f );
}
/*
================
Math::IsPowerOfTwo
================
*/
OG_INLINE bool Math::IsPowerOfTwo( int x ) {
// This is the faster of the two known methods
// with the x > 0 check moved to the beginning
return x > 0 && ( x & ( x - 1 ) ) == 0;
}
/*
================
Math::HigherPowerOfTwo
================
*/
OG_INLINE int Math::HigherPowerOfTwo( int x ) {
x--;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x + 1;
}
/*
================
Math::LowerPowerOfTwo
================
*/
OG_INLINE int Math::LowerPowerOfTwo( int x ) {
return HigherPowerOfTwo( x ) >> 1;
}
/*
================
Math::FloorPowerOfTwo
================
*/
OG_INLINE int Math::FloorPowerOfTwo( int x ) {
return IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x );
}
/*
================
Math::CeilPowerOfTwo
================
*/
OG_INLINE int Math::CeilPowerOfTwo( int x ) {
return IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x );
}
/*
================
Math::ClosestPowerOfTwo
================
*/
OG_INLINE int Math::ClosestPowerOfTwo( int x ) {
if ( IsPowerOfTwo( x ) )
return x;
int high = HigherPowerOfTwo( x );
int low = high >> 1;
return ((high-x) < (x-low)) ? high : low;
}
/*
================
Math::Digits
================
*/
OG_INLINE int Math::Digits( int x ) {
int digits = 1;
int step = 10;
while (step <= x) {
digits++;
step *= 10;
}
return digits;
}
/*
================
Math::Sin/ASin
================
*/
OG_INLINE float Math::Sin( float f ) {
return sinf( f );
}
OG_INLINE float Math::ASin( float f ) {
if ( f <= -1.0f )
return -HALF_PI;
if ( f >= 1.0f )
return HALF_PI;
return asinf( f );
}
/*
================
Math::Cos/ACos
================
*/
OG_INLINE float Math::Cos( float f ) {
return cosf( f );
}
OG_INLINE float Math::ACos( float f ) {
if ( f <= -1.0f )
return PI;
if ( f >= 1.0f )
return 0.0f;
return acosf( f );
}
/*
================
Math::Tan/ATan
================
*/
OG_INLINE float Math::Tan( float f ) {
return tanf( f );
}
OG_INLINE float Math::ATan( float f ) {
return atanf( f );
}
OG_INLINE float Math::ATan( float f1, float f2 ) {
return atan2f( f1, f2 );
}
/*
================
Math::SinCos
================
*/
OG_INLINE void Math::SinCos( float f, float &s, float &c ) {
#if OG_ASM_MSVC
// sometimes assembler is just waaayy faster
_asm {
fld f
fsincos
mov ecx, c
mov edx, s
fstp dword ptr [ecx]
fstp dword ptr [edx]
}
#elif OG_ASM_GNU
asm ("fsincos" : "=t" (c), "=u" (s) : "0" (f));
#else
s = Sin(f);
c = Sqrt( 1.0f - s * s ); // faster than calling Cos(f)
#endif
}
/*
================
Math::Deg2Rad
================
*/
OG_INLINE float Math::Deg2Rad( float f ) {
return f * DEG_TO_RAD;
}
/*
================
Math::Rad2Deg
================
*/
OG_INLINE float Math::Rad2Deg( float f ) {
return f * RAD_TO_DEG;
}
/*
================
Math::Square
================
*/
OG_INLINE float Math::Square( float v ) {
return v * v;
}
/*
================
Math::Cube
================
*/
OG_INLINE float Math::Cube( float v ) {
return v * v * v;
}
/*
================
Math::Sec2Ms
================
*/
OG_INLINE int Math::Sec2Ms( int sec ) {
return sec * 1000;
}
/*
================
Math::Ms2Sec
================
*/
OG_INLINE int Math::Ms2Sec( int ms ) {
return FtoiFast( ms * 0.001f );
}
}
#endif

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

1396
samples/Eagle/Eagle.brd Normal file

File diff suppressed because it is too large Load Diff

3612
samples/Eagle/Eagle.sch Normal file

File diff suppressed because it is too large Load Diff

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

@@ -0,0 +1,15 @@
-- (c) 2009 Aarne Ranta under LGPL
abstract Foods = {
flags startcat = Comment ;
cat
Comment ; Item ; Kind ; Quality ;
fun
Pred : Item -> Quality -> Comment ;
This, That, These, Those : Kind -> Item ;
Mod : Quality -> Kind -> Kind ;
Wine, Cheese, Fish, Pizza : Kind ;
Very : Quality -> Quality ;
Fresh, Warm, Italian,
Expensive, Delicious, Boring : Quality ;
}

View File

@@ -0,0 +1,79 @@
-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL
concrete FoodsAfr of Foods = open Prelude, Predef in{
flags coding=utf8;
lincat
Comment = {s: Str} ;
Kind = {s: Number => Str} ;
Item = {s: Str ; n: Number} ;
Quality = {s: AdjAP => Str} ;
lin
Pred item quality = {s = item.s ++ "is" ++ (quality.s ! Predic)};
This kind = {s = "hierdie" ++ (kind.s ! Sg); n = Sg};
That kind = {s = "daardie" ++ (kind.s ! Sg); n = Sg};
These kind = {s = "hierdie" ++ (kind.s ! Pl); n = Pl};
Those kind = {s = "daardie" ++ (kind.s ! Pl); n = Pl};
Mod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}};
Wine = declNoun_e "wyn";
Cheese = declNoun_aa "kaas";
Fish = declNoun_ss "vis";
Pizza = declNoun_s "pizza";
Very quality = veryAdj quality;
Fresh = regAdj "vars";
Warm = regAdj "warm";
Italian = smartAdj_e "Italiaans";
Expensive = regAdj "duur";
Delicious = smartAdj_e "heerlik";
Boring = smartAdj_e "vervelig";
param
AdjAP = Attr | Predic ;
Number = Sg | Pl ;
oper
--Noun operations (wyn, kaas, vis, pizza)
declNoun_aa: Str -> {s: Number => Str} = \x ->
let v = tk 2 x
in
{s = table{Sg => x ; Pl => v + (last x) +"e"}};
declNoun_e: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "e"}} ;
declNoun_s: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "s"}} ;
declNoun_ss: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + (last x) + "e"}} ;
--Adjective operations
mkAdj : Str -> Str -> {s: AdjAP => Str} = \x,y -> {s = table{Attr => x; Predic => y}};
declAdj_e : Str -> {s : AdjAP=> Str} = \x -> mkAdj (x + "e") x;
declAdj_g : Str -> {s : AdjAP=> Str} = \w ->
let v = init w
in mkAdj (v + "ë") w ;
declAdj_oog : Str -> {s : AdjAP=> Str} = \w ->
let v = init w
in
let i = init v
in mkAdj (i + "ë") w ;
regAdj : Str -> {s : AdjAP=> Str} = \x -> mkAdj x x;
veryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} = \x -> {s = table{a => "baie" ++ (x.s!a)}};
smartAdj_e : Str -> {s : AdjAP=> Str} = \a -> case a of
{
_ + "oog" => declAdj_oog a ;
_ + ("e" | "ie" | "o" | "oe") + "g" => declAdj_g a ;
_ => declAdj_e a
};
}

View File

@@ -0,0 +1,21 @@
concrete FoodsAmh of Foods ={
flags coding = utf8;
lincat
Comment,Item,Kind,Quality = Str;
lin
Pred item quality = item ++ quality++ "ነው::" ;
This kind = "ይህ" ++ kind;
That kind = "ያ" ++ kind;
Mod quality kind = quality ++ kind;
Wine = "ወይን";
Cheese = "አይብ";
Fish = "ዓሳ";
Very quality = "በጣም" ++ quality;
Fresh = "አዲስ";
Warm = "ትኩስ";
Italian = "የጥልያን";
Expensive = "ውድ";
Delicious = "ጣፋጭ";
Boring = "አስቀያሚ";
}

View File

@@ -0,0 +1,43 @@
-- (c) 2009 Krasimir Angelov under LGPL
concrete FoodsBul of Foods = {
flags
coding = utf8;
param
Gender = Masc | Fem | Neutr;
Number = Sg | Pl;
Agr = ASg Gender | APl ;
lincat
Comment = Str ;
Quality = {s : Agr => Str} ;
Item = {s : Str; a : Agr} ;
Kind = {s : Number => Str; g : Gender} ;
lin
Pred item qual = item.s ++ case item.a of {ASg _ => "е"; APl => "са"} ++ qual.s ! item.a ;
This kind = {s=case kind.g of {Masc=>"този"; Fem=>"тази"; Neutr=>"това" } ++ kind.s ! Sg; a=ASg kind.g} ;
That kind = {s=case kind.g of {Masc=>"онзи"; Fem=>"онази"; Neutr=>"онова"} ++ kind.s ! Sg; a=ASg kind.g} ;
These kind = {s="тези" ++ kind.s ! Pl; a=APl} ;
Those kind = {s="онези" ++ kind.s ! Pl; a=APl} ;
Mod qual kind = {s=\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ;
Wine = {s = table {Sg => "вино"; Pl => "вина"}; g = Neutr};
Cheese = {s = table {Sg => "сирене"; Pl => "сирена"}; g = Neutr};
Fish = {s = table {Sg => "риба"; Pl => "риби"}; g = Fem};
Pizza = {s = table {Sg => "пица"; Pl => "пици"}; g = Fem};
Very qual = {s = \\g => "много" ++ qual.s ! g};
Fresh = {s = table {ASg Masc => "свеж"; ASg Fem => "свежа"; ASg Neutr => "свежо"; APl => "свежи"}};
Warm = {s = table {ASg Masc => "горещ"; ASg Fem => "гореща"; ASg Neutr => "горещо"; APl => "горещи"}};
Italian = {s = table {ASg Masc => "италиански"; ASg Fem => "италианска"; ASg Neutr => "италианско"; APl => "италиански"}};
Expensive = {s = table {ASg Masc => "скъп"; ASg Fem => "скъпа"; ASg Neutr => "скъпо"; APl => "скъпи"}};
Delicious = {s = table {ASg Masc => "превъзходен"; ASg Fem => "превъзходна"; ASg Neutr => "превъзходно"; APl => "превъзходни"}};
Boring = {s = table {ASg Masc => "еднообразен"; ASg Fem => "еднообразна"; ASg Neutr => "еднообразно"; APl => "еднообразни"}};
}

View File

@@ -0,0 +1,7 @@
--# -path=.:present
-- (c) 2009 Jordi Saludes under LGPL
concrete FoodsCat of Foods = FoodsI with
(Syntax = SyntaxCat),
(LexFoods = LexFoodsCat) ;

View File

@@ -0,0 +1,35 @@
concrete FoodsChi of Foods = {
flags coding = utf8 ;
lincat
Comment, Item = Str ;
Kind = {s,c : Str} ;
Quality = {s,p : Str} ;
lin
Pred item quality = item ++ "是" ++ quality.s ++ quality.p ;
This kind = "这" ++ kind.c ++ kind.s ;
That kind = "那" ++ kind.c ++ kind.s ;
These kind = "这" ++ "些" ++ kind.s ;
Those kind = "那" ++ "些" ++ kind.s ;
Mod quality kind = {
s = quality.s ++ quality.p ++ kind.s ;
c = kind.c
} ;
Wine = geKind "酒" ;
Pizza = geKind "比 萨 饼" ;
Cheese = geKind "奶 酪" ;
Fish = geKind "鱼" ;
Very quality = longQuality ("非 常" ++ quality.s) ;
Fresh = longQuality "新 鲜" ;
Warm = longQuality "温 热" ;
Italian = longQuality "意 大 利 式" ;
Expensive = longQuality "昂 贵" ;
Delicious = longQuality "美 味" ;
Boring = longQuality "难 吃" ;
oper
mkKind : Str -> Str -> {s,c : Str} = \s,c ->
{s = s ; c = c} ;
geKind : Str -> {s,c : Str} = \s ->
mkKind s "个" ;
longQuality : Str -> {s,p : Str} = \s ->
{s = s ; p = "的"} ;
}

View File

@@ -0,0 +1,35 @@
-- (c) 2011 Katerina Bohmova under LGPL
concrete FoodsCze of Foods = open ResCze in {
flags
coding = utf8 ;
lincat
Comment = {s : Str} ;
Quality = Adjective ;
Kind = Noun ;
Item = NounPhrase ;
lin
Pred item quality =
{s = item.s ++ copula ! item.n ++
quality.s ! item.g ! item.n} ;
This = det Sg "tento" "tato" "toto" ;
That = det Sg "tamten" "tamta" "tamto" ;
These = det Pl "tyto" "tyto" "tato" ;
Those = det Pl "tamty" "tamty" "tamta" ;
Mod quality kind = {
s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;
g = kind.g
} ;
Wine = noun "víno" "vína" Neutr ;
Cheese = noun "sýr" "sýry" Masc ;
Fish = noun "ryba" "ryby" Fem ;
Pizza = noun "pizza" "pizzy" Fem ;
Very qual = {s = \\g,n => "velmi" ++ qual.s ! g ! n} ;
Fresh = regAdj "čerstv" ;
Warm = regAdj "tepl" ;
Italian = regAdj "italsk" ;
Expensive = regAdj "drah" ;
Delicious = regnfAdj "vynikající" ;
Boring = regAdj "nudn" ;
}

View File

@@ -0,0 +1,58 @@
-- (c) 2009 Femke Johansson under LGPL
concrete FoodsDut of Foods = {
lincat
Comment = {s : Str};
Quality = {s : AForm => Str};
Kind = { s : Number => Str};
Item = {s : Str ; n : Number};
lin
Pred item quality =
{s = item.s ++ copula ! item.n ++ quality.s ! APred};
This = det Sg "deze";
These = det Pl "deze";
That = det Sg "die";
Those = det Pl "die";
Mod quality kind =
{s = \\n => quality.s ! AAttr ++ kind.s ! n};
Wine = regNoun "wijn";
Cheese = noun "kaas" "kazen";
Fish = noun "vis" "vissen";
Pizza = noun "pizza" "pizza's";
Very a = {s = \\f => "erg" ++ a.s ! f};
Fresh = regadj "vers";
Warm = regadj "warm";
Italian = regadj "Italiaans";
Expensive = adj "duur" "dure";
Delicious = regadj "lekker";
Boring = regadj "saai";
param
Number = Sg | Pl;
AForm = APred | AAttr;
oper
det : Number -> Str ->
{s : Number => Str} -> {s : Str ; n: Number} =
\n,det,noun -> {s = det ++ noun.s ! n ; n=n};
noun : Str -> Str -> {s : Number => Str} =
\man,men -> {s = table {Sg => man; Pl => men}};
regNoun : Str -> {s : Number => Str} =
\wijn -> noun wijn (wijn + "en");
regadj : Str -> {s : AForm => Str} =
\koud -> adj koud (koud+"e");
adj : Str -> Str -> {s : AForm => Str} =
\duur, dure -> {s = table {APred => duur; AAttr => dure}};
copula : Number => Str =
table {Sg => "is" ; Pl => "zijn"};
}

View File

@@ -0,0 +1,43 @@
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsEng of Foods = {
flags language = en_US;
lincat
Comment, Quality = {s : Str} ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality =
{s = item.s ++ copula ! item.n ++ quality.s} ;
This = det Sg "this" ;
That = det Sg "that" ;
These = det Pl "these" ;
Those = det Pl "those" ;
Mod quality kind =
{s = \\n => quality.s ++ kind.s ! n} ;
Wine = regNoun "wine" ;
Cheese = regNoun "cheese" ;
Fish = noun "fish" "fish" ;
Pizza = regNoun "pizza" ;
Very a = {s = "very" ++ a.s} ;
Fresh = adj "fresh" ;
Warm = adj "warm" ;
Italian = adj "Italian" ;
Expensive = adj "expensive" ;
Delicious = adj "delicious" ;
Boring = adj "boring" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str ->
{s : Number => Str} -> {s : Str ; n : Number} =
\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;
noun : Str -> Str -> {s : Number => Str} =
\man,men -> {s = table {Sg => man ; Pl => men}} ;
regNoun : Str -> {s : Number => Str} =
\car -> noun car (car + "s") ;
adj : Str -> {s : Str} =
\cold -> {s = cold} ;
copula : Number => Str =
table {Sg => "is" ; Pl => "are"} ;
}

View File

@@ -0,0 +1,48 @@
-- (c) 2009 Julia Hammar under LGPL
concrete FoodsEpo of Foods = open Prelude in {
flags coding =utf8 ;
lincat
Comment = SS ;
Kind, Quality = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ;
This = det Sg "ĉi tiu" ;
That = det Sg "tiu" ;
These = det Pl "ĉi tiuj" ;
Those = det Pl "tiuj" ;
Mod quality kind = {s = \\n => quality.s ! n ++ kind.s ! n} ;
Wine = regNoun "vino" ;
Cheese = regNoun "fromaĝo" ;
Fish = regNoun "fiŝo" ;
Pizza = regNoun "pico" ;
Very quality = {s = \\n => "tre" ++ quality.s ! n} ;
Fresh = regAdj "freŝa" ;
Warm = regAdj "varma" ;
Italian = regAdj "itala" ;
Expensive = regAdj "altekosta" ;
Delicious = regAdj "bongusta" ;
Boring = regAdj "enuiga" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =
\n,d,cn -> {
s = d ++ cn.s ! n ;
n = n
} ;
regNoun : Str -> {s : Number => Str} =
\vino -> {s = table {Sg => vino ; Pl => vino + "j"}
} ;
regAdj : Str -> {s : Number => Str} =
\nova -> {s = table {Sg => nova ; Pl => nova + "j"}
} ;
copula : Number => Str = \\_ => "estas" ;
}

View File

@@ -0,0 +1,7 @@
--# -path=.:present
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsFin of Foods = FoodsI with
(Syntax = SyntaxFin),
(LexFoods = LexFoodsFin) ;

View File

@@ -0,0 +1,32 @@
--# -path=.:../foods:present
concrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in {
flags coding = utf8 ;
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_QuantSg kind ;
That kind = mkNP that_QuantSg kind ;
These kind = mkNP these_QuantPl kind ;
Those kind = mkNP those_QuantPl kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN (mkN "vin" masculine) ;
Pizza = mkCN (mkN "pizza" feminine) ;
Cheese = mkCN (mkN "fromage" masculine) ;
Fish = mkCN (mkN "poisson" masculine) ;
Fresh = mkAP (mkA "frais" "fraîche" "frais" "fraîchement") ;
Warm = mkAP (mkA "chaud") ;
Italian = mkAP (mkA "italien") ;
Expensive = mkAP (mkA "cher") ;
Delicious = mkAP (mkA "délicieux") ;
Boring = mkAP (mkA "ennuyeux") ;
}

View File

@@ -0,0 +1,7 @@
--# -path=.:present
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsGer of Foods = FoodsI with
(Syntax = SyntaxGer),
(LexFoods = LexFoodsGer) ;

View File

@@ -0,0 +1,108 @@
--# -path=alltenses
--(c) 2009 Dana Dannells
-- Licensed under LGPL
concrete FoodsHeb of Foods = open Prelude in {
flags coding=utf8 ;
lincat
Comment = SS ;
Quality = {s: Number => Species => Gender => Str} ;
Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ;
Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ;
lin
Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ;
This = det Sg Def "הזה" "הזאת";
That = det Sg Def "ההוא" "ההיא" ;
These = det Pl Def "האלה" "האלה" ;
Those = det Pl Def "ההם" "ההן" ;
Mod quality kind = {
s = \\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g;
g = kind.g ;
mod = T
} ;
Wine = regNoun "יין" "יינות" Masc ;
Cheese = regNoun "גבינה" "גבינות" Fem ;
Fish = regNoun "דג" "דגים" Masc ;
Pizza = regNoun "פיצה" "פיצות" Fem ;
Very qual = {s = \\g,n,sp => "מאוד" ++ qual.s ! g ! n ! sp} ;
Fresh = regAdj "טרי" ;
Warm = regAdj "חם" ;
Italian = regAdj2 "איטלקי" ;
Expensive = regAdj "יקר" ;
Delicious = regAdj "טעים" ;
Boring = regAdj2 "משעמם";
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
Species = Def | Indef ;
Modified = T | F ;
oper
Noun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ;
Adj : Type = {s : Number => Species => Gender => Str} ;
det : Number -> Species -> Str -> Str -> Noun ->
{s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} =
\n,sp,m,f,cn -> {
s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem => f} };
g = cn.g ;
n = n ;
sp = sp ;
mod = cn.mod
} ;
noun : (gvina,hagvina,gvinot,hagvinot : Str) -> Gender -> Noun =
\gvina,hagvina,gvinot,hagvinot,g -> {
s = table {
Sg => table {
Indef => gvina ;
Def => hagvina
} ;
Pl => table {
Indef => gvinot ;
Def => hagvinot
}
} ;
g = g ;
mod = F
} ;
regNoun : Str -> Str -> Gender -> Noun =
\gvina,gvinot, g ->
noun gvina (defH gvina) gvinot (defH gvinot) g ;
defH : Str -> Str = \cn ->
case cn of {_ => "ה" + cn};
replaceLastLetter : Str -> Str = \c ->
case c of {"ף" => "פ" ; "ם" => "מ" ; "ן" => "נ" ; "ץ" => "צ" ; "ך" => "כ"; _ => c} ;
adjective : (_,_,_,_ : Str) -> Adj =
\tov,tova,tovim,tovot -> {
s = table {
Sg => table {
Indef => table { Masc => tov ; Fem => tova } ;
Def => table { Masc => defH tov ; Fem => defH tova }
} ;
Pl => table {
Indef => table {Masc => tovim ; Fem => tovot } ;
Def => table { Masc => defH tovim ; Fem => defH tovot }
}
}
} ;
regAdj : Str -> Adj = \tov ->
case tov of { to + c@? =>
adjective tov (to + replaceLastLetter (c) + "ה" ) (to + replaceLastLetter (c) +"ים" ) (to + replaceLastLetter (c) + "ות" )};
regAdj2 : Str -> Adj = \italki ->
case italki of { italk+ c@? =>
adjective italki (italk + replaceLastLetter (c) +"ת" ) (italk + replaceLastLetter (c)+ "ים" ) (italk + replaceLastLetter (c) + "ות" )};
} -- FoodsHeb

View File

@@ -0,0 +1,75 @@
-- (c) 2010 Vikash Rauniyar under LGPL
concrete FoodsHin of Foods = {
flags coding=utf8 ;
param
Gender = Masc | Fem ;
Number = Sg | Pl ;
lincat
Comment = {s : Str} ;
Item = {s : Str ; g : Gender ; n : Number} ;
Kind = {s : Number => Str ; g : Gender} ;
Quality = {s : Gender => Number => Str} ;
lin
Pred item quality = {
s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n
} ;
This kind = {s = "यह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
That kind = {s = "वह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
These kind = {s = "ये" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Those kind = {s = "वे" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Mod quality kind = {
s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;
g = kind.g
} ;
Wine = regN "मदिरा" ;
Cheese = regN "पनीर" ;
Fish = regN "मछली" ;
Pizza = regN "पिज़्ज़ा" ;
Very quality = {s = \\g,n => "अति" ++ quality.s ! g ! n} ;
Fresh = regAdj "ताज़ा" ;
Warm = regAdj "गरम" ;
Italian = regAdj "इटली" ;
Expensive = regAdj "बहुमूल्य" ;
Delicious = regAdj "स्वादिष्ट" ;
Boring = regAdj "अरुचिकर" ;
oper
mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\s,p,g -> {
s = table {
Sg => s ;
Pl => p
} ;
g = g
} ;
regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of {
lark + "ा" => mkN s (lark + "े") Masc ;
lark + "ी" => mkN s (lark + "ीयँा") Fem ;
_ => mkN s s Masc
} ;
mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> {
s = table {
Masc => table {
Sg => ms ;
Pl => mp
} ;
Fem => \\_ => f
}
} ;
regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of {
acch + "ा" => mkAdj a (acch + "े") (acch + "ी") ;
_ => mkAdj a a a
} ;
copula : Number -> Str = \n -> case n of {
Sg => "है" ;
Pl => "हैं"
} ;
}

View File

@@ -0,0 +1,29 @@
-- (c) 2009 Aarne Ranta under LGPL
incomplete concrete FoodsI of Foods =
open Syntax, LexFoods in {
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_Det kind ;
That kind = mkNP that_Det kind ;
These kind = mkNP these_Det kind ;
Those kind = mkNP those_Det kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN wine_N ;
Pizza = mkCN pizza_N ;
Cheese = mkCN cheese_N ;
Fish = mkCN fish_N ;
Fresh = mkAP fresh_A ;
Warm = mkAP warm_A ;
Italian = mkAP italian_A ;
Expensive = mkAP expensive_A ;
Delicious = mkAP delicious_A ;
Boring = mkAP boring_A ;
}

View File

@@ -0,0 +1,84 @@
--# -path=.:prelude
-- (c) 2009 Martha Dis Brandt under LGPL
concrete FoodsIce of Foods = open Prelude in {
flags coding=utf8;
lincat
Comment = SS ;
Quality = {s : Gender => Number => Defin => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number} ;
lin
Pred item quality = ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ;
This, That = det Sg "þessi" "þessi" "þetta" ;
These, Those = det Pl "þessir" "þessar" "þessi" ;
Mod quality kind = { s = \\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;
Wine = noun "vín" "vín" Neutr ;
Cheese = noun "ostur" "ostar" Masc ;
Fish = noun "fiskur" "fiskar" Masc ;
-- the word "pizza" is more commonly used in Iceland, but "flatbaka" is the Icelandic word for it
Pizza = noun "flatbaka" "flatbökur" Fem ;
Very qual = {s = \\g,n,defOrInd => "mjög" ++ qual.s ! g ! n ! defOrInd } ;
Fresh = regAdj "ferskur" ;
Warm = regAdj "heitur" ;
Boring = regAdj "leiðinlegur" ;
-- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef
Italian = adjective "ítalskur" "ítölsk" "ítalskt" "ítalskir" "ítalskar" "ítölsk" "ítalski" "ítalska" "ítalsku" ;
Expensive = adjective "dýr" "dýr" "dýrt" "dýrir" "dýrar" "dýr" "dýri" "dýra" "dýru" ;
Delicious = adjective "ljúffengur" "ljúffeng" "ljúffengt" "ljúffengir" "ljúffengar" "ljúffeng" "ljúffengi" "ljúffenga" "ljúffengu" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem | Neutr ;
Defin = Ind | Def ;
oper
det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} ->
{s : Str ; g : Gender ; n : Number} =
\n,masc,fem,neutr,cn -> {
s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ;
g = cn.g ;
n = n
} ;
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\man,men,g -> {
s = table {
Sg => man ;
Pl => men
} ;
g = g
} ;
adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} =
\ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> {
s = \\g,n,t => case <g,n,t> of {
< Masc, Sg, Ind > => ferskur ;
< Masc, Pl, Ind > => ferskir ;
< Fem, Sg, Ind > => fersk ;
< Fem, Pl, Ind > => ferskar ;
< Neutr, Sg, Ind > => ferskt ;
< Neutr, Pl, Ind > => fersk_pl;
< Masc, Sg, Def > => ferski ;
< Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ;
< _ , Pl, Def > => fersku
}
} ;
regAdj : Str -> {s : Gender => Number => Defin => Str} = \ferskur ->
let fersk = Predef.tk 2 ferskur
in adjective
ferskur fersk (fersk + "t")
(fersk + "ir") (fersk + "ar") fersk
(fersk + "i") (fersk + "a") (fersk + "u") ;
copula : Number -> Str =
\n -> case n of {
Sg => "er" ;
Pl => "eru"
} ;
}

View File

@@ -0,0 +1,8 @@
--# -path=.:present
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsIta of Foods = FoodsI with
(Syntax = SyntaxIta),
(LexFoods = LexFoodsIta) ;

View File

@@ -0,0 +1,72 @@
--# -path=.:../lib/src/prelude
-- (c) 2009 Zofia Stankiewicz under LGPL
concrete FoodsJpn of Foods = open Prelude in {
flags coding=utf8 ;
lincat
Comment = {s: Style => Str};
Quality = {s: AdjUse => Str ; t: AdjType} ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality = {s = case quality.t of {
IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ;
NaAdj => \\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n }
} ;
This = det Sg "この" ;
That = det Sg "その" ;
These = det Pl "この" ;
Those = det Pl "その" ;
Mod quality kind = {s = \\n => quality.s ! Attr ++ kind.s ! n} ;
Wine = regNoun "ワインは" ;
Cheese = regNoun "チーズは" ;
Fish = regNoun "魚は" ;
Pizza = regNoun "ピザは" ;
Very quality = {s = \\a => "とても" ++ quality.s ! a ; t = quality.t } ;
Fresh = adj "新鮮な" "新鮮";
Warm = regAdj "あたたかい" ;
Italian = adj "イタリアの" "イタリアのもの";
Expensive = regAdj "たかい" ;
Delicious = regAdj "おいしい" ;
Boring = regAdj "つまらない" ;
param
Number = Sg | Pl ;
AdjUse = Attr | APred ; -- na-adjectives have different forms as noun attributes and predicates
Style = Plain | Polite ; -- for phrase types
AdjType = IAdj | NaAdj ; -- IAdj can form predicates without the copula, NaAdj cannot
oper
det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =
\n,d,cn -> {
s = d ++ cn.s ! n ;
n = n
} ;
noun : Str -> Str -> {s : Number => Str} =
\sakana,sakana -> {s = \\_ => sakana } ;
regNoun : Str -> {s : Number => Str} =
\sakana -> noun sakana sakana ;
adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} =
\chosenna, chosen -> {
s = table {
Attr => chosenna ;
APred => chosen
} ;
t = NaAdj
} ;
regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\akai -> {
s = \\_ => akai ; t = IAdj} ;
copula : Style => Number => Str =
table {
Plain => \\_ => "だ" ;
Polite => \\_ => "です" } ;
}

View File

@@ -0,0 +1,91 @@
--# -path=.:prelude
-- (c) 2009 Inese Bernsone under LGPL
concrete FoodsLav of Foods = open Prelude in {
flags
coding=utf8 ;
lincat
Comment = SS ;
Quality = {s : Q => Gender => Number => Defin => Str } ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number } ;
lin
Pred item quality = ss (item.s ++ {- copula item.n -} "ir" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ;
This = det Sg "šis" "šī" ;
That = det Sg "tas" "tā" ;
These = det Pl "šie" "šīs" ;
Those = det Pl "tie" "tās" ;
Mod quality kind = {s = \\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;
Wine = noun "vīns" "vīni" Masc ;
Cheese = noun "siers" "sieri" Masc ;
Fish = noun "zivs" "zivis" Fem ;
Pizza = noun "pica" "picas" Fem ;
Very qual = {s = \\q,g,n,spec => "ļoti" ++ qual.s ! Q2 ! g ! n ! spec };
Fresh = adjective "svaigs" "svaiga" "svaigi" "svaigas" "svaigais" "svaigā" "svaigie" "svaigās" ;
Warm = regAdj "silts" ;
Italian = specAdj "itāļu" (regAdj "itālisks") ;
Expensive = regAdj "dārgs" ;
Delicious = regAdj "garšīgs" ;
Boring = regAdj "garlaicīgs" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
Defin = Ind | Def ;
Q = Q1 | Q2 ;
oper
det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} ->
{s : Str ; g : Gender ; n : Number} =
\n,m,f,cn -> {
s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ;
g = cn.g ;
n = n
} ;
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\man,men,g -> {
s = table {
Sg => man ;
Pl => men
} ;
g = g
} ;
adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} =
\skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> {
s = table {
_ => table {
Masc => table {
Sg => table {Ind => skaists ; Def => skaistais} ;
Pl => table {Ind => skaisti ; Def => skaistie}
} ;
Fem => table {
Sg => table {Ind => skaista ; Def => skaistaa} ;
Pl => table {Ind => skaistas ; Def => skaistaas}
}
}
}
} ;
{- irregAdj : Str -> {s : Gender => Number => Defin => Str} = \itaalju ->
let itaalju = itaalju
in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -}
regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \skaists ->
let skaist = init skaists
in adjective skaists (skaist + "a") (skaist + "i") (skaist + "as") (skaist + "ais") (skaist + "ā") (skaist + "ie") (skaist + "ās");
Adjective : Type = {s : Q => Gender => Number => Defin => Str} ;
specAdj : Str -> Adjective -> Adjective = \s,a -> {
s = table {
Q2 => a.s ! Q1 ;
Q1 => \\_,_,_ => s
}
} ;
}

View File

@@ -0,0 +1,105 @@
-- (c) 2013 John J. Camilleri under LGPL
concrete FoodsMlt of Foods = open Prelude in {
flags coding=utf8 ;
lincat
Comment = SS ;
Quality = {s : Gender => Number => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; g : Gender ; n : Number} ;
lin
-- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ;
Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ;
This kind = det Sg "dan" "din" kind ;
That kind = det Sg "dak" "dik" kind ;
These kind = det Pl "dawn" "" kind ;
Those kind = det Pl "dawk" "" kind ;
Mod quality kind = {
s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ;
g = kind.g
} ;
Wine = noun "inbid" "inbejjed" Masc ;
Cheese = noun "ġobon" "ġobniet" Masc ;
Fish = noun "ħuta" "ħut" Fem ;
Pizza = noun "pizza" "pizzez" Fem ;
Very qual = {s = \\g,n => qual.s ! g ! n ++ "ħafna"} ;
Warm = adjective "sħun" "sħuna" "sħan" ;
Expensive = adjective "għali" "għalja" "għaljin" ;
Delicious = adjective "tajjeb" "tajba" "tajbin" ;
Boring = uniAdj "tad-dwejjaq" ;
Fresh = regAdj "frisk" ;
Italian = regAdj "Taljan" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
--Create an adjective (full function)
--Params: Sing Masc, Sing Fem, Plural
adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \iswed,sewda,suwed -> {
s = table {
Masc => table {
Sg => iswed ;
Pl => suwed
} ;
Fem => table {
Sg => sewda ;
Pl => suwed
}
}
} ;
--Create a regular adjective
--Param: Sing Masc
regAdj : Str -> {s : Gender => Number => Str} = \frisk ->
adjective frisk (frisk + "a") (frisk + "i") ;
--Create a "uni-adjective" eg tal-buzz
--Param: Sing Masc
uniAdj : Str -> {s : Gender => Number => Str} = \uni ->
adjective uni uni uni ;
--Create a noun
--Params: Singular, Plural, Gender (inherent)
noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \ktieb,kotba,g -> {
s = table {
Sg => ktieb ;
Pl => kotba
} ;
g = g
} ;
--Copula is a linking verb
--Params: Number, Gender
-- copula : Number -> Gender -> Str = \n,g -> case n of {
-- Sg => case g of { Masc => "huwa" ; Fem => "hija" } ;
-- Pl => "huma"
-- } ;
--Create an article, taking into account first letter of next word
article = pre {
"a"|"e"|"i"|"o"|"u" => "l-" ;
--cons@("ċ"|"d"|"n"|"r"|"s"|"t"|"x"|"ż") => "i" + cons + "-" ;
_ => "il-"
} ;
--Create a determinant
--Params: Sg/Pl, Masc, Fem
det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> {
s = case n of {
Sg => case cn.g of {Masc => m ; Fem => f}; --string
Pl => m --default to masc
} ++ article ++ cn.s ! n ;
g = cn.g ; --gender
n = n --number
} ;
}

View File

@@ -0,0 +1,49 @@
--# -path=.:/GF/lib/src/prelude
-- (c) 2009 Nyamsuren Erdenebadrakh under LGPL
concrete FoodsMon of Foods = open Prelude in {
flags coding=utf8;
lincat
Comment, Quality = SS ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality = ss (item.s ++ "бол" ++ quality.s) ;
This = det Sg "энэ" ;
That = det Sg "тэр" ;
These = det Pl "эдгээр" ;
Those = det Pl "тэдгээр" ;
Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ;
Wine = regNoun "дарс" ;
Cheese = regNoun "бяслаг" ;
Fish = regNoun "загас" ;
Pizza = regNoun "пицца" ;
Very = prefixSS "маш" ;
Fresh = ss "шинэ" ;
Warm = ss "халуун" ;
Italian = ss "итали" ;
Expensive = ss "үнэтэй" ;
Delicious = ss "амттай" ;
Boring = ss "амтгүй" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =
\n,d,cn -> {
s = d ++ cn.s ! n ;
n = n
} ;
regNoun : Str -> {s : Number => Str} =
\x -> {s = table {
Sg => x ;
Pl => x + "нууд"}
} ;
}

View File

@@ -0,0 +1,60 @@
-- (c) 2011 Dinesh Simkhada under LGPL
concrete FoodsNep of Foods = {
flags coding = utf8 ;
lincat
Comment, Quality = {s : Str} ;
Kind = {s : Number => Str} ;
Item = {s : Str ; n : Number} ;
lin
Pred item quality =
{s = item.s ++ quality.s ++ copula ! item.n} ;
This = det Sg "यो" ;
That = det Sg "त्यो" ;
These = det Pl "यी" ;
Those = det Pl "ती" ;
Mod quality kind =
{s = \\n => quality.s ++ kind.s ! n} ;
Wine = regNoun "रक्सी" ;
Cheese = regNoun "चिज" ;
Fish = regNoun "माछा" ;
Pizza = regNoun "पिज्जा" ;
Very a = {s = "धेरै" ++ a.s} ;
Fresh = adj "ताजा" ;
Warm = adj "तातो" ;
Italian = adj "इटालियन" ;
Expensive = adj "महँगो" | adj "बहुमूल्य" ;
Delicious = adj "स्वादिष्ट" | adj "मीठो" ;
Boring = adjPl "नमिठो" ;
param
Number = Sg | Pl ;
oper
det : Number -> Str ->
{s : Number => Str} -> {s : Str ; n : Number} =
\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;
noun : Str -> Str -> {s : Number => Str} =
\man,men -> {s = table {Sg => man ; Pl => men}} ;
regNoun : Str -> {s : Number => Str} =
\car -> noun car (car + "हरु") ;
adjPl : Str -> {s : Str} = \a -> case a of {
bor + "ठो" => adj (bor + "ठा") ;
_ => adj a
} ;
adj : Str -> {s : Str} =
\cold -> {s = cold} ;
copula : Number => Str =
table {Sg => "छ" ; Pl => "छन्"} ;
}

View File

@@ -0,0 +1,30 @@
concrete FoodsOri of Foods = {
flags coding = utf8 ;
lincat
Comment = Str;
Item = Str;
Kind = Str;
Quality = Str;
lin
Pred item quality = item ++ quality ++ "ଅଟେ";
This kind = "ଏଇ" ++ kind;
That kind = "ସେଇ" ++ kind;
These kind = "ଏଇ" ++ kind ++ "ଗୁଡିକ" ;
Those kind = "ସେଇ" ++ kind ++ "ଗୁଡିକ" ;
Mod quality kind = quality ++ kind;
Wine = "ମଦ";
Cheese = "ଛେନା";
Fish = "ମାଛ";
Pizza = "ପିଜଜ଼ା" ;
Very quality = "ଅତି" ++ quality;
Fresh = "ତାଜା";
Warm = "ଗରମ";
Italian = "ଇଟାଲି";
Expensive = "ମୁଲ୍ୟବାନ୍";
Delicious = "ସ୍ଵାଦିସ୍ଟ ";
Boring = "ଅରୁଚିକର";
}

View File

@@ -0,0 +1,65 @@
concrete FoodsPes of Foods = {
flags optimize=noexpand ; coding=utf8 ;
lincat
Comment = {s : Str} ;
Quality = {s : Add => Str; prep : Str} ;
Kind = {s : Add => Number => Str ; prep : Str};
Item = {s : Str ; n : Number};
lin
Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ;
This = det Sg "این" ;
That = det Sg "آن" ;
These = det Pl "این" ;
Those = det Pl "آن" ;
Mod quality kind = {s = \\a,n => kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ;
prep = quality.prep
};
Wine = regN "شراب" ;
Cheese = regN "پنیر" ;
Fish = regN "ماهى" ;
Pizza = regN "پیتزا" ;
Very a = {s = \\at => "خیلی" ++ a.s ! at ; prep = a.prep} ;
Fresh = adj "تازه" ;
Warm = adj "گرم" ;
Italian = adj "ایتالیایی" ;
Expensive = adj "گران" ;
Delicious = adj "لذىذ" ;
Boring = adj "ملال آور" ; -- it must be written as ملال آور.
param
Number = Sg | Pl ;
Add = Indep | Attr ;
oper
det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} =
\n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n };
noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \pytzA, pytzAy, pytzAhA,pr ->
{s = \\a,n => case <a,n> of
{<Indep,Sg> => pytzA ; <Indep,Pl> => pytzAhA ;
<Attr,Sg> =>pytzA ; <Attr,Pl> => pytzAhA + "ى" };
prep = pr
};
regN : Str -> {s: Add => Number => Str ; prep : Str} = \mrd ->
case mrd of
{ _ + ("ا"|"ه"|"ى"|"و"|"") => noun mrd (mrd+"ى") (mrd + "ها") "";
_ => noun mrd mrd (mrd + "ها") "e"
};
adj : Str -> {s : Add => Str; prep : Str} = \tAzh ->
case tAzh of
{ _ + ("ا"|"ه"|"ى"|"و"|"") => mkAdj tAzh (tAzh ++ "ى") "" ;
_ => mkAdj tAzh tAzh "ه"
};
mkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \tAzh, tAzhy, pr ->
{s = table {Indep => tAzh;
Attr => tAzhy};
prep = pr
};
copula : Number => Str = table {Sg => "است"; Pl => "هستند"};
}

View File

@@ -0,0 +1,79 @@
-- (c) 2009 Rami Shashati under LGPL
concrete FoodsPor of Foods = open Prelude in {
flags coding=utf8;
lincat
Comment = {s : Str} ;
Quality = {s : Gender => Number => Str} ;
Kind = {s : Number => Str ; g : Gender} ;
Item = {s : Str ; n : Number ; g : Gender } ;
lin
Pred item quality =
{s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ;
This = det Sg (table {Masc => "este" ; Fem => "esta"}) ;
That = det Sg (table {Masc => "esse" ; Fem => "essa"}) ;
These = det Pl (table {Masc => "estes" ; Fem => "estas"}) ;
Those = det Pl (table {Masc => "esses" ; Fem => "essas"}) ;
Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ;
Wine = regNoun "vinho" Masc ;
Cheese = regNoun "queijo" Masc ;
Fish = regNoun "peixe" Masc ;
Pizza = regNoun "pizza" Fem ;
Very a = { s = \\g,n => "muito" ++ a.s ! g ! n } ;
Fresh = mkAdjReg "fresco" ;
Warm = mkAdjReg "quente" ;
Italian = mkAdjReg "Italiano" ;
Expensive = mkAdjReg "caro" ;
Delicious = mkAdjReg "delicioso" ;
Boring = mkAdjReg "chato" ;
param
Number = Sg | Pl ;
Gender = Masc | Fem ;
oper
QualityT : Type = {s : Gender => Number => Str} ;
mkAdj : (_,_,_,_ : Str) -> QualityT = \bonito,bonita,bonitos,bonitas -> {
s = table {
Masc => table { Sg => bonito ; Pl => bonitos } ;
Fem => table { Sg => bonita ; Pl => bonitas }
} ;
} ;
-- regular pattern
adjSozinho : Str -> QualityT = \sozinho ->
let sozinh = Predef.tk 1 sozinho
in mkAdj sozinho (sozinh + "a") (sozinh + "os") (sozinh + "as") ;
-- for gender-independent adjectives
adjUtil : Str -> Str -> QualityT = \util,uteis ->
mkAdj util util uteis uteis ;
-- smart paradigm for adjcetives
mkAdjReg : Str -> QualityT = \a -> case last a of {
"o" => adjSozinho a ;
"e" => adjUtil a (a + "s")
} ;
ItemT : Type = {s : Str ; n : Number ; g : Gender } ;
det : Number -> (Gender => Str) -> KindT -> ItemT =
\num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ;
KindT : Type = {s : Number => Str ; g : Gender} ;
noun : Str -> Str -> Gender -> KindT =
\animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ;
regNoun : Str -> Gender -> KindT =
\carro,gen -> noun carro (carro + "s") gen ;
copula : Number => Str = table {Sg => "é" ; Pl => "são"} ;
}

View File

@@ -0,0 +1,72 @@
-- (c) 2009 Ramona Enache under LGPL
concrete FoodsRon of Foods =
{
flags coding=utf8 ;
param Number = Sg | Pl ;
Gender = Masc | Fem ;
NGender = NMasc | NFem | NNeut ;
lincat
Comment = {s : Str};
Quality = {s : Number => Gender => Str};
Kind = {s : Number => Str; g : NGender};
Item = {s : Str ; n : Number; g : Gender};
lin
This = det Sg (mkTab "acest" "această");
That = det Sg (mkTab "acel" "acea");
These = det Pl (mkTab "acești" "aceste");
Those = det Pl (mkTab "acei" "acele");
Wine = mkNoun "vin" "vinuri" NNeut ;
Cheese = mkNoun "brânză" "brânzeturi" NFem ;
Fish = mkNoun "peşte" "peşti" NMasc ;
Pizza = mkNoun "pizza" "pizze" NFem;
Very a = {s = \\n,g => "foarte" ++ a.s ! n ! g};
Fresh = mkAdj "proaspăt" "proaspătă" "proaspeţi" "proaspete" ;
Warm = mkAdj "cald" "caldă" "calzi" "calde" ;
Italian = mkAdj "italian" "italiană" "italieni" "italiene" ;
Expensive = mkAdj "scump" "scumpă" "scumpi" "scumpe" ;
Delicious = mkAdj "delicios" "delcioasă" "delicioşi" "delicioase" ;
Boring = mkAdj "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ;
Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ;
Mod quality kind = {s = \\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g};
oper
mkTab : Str -> Str -> {s : Gender => Str} = \acesta, aceasta ->
{s = table{Masc => acesta;
Fem => aceasta}};
det : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} =
\n,det,noun -> let gg = getAgrGender noun.g n
in
{s = det.s ! gg ++ noun.s ! n ; n = n ; g = gg};
mkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \peste, pesti,g ->
{s = table {Sg => peste;
Pl => pesti};
g = g
};
oper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \scump, scumpa, scumpi, scumpe ->
{s = \\n,g => case <n,g> of
{<Sg,Masc> => scump ; <Sg,Fem> => scumpa;
<Pl,Masc> => scumpi ; <Pl,Fem> => scumpe
}};
copula : Number => Str = table {Sg => "este" ; Pl => "sunt"};
getAgrGender : NGender -> Number -> Gender = \ng,n ->
case <ng,n> of
{<NMasc,_> => Masc ; <NFem,_> => Fem;
<NNeut,Sg> => Masc ; <NNeut,Pl> => Fem
};
}

View File

@@ -0,0 +1,31 @@
--# -path=.:present
concrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in {
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_QuantSg kind ;
That kind = mkNP that_QuantSg kind ;
These kind = mkNP these_QuantPl kind ;
Those kind = mkNP those_QuantPl kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN (mkN "vino") ;
Pizza = mkCN (mkN "pizza") ;
Cheese = mkCN (mkN "queso") ;
Fish = mkCN (mkN "pescado") ;
Fresh = mkAP (mkA "fresco") ;
Warm = mkAP (mkA "caliente") ;
Italian = mkAP (mkA "italiano") ;
Expensive = mkAP (mkA "caro") ;
Delicious = mkAP (mkA "delicioso") ;
Boring = mkAP (mkA "aburrido") ;
}

View File

@@ -0,0 +1,7 @@
--# -path=.:present
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsSwe of Foods = FoodsI with
(Syntax = SyntaxSwe),
(LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ;

View File

@@ -0,0 +1,33 @@
--# -path=.:alltenses
concrete FoodsTha of Foods = open SyntaxTha, LexiconTha,
ParadigmsTha, (R=ResTha) in {
flags coding = utf8 ;
lincat
Comment = Utt ;
Item = NP ;
Kind = CN ;
Quality = AP ;
lin
Pred item quality = mkUtt (mkCl item quality) ;
This kind = mkNP this_Det kind ;
That kind = mkNP that_Det kind ;
These kind = mkNP these_Det kind ;
Those kind = mkNP those_Det kind ;
Mod quality kind = mkCN quality kind ;
Very quality = mkAP very_AdA quality ;
Wine = mkCN (mkN (R.thword "เหล้าอ" "งุ่น") "ขวด") ;
Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ;
Cheese = mkCN (mkN (R.thword "เนย" "แข็ง") "ก้อน") ;
Fish = mkCN fish_N ;
Fresh = mkAP (mkA "สด") ;
Warm = mkAP warm_A ;
Italian = mkAP (mkA " อิตาลี") ;
Expensive = mkAP (mkA "แพง") ;
Delicious = mkAP (mkA "อร่อย") ;
Boring = mkAP (mkA (R.thword "น่า" "เบิ่อ")) ;
}

View File

@@ -0,0 +1,178 @@
--# -path=alltenses
-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL
concrete FoodsTsn of Foods = open Prelude, Predef in {
flags coding = utf8;
lincat
Comment = {s:Str};
Item = {s:Str; c:NounClass; n:Number};
Kind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool};
Quality = {s: NounClass => Number => Str; p_form: Str; t: TType};
lin
Pred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form};
This kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};
That kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};
These kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};
Those kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};
Mod quality kind = mkMod quality kind;
-- Lexicon
Wine = mkNounNC14_6 "jalwa";
Cheese = mkNounNC9_10 "kase";
Fish = mkNounNC9_10 "thlapi";
Pizza = mkNounNC9_10 "pizza";
Very quality = smartVery quality;
Fresh = mkVarAdj "ntsha";
Warm = mkOrdAdj "bothitho";
Italian = mkPerAdj "Itali";
Expensive = mkVerbRel "tura";
Delicious = mkOrdAdj "monate";
Boring = mkOrdAdj "bosula";
param
NounClass = NC9_10 | NC14_6;
Number = Sg | Pl;
TType = P | V | ModV | R ;
oper
mkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str;
b: Bool} = \x,y -> case y.b of
{
True => {w = y.w; r = y.r; c = y.c;
q = table {
Sg => ((y.q ! Sg) ++ "le" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg));
Pl => ((y.q ! Pl) ++ "le" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl))
}; b = True
};
False => {w = y.w; r = y.r; c = y.c;
q = table {
Sg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg));
Pl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl))
}; b = True
}
};
mkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "bo" + x; Pl => "ma" + x}; r = x; c = NC14_6;
q = table {Sg => ""; Pl => ""}; b = False};
mkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "" + x; Pl => "di" + x}; r = x; c = NC9_10;
q = table {Sg => ""; Pl => ""}; b = False};
mkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "di" + x};
NC14_6 => table {Sg => "bo" + x; Pl => "ma" + x}
};
p_form = x;
t = R;
};
mkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "" + x};
NC14_6 => table {Sg => "" + x; Pl => "" + x}
};
p_form = x;
t = R;
};
mkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => x + "ng"; Pl => x + "ng"};
NC14_6 => table {Sg => x + "ng"; Pl => x + "ng"}
};
p_form = x;
t = V;
};
mkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table {
NC9_10 => table {Sg => "" + x; Pl => "" + x};
NC14_6 => table {Sg => "" + x; Pl => "" + x}
};
p_form = "mo" ++ x;
t = P;
};
mkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = x.t
};
mkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->
{
s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = ModV
};
smartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} =
\x -> case x.t of --(x.s!c!n)
{
(V | ModV) => mkVeryVerb x;
--ModV => mkVeryVerb x;
_ => mkVeryAdj x
};
mkDemPron1 : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "tse"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkDemPron2 : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "eo"; Pl => "tseo"};
NC14_6 => table {Sg => "boo"; Pl => "ao"}
};
smartQualRelPart : TType -> (NounClass => Number => Str) = \x -> case x of
{
P => mkQualRelPart_PName;
_ => mkQualRelPart
};
mkQualRelPart : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "tse"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkQualRelPart_PName : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "ya"; Pl => "tsa"};
NC14_6 => table {Sg => "ba"; Pl => "a"}
};
smartDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of
{
P => mkDescrCop_PName;
_ => mkDescrCop
};
mkDescrCop : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "e"; Pl => "di"};
NC14_6 => table {Sg => "bo"; Pl => "a"}
};
mkDescrCop_PName : NounClass => Number => Str = table
{
NC9_10 => table {Sg => "ga"; Pl => "ga"};
NC14_6 => table {Sg => "ga"; Pl => "ga"}
};
mkPredDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of
{
V => table {NC9_10 => table {Sg => "e" ++ "a"; Pl => "di" ++ "a"};
NC14_6 => table {Sg => "bo" ++ "a"; Pl => "a" ++ "a"}};
_ => table {NC9_10 => table {Sg => "e"; Pl => "di"};
NC14_6 => table {Sg => "bo"; Pl => "a"}}
};
}

View File

@@ -0,0 +1,140 @@
{-
File : FoodsTur.gf
Author : Server Çimen
Version : 1.0
Created on: August 26, 2009
This file contains concrete grammar of Foods abstract grammar for Turkish Language.
This grammar is to be used for Fridge demo and developed in the scope of GF Resource
Grammar Summer School.
-}
concrete FoodsTur of Foods = open Predef in {
flags
coding=utf8 ;
lincat
Comment = {s : Str} ;
Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ;
Kind = {s : Case => Number => Str} ;
Item = {s : Str; n : Number} ;
lin
This = det Sg "bu" ;
That = det Sg "şu" ;
These = det Pl "bu" ;
Those = det Pl "şu" ;
-- Reason for excluding plural form of copula: In Turkish if subject is not a human being,
-- then singular form of copula is used regardless of the number of subject. Since all
-- possible subjects are non human, copula do not need to have plural form.
Pred item quality = {s = item.s ++ quality.s ++ "&+" ++ copula ! quality.softness ! quality.h} ;--! item.n} ;
Mod quality kind = {s = case quality.c of {
Nom => \\t,n => quality.s ++ kind.s ! t ! n ;
Gen => \\t,n => quality.s ++ kind.s ! Gen ! n
}
} ;
Wine = mkN "şarap" "şaraplar" "şarabı" "şarapları" ;
Cheese = mkN "peynir" "peynirler" "peyniri" "peynirleri" ;
Fish = mkN "balık" "balıklar" "balığı" "balıkları" ;
Pizza = mkN "pizza" "pizzalar" "pizzası" "pizzaları" ;
Very a = {s = "çok" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ;
Fresh = adj "taze" Nom;
Warm = adj "ılık" Nom;
Italian = adj "İtalyan" Gen ;
Expensive = adj "pahalı" Nom;
Delicious = adj "lezzetli" Nom;
Boring = adj "sıkıcı" Nom;
param
Number = Sg | Pl ;
Case = Nom | Gen ;
Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü
Softness = Soft | Hard ;
oper
det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} =
\num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ;
mkN = overload {
mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ;
mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ;
} ;
regNoun : Str -> Str -> {s : Case => Number => Str} =
\peynir,peynirler -> noun peynir peynirler [] [] ;
noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} =
\sarap,saraplar,sarabi,saraplari -> {
s = table {
Nom => table {
Sg => sarap ;
Pl => saraplar
} ;
Gen => table {
Sg => sarabi ;
Pl => saraplari
}
}
};
{-
Since there is a bug in overloading, this overload is useless.
mkA = overload {
mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \base -> adj base Nom ;
mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ;
} ;
-}
adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} =
\italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ;
-- See the comment at lines 26 and 27 for excluded plural form of copula.
copula : Softness => Harmony {-=> Number-} => Str =
table {
Soft => table {
I_Har => "dır" ;--table {
-- Sg => "dır" ;
-- Pl => "dırlar"
--} ;
Ih_Har => "dir" ;--table {
--Sg => "dir" ;
--Pl => "dirler"
--} ;
U_Har => "dur" ;--table {
-- Sg => "dur" ;
-- Pl => "durlar"
--} ;
Uh_Har => "dür" --table {
--Sg => "dür" ;
--Pl => "dürler"
--}
} ;
Hard => table {
I_Har => "tır" ;--table {
--Sg => "tır" ;
--Pl => "tırlar"
--} ;
Ih_Har => "tir" ;--table {
--Sg => "tir" ;
--Pl => "tirler"
--} ;
U_Har => "tur" ;--table {
-- Sg => "tur" ;
-- Pl => "turlar"
--} ;
Uh_Har => "tür"--table {
--Sg => "tür" ;
--Pl => "türler"
--}
}
} ;
getHarmony : Str -> Harmony
= \base -> case base of {
_+c@("ı"|"a"|"i"|"e"|"u"|"o"|"ü"|"ö")+
("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h")* =>
case c of {
("ı"|"a") => I_Har ;
("i"|"e") => Ih_Har ;
("u"|"o") => U_Har ;
("ü"|"ö") => Uh_Har
}
} ;
getSoftness : Str -> Softness
= \base -> case base of {
_+("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") => Hard ;
_ => Soft
} ;
}

View File

@@ -0,0 +1,53 @@
-- (c) 2009 Shafqat Virk under LGPL
concrete FoodsUrd of Foods = {
flags coding=utf8 ;
param Number = Sg | Pl ;
param Gender = Masc | Fem;
oper coupla : Number -> Str =\n -> case n of {Sg => "ہے" ; Pl => "ہیں"};
lincat
Comment = {s : Str} ;
Item = {s: Str ; n: Number ; g:Gender};
Kind = {s: Number => Str ; g:Gender};
Quality = {s: Gender => Number => Str};
lin
Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++ coupla item.n} ;
This kind = {s = "یھ" ++ kind.s ! Sg; n= Sg ; g = kind.g } ;
These kind = {s = "یھ" ++ kind.s ! Pl; n = Pl ; g = kind.g} ;
That kind = {s = "وہ" ++ kind.s ! Sg; n= Sg ; g = kind.g} ;
Those kind = {s = "وہ" ++ kind.s ! Pl; n=Pl ; g = kind.g} ;
Mod quality kind = {s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g};
Wine = {s = table { Sg => "شراب" ; Pl => "شرابیں"} ; g = Fem};
Cheese = {s = table { Sg => "پنیر" ; Pl => "پنیریں"} ; g = Fem};
Fish = {s = table { Sg => "مچھلی" ; Pl => "مچھلیاں"} ; g = Fem};
Pizza = {s = table { Sg => "پیزہ" ; Pl => "پیزے"} ; g = Masc};
Very quality = {s = \\g,n => "بہت" ++ quality.s ! g ! n} ;
Fresh = regAdj "تازہ" ;
Warm = regAdj "گرم" ;
Italian = regAdj "اٹا لوی" ;
Expensive = regAdj "مہنگا" ;
Delicious = regAdj "مزیدار" ;
Boring = regAdj "فضول" ;
oper
regAdj : Str -> {s: Gender => Number => Str} = \a -> case a of {
x + "ا" => mkAdj a (x+"ے") (x+"ی");
_ => mkAdj a a a
};
mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \s,p,f -> {
s = table {
Masc => table {
Sg => s;
Pl => p
};
Fem => \\_ => f
}
};
}

View File

@@ -0,0 +1,15 @@
-- (c) 2009 Aarne Ranta under LGPL
interface LexFoods = open Syntax in {
oper
wine_N : N ;
pizza_N : N ;
cheese_N : N ;
fish_N : N ;
fresh_A : A ;
warm_A : A ;
italian_A : A ;
expensive_A : A ;
delicious_A : A ;
boring_A : A ;
}

View File

@@ -0,0 +1,18 @@
-- (c) 2009 Jordi Saludes under LGPL
instance LexFoodsCat of LexFoods =
open SyntaxCat, ParadigmsCat, (M = MorphoCat) in {
flags
coding = utf8 ;
oper
wine_N = mkN "vi" "vins" M.Masc ;
pizza_N = mkN "pizza" ;
cheese_N = mkN "formatge" ;
fish_N = mkN "peix" "peixos" M.Masc;
fresh_A = mkA "fresc" "fresca" "frescos" "fresques" "frescament";
warm_A = mkA "calent" ;
italian_A = mkA "italià" "italiana" "italians" "italianes" "italianament" ;
expensive_A = mkA "car" ;
delicious_A = mkA "deliciós" "deliciosa" "deliciosos" "delicioses" "deliciosament";
boring_A = mkA "aburrit" "aburrida" "aburrits" "aburrides" "aburridament" ;
}

View File

@@ -0,0 +1,21 @@
-- (c) 2009 Aarne Ranta under LGPL
instance LexFoodsFin of LexFoods =
open SyntaxFin, ParadigmsFin in {
flags coding=utf8;
oper
wine_N = mkN "viini" ;
pizza_N = mkN "pizza" ;
cheese_N = mkN "juusto" ;
fish_N = mkN "kala" ;
fresh_A = mkA "tuore" ;
warm_A = mkA
(mkN "lämmin" "lämpimän" "lämmintä" "lämpimänä" "lämpimään"
"lämpiminä" "lämpimiä" "lämpimien" "lämpimissä" "lämpimiin"
)
"lämpimämpi" "lämpimin" ;
italian_A = mkA "italialainen" ;
expensive_A = mkA "kallis" ;
delicious_A = mkA "herkullinen" ;
boring_A = mkA "tylsä" ;
}

View File

@@ -0,0 +1,17 @@
-- (c) 2009 Aarne Ranta under LGPL
instance LexFoodsGer of LexFoods =
open SyntaxGer, ParadigmsGer in {
flags coding=utf8;
oper
wine_N = mkN "Wein" ;
pizza_N = mkN "Pizza" "Pizzen" feminine ;
cheese_N = mkN "Käse" "Käse" masculine ;
fish_N = mkN "Fisch" ;
fresh_A = mkA "frisch" ;
warm_A = mkA "warm" "wärmer" "wärmste" ;
italian_A = mkA "italienisch" ;
expensive_A = mkA "teuer" ;
delicious_A = mkA "köstlich" ;
boring_A = mkA "langweilig" ;
}

View File

@@ -0,0 +1,16 @@
-- (c) 2009 Aarne Ranta under LGPL
instance LexFoodsIta of LexFoods =
open SyntaxIta, ParadigmsIta in {
oper
wine_N = mkN "vino" ;
pizza_N = mkN "pizza" ;
cheese_N = mkN "formaggio" ;
fish_N = mkN "pesce" ;
fresh_A = mkA "fresco" ;
warm_A = mkA "caldo" ;
italian_A = mkA "italiano" ;
expensive_A = mkA "caro" ;
delicious_A = mkA "delizioso" ;
boring_A = mkA "noioso" ;
}

View File

@@ -0,0 +1,17 @@
-- (c) 2009 Aarne Ranta under LGPL
instance LexFoodsSwe of LexFoods =
open SyntaxSwe, ParadigmsSwe in {
flags coding=utf8;
oper
wine_N = mkN "vin" "vinet" "viner" "vinerna" ;
pizza_N = mkN "pizza" ;
cheese_N = mkN "ost" ;
fish_N = mkN "fisk" ;
fresh_A = mkA "färsk" ;
warm_A = mkA "varm" ;
italian_A = mkA "italiensk" ;
expensive_A = mkA "dyr" ;
delicious_A = mkA "läcker" ;
boring_A = mkA "tråkig" ;
}

View File

@@ -0,0 +1,46 @@
-- (c) 2011 Katerina Bohmova under LGPL
resource ResCze = open Prelude in {
flags
coding = utf8 ;
param
Number = Sg | Pl ;
Gender = Masc | Fem | Neutr;
oper
NounPhrase : Type =
{s : Str ; g : Gender ; n : Number} ;
Noun : Type = {s : Number => Str ; g : Gender} ;
Adjective : Type = {s : Gender => Number => Str} ;
det : Number -> Str -> Str -> Str -> Noun -> NounPhrase =
\n,m,f,ne,cn -> {
s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++
cn.s ! n ;
g = cn.g ;
n = n
} ;
noun : Str -> Str -> Gender -> Noun =
\muz,muzi,g -> {
s = table {Sg => muz ; Pl => muzi} ;
g = g
} ;
adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective =
\msg,fsg,nsg,mpl,fpl,npl -> {
s = table {
Masc => table {Sg => msg ; Pl => mpl} ;
Fem => table {Sg => fsg ; Pl => fpl} ;
Neutr => table {Sg => nsg ; Pl => npl}
}
} ;
regAdj : Str -> Adjective =
\mlad ->
adjective (mlad+"ý") (mlad+"á") (mlad+"é")
(mlad+"é") (mlad+"é") (mlad+"á") ;
regnfAdj : Str -> Adjective =
\vynikajici ->
adjective vynikajici vynikajici vynikajici
vynikajici vynikajici vynikajici;
copula : Number => Str =
table {Sg => "je" ; Pl => "jsou"} ;
}

View File

@@ -0,0 +1,75 @@
-- (c) 2009 Aarne Ranta under LGPL
concrete FoodsHin of Foods = {
flags coding=utf8 ;
param
Gender = Masc | Fem ;
Number = Sg | Pl ;
lincat
Comment = {s : Str} ;
Item = {s : Str ; g : Gender ; n : Number} ;
Kind = {s : Number => Str ; g : Gender} ;
Quality = {s : Gender => Number => Str} ;
lin
Pred item quality = {
s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n
} ;
This kind = {s = "yah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
That kind = {s = "vah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;
These kind = {s = "ye" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Those kind = {s = "ve" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;
Mod quality kind = {
s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;
g = kind.g
} ;
Wine = regN "madirA" ;
Cheese = regN "panIr" ;
Fish = regN "maClI" ;
Pizza = regN "pijjA" ;
Very quality = {s = \\g,n => "bahut" ++ quality.s ! g ! n} ;
Fresh = regAdj "tAzA" ;
Warm = regAdj "garam" ;
Italian = regAdj "i-t.alI" ;
Expensive = regAdj "mahaNgA" ;
Delicious = regAdj "rucikar" ;
Boring = regAdj "pEriyA" ;
oper
mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =
\s,p,g -> {
s = table {
Sg => s ;
Pl => p
} ;
g = g
} ;
regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of {
lark + "A" => mkN s (lark + "e") Masc ;
lark + "I" => mkN s (lark + "iyaM") Fem ;
_ => mkN s s Masc
} ;
mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> {
s = table {
Masc => table {
Sg => ms ;
Pl => mp
} ;
Fem => \\_ => f
}
} ;
regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of {
acch + "A" => mkAdj a (acch + "e") (acch + "I") ;
_ => mkAdj a a a
} ;
copula : Number -> Str = \n -> case n of {
Sg => "hE" ;
Pl => "hEN"
} ;
}

9
samples/JSONiq/detail.jq Normal file
View File

@@ -0,0 +1,9 @@
(: Query for returning one database entry :)
import module namespace req = "http://www.28msec.com/modules/http-request";
import module namespace catalog = "http://guide.com/catalog";
variable $id := (req:param-values("id"), "London")[1];
variable $part := (req:param-values("part"), "main")[1];
catalog:get-data-by-key($id, $part)

17
samples/JSONiq/query.jq Normal file
View File

@@ -0,0 +1,17 @@
(: Query for searching the database for keywords :)
import module namespace index = "http://guide.com/index";
import module namespace catalog = "http://guide.com/catalog";
import module namespace req = "http://www.28msec.com/modules/http-request";
variable $phrase := (req:param-values("q"), "London")[1];
variable $limit := integer((req:param-values("limit"), 5)[1]);
[
for $result at $idx in index:index-search($phrase)
where $idx le $limit
let $data := catalog:get-data-by-id($result.s, $result.p)
return
{| { score : $result.r } , $data |}
]

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

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,778 @@
// grabbed from https://raw.github.com/AOKP/external_webkit/61b2fb934bdd3a5fea253e2de0bcf8a47a552333/Source/WebCore/page/mac/EventHandlerMac.mm
/*
* Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "EventHandler.h"
#include "AXObjectCache.h"
#include "BlockExceptions.h"
#include "Chrome.h"
#include "ChromeClient.h"
#include "ClipboardMac.h"
#include "DragController.h"
#include "EventNames.h"
#include "FocusController.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameView.h"
#include "KeyboardEvent.h"
#include "MouseEventWithHitTestResults.h"
#include "NotImplemented.h"
#include "Page.h"
#include "PlatformKeyboardEvent.h"
#include "PlatformWheelEvent.h"
#include "RenderWidget.h"
#include "RuntimeApplicationChecks.h"
#include "Scrollbar.h"
#include "Settings.h"
#include "WebCoreSystemInterface.h"
#include <objc/objc-runtime.h>
#include <wtf/StdLibExtras.h>
#if !(defined(OBJC_API_VERSION) && OBJC_API_VERSION > 0)
static inline IMP method_setImplementation(Method m, IMP i)
{
IMP oi = m->method_imp;
m->method_imp = i;
return oi;
}
#endif
namespace WebCore {
#if ENABLE(DRAG_SUPPORT)
const double EventHandler::TextDragDelay = 0.15;
#endif
static RetainPtr<NSEvent>& currentNSEventSlot()
{
DEFINE_STATIC_LOCAL(RetainPtr<NSEvent>, event, ());
return event;
}
NSEvent *EventHandler::currentNSEvent()
{
return currentNSEventSlot().get();
}
class CurrentEventScope {
WTF_MAKE_NONCOPYABLE(CurrentEventScope);
public:
CurrentEventScope(NSEvent *);
~CurrentEventScope();
private:
RetainPtr<NSEvent> m_savedCurrentEvent;
#ifndef NDEBUG
RetainPtr<NSEvent> m_event;
#endif
};
inline CurrentEventScope::CurrentEventScope(NSEvent *event)
: m_savedCurrentEvent(currentNSEventSlot())
#ifndef NDEBUG
, m_event(event)
#endif
{
currentNSEventSlot() = event;
}
inline CurrentEventScope::~CurrentEventScope()
{
ASSERT(currentNSEventSlot() == m_event);
currentNSEventSlot() = m_savedCurrentEvent;
}
bool EventHandler::wheelEvent(NSEvent *event)
{
Page* page = m_frame->page();
if (!page)
return false;
CurrentEventScope scope(event);
PlatformWheelEvent wheelEvent(event, page->chrome()->platformPageClient());
handleWheelEvent(wheelEvent);
return wheelEvent.isAccepted();
}
PassRefPtr<KeyboardEvent> EventHandler::currentKeyboardEvent() const
{
NSEvent *event = [NSApp currentEvent];
if (!event)
return 0;
switch ([event type]) {
case NSKeyDown: {
PlatformKeyboardEvent platformEvent(event);
platformEvent.disambiguateKeyDownEvent(PlatformKeyboardEvent::RawKeyDown);
return KeyboardEvent::create(platformEvent, m_frame->document()->defaultView());
}
case NSKeyUp:
return KeyboardEvent::create(event, m_frame->document()->defaultView());
default:
return 0;
}
}
bool EventHandler::keyEvent(NSEvent *event)
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
ASSERT([event type] == NSKeyDown || [event type] == NSKeyUp);
CurrentEventScope scope(event);
return keyEvent(PlatformKeyboardEvent(event));
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
void EventHandler::focusDocumentView()
{
Page* page = m_frame->page();
if (!page)
return;
if (FrameView* frameView = m_frame->view()) {
if (NSView *documentView = frameView->documentView())
page->chrome()->focusNSView(documentView);
}
page->focusController()->setFocusedFrame(m_frame);
}
bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
{
// Figure out which view to send the event to.
RenderObject* target = targetNode(event) ? targetNode(event)->renderer() : 0;
if (!target || !target->isWidget())
return false;
// Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will
// just pass currentEvent down to the widget, we don't want to call it for events that
// don't correspond to Cocoa events. The mousedown/ups will have already been passed on as
// part of the pressed/released handling.
return passMouseDownEventToWidget(toRenderWidget(target)->widget());
}
bool EventHandler::passWidgetMouseDownEventToWidget(RenderWidget* renderWidget)
{
return passMouseDownEventToWidget(renderWidget->widget());
}
static bool lastEventIsMouseUp()
{
// Many AppKit widgets run their own event loops and consume events while the mouse is down.
// When they finish, currentEvent is the mouseUp that they exited on. We need to update
// the WebCore state with this mouseUp, which we never saw. This method lets us detect
// that state. Handling this was critical when we used AppKit widgets for form elements.
// It's not clear in what cases this is helpful now -- it's possible it can be removed.
BEGIN_BLOCK_OBJC_EXCEPTIONS;
NSEvent *currentEventAfterHandlingMouseDown = [NSApp currentEvent];
return EventHandler::currentNSEvent() != currentEventAfterHandlingMouseDown
&& [currentEventAfterHandlingMouseDown type] == NSLeftMouseUp
&& [currentEventAfterHandlingMouseDown timestamp] >= [EventHandler::currentNSEvent() timestamp];
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
bool EventHandler::passMouseDownEventToWidget(Widget* pWidget)
{
// FIXME: This function always returns true. It should be changed either to return
// false in some cases or the return value should be removed.
RefPtr<Widget> widget = pWidget;
if (!widget) {
LOG_ERROR("hit a RenderWidget without a corresponding Widget, means a frame is half-constructed");
return true;
}
// In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of
// dispatching the event.
if (!widget->platformWidget())
return false;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
NSView *nodeView = widget->platformWidget();
ASSERT([nodeView superview]);
NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
if (!view) {
// We probably hit the border of a RenderWidget
return true;
}
Page* page = m_frame->page();
if (!page)
return true;
if (page->chrome()->client()->firstResponder() != view) {
// Normally [NSWindow sendEvent:] handles setting the first responder.
// But in our case, the event was sent to the view representing the entire web page.
if ([currentNSEvent() clickCount] <= 1 && [view acceptsFirstResponder] && [view needsPanelToBecomeKey])
page->chrome()->client()->makeFirstResponder(view);
}
// We need to "defer loading" while tracking the mouse, because tearing down the
// page while an AppKit control is tracking the mouse can cause a crash.
// FIXME: In theory, WebCore now tolerates tear-down while tracking the
// mouse. We should confirm that, and then remove the deferrsLoading
// hack entirely.
bool wasDeferringLoading = page->defersLoading();
if (!wasDeferringLoading)
page->setDefersLoading(true);
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
NSView *outerView = widget->getOuterView();
widget->beforeMouseDown(outerView, widget.get());
[view mouseDown:currentNSEvent()];
widget->afterMouseDown(outerView, widget.get());
m_sendingEventToSubview = false;
if (!wasDeferringLoading)
page->setDefersLoading(false);
// Remember which view we sent the event to, so we can direct the release event properly.
m_mouseDownView = view;
m_mouseDownWasInSubframe = false;
// Many AppKit widgets run their own event loops and consume events while the mouse is down.
// When they finish, currentEvent is the mouseUp that they exited on. We need to update
// the EventHandler state with this mouseUp, which we never saw.
// If this event isn't a mouseUp, we assume that the mouseUp will be coming later. There
// is a hole here if the widget consumes both the mouseUp and subsequent events.
if (lastEventIsMouseUp())
m_mousePressed = false;
END_BLOCK_OBJC_EXCEPTIONS;
return true;
}
// Note that this does the same kind of check as [target isDescendantOf:superview].
// There are two differences: This is a lot slower because it has to walk the whole
// tree, and this works in cases where the target has already been deallocated.
static bool findViewInSubviews(NSView *superview, NSView *target)
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
NSEnumerator *e = [[superview subviews] objectEnumerator];
NSView *subview;
while ((subview = [e nextObject])) {
if (subview == target || findViewInSubviews(subview, target)) {
return true;
}
}
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
NSView *EventHandler::mouseDownViewIfStillGood()
{
// Since we have no way of tracking the lifetime of m_mouseDownView, we have to assume that
// it could be deallocated already. We search for it in our subview tree; if we don't find
// it, we set it to nil.
NSView *mouseDownView = m_mouseDownView;
if (!mouseDownView) {
return nil;
}
FrameView* topFrameView = m_frame->view();
NSView *topView = topFrameView ? topFrameView->platformWidget() : nil;
if (!topView || !findViewInSubviews(topView, mouseDownView)) {
m_mouseDownView = nil;
return nil;
}
return mouseDownView;
}
#if ENABLE(DRAG_SUPPORT)
bool EventHandler::eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&)
{
NSView *view = mouseDownViewIfStillGood();
if (!view)
return false;
if (!m_mouseDownWasInSubframe) {
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
[view mouseDragged:currentNSEvent()];
END_BLOCK_OBJC_EXCEPTIONS;
m_sendingEventToSubview = false;
}
return true;
}
#endif // ENABLE(DRAG_SUPPORT)
bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&)
{
NSView *view = mouseDownViewIfStillGood();
if (!view)
return false;
if (!m_mouseDownWasInSubframe) {
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
[view mouseUp:currentNSEvent()];
END_BLOCK_OBJC_EXCEPTIONS;
m_sendingEventToSubview = false;
}
return true;
}
bool EventHandler::passSubframeEventToSubframe(MouseEventWithHitTestResults& event, Frame* subframe, HitTestResult* hoveredNode)
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
switch ([currentNSEvent() type]) {
case NSLeftMouseDragged:
case NSOtherMouseDragged:
case NSRightMouseDragged:
// This check is bogus and results in <rdar://6813830>, but removing it breaks a number of
// layout tests.
if (!m_mouseDownWasInSubframe)
return false;
#if ENABLE(DRAG_SUPPORT)
if (subframe->page()->dragController()->didInitiateDrag())
return false;
#endif
case NSMouseMoved:
// Since we're passing in currentNSEvent() here, we can call
// handleMouseMoveEvent() directly, since the save/restore of
// currentNSEvent() that mouseMoved() does would have no effect.
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
subframe->eventHandler()->handleMouseMoveEvent(currentPlatformMouseEvent(), hoveredNode);
m_sendingEventToSubview = false;
return true;
case NSLeftMouseDown: {
Node* node = targetNode(event);
if (!node)
return false;
RenderObject* renderer = node->renderer();
if (!renderer || !renderer->isWidget())
return false;
Widget* widget = toRenderWidget(renderer)->widget();
if (!widget || !widget->isFrameView())
return false;
if (!passWidgetMouseDownEventToWidget(toRenderWidget(renderer)))
return false;
m_mouseDownWasInSubframe = true;
return true;
}
case NSLeftMouseUp: {
if (!m_mouseDownWasInSubframe)
return false;
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
subframe->eventHandler()->handleMouseReleaseEvent(currentPlatformMouseEvent());
m_sendingEventToSubview = false;
return true;
}
default:
return false;
}
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
static IMP originalNSScrollViewScrollWheel;
static bool _nsScrollViewScrollWheelShouldRetainSelf;
static void selfRetainingNSScrollViewScrollWheel(NSScrollView *, SEL, NSEvent *);
static bool nsScrollViewScrollWheelShouldRetainSelf()
{
ASSERT(isMainThread());
return _nsScrollViewScrollWheelShouldRetainSelf;
}
static void setNSScrollViewScrollWheelShouldRetainSelf(bool shouldRetain)
{
ASSERT(isMainThread());
if (!originalNSScrollViewScrollWheel) {
Method method = class_getInstanceMethod(objc_getRequiredClass("NSScrollView"), @selector(scrollWheel:));
originalNSScrollViewScrollWheel = method_setImplementation(method, reinterpret_cast<IMP>(selfRetainingNSScrollViewScrollWheel));
}
_nsScrollViewScrollWheelShouldRetainSelf = shouldRetain;
}
static void selfRetainingNSScrollViewScrollWheel(NSScrollView *self, SEL selector, NSEvent *event)
{
bool shouldRetainSelf = isMainThread() && nsScrollViewScrollWheelShouldRetainSelf();
if (shouldRetainSelf)
[self retain];
originalNSScrollViewScrollWheel(self, selector, event);
if (shouldRetainSelf)
[self release];
}
bool EventHandler::passWheelEventToWidget(PlatformWheelEvent& wheelEvent, Widget* widget)
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
if (!widget)
return false;
NSView* nodeView = widget->platformWidget();
if (!nodeView) {
// WebKit2 code path.
if (!widget->isFrameView())
return false;
return static_cast<FrameView*>(widget)->frame()->eventHandler()->handleWheelEvent(wheelEvent);
}
if ([currentNSEvent() type] != NSScrollWheel || m_sendingEventToSubview)
return false;
ASSERT(nodeView);
ASSERT([nodeView superview]);
NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
if (!view)
// We probably hit the border of a RenderWidget
return false;
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
// Work around <rdar://problem/6806810> which can cause -[NSScrollView scrollWheel:] to
// crash if the NSScrollView is released during timer or network callback dispatch
// in the nested tracking runloop that -[NSScrollView scrollWheel:] runs.
setNSScrollViewScrollWheelShouldRetainSelf(true);
[view scrollWheel:currentNSEvent()];
setNSScrollViewScrollWheelShouldRetainSelf(false);
m_sendingEventToSubview = false;
return true;
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
void EventHandler::mouseDown(NSEvent *event)
{
FrameView* v = m_frame->view();
if (!v || m_sendingEventToSubview)
return;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
m_frame->loader()->resetMultipleFormSubmissionProtection();
m_mouseDownView = nil;
CurrentEventScope scope(event);
handleMousePressEvent(currentPlatformMouseEvent());
END_BLOCK_OBJC_EXCEPTIONS;
}
void EventHandler::mouseDragged(NSEvent *event)
{
FrameView* v = m_frame->view();
if (!v || m_sendingEventToSubview)
return;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
CurrentEventScope scope(event);
handleMouseMoveEvent(currentPlatformMouseEvent());
END_BLOCK_OBJC_EXCEPTIONS;
}
void EventHandler::mouseUp(NSEvent *event)
{
FrameView* v = m_frame->view();
if (!v || m_sendingEventToSubview)
return;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
CurrentEventScope scope(event);
// Our behavior here is a little different that Qt. Qt always sends
// a mouse release event, even for a double click. To correct problems
// in khtml's DOM click event handling we do not send a release here
// for a double click. Instead we send that event from FrameView's
// handleMouseDoubleClickEvent. Note also that the third click of
// a triple click is treated as a single click, but the fourth is then
// treated as another double click. Hence the "% 2" below.
int clickCount = [event clickCount];
if (clickCount > 0 && clickCount % 2 == 0)
handleMouseDoubleClickEvent(currentPlatformMouseEvent());
else
handleMouseReleaseEvent(currentPlatformMouseEvent());
m_mouseDownView = nil;
END_BLOCK_OBJC_EXCEPTIONS;
}
/*
A hack for the benefit of AK's PopUpButton, which uses the Carbon menu manager, which thus
eats all subsequent events after it is starts its modal tracking loop. After the interaction
is done, this routine is used to fix things up. When a mouse down started us tracking in
the widget, we post a fake mouse up to balance the mouse down we started with. When a
key down started us tracking in the widget, we post a fake key up to balance things out.
In addition, we post a fake mouseMoved to get the cursor in sync with whatever we happen to
be over after the tracking is done.
*/
void EventHandler::sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent)
{
FrameView* view = m_frame->view();
if (!view)
return;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
m_sendingEventToSubview = false;
int eventType = [initiatingEvent type];
if (eventType == NSLeftMouseDown || eventType == NSKeyDown) {
NSEvent *fakeEvent = nil;
if (eventType == NSLeftMouseDown) {
fakeEvent = [NSEvent mouseEventWithType:NSLeftMouseUp
location:[initiatingEvent locationInWindow]
modifierFlags:[initiatingEvent modifierFlags]
timestamp:[initiatingEvent timestamp]
windowNumber:[initiatingEvent windowNumber]
context:[initiatingEvent context]
eventNumber:[initiatingEvent eventNumber]
clickCount:[initiatingEvent clickCount]
pressure:[initiatingEvent pressure]];
[NSApp postEvent:fakeEvent atStart:YES];
} else { // eventType == NSKeyDown
fakeEvent = [NSEvent keyEventWithType:NSKeyUp
location:[initiatingEvent locationInWindow]
modifierFlags:[initiatingEvent modifierFlags]
timestamp:[initiatingEvent timestamp]
windowNumber:[initiatingEvent windowNumber]
context:[initiatingEvent context]
characters:[initiatingEvent characters]
charactersIgnoringModifiers:[initiatingEvent charactersIgnoringModifiers]
isARepeat:[initiatingEvent isARepeat]
keyCode:[initiatingEvent keyCode]];
[NSApp postEvent:fakeEvent atStart:YES];
}
// FIXME: We should really get the current modifierFlags here, but there's no way to poll
// them in Cocoa, and because the event stream was stolen by the Carbon menu code we have
// no up-to-date cache of them anywhere.
fakeEvent = [NSEvent mouseEventWithType:NSMouseMoved
location:[[view->platformWidget() window] convertScreenToBase:[NSEvent mouseLocation]]
modifierFlags:[initiatingEvent modifierFlags]
timestamp:[initiatingEvent timestamp]
windowNumber:[initiatingEvent windowNumber]
context:[initiatingEvent context]
eventNumber:0
clickCount:0
pressure:0];
[NSApp postEvent:fakeEvent atStart:YES];
}
END_BLOCK_OBJC_EXCEPTIONS;
}
void EventHandler::mouseMoved(NSEvent *event)
{
// Reject a mouse moved if the button is down - screws up tracking during autoscroll
// These happen because WebKit sometimes has to fake up moved events.
if (!m_frame->view() || m_mousePressed || m_sendingEventToSubview)
return;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
CurrentEventScope scope(event);
mouseMoved(currentPlatformMouseEvent());
END_BLOCK_OBJC_EXCEPTIONS;
}
static bool frameHasPlatformWidget(Frame* frame)
{
if (FrameView* frameView = frame->view()) {
if (frameView->platformWidget())
return true;
}
return false;
}
bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
{
// WebKit1 code path.
if (frameHasPlatformWidget(m_frame))
return passSubframeEventToSubframe(mev, subframe);
// WebKit2 code path.
subframe->eventHandler()->handleMousePressEvent(mev.event());
return true;
}
bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)
{
// WebKit1 code path.
if (frameHasPlatformWidget(m_frame))
return passSubframeEventToSubframe(mev, subframe, hoveredNode);
// WebKit2 code path.
if (m_mouseDownMayStartDrag && !m_mouseDownWasInSubframe)
return false;
subframe->eventHandler()->handleMouseMoveEvent(mev.event(), hoveredNode);
return true;
}
bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
{
// WebKit1 code path.
if (frameHasPlatformWidget(m_frame))
return passSubframeEventToSubframe(mev, subframe);
// WebKit2 code path.
subframe->eventHandler()->handleMouseReleaseEvent(mev.event());
return true;
}
PlatformMouseEvent EventHandler::currentPlatformMouseEvent() const
{
NSView *windowView = nil;
if (Page* page = m_frame->page())
windowView = page->chrome()->platformPageClient();
return PlatformMouseEvent(currentNSEvent(), windowView);
}
#if ENABLE(CONTEXT_MENUS)
bool EventHandler::sendContextMenuEvent(NSEvent *event)
{
Page* page = m_frame->page();
if (!page)
return false;
return sendContextMenuEvent(PlatformMouseEvent(event, page->chrome()->platformPageClient()));
}
#endif // ENABLE(CONTEXT_MENUS)
#if ENABLE(DRAG_SUPPORT)
bool EventHandler::eventMayStartDrag(NSEvent *event)
{
Page* page = m_frame->page();
if (!page)
return false;
return eventMayStartDrag(PlatformMouseEvent(event, page->chrome()->platformPageClient()));
}
#endif // ENABLE(DRAG_SUPPORT)
bool EventHandler::eventActivatedView(const PlatformMouseEvent& event) const
{
return m_activationEventNumber == event.eventNumber();
}
#if ENABLE(DRAG_SUPPORT)
PassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const
{
NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
// Must be done before ondragstart adds types and data to the pboard,
// also done for security, as it erases data from the last drag
[pasteboard declareTypes:[NSArray array] owner:nil];
return ClipboardMac::create(Clipboard::DragAndDrop, pasteboard, ClipboardWritable, m_frame);
}
#endif
bool EventHandler::tabsToAllFormControls(KeyboardEvent* event) const
{
Page* page = m_frame->page();
if (!page)
return false;
KeyboardUIMode keyboardUIMode = page->chrome()->client()->keyboardUIMode();
bool handlingOptionTab = isKeyboardOptionTab(event);
// If tab-to-links is off, option-tab always highlights all controls
if ((keyboardUIMode & KeyboardAccessTabsToLinks) == 0 && handlingOptionTab)
return true;
// If system preferences say to include all controls, we always include all controls
if (keyboardUIMode & KeyboardAccessFull)
return true;
// Otherwise tab-to-links includes all controls, unless the sense is flipped via option-tab.
if (keyboardUIMode & KeyboardAccessTabsToLinks)
return !handlingOptionTab;
return handlingOptionTab;
}
bool EventHandler::needsKeyboardEventDisambiguationQuirks() const
{
Document* document = m_frame->document();
// RSS view needs arrow key keypress events.
if (applicationIsSafari() && (document->url().protocolIs("feed") || document->url().protocolIs("feeds")))
return true;
Settings* settings = m_frame->settings();
if (!settings)
return false;
#if ENABLE(DASHBOARD_SUPPORT)
if (settings->usesDashboardBackwardCompatibilityMode())
return true;
#endif
if (settings->needsKeyboardEventDisambiguationQuirks())
return true;
return false;
}
unsigned EventHandler::accessKeyModifiers()
{
// Control+Option key combinations are usually unused on Mac OS X, but not when VoiceOver is enabled.
// So, we use Control in this case, even though it conflicts with Emacs-style key bindings.
// See <https://bugs.webkit.org/show_bug.cgi?id=21107> for more detail.
if (AXObjectCache::accessibilityEnhancedUserInterfaceEnabled())
return PlatformKeyboardEvent::CtrlKey;
return PlatformKeyboardEvent::CtrlKey | PlatformKeyboardEvent::AltKey;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
module Control.Arrow where
import Data.Tuple
class Arrow a where
arr :: forall b c. (b -> c) -> a b c
first :: forall b c d. a b c -> a (Tuple b d) (Tuple c d)
instance arrowFunction :: Arrow (->) where
arr f = f
first f (Tuple b d) = Tuple (f b) d
second :: forall a b c d. (Category a, Arrow a) => a b c -> a (Tuple d b) (Tuple d c)
second f = arr swap >>> first f >>> arr swap
swap :: forall a b. Tuple a b -> Tuple b a
swap (Tuple x y) = Tuple y x
infixr 3 ***
infixr 3 &&&
(***) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b' c' -> a (Tuple b b') (Tuple c c')
(***) f g = first f >>> second g
(&&&) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b c' -> a b (Tuple c c')
(&&&) f g = arr (\b -> Tuple b b) >>> (f *** g)
class ArrowZero a where
zeroArrow :: forall b c. a b c
infixr 5 <+>
class ArrowPlus a where
(<+>) :: forall b c. a b c -> a b c -> a b c

View File

@@ -0,0 +1,111 @@
module Data.Foreign
( Foreign(..)
, ForeignParser(ForeignParser)
, parseForeign
, parseJSON
, ReadForeign
, read
, prop
) where
import Prelude
import Data.Array
import Data.Either
import Data.Maybe
import Data.Tuple
import Data.Traversable
foreign import data Foreign :: *
foreign import fromString
"function fromString (str) { \
\ try { \
\ return _ps.Data_Either.Right(JSON.parse(str)); \
\ } catch (e) { \
\ return _ps.Data_Either.Left(e.toString()); \
\ } \
\}" :: String -> Either String Foreign
foreign import readPrimType
"function readPrimType (typeName) { \
\ return function (value) { \
\ if (toString.call(value) == '[object ' + typeName + ']') { \
\ return _ps.Data_Either.Right(value);\
\ } \
\ return _ps.Data_Either.Left('Value is not a ' + typeName + ''); \
\ }; \
\}" :: forall a. String -> Foreign -> Either String a
foreign import readMaybeImpl
"function readMaybeImpl (value) { \
\ return value === undefined || value === null ? _ps.Data_Maybe.Nothing : _ps.Data_Maybe.Just(value); \
\}" :: forall a. Foreign -> Maybe Foreign
foreign import readPropImpl
"function readPropImpl (k) { \
\ return function (obj) { \
\ return _ps.Data_Either.Right(obj[k]);\
\ }; \
\}" :: forall a. String -> Foreign -> Either String Foreign
foreign import showForeignImpl
"var showForeignImpl = JSON.stringify;" :: Foreign -> String
instance showForeign :: Prelude.Show Foreign where
show = showForeignImpl
data ForeignParser a = ForeignParser (Foreign -> Either String a)
parseForeign :: forall a. ForeignParser a -> Foreign -> Either String a
parseForeign (ForeignParser p) x = p x
parseJSON :: forall a. (ReadForeign a) => String -> Either String a
parseJSON json = fromString json >>= parseForeign read
instance monadForeignParser :: Prelude.Monad ForeignParser where
return x = ForeignParser \_ -> Right x
(>>=) (ForeignParser p) f = ForeignParser \x -> case p x of
Left err -> Left err
Right x' -> parseForeign (f x') x
instance applicativeForeignParser :: Prelude.Applicative ForeignParser where
pure x = ForeignParser \_ -> Right x
(<*>) (ForeignParser f) (ForeignParser p) = ForeignParser \x -> case f x of
Left err -> Left err
Right f' -> f' <$> p x
instance functorForeignParser :: Prelude.Functor ForeignParser where
(<$>) f (ForeignParser p) = ForeignParser \x -> f <$> p x
class ReadForeign a where
read :: ForeignParser a
instance readString :: ReadForeign String where
read = ForeignParser $ readPrimType "String"
instance readNumber :: ReadForeign Number where
read = ForeignParser $ readPrimType "Number"
instance readBoolean :: ReadForeign Boolean where
read = ForeignParser $ readPrimType "Boolean"
instance readArray :: (ReadForeign a) => ReadForeign [a] where
read =
let arrayItem (Tuple i x) = case parseForeign read x of
Right result -> Right result
Left err -> Left $ "Error reading item at index " ++ (show i) ++ ":\n" ++ err
in
(ForeignParser $ readPrimType "Array") >>= \xs ->
ForeignParser \_ -> arrayItem `traverse` (zip (range 0 (length xs)) xs)
instance readMaybe :: (ReadForeign a) => ReadForeign (Maybe a) where
read = (ForeignParser $ Right <<< readMaybeImpl) >>= \x ->
ForeignParser \_ -> case x of
Just x' -> parseForeign read x' >>= return <<< Just
Nothing -> return Nothing
prop :: forall a. (ReadForeign a) => String -> ForeignParser a
prop p = (ForeignParser \x -> readPropImpl p x) >>= \x ->
ForeignParser \_ -> case parseForeign read x of
Right result -> Right result
Left err -> Left $ "Error reading property '" ++ p ++ "':\n" ++ err

View File

@@ -0,0 +1,90 @@
module Data.Map
( Map(),
empty,
singleton,
insert,
lookup,
delete,
alter,
toList,
fromList,
union,
map
) where
import qualified Prelude as P
import Data.Array (concat)
import Data.Foldable (foldl)
import Data.Maybe
import Data.Tuple
data Map k v = Leaf | Branch { key :: k, value :: v, left :: Map k v, right :: Map k v }
instance eqMap :: (P.Eq k, P.Eq v) => P.Eq (Map k v) where
(==) m1 m2 = toList m1 P.== toList m2
(/=) m1 m2 = P.not (m1 P.== m2)
instance showMap :: (P.Show k, P.Show v) => P.Show (Map k v) where
show m = "fromList " P.++ P.show (toList m)
empty :: forall k v. Map k v
empty = Leaf
singleton :: forall k v. k -> v -> Map k v
singleton k v = Branch { key: k, value: v, left: empty, right: empty }
insert :: forall k v. (P.Eq k, P.Ord k) => k -> v -> Map k v -> Map k v
insert k v Leaf = singleton k v
insert k v (Branch b@{ key = k1 }) | k P.== k1 = Branch (b { key = k, value = v })
insert k v (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = insert k v b.left })
insert k v (Branch b) = Branch (b { right = insert k v b.right })
lookup :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Maybe v
lookup k Leaf = Nothing
lookup k (Branch { key = k1, value = v }) | k P.== k1 = Just v
lookup k (Branch { key = k1, left = left }) | k P.< k1 = lookup k left
lookup k (Branch { right = right }) = lookup k right
findMinKey :: forall k v. (P.Ord k) => Map k v -> Tuple k v
findMinKey (Branch { key = k, value = v, left = Leaf }) = Tuple k v
findMinKey (Branch b) = findMinKey b.left
delete :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Map k v
delete k Leaf = Leaf
delete k (Branch b@{ key = k1, left = Leaf }) | k P.== k1 =
case b of
{ left = Leaf } -> b.right
{ right = Leaf } -> b.left
_ -> glue b.left b.right
delete k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = delete k b.left })
delete k (Branch b) = Branch (b { right = delete k b.right })
alter :: forall k v. (P.Eq k, P.Ord k) => (Maybe v -> Maybe v) -> k -> Map k v -> Map k v
alter f k Leaf = case f Nothing of
Nothing -> Leaf
Just v -> singleton k v
alter f k (Branch b@{ key = k1, value = v }) | k P.== k1 = case f (Just v) of
Nothing -> glue b.left b.right
Just v' -> Branch (b { value = v' })
alter f k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = alter f k b.left })
alter f k (Branch b) = Branch (b { right = alter f k b.right })
glue :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v
glue left right =
let Tuple minKey root = findMinKey right in
Branch { key: minKey, value: root, left: left, right: delete minKey right }
toList :: forall k v. Map k v -> [Tuple k v]
toList Leaf = []
toList (Branch b) = toList b.left `concat` [Tuple b.key b.value] `concat` toList b.right
fromList :: forall k v. (P.Eq k, P.Ord k) => [Tuple k v] -> Map k v
fromList = foldl (\m (Tuple k v) -> insert k v m) empty
union :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v
union m1 m2 = foldl (\m (Tuple k v) -> insert k v m) m2 (toList m1)
map :: forall k v1 v2. (P.Eq k, P.Ord k) => (v1 -> v2) -> Map k v1 -> Map k v2
map _ Leaf = Leaf
map f (Branch b) = Branch (b { value = f b.value, left = map f b.left, right = map f b.right })

View File

@@ -0,0 +1,128 @@
module ReactiveJQueryTest where
import Prelude ((+), (++), (<$>), (<*>), ($), (<<<), flip, return, show)
import Control.Monad
import Control.Monad.Eff
import Control.Monad.JQuery
import Control.Reactive
import Control.Reactive.JQuery
import Data.Array (map, head, length)
import Data.Foldable
import Data.Foreign
import Data.Maybe
import Data.Monoid
import Data.Traversable
import Debug.Trace
import Global (parseInt)
main = do
personDemo
todoListDemo
greet firstName lastName = "Hello, " ++ firstName ++ " " ++ lastName ++ "!"
personDemo = do
-- Create new reactive variables to hold the user's names
firstName <- newRVar "John"
lastName <- newRVar "Smith"
-- Get the document body
b <- body
-- Create a text box for the first name
firstNameDiv <- create "<div>"
firstNameInput <- create "<input>"
"First Name: " `appendText` firstNameDiv
firstNameInput `append` firstNameDiv
firstNameDiv `append` b
-- Create a text box for the last name
lastNameDiv <- create "<div>"
lastNameInput <- create "<input>"
"Last Name: " `appendText` lastNameDiv
lastNameInput `append` lastNameDiv
lastNameDiv `append` b
-- Bind the text box values to the name variables
bindValueTwoWay firstName firstNameInput
bindValueTwoWay lastName lastNameInput
-- Create a paragraph to display a greeting
greeting <- create "<p>"
{ color: "red" } `css` greeting
greeting `append` b
-- Bind the text property of the greeting paragraph to a computed property
let greetingC = greet <$> toComputed firstName <*> toComputed lastName
bindTextOneWay greetingC greeting
todoListDemo = do
-- Get the document body
b <- body
-- Create an array
arr <- newRArray
text1 <- newRVar "Learn PureScript"
comp1 <- newRVar false
insertRArray arr { text: text1, completed: comp1 } 0
ul <- create "<ul>"
-- Bind the ul to the array
bindArray arr ul $ \entry indexR -> do
li <- create "<li>"
completedInput <- create "<input>"
setAttr "type" "checkbox" completedInput
completedInput `append` li
sub1 <- bindCheckedTwoWay entry.completed completedInput
textInput <- create "<input>"
textInput `append` li
sub2 <- bindValueTwoWay entry.text textInput
btn <- create "<button>"
"Remove" `appendText` btn
flip (on "click") btn $ do
index <- readRVar indexR
removeRArray arr index
btn `append` li
return { el: li, subscription: sub1 <> sub2 }
ul `append` b
-- Add button
newEntryDiv <- create "<div>"
btn <- create "<button>"
"Add" `appendText` btn
btn `append` newEntryDiv
newEntryDiv `append` b
flip (on "click") btn $ do
text <- newRVar ""
completed <- newRVar false
arr' <- readRArray arr
insertRArray arr { text: text, completed: completed } (length arr')
-- Create a paragraph to display the next task
nextTaskLabel <- create "<p>"
nextTaskLabel `append` b
let nextTask = do
task <- head <$> toComputedArray arr
case task of
Nothing -> return "Done!"
Just { text = text } -> (++) "Next task: " <$> toComputed text
bindTextOneWay nextTask nextTaskLabel
-- Create a paragraph to display the task counter
counterLabel <- create "<p>"
counterLabel `append` b
let counter = (flip (++) " tasks remaining") <<< show <$> do
rs <- toComputedArray arr
cs <- map (\c -> if c then 0 else 1) <$> traverse (\entry -> toComputed entry.completed) rs
return $ foldl (+) 0 cs
bindTextOneWay counter counterLabel

View File

@@ -0,0 +1,217 @@
Rebol [Title: "Google Code Prettify Datatypes"]
re: func [s /i] [rejoin compose ["/^^" (s) "/" either i ["i"][""]]] ; little helper for standard grammar regex used
date-re: "\d{1,2}[\-\/](\d{1,2}|\w{3,9})[\-\/]\d{2,4}" ; naive date! regex
string-re: {\"(?:[^^\"\\]|\\[\s\S])*(?:\"|$)}
brace-re: "\{(?:[^^\}\^^]|\^^[\s\S])*(?:\}|$)" ; TODO - could build this from string-re
block-re: "\[(?:[^^\]\\]|\\[\s\S])*(?:\]|$)"
tag-re: "\<(?:[^^\>\\]|\\[\s\S])*(?:\>|$)" ; TODO - could build this from string-re
number-re: "(?:[.,]\d+|\d+['\d]*(?:[.,]\d*)?)(?:e[-+]?\d+)?"
word-re: "[A-Za-z=\-?!_*+.`~&][A-Za-z0-9=\-!?_*+.`~&]*"
|: "|"
types: compose/deep [
; comments
comment! [
PR_LITERAL
; comment_shebang -- Script tag (shebang!)
(re/i "#![^^\r\n]+")
; comment_line -- A line comment that starts with ;
(re ";[^^\r\n]*")
; comment_multiline_string -- Multi-line comment
(re ["comment\s*" brace-re])
; comment_multiline_block
(re ["comment\s*" block-re])
]
; type_literal
; logic
logic! [
PR_LITERAL
(re "#\[(?:true|false|yes|no|on|off)\]")
]
; none
none! [
PR_LITERAL
(re "#\[none\]")
]
; strings
; character
char! [
PR_LITERAL
(re/i "#^"(?:[^^^^^"]|\^^(?:[\^^^"\/\-A-Z]|\((?:[0-9A-F]{2,4}|tab|newline)\)))^"")
]
string! [
PR_LITERAL
; string_quoted
(re "^"(?:[^^^"\\]|\\[\s\S])*(?:^"|$)")
; string_multiline -- Multi-line string {braces} - allowed within: { ^{ ^}
(re brace-re)
]
; string_tag_comment
comment! [
PR_LITERAL
(re "<!--(?:[^^-]|-(?!->))+-->")
]
; string_tag
tag! [
PR_LITERAL
(re "<[^^^"<=>\x00\x09\x0A\x0D\x20\u005D\u007F][^^>\x00]*>")
]
file! [
PR_LITERAL
; string_file
(re "%(?:[a-zA-Z?!.*&|=_~0-9'+\-,:\/\\@]|%[0-9A-F]{2})+")
; string_file_quoted
(re "%^"(?:[^^^"])*^"")
]
url! [
PR_LITERAL
; string_url
(re "[a-zA-Z?!.*&|=_~][a-zA-Z?!.*&|=_~0-9'+-,]*:(?:[a-zA-Z?!.*&|=_~0-9'+\-,:\/@]|%[0-9A-F]{2})+")
]
email! [
PR_LITERAL
; string_email
(re "[\w\d\+\-\.]+\@[\w\d\+\-\.]+\b")
]
binary! [
PR_LITERAL
; binary_base_two
(re "2#\{(?:[01\r\n\t ])*\}")
; binary_base_sixty_four
(re "64#\{(?:[0-9+\/a-yA-Z=\r\n\t ])*\}")
; binary_base_sixteen
(re/i "(?:16)?#\{(?:[0-9a-f\r\n\t ])*\}")
]
issue! [
PR_LITERAL
; string_issue
(re "#[\w\d\-]+(?=[\s\n\t]|$)")
]
; values
date! [
PR_LITERAL
; value_date
(re [date-re "\/\d{1,2}\:\d{1,2}\:\d{1,2}(\+|\-)\d{1,2}\:(00|30)\b"])
(re [date-re "\/\d{1,2}\:\d{1,2}\:\d{1,2}\b"])
(re [date-re "\b"])
(re "\d{2,4}[\/\-](\d{1,2}|\w{3,9})[\/\-]\d{1,2}(?:\/\d{1,2}\:\d{1,2}(?:\:\d{1,2})?(?:[-+]\d{1,2}:[03]0)?)?")
]
time! [
PR_LITERAL
; value_time
(re "[-+]?\d{1,2}:\d{1,2}(?::\d{1,2}(?:\.\d+)?)?\b")
]
tuple! [
PR_LITERAL
; value_tuple
(re "\d+(?:\.\d+){2,9}")
]
pair! [
PR_LITERAL
; value_pair
(re/i ["[-+]?" number-re "x[-+]?" number-re])
]
; [PR['PR_LITERAL'], /^\d(?:[\.\,\'\d]*)x\d(?:[\.\,\'\d]*)\b/]
money! [
PR_LITERAL
; value_money
(re ["[-+]?[A-Z]{0,3}\$" number-re])
; [PR['PR_LITERAL'], /^\$\d[\d\.\,\']*\b/]
; [PR['PR_LITERAL'], /^[\+\-\w]{1,4}\$\d[\d\.\,\']*\b/]
]
; value_number
number! [
PR_LITERAL
(re/i ["[-+]?" number-re "%?"])
; percent! [PR_LITERAL (re "(\+|\-|\d)(?:[\.\,\'\d]*)\%\b")]
; decimal! [PR_LITERAL (re "(\+|\-|\d)\d*(?:[\.\,]\d+)\b")]
; integer! [PR_LITERAL (re "(\+|\-|\d)\d*\b")]
]
; words
datatype! [
PR_LITERAL
; word_datatype
(re "(?:[A-Za-z\-]+)\!(?![A-Za-z0-9\-])")
]
set-word! [
PR_LITERAL
; word_set
(re [word-re "(?:\/" word-re "|\/\d+)*:"])
]
; -- get-word!
get-word! [
PR_LITERAL
; word_get
(re [":" word-re])
]
; -- lit-word!
lit-word! [
PR_LITERAL
; word_lit
(re ["'" word-re])
]
refinement! [
PR_LITERAL
; word_refine
(re reduce ["\/" replace copy find next word-re "[" "]*" "]+" "(?![A-Za-z0-9\-])"])
]
op! [
PR_LITERAL
; word_native
(re "(?:!=?=?|\*\*?|[+-]|\/\/?|<[=>]?|=[=?]?|>=?)(?![A-Za-z0-9\-])")
]
function! [
PR_LITERAL
(re make-keywords-string)
; [REB['function!'], /\b(?:to\-relative\-file\/as\-local|or\~|pwd|abs|map|not|rm|at|do|dp|ds|dt|cd|in|ls|to|or|if)\s/]
]
rebol! [
PR_LITERAL
; word_header
(re/i "(?:rebol|red(?:\/system)?|world|topaz)$")
]
logic! [
PR_LITERAL
; word_logic
(re "(?:true|false|yes|no|on|off)$")
]
; word_none
none! [PR_LITERAL (re "none$")]
; word
word! [PR_LITERAL (re word-re)]
; -- literal!
; literal! [PR_LITERAL (re ["#" block-re])]
]

31
samples/Rebol/booters.r Normal file
View File

@@ -0,0 +1,31 @@
REBOL [
System: "REBOL [R3] Language Interpreter and Run-time Environment"
Title: "Special boot native function specs"
Rights: {
Copyright 2012 REBOL Technologies
REBOL is a trademark of REBOL Technologies
}
License: {
Licensed under the Apache License, Version 2.0.
See: http://www.apache.org/licenses/LICENSE-2.0
}
Purpose: {
These are used to define natives and actions.
Bind attributes for this block are: BIND_SET and SHALLOW
}
]
; Special block used as spec to the datatype test functions (e.g. time?):
["Returns TRUE if it is this type." value [any-type!] 0]
; The native function must be defined first. This is a
; special boot function created manually within the C code.
native: native [
{Creates native function (for internal usage only).}
spec ; [block!] -- no check required, we know it is correct
]
action: native [
{Creates datatype action (for internal usage only).}
spec ; [block!] -- no check required, we know it is correct
]

View File

@@ -1,5 +1,7 @@
REBOL []
hello: func [] [
print "hello, world!"
]
hello

View File

@@ -0,0 +1,7 @@
Rebol []
hello: func [] [
print "hello, world!"
]
hello

View File

@@ -0,0 +1,5 @@
Rebol []
hello: func [] [
print "hello, world!"
]
hello

View File

@@ -0,0 +1,9 @@
Rebol [
author: "Rebol user"
]
hello: func [] [
print "hello, world!"
]
hello

View File

@@ -0,0 +1,2 @@
$ echo $FOOBAR
Hello World!

View File

@@ -0,0 +1,47 @@
$ gem install nokogiri
...
Building native extensions. This could take a while...
...
checking for libxml/parser.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
...
$ brew tap homebrew/dupes
Cloning into '/usr/local/Library/Taps/homebrew-dupes'...
remote: Counting objects: 1034, done.
remote: Compressing objects: 100% (591/591), done.
remote: Total 1034 (delta 560), reused 898 (delta 443)
Receiving objects: 100% (1034/1034), 192.53 KiB | 0 bytes/s, done.
Resolving deltas: 100% (560/560), done.
Checking connectivity... done
Warning: Could not tap homebrew/dupes/lsof over mxcl/master/lsof
Tapped 41 formula
$ brew install apple-gcc42
==> Downloading http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg
######################################################################## 100.0%
==> Caveats
NOTE:
This formula provides components that were removed from XCode in the 4.2
release. There is no reason to install this formula if you are using a
version of XCode prior to 4.2.
This formula contains compilers built from Apple's GCC sources, build
5666.3, available from:
http://opensource.apple.com/tarballs/gcc
All compilers have a `-4.2` suffix. A GFortran compiler is also included.
==> Summary
🍺 /usr/local/Cellar/apple-gcc42/4.2.1-5666.3: 104 files, 75M, built in 11 seconds
$ gem install nokogiri -v 1.5.10
Fetching: nokogiri-1.5.10.gem (100%)
Building native extensions. This could take a while...
Successfully installed nokogiri-1.5.10
1 gem installed
Installing ri documentation for nokogiri-1.5.10...
Installing RDoc documentation for nokogiri-1.5.10...

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