Merge branch 'devel' into warning-for-result
This commit is contained in:
commit
70eaf92ff0
356 changed files with 6122 additions and 3809 deletions
|
|
@ -1,6 +1,5 @@
|
|||
discard """
|
||||
line: 21
|
||||
errormsg: "invalid type: 'Table[string, proc (string){.gcsafe.}]'"
|
||||
output: "action 3 arg"
|
||||
"""
|
||||
|
||||
import tables
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ tfailedassert.nim:27 false assertion from foo
|
|||
type
|
||||
TLineInfo = tuple[filename: string, line: int]
|
||||
|
||||
TMyError = object of E_Base
|
||||
TMyError = object of Exception
|
||||
lineinfo: TLineInfo
|
||||
|
||||
EMyError = ref TMyError
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ proc processClient(fd: int) {.async.} =
|
|||
var foo = line[0]
|
||||
if foo == 'g':
|
||||
raise newException(EBase, "foobar")
|
||||
|
||||
|
||||
proc serve() {.async.} =
|
||||
|
||||
|
|
|
|||
|
|
@ -49,3 +49,44 @@ proc catch() {.async.} =
|
|||
assert false
|
||||
|
||||
asyncCheck catch()
|
||||
|
||||
proc test(): Future[bool] {.async.} =
|
||||
result = false
|
||||
try:
|
||||
raise newException(OSError, "Foobar")
|
||||
except:
|
||||
result = true
|
||||
return
|
||||
|
||||
proc foo(): Future[bool] {.async.} = discard
|
||||
|
||||
proc test2(): Future[bool] {.async.} =
|
||||
result = false
|
||||
try:
|
||||
discard await foo()
|
||||
raise newException(OSError, "Foobar")
|
||||
except:
|
||||
result = true
|
||||
return
|
||||
|
||||
proc test3(): Future[int] {.async.} =
|
||||
result = 0
|
||||
try:
|
||||
try:
|
||||
discard await foo()
|
||||
raise newException(OSError, "Hello")
|
||||
except:
|
||||
result = 1
|
||||
raise
|
||||
except:
|
||||
result = 2
|
||||
return
|
||||
|
||||
var x = test()
|
||||
assert x.read
|
||||
|
||||
x = test2()
|
||||
assert x.read
|
||||
|
||||
var y = test3()
|
||||
assert y.read == 2
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
discard """
|
||||
line: 18
|
||||
errormsg: "type mismatch: got (proc (TScgi) | proc (AsyncSocket, StringTableRef, string){.gcsafe.})"
|
||||
errormsg: "type mismatch: got (proc (TScgi) | proc (AsyncSocket, StringTableRef, string)"
|
||||
"""
|
||||
|
||||
#bug #442
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ def\tskType\tsystem.string\tstring
|
|||
> idetools --track:$TESTNIM,12,35 --def $SILENT
|
||||
def\tskLet\t$MODULE.failtest.input\tTaintedString
|
||||
|
||||
# The following fail because they seem shifted one colum to the right.
|
||||
# The following fail because they seem shifted one column to the right.
|
||||
> idetools --track:$TESTNIM,12,16 --def $SILENT
|
||||
def\tskTemplate\tsequtils.toSeq\tproc \(expr\): expr
|
||||
> idetools --track:$TESTNIM,12,22 --def $SILENT
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import unicode, sequtils
|
|||
|
||||
# This example shows that idetools returns proc as signature for everything
|
||||
# which can be called. While a clever person would use the second column to
|
||||
# differentiate betwen procs, methods and others, why does the output contain
|
||||
# differentiate between procs, methods and others, why does the output contain
|
||||
# incorrect information?
|
||||
|
||||
type
|
||||
|
|
|
|||
24
tests/casestmt/tcase_emptyset_when.nim
Normal file
24
tests/casestmt/tcase_emptyset_when.nim
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
discard """
|
||||
file: "tcaseofwhen.nim"
|
||||
outputsub: "compiles for 1\ni am always two\ndefault for 3\nset is 4 not 5\narray is 6 not 7\ndefault for 8"
|
||||
exitcode: "0"
|
||||
"""
|
||||
|
||||
proc whenCase(a: int) =
|
||||
case a
|
||||
of (when compiles(whenCase(1)): 1 else: {}): echo "compiles for 1"
|
||||
of {}: echo "me not fail"
|
||||
of 2: echo "i am always two"
|
||||
of []: echo "me neither"
|
||||
of {4,5}: echo "set is 4 not 5"
|
||||
of [6,7]: echo "array is 6 not 7"
|
||||
of (when compiles(neverCompilesIBet()): 3 else: {}): echo "compiles for 3"
|
||||
#of {},[]: echo "me neither"
|
||||
else: echo "default for ", a
|
||||
|
||||
whenCase(1)
|
||||
whenCase(2)
|
||||
whenCase(3)
|
||||
whenCase(4)
|
||||
whenCase(6)
|
||||
whenCase(8)
|
||||
30
tests/ccgbugs/tmissingderef.nim
Normal file
30
tests/ccgbugs/tmissingderef.nim
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
discard """
|
||||
output: '''255
|
||||
1 1
|
||||
0.5'''
|
||||
"""
|
||||
|
||||
# bug #1181
|
||||
|
||||
type
|
||||
TFoo = object
|
||||
x: int32
|
||||
|
||||
proc mainowar =
|
||||
var foo: TFoo
|
||||
foo.x = 0xff
|
||||
var arr1 = cast[ptr array[4, uint8]](addr foo)[] # Fails.
|
||||
echo arr1[when cpuEndian == littleEndian: 0 else: 3]
|
||||
|
||||
var i = 1i32
|
||||
let x = addr i
|
||||
var arr2 = cast[ptr array[4, uint8]](x)[] # Fails.
|
||||
echo arr2[when cpuEndian == littleEndian: 0 else: 3], " ", i
|
||||
|
||||
# bug #1715
|
||||
var a: array[2, float32] = [0.5'f32, 0.7]
|
||||
let p = addr a
|
||||
var b = p[]
|
||||
echo b[0]
|
||||
|
||||
mainowar()
|
||||
8
tests/ccgbugs/trecursive_closure.nim
Normal file
8
tests/ccgbugs/trecursive_closure.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# bug #2233
|
||||
type MalType = object
|
||||
fun: proc: MalType
|
||||
|
||||
proc f(x: proc: MalType) =
|
||||
discard x()
|
||||
|
||||
f(nil)
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
discard """
|
||||
errormsg: 'type mismatch: got (mc.typ)'
|
||||
errormsg: "type mismatch: got (mc.typ)"
|
||||
line: 12
|
||||
"""
|
||||
|
||||
|
|
|
|||
22
tests/closure/tfib50.nim
Normal file
22
tests/closure/tfib50.nim
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
discard """
|
||||
output: "20365011074"
|
||||
"""
|
||||
|
||||
import tables
|
||||
|
||||
proc memoize(f: proc (a: int64): int64): proc (a: int64): int64 =
|
||||
var previous = initTable[int64, int64]()
|
||||
return proc(i: int64): int64 =
|
||||
if not previous.hasKey i:
|
||||
previous[i] = f(i)
|
||||
return previous[i]
|
||||
|
||||
var fib: proc(a: int64): int64
|
||||
|
||||
fib = memoize(proc (i: int64): int64 =
|
||||
if i == 0 or i == 1:
|
||||
return 1
|
||||
return fib(i-1) + fib(i-2)
|
||||
)
|
||||
|
||||
echo fib(50)
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
discard """
|
||||
file: "tissue1642.nim"
|
||||
disabled: true
|
||||
"""
|
||||
block:
|
||||
var i = 0
|
||||
|
|
|
|||
15
tests/closure/ttimeinfo.nim
Normal file
15
tests/closure/ttimeinfo.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# bug #2073
|
||||
|
||||
import sequtils
|
||||
import times
|
||||
|
||||
# 1
|
||||
proc f(n: int): TimeInfo =
|
||||
TimeInfo(year: n, month: mJan, monthday: 1)
|
||||
|
||||
echo toSeq(2000 || 2015).map(f)
|
||||
|
||||
# 2
|
||||
echo toSeq(2000 || 2015).map(proc (n: int): TimeInfo =
|
||||
TimeInfo(year: n, month: mJan, monthday: 1)
|
||||
)
|
||||
22
tests/collections/tindexby.nim
Normal file
22
tests/collections/tindexby.nim
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
import tables
|
||||
|
||||
doAssert indexBy(newSeq[int](), proc(x: int):int = x) == initTable[int, int](), "empty int table"
|
||||
|
||||
var tbl1 = initTable[int, int]()
|
||||
tbl1.add(1,1)
|
||||
tbl1.add(2,2)
|
||||
doAssert indexBy(@[1,2], proc(x: int):int = x) == tbl1, "int table"
|
||||
|
||||
type
|
||||
TElem = object
|
||||
foo: int
|
||||
bar: string
|
||||
|
||||
let
|
||||
elem1 = TElem(foo: 1, bar: "bar")
|
||||
elem2 = TElem(foo: 2, bar: "baz")
|
||||
|
||||
var tbl2 = initTable[string, TElem]()
|
||||
tbl2.add("bar", elem1)
|
||||
tbl2.add("baz", elem2)
|
||||
doAssert indexBy(@[elem1,elem2], proc(x: TElem): string = x.bar) == tbl2, "element table"
|
||||
|
|
@ -1,22 +1,152 @@
|
|||
import tables
|
||||
discard """
|
||||
output: '''true'''
|
||||
"""
|
||||
|
||||
doAssert indexBy(newSeq[int](), proc(x: int):int = x) == initTable[int, int](), "empty int table"
|
||||
import hashes, tables
|
||||
|
||||
var tbl1 = initTable[int, int]()
|
||||
tbl1.add(1,1)
|
||||
tbl1.add(2,2)
|
||||
doAssert indexBy(@[1,2], proc(x: int):int = x) == tbl1, "int table"
|
||||
const
|
||||
data = {
|
||||
"34": 123456, "12": 789,
|
||||
"90": 343, "0": 34404,
|
||||
"1": 344004, "2": 344774,
|
||||
"3": 342244, "4": 3412344,
|
||||
"5": 341232144, "6": 34214544,
|
||||
"7": 3434544, "8": 344544,
|
||||
"9": 34435644, "---00": 346677844,
|
||||
"10": 34484, "11": 34474, "19": 34464,
|
||||
"20": 34454, "30": 34141244, "40": 344114,
|
||||
"50": 344490, "60": 344491, "70": 344492,
|
||||
"80": 344497}
|
||||
|
||||
type
|
||||
TElem = object
|
||||
foo: int
|
||||
bar: string
|
||||
|
||||
let
|
||||
elem1 = TElem(foo: 1, bar: "bar")
|
||||
elem2 = TElem(foo: 2, bar: "baz")
|
||||
sorteddata = {
|
||||
"---00": 346677844,
|
||||
"0": 34404,
|
||||
"1": 344004,
|
||||
"10": 34484,
|
||||
"11": 34474,
|
||||
"12": 789,
|
||||
"19": 34464,
|
||||
"2": 344774, "20": 34454,
|
||||
"3": 342244, "30": 34141244,
|
||||
"34": 123456,
|
||||
"4": 3412344, "40": 344114,
|
||||
"5": 341232144, "50": 344490,
|
||||
"6": 34214544, "60": 344491,
|
||||
"7": 3434544, "70": 344492,
|
||||
"8": 344544, "80": 344497,
|
||||
"9": 34435644,
|
||||
"90": 343}
|
||||
|
||||
block tableTest1:
|
||||
var t = initTable[tuple[x, y: int], string]()
|
||||
t[(0,0)] = "00"
|
||||
t[(1,0)] = "10"
|
||||
t[(0,1)] = "01"
|
||||
t[(1,1)] = "11"
|
||||
for x in 0..1:
|
||||
for y in 0..1:
|
||||
assert t[(x,y)] == $x & $y
|
||||
assert($t ==
|
||||
"{(x: 0, y: 1): 01, (x: 0, y: 0): 00, (x: 1, y: 0): 10, (x: 1, y: 1): 11}")
|
||||
|
||||
block tableTest2:
|
||||
var t = initTable[string, float]()
|
||||
t["test"] = 1.2345
|
||||
t["111"] = 1.000043
|
||||
t["123"] = 1.23
|
||||
t.del("111")
|
||||
|
||||
var tbl2 = initTable[string, TElem]()
|
||||
tbl2.add("bar", elem1)
|
||||
tbl2.add("baz", elem2)
|
||||
doAssert indexBy(@[elem1,elem2], proc(x: TElem): string = x.bar) == tbl2, "element table"
|
||||
t["012"] = 67.9
|
||||
t["123"] = 1.5 # test overwriting
|
||||
|
||||
assert t["123"] == 1.5
|
||||
assert t["111"] == 0.0 # deleted
|
||||
assert(not hasKey(t, "111"))
|
||||
|
||||
for key, val in items(data): t[key] = val.toFloat
|
||||
for key, val in items(data): assert t[key] == val.toFloat
|
||||
|
||||
assert(not t.hasKeyOrPut("456", 4.0)) # test absent key
|
||||
assert t.hasKeyOrPut("012", 3.0) # test present key
|
||||
var x = t.mgetOrPut("111", 1.5) # test absent key
|
||||
x = x * 2
|
||||
assert x == 3.0
|
||||
x = t.mgetOrPut("test", 1.5) # test present key
|
||||
x = x * 2
|
||||
assert x == 2 * 1.2345
|
||||
|
||||
block orderedTableTest1:
|
||||
var t = initOrderedTable[string, int](2)
|
||||
for key, val in items(data): t[key] = val
|
||||
for key, val in items(data): assert t[key] == val
|
||||
var i = 0
|
||||
# `pairs` needs to yield in insertion order:
|
||||
for key, val in pairs(t):
|
||||
assert key == data[i][0]
|
||||
assert val == data[i][1]
|
||||
inc(i)
|
||||
|
||||
for key, val in mpairs(t): val = 99
|
||||
for val in mvalues(t): assert val == 99
|
||||
|
||||
block countTableTest1:
|
||||
var s = data.toTable
|
||||
var t = initCountTable[string]()
|
||||
for k in s.keys: t.inc(k)
|
||||
for k in t.keys: assert t[k] == 1
|
||||
t.inc("90", 3)
|
||||
t.inc("12", 2)
|
||||
t.inc("34", 1)
|
||||
assert t.largest()[0] == "90"
|
||||
|
||||
t.sort()
|
||||
var i = 0
|
||||
for k, v in t.pairs:
|
||||
case i
|
||||
of 0: assert k == "90" and v == 4
|
||||
of 1: assert k == "12" and v == 3
|
||||
of 2: assert k == "34" and v == 2
|
||||
else: break
|
||||
inc i
|
||||
|
||||
block mpairsTableTest1:
|
||||
var t = initTable[string, int]()
|
||||
t["a"] = 1
|
||||
t["b"] = 2
|
||||
t["c"] = 3
|
||||
t["d"] = 4
|
||||
for k, v in t.mpairs:
|
||||
if k == "a" or k == "c":
|
||||
v = 9
|
||||
|
||||
for k, v in t.pairs:
|
||||
if k == "a" or k == "c":
|
||||
assert v == 9
|
||||
else:
|
||||
assert v != 1 and v != 3
|
||||
|
||||
block SyntaxTest:
|
||||
var x = toTable[int, string]({:})
|
||||
|
||||
proc orderedTableSortTest() =
|
||||
var t = initOrderedTable[string, int](2)
|
||||
for key, val in items(data): t[key] = val
|
||||
for key, val in items(data): assert t[key] == val
|
||||
t.sort(proc (x, y: tuple[key: string, val: int]): int = cmp(x.key, y.key))
|
||||
var i = 0
|
||||
# `pairs` needs to yield in sorted order:
|
||||
for key, val in pairs(t):
|
||||
doAssert key == sorteddata[i][0]
|
||||
doAssert val == sorteddata[i][1]
|
||||
inc(i)
|
||||
|
||||
# check that lookup still works:
|
||||
for key, val in pairs(t):
|
||||
doAssert val == t[key]
|
||||
# check that insert still works:
|
||||
t["newKeyHere"] = 80
|
||||
|
||||
|
||||
orderedTableSortTest()
|
||||
echo "true"
|
||||
|
||||
|
|
|
|||
|
|
@ -16,5 +16,15 @@ proc run1() = # occupied Memory stays constant, but
|
|||
for i in 1 .. 50: # aborts at run: 44 on win32 with 3.2GB with out of memory
|
||||
TestHashIntInt()
|
||||
|
||||
# bug #2107
|
||||
|
||||
var delTab = initTable[int,int](4)
|
||||
|
||||
for i in 1..4:
|
||||
delTab[i] = i
|
||||
delTab.del(i)
|
||||
delTab[5] = 5
|
||||
|
||||
|
||||
run1()
|
||||
echo "true"
|
||||
|
|
@ -47,7 +47,7 @@ block tableTest1:
|
|||
for y in 0..1:
|
||||
assert t[(x,y)] == $x & $y
|
||||
assert($t ==
|
||||
"{(x: 0, y: 0): 00, (x: 0, y: 1): 01, (x: 1, y: 0): 10, (x: 1, y: 1): 11}")
|
||||
"{(x: 0, y: 1): 01, (x: 0, y: 0): 00, (x: 1, y: 0): 10, (x: 1, y: 1): 11}")
|
||||
|
||||
block tableTest2:
|
||||
var t = newTable[string, float]()
|
||||
|
|
@ -84,7 +84,7 @@ block orderedTableTest1:
|
|||
block countTableTest1:
|
||||
var s = data.toTable
|
||||
var t = newCountTable[string]()
|
||||
for k in s.Keys: t.inc(k)
|
||||
for k in s.keys: t.inc(k)
|
||||
for k in t.keys: assert t[k] == 1
|
||||
t.inc("90", 3)
|
||||
t.inc("12", 2)
|
||||
5
tests/cpp/trawsockets.nim
Normal file
5
tests/cpp/trawsockets.nim
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
discard """
|
||||
cmd: "nim cpp $file"
|
||||
"""
|
||||
|
||||
import rawsockets
|
||||
5
tests/cpp/ttypeinfo.nim
Normal file
5
tests/cpp/ttypeinfo.nim
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
discard """
|
||||
cmd: "nim cpp $file"
|
||||
"""
|
||||
|
||||
import typeinfo
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
discard """
|
||||
line: 9
|
||||
errormsg: "'a' is deprecated [Deprecated]"
|
||||
nimout: "'a' is deprecated [Deprecated]"
|
||||
"""
|
||||
|
||||
var
|
||||
|
|
@ -8,4 +7,3 @@ var
|
|||
|
||||
a[8] = 1
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
discard """
|
||||
line: 20
|
||||
errormsg: " usage of a type with a destructor in a non destructible context"
|
||||
line: 23
|
||||
nimout: " usage of a type with a destructor in a non destructible context"
|
||||
"""
|
||||
|
||||
{.experimental.}
|
||||
|
|
@ -19,5 +19,9 @@ proc open: TMyObj =
|
|||
|
||||
proc `$`(x: TMyObj): string = $x.y
|
||||
|
||||
echo open()
|
||||
proc foo =
|
||||
discard open()
|
||||
|
||||
# XXX doesn't trigger this yet:
|
||||
#echo open()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
discard """
|
||||
line: 2166
|
||||
file: "system.nim"
|
||||
errormsg: "can raise an unlisted exception: ref IOError"
|
||||
"""
|
||||
|
|
|
|||
18
tests/exception/tdefer1.nim
Normal file
18
tests/exception/tdefer1.nim
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
discard """
|
||||
output: '''hi
|
||||
hi'''
|
||||
"""
|
||||
|
||||
# bug #1742
|
||||
|
||||
template test(): expr =
|
||||
let a = 0
|
||||
defer: echo "hi"
|
||||
a
|
||||
|
||||
let i = test()
|
||||
|
||||
import strutils
|
||||
let x = try: parseInt("133a")
|
||||
except: -1
|
||||
finally: echo "hi"
|
||||
6
tests/exprs/thighCString.nim
Normal file
6
tests/exprs/thighCString.nim
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
discard """
|
||||
output: "5"
|
||||
"""
|
||||
let test = cstring("foobar")
|
||||
|
||||
echo high(test)
|
||||
15
tests/fields/tfields_in_template.nim
Normal file
15
tests/fields/tfields_in_template.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
discard """
|
||||
output: '''n
|
||||
n'''
|
||||
"""
|
||||
|
||||
# bug #1902
|
||||
# This works.
|
||||
for name, value in (n: "v").fieldPairs:
|
||||
echo name
|
||||
|
||||
# This doesn't compile - "expression 'name' has no type (or is ambiguous)".
|
||||
template wrapper: stmt =
|
||||
for name, value in (n: "v").fieldPairs:
|
||||
echo name
|
||||
wrapper()
|
||||
33
tests/fields/tfields_with_break.nim
Normal file
33
tests/fields/tfields_with_break.nim
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
discard """
|
||||
output: '''(one: 1, two: 2, three: 3)
|
||||
1
|
||||
2
|
||||
3
|
||||
(one: 4, two: 5, three: 6)
|
||||
4
|
||||
(one: 7, two: 8, three: 9)
|
||||
7
|
||||
8
|
||||
9'''
|
||||
"""
|
||||
|
||||
# bug #2134
|
||||
type
|
||||
TestType = object
|
||||
one: int
|
||||
two: int
|
||||
three: int
|
||||
|
||||
var
|
||||
ab = TestType(one:1, two:2, three:3)
|
||||
ac = TestType(one:4, two:5, three:6)
|
||||
ad = TestType(one:7, two:8, three:9)
|
||||
tstSeq = [ab, ac, ad]
|
||||
|
||||
for tstElement in mitems(tstSeq):
|
||||
echo tstElement
|
||||
for tstField in fields(tstElement):
|
||||
#for tstField in [1,2,4,6]:
|
||||
echo tstField
|
||||
if tstField == 4:
|
||||
break
|
||||
|
|
@ -38,12 +38,14 @@ proc newPlus(a, b: ref TExpr): ref TPlusExpr =
|
|||
result.b = b
|
||||
result.op2 = $getOccupiedMem()
|
||||
|
||||
const Limit = when compileOption("gc", "markAndSweep"): 5*1024*1024 else: 500_000
|
||||
|
||||
for i in 0..100_000:
|
||||
var s: array[0..11, ref TExpr]
|
||||
for j in 0..high(s):
|
||||
s[j] = newPlus(newPlus(newLit(j), newLit(2)), newLit(4))
|
||||
if eval(s[j]) != j+6:
|
||||
quit "error: wrong result"
|
||||
if getOccupiedMem() > 500_000: quit("still a leak!")
|
||||
if getOccupiedMem() > Limit: quit("still a leak!")
|
||||
|
||||
echo "no leak: ", getOccupiedMem()
|
||||
|
|
|
|||
29
tests/gc/growobjcrash.nim
Normal file
29
tests/gc/growobjcrash.nim
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
discard """
|
||||
output: "works"
|
||||
"""
|
||||
|
||||
import cgi, strtabs
|
||||
|
||||
proc handleRequest(query: string): StringTableRef =
|
||||
iterator foo(): StringTableRef {.closure.} =
|
||||
var params = {:}.newStringTable()
|
||||
for key, val in cgi.decodeData(query):
|
||||
params[key] = val
|
||||
yield params
|
||||
|
||||
let x = foo
|
||||
result = x()
|
||||
|
||||
const Limit = when compileOption("gc", "markAndSweep"): 5*1024*1024 else: 700_000
|
||||
|
||||
proc main =
|
||||
var counter = 0
|
||||
for i in 0 .. 100_000:
|
||||
for k, v in handleRequest("nick=Elina2&type=activate"):
|
||||
inc counter
|
||||
if counter mod 100 == 0:
|
||||
if getOccupiedMem() > Limit:
|
||||
quit "but now a leak"
|
||||
|
||||
main()
|
||||
echo "works"
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
discard """
|
||||
output: '''TMatrix[3, 3, system.int]
|
||||
3
|
||||
3'''
|
||||
"""
|
||||
|
||||
|
|
@ -22,5 +21,5 @@ proc echoMat2(a: TMat2) =
|
|||
var m = TMatrix[3,3,int](data: [1,2,3,4,5,6,7,8,9])
|
||||
|
||||
echoMatrix m
|
||||
echoMat2 m
|
||||
#echoMat2 m
|
||||
|
||||
|
|
|
|||
68
tests/generics/twrong_field_caching.nim
Normal file
68
tests/generics/twrong_field_caching.nim
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
discard """
|
||||
output: '''a23: 2x3
|
||||
a32: 3x2
|
||||
transpose A
|
||||
t32: 3x2
|
||||
transpose B
|
||||
x23: 2x3 (2x3)
|
||||
x32: 3x2 (3x2)'''
|
||||
"""
|
||||
|
||||
# bug #2125
|
||||
# Suppose we have the following type for a rectangular array:
|
||||
|
||||
type
|
||||
RectArray*[R, C: static[int], T] = distinct array[R * C, T]
|
||||
|
||||
var a23: RectArray[2, 3, int]
|
||||
var a32: RectArray[3, 2, int]
|
||||
|
||||
echo "a23: ", a23.R, "x", a23.C
|
||||
echo "a32: ", a32.R, "x", a32.C
|
||||
|
||||
# Output:
|
||||
# a23: 2x3
|
||||
# a32: 3x2
|
||||
|
||||
# Looking good. Let's add a proc:
|
||||
proc transpose*[R, C, T](m: RectArray[R, C, T]): RectArray[C, R, T] =
|
||||
echo "transpose A"
|
||||
|
||||
var t32 = a23.transpose
|
||||
|
||||
echo "t32: ", t32.R, "x", t32.C
|
||||
|
||||
# Output:
|
||||
# t32: 3x2
|
||||
|
||||
|
||||
# Everything is still OK. Now let's use the rectangular array inside another
|
||||
# generic type:
|
||||
type
|
||||
Matrix*[R, C: static[int], T] = object
|
||||
theArray*: RectArray[R, C, T]
|
||||
|
||||
#var m23: Matrix[2, 3, int]
|
||||
#var m32: Matrix[3, 2, int]
|
||||
|
||||
#echo "m23: ", m23.R, "x", m23.C, " (", m23.theArray.R, "x", m23.theArray.C, ")"
|
||||
#echo "m32: ", m32.R, "x", m32.C, " (", m32.theArray.R, "x", m32.theArray.C, ")"
|
||||
|
||||
# Output:
|
||||
# m23: 2x3 (2x3)
|
||||
# m32: 3x2 (3x2)
|
||||
|
||||
|
||||
# Everything is still as expected. Now let's add the following proc:
|
||||
proc transpose*[R, C, T](m: Matrix[R, C, T]): Matrix[C, R, T] =
|
||||
echo "transpose B"
|
||||
|
||||
var x23: Matrix[2, 3, int]
|
||||
var x32 = x23.transpose
|
||||
|
||||
echo "x23: ", x23.R, "x", x23.C, " (", x23.theArray.R, "x", x23.theArray.C, ")"
|
||||
echo "x32: ", x32.R, "x", x32.C, " (", x32.theArray.R, "x", x32.theArray.C, ")"
|
||||
|
||||
# Output:
|
||||
# x23: 2x3 (2x3)
|
||||
# x32: 3x2 (3x2) <--- this is incorrect. R and C do not match!
|
||||
118
tests/generics/twrong_floatlit_type.nim
Normal file
118
tests/generics/twrong_floatlit_type.nim
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
discard """
|
||||
errormsg: "type mismatch"
|
||||
line: 116
|
||||
"""
|
||||
|
||||
# bug #2169
|
||||
import strutils, math
|
||||
|
||||
type
|
||||
Point2D*[S] = object
|
||||
x*, y*: S
|
||||
Matrix2x3*[S] = distinct array[6, S] ## Row major order
|
||||
|
||||
Vector2D*[S] = object
|
||||
x*, y*: S
|
||||
|
||||
proc `[]`*[T](m: Matrix2x3[T], i: int): T = array[6, T](m)[i]
|
||||
|
||||
template M11*[T](m: Matrix2x3[T]): T = m[0]
|
||||
template M12*[T](m: Matrix2x3[T]): T = m[1]
|
||||
template M13*[T](m: Matrix2x3[T]): T = m[2]
|
||||
template M21*[T](m: Matrix2x3[T]): T = m[3]
|
||||
template M22*[T](m: Matrix2x3[T]): T = m[4]
|
||||
template M23*[T](m: Matrix2x3[T]): T = m[5]
|
||||
|
||||
proc identity*[T](): Matrix2x3[T] =
|
||||
Matrix2x3[T]([T(1.0), 0.0, 0.0, 0.0, 1.0, 0.0])
|
||||
|
||||
proc translation*[T](p: Point2D[T]): Matrix2x3[T] =
|
||||
Matrix2x3[T]([T(1.0), T(0.0), p.x, T(0.0), T(1.0), p.y])
|
||||
|
||||
proc translation*[T](p: Vector2D[T]): Matrix2x3[T] =
|
||||
Matrix2x3[T]([T(1.0), T(0.0), p.x, T(0.0), T(1.0), p.y])
|
||||
|
||||
proc scale*[T](v: Vector2D[T]): Matrix2x3[T] =
|
||||
Matrix2x3[T]([v.x, T(0.0), T(0.0), T(0.0), v.y, T(0.0)])
|
||||
|
||||
proc rotation*[T](th: T): Matrix2x3[T] =
|
||||
let
|
||||
c = T(cos(th.float))
|
||||
s = T(sin(th.float))
|
||||
|
||||
Matrix2x3[T]([c, -s, T(0.0), s, c, T(0.0)])
|
||||
|
||||
proc `*`*[T](a, b: Matrix2x3[T]): Matrix2x3[T] =
|
||||
# Here we pretend that row 3 is [0,0,0,1] without
|
||||
# actually storing it in the matrix.
|
||||
Matrix2x3[T]([a.M11*b.M11 + a.M12*b.M21,
|
||||
a.M11*b.M12 + a.M12*b.M22,
|
||||
a.M11*b.M13 + a.M12*b.M23 + a.M13,
|
||||
|
||||
a.M21*b.M11 + a.M22*b.M21,
|
||||
a.M21*b.M12 + a.M22*b.M22,
|
||||
a.M21*b.M13 + a.M22*b.M23 + a.M23])
|
||||
|
||||
proc `*`*[T](a: Matrix2x3[T], p: Point2D[T]): Point2D[T] =
|
||||
let
|
||||
x = a.M11*p.x + a.M12*p.y + a.M13
|
||||
y = a.M21*p.x + a.M22*p.y + a.M23
|
||||
|
||||
Point2D[T](x: x, y: y)
|
||||
|
||||
# making these so things like "line" that need a constructor don't stick out.
|
||||
# 2x2 determinant: |a b|
|
||||
# |c d| = ad - bc
|
||||
|
||||
# String rendering
|
||||
#
|
||||
template ff[S](x: S): string =
|
||||
formatFloat(float(x), ffDefault, 0)
|
||||
|
||||
proc `$`*[S](p: Point2D[S]): string =
|
||||
"P($1, $2)" % [ff(p.x), ff(p.y)]
|
||||
|
||||
proc `$`*[S](p: Vector2D[S]): string =
|
||||
"V($1, $2)" % [ff(p.x), ff(p.y)]
|
||||
|
||||
proc `$`*[S](m: Matrix2x3[S]): string =
|
||||
"M($1 $2 $3/$4 $5 $6)" % [ff(m.M11), ff(m.M12), ff(m.M13),
|
||||
ff(m.M21), ff(m.M22), ff(m.M23)]
|
||||
|
||||
#
|
||||
# Vector operators.
|
||||
proc `-`*[S](a: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: -a.x, y: -a.y)
|
||||
|
||||
proc `+`*[S](a, b: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: a.x + b.x, y: a.y + b.y)
|
||||
|
||||
proc `-`*[S](a, b: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: a.x - b.x, y: a.y - b.y)
|
||||
|
||||
proc `*`*[S](v: Vector2D[S], sc: S): Vector2D[S] =
|
||||
Vector2D[S](x: v.x*sc, y: v.y*sc)
|
||||
|
||||
proc `*`*[S](sc: S, v: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: v.x*sc, y: v.y*sc)
|
||||
|
||||
proc `/`*[S](v: Vector2D[S], sc: S): Vector2D[S] =
|
||||
Vector2D[S](x: v.x/sc, y: v.y/sc)
|
||||
|
||||
proc `/`*[S](sc: S; v: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: sc/v.x, y: sc/v.y)
|
||||
|
||||
proc `/`*[S](a, b: Vector2D[S]): Vector2D[S] =
|
||||
Vector2D[S](x: a.x/b.x, y: a.y/b.y)
|
||||
#proc vec[S](x, y: S): Vector2D[S]
|
||||
proc vec[S](x, y: S): Vector2D[S] =
|
||||
Vector2D[S](x: x, y: y)
|
||||
|
||||
if isMainModule:
|
||||
# Comment out this let, and the program will fail to
|
||||
# compile with a type mismatch, as expected.
|
||||
|
||||
let s3 = scale(vec(4.0, 4.0))
|
||||
let barf = translation(Point2D[float32](x: 1, y: 1)) * rotation(float(0.7))
|
||||
|
||||
echo "Badness ", barf
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
discard """
|
||||
file: "toop1.nim"
|
||||
output: "in globalaux2: 10\ntotal globals: 2\nint value: 100\nstring value: second"
|
||||
disabled: "true"
|
||||
"""
|
||||
|
||||
import globalaux, globalaux2
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
discard """
|
||||
output: "2"
|
||||
output: '''2
|
||||
88'''
|
||||
"""
|
||||
|
||||
type
|
||||
TValue* {.pure, final.} = object of TObject
|
||||
TValue* {.pure, final.} = object of RootObj
|
||||
a: int
|
||||
PValue = ref TValue
|
||||
PPValue = ptr PValue
|
||||
|
|
@ -16,3 +17,19 @@ var sp: PPValue = addr x
|
|||
sp.a = 2
|
||||
if sp.a == 2: echo 2 # with sp[].a the error is gone
|
||||
|
||||
# Test the new auto-deref a little
|
||||
|
||||
{.experimental.}
|
||||
|
||||
proc p(x: var int; y: int) = x += y
|
||||
|
||||
block:
|
||||
var x: ref int
|
||||
new(x)
|
||||
|
||||
x.p(44)
|
||||
|
||||
var indirect = p
|
||||
x.indirect(44)
|
||||
|
||||
echo x[]
|
||||
|
|
|
|||
24
tests/iter/tconcat.nim
Normal file
24
tests/iter/tconcat.nim
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
discard """
|
||||
output: '''1
|
||||
2
|
||||
3
|
||||
4
|
||||
20
|
||||
21
|
||||
22
|
||||
23'''
|
||||
"""
|
||||
|
||||
proc toIter*[T](s: Slice[T]): iterator: T =
|
||||
iterator it: T {.closure.} =
|
||||
for x in s.a..s.b:
|
||||
yield x
|
||||
return it
|
||||
|
||||
iterator concat*[T](its: varargs[T, toIter]): auto =
|
||||
for i in its:
|
||||
for x in i():
|
||||
yield x
|
||||
|
||||
for i in concat(1..4, 20..23):
|
||||
echo i
|
||||
17
tests/macros/macro_bug.nim
Normal file
17
tests/macros/macro_bug.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import macros
|
||||
|
||||
macro macro_bug*(s: stmt): stmt {.immediate.} =
|
||||
s.expectKind({nnkProcDef, nnkMethodDef})
|
||||
|
||||
var params = s.params
|
||||
|
||||
let genericParams = s[2]
|
||||
result = newNimNode(nnkProcDef).add(
|
||||
s.name, s[1], genericParams, params, pragma(s), newEmptyNode())
|
||||
|
||||
var body = body(s)
|
||||
|
||||
# Fails here.
|
||||
var call = newCall("macro_bug", s.params[1][0])
|
||||
body.insert(0, call)
|
||||
result.add(body)
|
||||
|
|
@ -1,16 +1,16 @@
|
|||
discard """
|
||||
disabled: true
|
||||
nimout: '''void
|
||||
int'''
|
||||
"""
|
||||
|
||||
import macros, typetraits
|
||||
import macros
|
||||
|
||||
macro checkType(ex, expected: expr): stmt {.immediate.} =
|
||||
var t = ex.typ
|
||||
assert t.name == expected.strVal
|
||||
macro checkType(ex: stmt; expected: expr): stmt =
|
||||
var t = ex.getType()
|
||||
echo t
|
||||
|
||||
proc voidProc = echo "hello"
|
||||
proc intProc(a, b): int = 10
|
||||
proc intProc(a: int, b: float): int = 10
|
||||
|
||||
checkType(voidProc(), "void")
|
||||
checkType(intProc(10, 20.0), "int")
|
||||
checkType(noproc(10, 20.0), "Error Type")
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
discard """
|
||||
output: "bla"
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
import macros
|
||||
9
tests/macros/tsame_name_497.nim
Normal file
9
tests/macros/tsame_name_497.nim
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
discard """
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
import macro_bug
|
||||
|
||||
type TObj = object
|
||||
|
||||
proc f(o: TObj) {.macro_bug.} = discard
|
||||
17
tests/macros/typesapi.nim
Normal file
17
tests/macros/typesapi.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
discard """
|
||||
nimout: '''proc (x: int): string => typeDesc[proc[string, int]]
|
||||
proc (x: int): void => typeDesc[proc[void, int]]
|
||||
proc (x: int) => typeDesc[proc[void, int]]'''
|
||||
"""
|
||||
|
||||
#2211
|
||||
|
||||
import macros
|
||||
|
||||
macro showType(t:stmt): stmt =
|
||||
let ty = t.getType
|
||||
echo t.repr, " => ", ty.repr
|
||||
|
||||
showType(proc(x:int): string)
|
||||
showType(proc(x:int): void)
|
||||
showType(proc(x:int))
|
||||
|
|
@ -302,7 +302,7 @@ template build_specification_lookup():
|
|||
## Returns the table used to keep pointers to all of the specifications.
|
||||
var result {.gensym.}: OrderedTable[string, ptr Tparameter_specification]
|
||||
result = initOrderedTable[string, ptr Tparameter_specification](
|
||||
nextPowerOfTwo(expected.len))
|
||||
tables.rightSize(expected.len))
|
||||
for i in 0..expected.len-1:
|
||||
for param_to_detect in expected[i].names:
|
||||
if result.hasKey(param_to_detect):
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ type
|
|||
contacts*: PContact
|
||||
stamp*: TTimestamp
|
||||
handler*: PCollisionHandler
|
||||
swappedColl*: bool32
|
||||
swappedColl*: Bool32
|
||||
state*: TArbiterState
|
||||
PCollisionHandler* = ptr TCollisionHandler
|
||||
TCollisionHandler*{.pf.} = object
|
||||
|
|
@ -108,7 +108,7 @@ type
|
|||
#/ Collision begin event function callback type.
|
||||
#/ Returning false from a begin callback causes the collision to be ignored until
|
||||
#/ the the separate callback is called when the objects stop colliding.
|
||||
TCollisionBeginFunc* = proc (arb: PArbiter; space: PSpace; data: pointer): Bool{.
|
||||
TCollisionBeginFunc* = proc (arb: PArbiter; space: PSpace; data: pointer): bool{.
|
||||
cdecl.}
|
||||
#/ Collision pre-solve event function callback type.
|
||||
#/ Returning false from a pre-step callback causes the collision to be ignored until the next step.
|
||||
|
|
@ -142,14 +142,14 @@ type
|
|||
PSpatialIndex = ptr TSpatialIndex
|
||||
TSpatialIndex{.pf.} = object
|
||||
klass: PSpatialIndexClass
|
||||
bbfunc: TSpatialIndexBBFunc
|
||||
bbfun: TSpatialIndexBBFunc
|
||||
staticIndex: PSpatialIndex
|
||||
dynamicIndex: PSpatialIndex
|
||||
|
||||
TSpatialIndexDestroyImpl* = proc (index: PSpatialIndex){.cdecl.}
|
||||
TSpatialIndexCountImpl* = proc (index: PSpatialIndex): cint{.cdecl.}
|
||||
TSpatialIndexEachImpl* = proc (index: PSpatialIndex;
|
||||
func: TSpatialIndexIteratorFunc; data: pointer){.
|
||||
fun: TSpatialIndexIteratorFunc; data: pointer){.
|
||||
cdecl.}
|
||||
TSpatialIndexContainsImpl* = proc (index: PSpatialIndex; obj: pointer;
|
||||
hashid: THashValue): Bool32 {.cdecl.}
|
||||
|
|
@ -161,15 +161,15 @@ type
|
|||
TSpatialIndexReindexObjectImpl* = proc (index: PSpatialIndex;
|
||||
obj: pointer; hashid: THashValue){.cdecl.}
|
||||
TSpatialIndexReindexQueryImpl* = proc (index: PSpatialIndex;
|
||||
func: TSpatialIndexQueryFunc; data: pointer){.cdecl.}
|
||||
fun: TSpatialIndexQueryFunc; data: pointer){.cdecl.}
|
||||
TSpatialIndexPointQueryImpl* = proc (index: PSpatialIndex; point: TVector;
|
||||
func: TSpatialIndexQueryFunc;
|
||||
fun: TSpatialIndexQueryFunc;
|
||||
data: pointer){.cdecl.}
|
||||
TSpatialIndexSegmentQueryImpl* = proc (index: PSpatialIndex; obj: pointer;
|
||||
a: TVector; b: TVector; t_exit: CpFloat; func: TSpatialIndexSegmentQueryFunc;
|
||||
a: TVector; b: TVector; t_exit: CpFloat; fun: TSpatialIndexSegmentQueryFunc;
|
||||
data: pointer){.cdecl.}
|
||||
TSpatialIndexQueryImpl* = proc (index: PSpatialIndex; obj: pointer;
|
||||
bb: TBB; func: TSpatialIndexQueryFunc;
|
||||
bb: TBB; fun: TSpatialIndexQueryFunc;
|
||||
data: pointer){.cdecl.}
|
||||
PSpatialIndexClass* = ptr TSpatialIndexClass
|
||||
TSpatialIndexClass*{.pf.} = object
|
||||
|
|
@ -279,14 +279,14 @@ type
|
|||
PSegmentQueryInfo* = ptr TSegmentQueryInfo
|
||||
#/ Segment query info struct.
|
||||
TSegmentQueryInfo*{.pf.} = object
|
||||
shape*: PShape #/ The shape that was hit, NULL if no collision occured.
|
||||
shape*: PShape #/ The shape that was hit, NULL if no collision occurred.
|
||||
t*: CpFloat #/ The normalized distance along the query segment in the range [0, 1].
|
||||
n*: TVector #/ The normal of the surface hit.
|
||||
TShapeType*{.size: sizeof(cint).} = enum
|
||||
CP_CIRCLE_SHAPE, CP_SEGMENT_SHAPE, CP_POLY_SHAPE, CP_NUM_SHAPES
|
||||
TShapeCacheDataImpl* = proc (shape: PShape; p: TVector; rot: TVector): TBB{.cdecl.}
|
||||
TShapeDestroyImpl* = proc (shape: PShape){.cdecl.}
|
||||
TShapePointQueryImpl* = proc (shape: PShape; p: TVector): bool32 {.cdecl.}
|
||||
TShapePointQueryImpl* = proc (shape: PShape; p: TVector): Bool32 {.cdecl.}
|
||||
TShapeSegmentQueryImpl* = proc (shape: PShape; a: TVector; b: TVector;
|
||||
info: PSegmentQueryInfo){.cdecl.}
|
||||
PShapeClass* = ptr TShapeClass
|
||||
|
|
@ -427,7 +427,7 @@ defGetter(PSpace, CpFloat, currDt, CurrentTimeStep)
|
|||
|
||||
|
||||
#/ returns true from inside a callback and objects cannot be added/removed.
|
||||
proc isLocked*(space: PSpace): Bool{.inline.} =
|
||||
proc isLocked*(space: PSpace): bool{.inline.} =
|
||||
result = space.locked.bool
|
||||
|
||||
#/ Set a default collision handler for this space.
|
||||
|
|
@ -478,24 +478,24 @@ proc removeBody*(space: PSpace; body: PBody){.
|
|||
proc RemoveConstraint*(space: PSpace; constraint: PConstraint){.
|
||||
cdecl, importc: "cpSpaceRemoveConstraint", dynlib: Lib.}
|
||||
#/ Test if a collision shape has been added to the space.
|
||||
proc containsShape*(space: PSpace; shape: PShape): Bool{.
|
||||
proc containsShape*(space: PSpace; shape: PShape): bool{.
|
||||
cdecl, importc: "cpSpaceContainsShape", dynlib: Lib.}
|
||||
#/ Test if a rigid body has been added to the space.
|
||||
proc containsBody*(space: PSpace; body: PBody): Bool{.
|
||||
proc containsBody*(space: PSpace; body: PBody): bool{.
|
||||
cdecl, importc: "cpSpaceContainsBody", dynlib: Lib.}
|
||||
#/ Test if a constraint has been added to the space.
|
||||
|
||||
proc containsConstraint*(space: PSpace; constraint: PConstraint): Bool{.
|
||||
proc containsConstraint*(space: PSpace; constraint: PConstraint): bool{.
|
||||
cdecl, importc: "cpSpaceContainsConstraint", dynlib: Lib.}
|
||||
#/ Schedule a post-step callback to be called when cpSpaceStep() finishes.
|
||||
#/ @c obj is used a key, you can only register one callback per unique value for @c obj
|
||||
proc addPostStepCallback*(space: PSpace; func: TPostStepFunc;
|
||||
proc addPostStepCallback*(space: PSpace; fun: TPostStepFunc;
|
||||
obj: pointer; data: pointer){.
|
||||
cdecl, importc: "cpSpaceAddPostStepCallback", dynlib: Lib.}
|
||||
|
||||
#/ Query the space at a point and call @c func for each shape found.
|
||||
proc pointQuery*(space: PSpace; point: TVector; layers: TLayers;
|
||||
group: TGroup; func: TSpacePointQueryFunc; data: pointer){.
|
||||
group: TGroup; fun: TSpacePointQueryFunc; data: pointer){.
|
||||
cdecl, importc: "cpSpacePointQuery", dynlib: Lib.}
|
||||
|
||||
#/ Query the space at a point and return the first shape found. Returns NULL if no shapes were found.
|
||||
|
|
@ -506,7 +506,7 @@ proc pointQueryFirst*(space: PSpace; point: TVector; layers: TLayers;
|
|||
#/ Perform a directed line segment query (like a raycast) against the space calling @c func for each shape intersected.
|
||||
proc segmentQuery*(space: PSpace; start: TVector; to: TVector;
|
||||
layers: TLayers; group: TGroup;
|
||||
func: TSpaceSegmentQueryFunc; data: pointer){.
|
||||
fun: TSpaceSegmentQueryFunc; data: pointer){.
|
||||
cdecl, importc: "cpSpaceSegmentQuery", dynlib: Lib.}
|
||||
#/ Perform a directed line segment query (like a raycast) against the space and return the first shape hit. Returns NULL if no shapes were hit.
|
||||
proc segmentQueryFirst*(space: PSpace; start: TVector; to: TVector;
|
||||
|
|
@ -517,26 +517,26 @@ proc segmentQueryFirst*(space: PSpace; start: TVector; to: TVector;
|
|||
#/ Perform a fast rectangle query on the space calling @c func for each shape found.
|
||||
#/ Only the shape's bounding boxes are checked for overlap, not their full shape.
|
||||
proc BBQuery*(space: PSpace; bb: TBB; layers: TLayers; group: TGroup;
|
||||
func: TSpaceBBQueryFunc; data: pointer){.
|
||||
fun: TSpaceBBQueryFunc; data: pointer){.
|
||||
cdecl, importc: "cpSpaceBBQuery", dynlib: Lib.}
|
||||
|
||||
#/ Query a space for any shapes overlapping the given shape and call @c func for each shape found.
|
||||
proc shapeQuery*(space: PSpace; shape: PShape; func: TSpaceShapeQueryFunc; data: pointer): Bool {.
|
||||
proc shapeQuery*(space: PSpace; shape: PShape; fun: TSpaceShapeQueryFunc; data: pointer): bool {.
|
||||
cdecl, importc: "cpSpaceShapeQuery", dynlib: Lib.}
|
||||
#/ Call cpBodyActivate() for any shape that is overlaps the given shape.
|
||||
proc activateShapesTouchingShape*(space: PSpace; shape: PShape){.
|
||||
cdecl, importc: "cpSpaceActivateShapesTouchingShape", dynlib: Lib.}
|
||||
|
||||
#/ Call @c func for each body in the space.
|
||||
proc eachBody*(space: PSpace; func: TSpaceBodyIteratorFunc; data: pointer){.
|
||||
proc eachBody*(space: PSpace; fun: TSpaceBodyIteratorFunc; data: pointer){.
|
||||
cdecl, importc: "cpSpaceEachBody", dynlib: Lib.}
|
||||
|
||||
#/ Call @c func for each shape in the space.
|
||||
proc eachShape*(space: PSpace; func: TSpaceShapeIteratorFunc;
|
||||
proc eachShape*(space: PSpace; fun: TSpaceShapeIteratorFunc;
|
||||
data: pointer){.
|
||||
cdecl, importc: "cpSpaceEachShape", dynlib: Lib.}
|
||||
#/ Call @c func for each shape in the space.
|
||||
proc eachConstraint*(space: PSpace; func: TSpaceConstraintIteratorFunc;
|
||||
proc eachConstraint*(space: PSpace; fun: TSpaceConstraintIteratorFunc;
|
||||
data: pointer){.
|
||||
cdecl, importc: "cpSpaceEachConstraint", dynlib: Lib.}
|
||||
#/ Update the collision detection info for the static shapes in the space.
|
||||
|
|
@ -674,7 +674,7 @@ proc dist*(v1, v2: TVector): CpFloat {.inline.} =
|
|||
proc distsq*(v1, v2: TVector): CpFloat {.inline.} =
|
||||
result = (v1 - v2).lenSq #vlengthsq(vsub(v1, v2))
|
||||
#/ Returns true if the distance between v1 and v2 is less than dist.
|
||||
proc near*(v1, v2: TVector; dist: CpFloat): Bool{.inline.} =
|
||||
proc near*(v1, v2: TVector; dist: CpFloat): bool{.inline.} =
|
||||
result = v1.distSq(v2) < dist * dist
|
||||
|
||||
|
||||
|
|
@ -706,13 +706,13 @@ proc Sleep*(body: PBody){.importc: "cpBodySleep", dynlib: Lib.}
|
|||
proc SleepWithGroup*(body: PBody; group: PBody){.
|
||||
importc: "cpBodySleepWithGroup", dynlib: Lib.}
|
||||
#/ Returns true if the body is sleeping.
|
||||
proc isSleeping*(body: PBody): Bool {.inline.} =
|
||||
proc isSleeping*(body: PBody): bool {.inline.} =
|
||||
return body.node.root != nil
|
||||
#/ Returns true if the body is static.
|
||||
proc isStatic*(body: PBody): bool {.inline.} =
|
||||
return body.node.idleTime == CpInfinity
|
||||
#/ Returns true if the body has not been added to a space.
|
||||
proc isRogue*(body: PBody): Bool {.inline.} =
|
||||
proc isRogue*(body: PBody): bool {.inline.} =
|
||||
return body.space == nil
|
||||
|
||||
# #define CP_DefineBodyStructGetter(type, member, name) \
|
||||
|
|
@ -808,15 +808,15 @@ proc kineticEnergy*(body: PBOdy): CpFloat =
|
|||
result = (body.v.dot(body.v) * body.m) + (body.w * body.w * body.i)
|
||||
|
||||
#/ Call @c func once for each shape attached to @c body and added to the space.
|
||||
proc eachShape*(body: PBody; func: TBodyShapeIteratorFunc;
|
||||
proc eachShape*(body: PBody; fun: TBodyShapeIteratorFunc;
|
||||
data: pointer){.
|
||||
cdecl, importc: "cpBodyEachShape", dynlib: Lib.}
|
||||
#/ Call @c func once for each constraint attached to @c body and added to the space.
|
||||
proc eachConstraint*(body: PBody; func: TBodyConstraintIteratorFunc;
|
||||
proc eachConstraint*(body: PBody; fun: TBodyConstraintIteratorFunc;
|
||||
data: pointer) {.
|
||||
cdecl, importc: "cpBodyEachConstraint", dynlib: Lib.}
|
||||
#/ Call @c func once for each arbiter that is currently active on the body.
|
||||
proc eachArbiter*(body: PBody; func: TBodyArbiterIteratorFunc;
|
||||
proc eachArbiter*(body: PBody; fun: TBodyArbiterIteratorFunc;
|
||||
data: pointer){.
|
||||
cdecl, importc: "cpBodyEachArbiter", dynlib: Lib.}
|
||||
#/ Allocate a spatial hash.
|
||||
|
|
@ -824,10 +824,10 @@ proc SpaceHashAlloc*(): PSpaceHash{.
|
|||
cdecl, importc: "cpSpaceHashAlloc", dynlib: Lib.}
|
||||
#/ Initialize a spatial hash.
|
||||
proc SpaceHashInit*(hash: PSpaceHash; celldim: CpFloat; numcells: cint;
|
||||
bbfunc: TSpatialIndexBBFunc; staticIndex: PSpatialIndex): PSpatialIndex{.
|
||||
bbfun: TSpatialIndexBBFunc; staticIndex: PSpatialIndex): PSpatialIndex{.
|
||||
cdecl, importc: "cpSpaceHashInit", dynlib: Lib.}
|
||||
#/ Allocate and initialize a spatial hash.
|
||||
proc SpaceHashNew*(celldim: CpFloat; cells: cint; bbfunc: TSpatialIndexBBFunc;
|
||||
proc SpaceHashNew*(celldim: CpFloat; cells: cint; bbfun: TSpatialIndexBBFunc;
|
||||
staticIndex: PSpatialIndex): PSpatialIndex{.
|
||||
cdecl, importc: "cpSpaceHashNew", dynlib: Lib.}
|
||||
#/ Change the cell dimensions and table size of the spatial hash to tune it.
|
||||
|
|
@ -842,18 +842,18 @@ proc SpaceHashResize*(hash: PSpaceHash; celldim: CpFloat; numcells: cint){.
|
|||
#/ Allocate a bounding box tree.
|
||||
proc BBTreeAlloc*(): PBBTree{.cdecl, importc: "cpBBTreeAlloc", dynlib: Lib.}
|
||||
#/ Initialize a bounding box tree.
|
||||
proc BBTreeInit*(tree: PBBTree; bbfunc: TSpatialIndexBBFunc;
|
||||
proc BBTreeInit*(tree: PBBTree; bbfun: TSpatialIndexBBFunc;
|
||||
staticIndex: ptr TSpatialIndex): ptr TSpatialIndex{.cdecl,
|
||||
importc: "cpBBTreeInit", dynlib: Lib.}
|
||||
#/ Allocate and initialize a bounding box tree.
|
||||
proc BBTreeNew*(bbfunc: TSpatialIndexBBFunc; staticIndex: PSpatialIndex): PSpatialIndex{.
|
||||
proc BBTreeNew*(bbfun: TSpatialIndexBBFunc; staticIndex: PSpatialIndex): PSpatialIndex{.
|
||||
cdecl, importc: "cpBBTreeNew", dynlib: Lib.}
|
||||
#/ Perform a static top down optimization of the tree.
|
||||
proc BBTreeOptimize*(index: PSpatialIndex){.
|
||||
cdecl, importc: "cpBBTreeOptimize", dynlib: Lib.}
|
||||
#/ Set the velocity function for the bounding box tree to enable temporal coherence.
|
||||
|
||||
proc BBTreeSetVelocityFunc*(index: PSpatialIndex; func: TBBTreeVelocityFunc){.
|
||||
proc BBTreeSetVelocityFunc*(index: PSpatialIndex; fun: TBBTreeVelocityFunc){.
|
||||
cdecl, importc: "cpBBTreeSetVelocityFunc", dynlib: Lib.}
|
||||
#MARK: Single Axis Sweep
|
||||
|
||||
|
|
@ -864,12 +864,12 @@ proc Sweep1DAlloc*(): ptr TSweep1D{.cdecl, importc: "cpSweep1DAlloc",
|
|||
dynlib: Lib.}
|
||||
#/ Initialize a 1D sort and sweep broadphase.
|
||||
|
||||
proc Sweep1DInit*(sweep: ptr TSweep1D; bbfunc: TSpatialIndexBBFunc;
|
||||
proc Sweep1DInit*(sweep: ptr TSweep1D; bbfun: TSpatialIndexBBFunc;
|
||||
staticIndex: ptr TSpatialIndex): ptr TSpatialIndex{.cdecl,
|
||||
importc: "cpSweep1DInit", dynlib: Lib.}
|
||||
#/ Allocate and initialize a 1D sort and sweep broadphase.
|
||||
|
||||
proc Sweep1DNew*(bbfunc: TSpatialIndexBBFunc; staticIndex: ptr TSpatialIndex): ptr TSpatialIndex{.
|
||||
proc Sweep1DNew*(bbfun: TSpatialIndexBBFunc; staticIndex: ptr TSpatialIndex): ptr TSpatialIndex{.
|
||||
cdecl, importc: "cpSweep1DNew", dynlib: Lib.}
|
||||
|
||||
|
||||
|
|
@ -1359,7 +1359,7 @@ defCProp(SlideJoint, TVector, anchr2, Anchr2)
|
|||
defCProp(SlideJoint, CpFloat, min, Min)
|
||||
defCProp(SlideJoint, CpFloat, max, Max)
|
||||
|
||||
proc pivotJointGetClass*(): PConstraintClass {.
|
||||
proc PivotJointGetClass*(): PConstraintClass {.
|
||||
cdecl, importc: "cpPivotJointGetClass", dynlib: Lib.}
|
||||
|
||||
#/ Allocate a pivot joint
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
const Lib = "libenet.so.1(|.0.3)"
|
||||
|
||||
{.deadCodeElim: ON.}
|
||||
{.deadCodeElim: on.}
|
||||
const
|
||||
ENET_VERSION_MAJOR* = 1
|
||||
ENET_VERSION_MINOR* = 3
|
||||
|
|
|
|||
|
|
@ -9,15 +9,6 @@ template defPacketImports*(): stmt {.immediate, dirty.} =
|
|||
import macros, macro_dsl, estreams
|
||||
from strutils import format
|
||||
|
||||
proc `$`*[T](x: seq[T]): string =
|
||||
result = "[seq len="
|
||||
result.add($x.len)
|
||||
result.add ':'
|
||||
for i in 0.. <len(x):
|
||||
result.add " "
|
||||
result.add($x[i])
|
||||
result.add ']'
|
||||
|
||||
macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
||||
result = newNimNode(nnkStmtList)
|
||||
let
|
||||
|
|
@ -293,4 +284,4 @@ when isMainModule:
|
|||
for itm in test.x:
|
||||
echo(itm)
|
||||
test.pack(s)
|
||||
echo(repr(s.data))
|
||||
echo(repr(s.data))
|
||||
|
|
|
|||
|
|
@ -221,10 +221,10 @@ type
|
|||
TTransform* {.pf.} = object
|
||||
matrix*: array[0..8, cfloat]
|
||||
TColor* {.pf.} = object
|
||||
r*: Uint8
|
||||
g*: Uint8
|
||||
b*: Uint8
|
||||
a*: Uint8
|
||||
r*: uint8
|
||||
g*: uint8
|
||||
b*: uint8
|
||||
a*: uint8
|
||||
PFloatRect* = ptr TFloatRect
|
||||
TFloatRect*{.pf.} = object
|
||||
left*: cfloat
|
||||
|
|
@ -306,7 +306,7 @@ proc close*(window: PRenderWindow) {.
|
|||
proc isOpen*(window: PRenderWindow): bool {.
|
||||
cdecl, importc: "sfRenderWindow_isOpen", dynlib: LibG.}
|
||||
|
||||
#void sfRenderWindow_setIcon(sfRenderWindow* renderWindow, unsigned int width, unsigned int height, const sfUint8* pixels);
|
||||
#void sfRenderWindow_setIcon(sfRenderWindow* renderWindow, unsigned int width, unsigned int height, const sfuint8* pixels);
|
||||
#proc setIcon*(window: PRenderWindow, width, height: cint, pixels: seq[uint8]) {.
|
||||
# cdecl, importc: "sfRenderWindow_setIcon", dynlib: LibG.}
|
||||
|
||||
|
|
@ -395,7 +395,7 @@ proc capture*(window: PRenderWindow): PImage {.
|
|||
cdecl, importc: "sfRenderWindow_capture", dynlib: LibG.}
|
||||
|
||||
#Construct a new render texture
|
||||
proc newRenderTexture*(width, height: cint; depthBuffer: Bool): PRenderTexture {.
|
||||
proc newRenderTexture*(width, height: cint; depthBuffer: bool): PRenderTexture {.
|
||||
cdecl, importc: "sfRenderTexture_create", dynlib: LibG.}
|
||||
#Destroy an existing render texture
|
||||
proc destroy*(renderTexture: PRenderTexture){.
|
||||
|
|
@ -522,9 +522,9 @@ proc copy*(font: PFont): PFont {.
|
|||
cdecl, importc: "sfFont_copy", dynlib: LibG.}
|
||||
proc destroy*(font: PFont) {.
|
||||
cdecl, importc: "sfFont_destroy", dynlib: LibG.}
|
||||
proc getGlyph*(font: PFont, codePoint: Uint32, characterSize: cint, bold: bool): TGlyph{.
|
||||
proc getGlyph*(font: PFont, codePoint: uint32, characterSize: cint, bold: bool): TGlyph{.
|
||||
cdecl, importc: "sfFont_getGlyph", dynlib: LibG.}
|
||||
proc getKerning*(font: PFont, first: Uint32, second: Uint32, characterSize: cint): cint {.
|
||||
proc getKerning*(font: PFont, first: uint32, second: uint32, characterSize: cint): cint {.
|
||||
cdecl, importc: "sfFont_getKerning", dynlib: LibG.}
|
||||
proc getLineSpacing*(font: PFont, characterSize: cint): cint {.
|
||||
cdecl, importc: "sfFont_getLineSpacing", dynlib: LibG.}
|
||||
|
|
@ -882,7 +882,7 @@ proc getInverseTransform*(text: PText): TTransform {.
|
|||
cdecl, importc: "sfText_getInverseTransform", dynlib: LibG.}
|
||||
proc setString*(text: PText, string: cstring) {.
|
||||
cdecl, importc: "sfText_setString", dynlib: LibG.}
|
||||
proc setUnicodeString*(text: PText, string: ptr Uint32) {.
|
||||
proc setUnicodeString*(text: PText, string: ptr uint32) {.
|
||||
cdecl, importc: "sfText_setUnicodeString", dynlib: LibG.}
|
||||
proc setFont*(text: PText, font: PFont) {.
|
||||
cdecl, importc: "sfText_setFont", dynlib: LibG.}
|
||||
|
|
@ -894,13 +894,13 @@ proc setColor*(text: PText, color: TColor) {.
|
|||
cdecl, importc: "sfText_setColor", dynlib: LibG.}
|
||||
proc getString*(text: PText): cstring {.
|
||||
cdecl, importc: "sfText_getString", dynlib: LibG.}
|
||||
proc getUnicodeString*(text: PText): ptr Uint32 {.cdecl,
|
||||
proc getUnicodeString*(text: PText): ptr uint32 {.cdecl,
|
||||
importc: "sfText_getUnicodeString", dynlib: LibG.}
|
||||
proc getFont*(text: PText): PFont {.
|
||||
cdecl, importc: "sfText_getFont", dynlib: LibG.}
|
||||
proc getCharacterSize*(text: PText): cint {.
|
||||
cdecl, importc: "sfText_getCharacterSize", dynlib: LibG.}
|
||||
proc getStyle*(text: PText): Uint32 {.
|
||||
proc getStyle*(text: PText): uint32 {.
|
||||
cdecl, importc: "sfText_getStyle", dynlib: LibG.}
|
||||
proc getColor*(text: PText): TColor {.
|
||||
cdecl, importc: "sfText_getColor", dynlib: LibG.}
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ proc newSoundBuffer*(stream: PInputStream): PSoundBuffer{.
|
|||
#/ \brief Create a new sound buffer and load it from an array of samples in memory
|
||||
#/
|
||||
#/ The assumed format of the audio samples is 16 bits signed integer
|
||||
#/ (sfInt16).
|
||||
#/ (sfint16).
|
||||
#/
|
||||
#/ \param samples Pointer to the array of samples in memory
|
||||
#/ \param sampleCount Number of samples in the array
|
||||
|
|
@ -334,7 +334,7 @@ proc saveToFile*(soundBuffer: PSoundBuffer; filename: cstring): bool {.
|
|||
#/ \brief Get the array of audio samples stored in a sound buffer
|
||||
#/
|
||||
#/ The format of the returned samples is 16 bits signed integer
|
||||
#/ (sfInt16). The total number of samples in this array
|
||||
#/ (sfint16). The total number of samples in this array
|
||||
#/ is given by the sfSoundBuffer_getSampleCount function.
|
||||
#/
|
||||
#/ \param soundBuffer Sound buffer object
|
||||
|
|
@ -342,7 +342,7 @@ proc saveToFile*(soundBuffer: PSoundBuffer; filename: cstring): bool {.
|
|||
#/ \return Read-only pointer to the array of sound samples
|
||||
#/
|
||||
#//////////////////////////////////////////////////////////
|
||||
proc sfSoundBuffer_getSamples*(soundBuffer: PSoundBuffer): ptr Int16{.
|
||||
proc sfSoundBuffer_getSamples*(soundBuffer: PSoundBuffer): ptr int16{.
|
||||
cdecl, importc: "sfSoundBuffer_getSamples", dynlib: Lib.}
|
||||
#//////////////////////////////////////////////////////////
|
||||
#/ \brief Get the number of samples stored in a sound buffer
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ proc tryLogin*(b: PButton) =
|
|||
passwd = u_passwd.getText())
|
||||
dirServer.send HLogin, login
|
||||
proc tryTransition*(b: PButton) =
|
||||
discard
|
||||
#zone.writePkt HZoneJoinReq, myCreds
|
||||
proc tryConnect*(b: PButton) =
|
||||
if not dirServer.connected:
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ proc mouseToSpace*(): TVector =
|
|||
proc explode*(b: PLiveBullet)
|
||||
## TCollisionBeginFunc
|
||||
proc collisionBulletPlayer(arb: PArbiter; space: PSpace;
|
||||
data: pointer): Bool{.cdecl.} =
|
||||
data: pointer): bool{.cdecl.} =
|
||||
var
|
||||
bullet = cast[PLiveBullet](arb.a.data)
|
||||
target = cast[PVehicle](arb.b.data)
|
||||
|
|
@ -152,7 +152,7 @@ proc collisionBulletPlayer(arb: PArbiter; space: PSpace;
|
|||
|
||||
proc angularDampingSim(body: PBody, gravity: TVector, damping, dt: CpFloat){.cdecl.} =
|
||||
body.w -= (body.w * 0.98 * dt)
|
||||
body.updateVelocity(gravity, damping, dt)
|
||||
body.UpdateVelocity(gravity, damping, dt)
|
||||
|
||||
proc initLevel() =
|
||||
loadAllAssets()
|
||||
|
|
@ -227,7 +227,7 @@ proc explode*(b: PLiveBullet) =
|
|||
playSound(b.record.explosion.sound, b.body.getPos())
|
||||
|
||||
proc bulletUpdate(body: PBody, gravity: TVector, damping, dt: CpFloat){.cdecl.} =
|
||||
body.updateVelocity(gravity, damping, dt)
|
||||
body.UpdateVelocity(gravity, damping, dt)
|
||||
|
||||
template getPhysical() {.immediate.} =
|
||||
result.body = space.addBody(newBody(
|
||||
|
|
@ -237,7 +237,7 @@ template getPhysical() {.immediate.} =
|
|||
chipmunk.newCircleShape(
|
||||
result.body,
|
||||
record.physics.radius,
|
||||
vectorZero))
|
||||
VectorZero))
|
||||
|
||||
proc newBullet*(record: PBulletRecord; fromPlayer: PPlayer): PLiveBullet =
|
||||
new(result, free)
|
||||
|
|
@ -480,7 +480,7 @@ when defined(DebugKeys):
|
|||
echo(repr(activeVehicle.record))
|
||||
elif keyPressed(KeyH):
|
||||
activeVehicle.body.setPos(vector(100.0, 100.0))
|
||||
activeVehicle.body.setVel(vectorZero)
|
||||
activeVehicle.body.setVel(VectorZero)
|
||||
elif keyPressed(KeyComma):
|
||||
activeVehicle.body.setPos mouseToSpace())
|
||||
ingameClient.registerHandler(KeyY, down, proc() =
|
||||
|
|
@ -507,7 +507,7 @@ when defined(DebugKeys):
|
|||
return
|
||||
let body = shape.getBody()
|
||||
mouseJoint = space.addConstraint(
|
||||
newPivotJoint(mouseBody, body, vectorZero, body.world2local(point)))
|
||||
newPivotJoint(mouseBody, body, VectorZero, body.world2local(point)))
|
||||
mouseJoint.maxForce = 50000.0
|
||||
mouseJoint.errorBias = pow(1.0 - 0.15, 60))
|
||||
|
||||
|
|
@ -539,15 +539,15 @@ proc mainUpdate(dt: float) =
|
|||
elif not activeVehicle.isNil:
|
||||
if keyPressed(KeyUp):
|
||||
activeVehicle.accel(dt)
|
||||
elif keyPressed(keyDown):
|
||||
elif keyPressed(KeyDown):
|
||||
activeVehicle.reverse(dt)
|
||||
if keyPressed(KeyRight):
|
||||
activeVehicle.turn_right(dt)
|
||||
elif keyPressed(KeyLeft):
|
||||
activeVehicle.turn_left(dt)
|
||||
if keyPressed(keyz):
|
||||
if keyPressed(Keyz):
|
||||
activeVehicle.strafe_left(dt)
|
||||
elif keyPressed(keyx):
|
||||
elif keyPressed(Keyx):
|
||||
activeVehicle.strafe_right(dt)
|
||||
if keyPressed(KeyLControl):
|
||||
localPlayer.useItem 0
|
||||
|
|
@ -557,7 +557,7 @@ proc mainUpdate(dt: float) =
|
|||
localPlayer.useItem 2
|
||||
if keyPressed(KeyW):
|
||||
localPlayer.useItem 3
|
||||
if Keypressed(keyA):
|
||||
if keyPressed(KeyA):
|
||||
localPlayer.useItem 4
|
||||
if keyPressed(sfml.KeyS):
|
||||
localPlayer.useItem 5
|
||||
|
|
@ -666,7 +666,7 @@ when isMainModule:
|
|||
import parseopt
|
||||
|
||||
localPlayer = newPlayer()
|
||||
LobbyInit()
|
||||
lobbyInit()
|
||||
|
||||
videoMode = getClientSettings().resolution
|
||||
window = newRenderWindow(videoMode, "sup", sfDefaultStyle)
|
||||
|
|
@ -683,7 +683,7 @@ when isMainModule:
|
|||
mouseSprite.setOutlineThickness 1.4
|
||||
mouseSprite.setOrigin vec2f(14, 14)
|
||||
|
||||
LobbyReady()
|
||||
lobbyReady()
|
||||
playBtn = specGui.newButton(
|
||||
"Unspec - F12", position = vec2f(680.0, 8.0), onClick = proc(b: PButton) =
|
||||
toggleSpec())
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ proc newObject*(record: PObjectRecord): PGameObject =
|
|||
when false:
|
||||
result.sprite = record.anim.spriteSheet.sprite.copy()
|
||||
result.body = newBody(result.record.physics.mass, 10.0)
|
||||
result.shape = chipmunk.newCircleShape(result.body, result.record.physics.radius, vectorZero)
|
||||
result.shape = chipmunk.newCircleShape(result.body, result.record.physics.radius, VectorZero)
|
||||
result.body.setPos(vector(100, 100))
|
||||
proc newObject*(name: string): PGameObject =
|
||||
result = newObject(fetchObj(name))
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ type
|
|||
PGLclampf* = ptr TGLclampf
|
||||
PGLdouble* = ptr TGLdouble
|
||||
PGLclampd* = ptr TGLclampd
|
||||
PGLvoid* = Pointer
|
||||
PGLvoid* = pointer
|
||||
PPGLvoid* = ptr PGLvoid
|
||||
TGLenum* = cint
|
||||
TGLboolean* = bool
|
||||
|
|
@ -983,7 +983,7 @@ const # Version
|
|||
GL_TEXTURE_COMPONENTS* = GL_TEXTURE_INTERNAL_FORMAT
|
||||
|
||||
proc glAccum*(op: TGLenum, value: TGLfloat){.dynlib: dllname, importc: "glAccum".}
|
||||
proc glAlphaFunc*(func: TGLenum, theref: TGLclampf){.dynlib: dllname,
|
||||
proc glAlphaFunc*(fun: TGLenum, theref: TGLclampf){.dynlib: dllname,
|
||||
importc: "glAlphaFunc".}
|
||||
proc glAreTexturesResident*(n: TGLsizei, textures: PGLuint,
|
||||
residences: PGLboolean): TGLboolean{.
|
||||
|
|
@ -998,7 +998,7 @@ proc glBitmap*(width, height: TGLsizei, xorig, yorig: TGLfloat,
|
|||
proc glBlendFunc*(sfactor, dfactor: TGLenum){.dynlib: dllname,
|
||||
importc: "glBlendFunc".}
|
||||
proc glCallList*(list: TGLuint){.dynlib: dllname, importc: "glCallList".}
|
||||
proc glCallLists*(n: TGLsizei, atype: TGLenum, lists: Pointer){.dynlib: dllname,
|
||||
proc glCallLists*(n: TGLsizei, atype: TGLenum, lists: pointer){.dynlib: dllname,
|
||||
importc: "glCallLists".}
|
||||
proc glClear*(mask: TGLbitfield){.dynlib: dllname, importc: "glClear".}
|
||||
proc glClearAccum*(red, green, blue, alpha: TGLfloat){.dynlib: dllname,
|
||||
|
|
@ -1062,7 +1062,7 @@ proc glColorMask*(red, green, blue, alpha: TGLboolean){.dynlib: dllname,
|
|||
proc glColorMaterial*(face, mode: TGLenum){.dynlib: dllname,
|
||||
importc: "glColorMaterial".}
|
||||
proc glColorPointer*(size: TGLint, atype: TGLenum, stride: TGLsizei,
|
||||
pointer: Pointer){.dynlib: dllname,
|
||||
p: pointer){.dynlib: dllname,
|
||||
importc: "glColorPointer".}
|
||||
proc glCopyPixels*(x, y: TGLint, width, height: TGLsizei, atype: TGLenum){.
|
||||
dynlib: dllname, importc: "glCopyPixels".}
|
||||
|
|
@ -1084,7 +1084,7 @@ proc glDeleteLists*(list: TGLuint, range: TGLsizei){.dynlib: dllname,
|
|||
importc: "glDeleteLists".}
|
||||
proc glDeleteTextures*(n: TGLsizei, textures: PGLuint){.dynlib: dllname,
|
||||
importc: "glDeleteTextures".}
|
||||
proc glDepthFunc*(func: TGLenum){.dynlib: dllname, importc: "glDepthFunc".}
|
||||
proc glDepthFunc*(fun: TGLenum){.dynlib: dllname, importc: "glDepthFunc".}
|
||||
proc glDepthMask*(flag: TGLboolean){.dynlib: dllname, importc: "glDepthMask".}
|
||||
proc glDepthRange*(zNear, zFar: TGLclampd){.dynlib: dllname,
|
||||
importc: "glDepthRange".}
|
||||
|
|
@ -1095,12 +1095,12 @@ proc glDrawArrays*(mode: TGLenum, first: TGLint, count: TGLsizei){.
|
|||
dynlib: dllname, importc: "glDrawArrays".}
|
||||
proc glDrawBuffer*(mode: TGLenum){.dynlib: dllname, importc: "glDrawBuffer".}
|
||||
proc glDrawElements*(mode: TGLenum, count: TGLsizei, atype: TGLenum,
|
||||
indices: Pointer){.dynlib: dllname,
|
||||
indices: pointer){.dynlib: dllname,
|
||||
importc: "glDrawElements".}
|
||||
proc glDrawPixels*(width, height: TGLsizei, format, atype: TGLenum,
|
||||
pixels: Pointer){.dynlib: dllname, importc: "glDrawPixels".}
|
||||
pixels: pointer){.dynlib: dllname, importc: "glDrawPixels".}
|
||||
proc glEdgeFlag*(flag: TGLboolean){.dynlib: dllname, importc: "glEdgeFlag".}
|
||||
proc glEdgeFlagPointer*(stride: TGLsizei, pointer: Pointer){.dynlib: dllname,
|
||||
proc glEdgeFlagPointer*(stride: TGLsizei, p: pointer){.dynlib: dllname,
|
||||
importc: "glEdgeFlagPointer".}
|
||||
proc glEdgeFlagv*(flag: PGLboolean){.dynlib: dllname, importc: "glEdgeFlagv".}
|
||||
proc glEnable*(cap: TGLenum){.dynlib: dllname, importc: "glEnable".}
|
||||
|
|
@ -1171,7 +1171,7 @@ proc glGetPixelMapuiv*(map: TGLenum, values: PGLuint){.dynlib: dllname,
|
|||
importc: "glGetPixelMapuiv".}
|
||||
proc glGetPixelMapusv*(map: TGLenum, values: PGLushort){.dynlib: dllname,
|
||||
importc: "glGetPixelMapusv".}
|
||||
proc glGetPointerv*(pname: TGLenum, params: Pointer){.dynlib: dllname,
|
||||
proc glGetPointerv*(pname: TGLenum, params: pointer){.dynlib: dllname,
|
||||
importc: "glGetPointerv".}
|
||||
proc glGetPolygonStipple*(mask: PGLubyte){.dynlib: dllname,
|
||||
importc: "glGetPolygonStipple".}
|
||||
|
|
@ -1188,10 +1188,10 @@ proc glGetTexGenfv*(coord, pname: TGLenum, params: PGLfloat){.dynlib: dllname,
|
|||
proc glGetTexGeniv*(coord, pname: TGLenum, params: PGLint){.dynlib: dllname,
|
||||
importc: "glGetTexGeniv".}
|
||||
proc glGetTexImage*(target: TGLenum, level: TGLint, format: TGLenum,
|
||||
atype: TGLenum, pixels: Pointer){.dynlib: dllname,
|
||||
atype: TGLenum, pixels: pointer){.dynlib: dllname,
|
||||
importc: "glGetTexImage".}
|
||||
proc glGetTexLevelParameterfv*(target: TGLenum, level: TGLint, pname: TGLenum,
|
||||
params: Pointer){.dynlib: dllname,
|
||||
params: pointer){.dynlib: dllname,
|
||||
importc: "glGetTexLevelParameterfv".}
|
||||
proc glGetTexLevelParameteriv*(target: TGLenum, level: TGLint, pname: TGLenum,
|
||||
params: PGLint){.dynlib: dllname,
|
||||
|
|
@ -1202,7 +1202,7 @@ proc glGetTexParameteriv*(target, pname: TGLenum, params: PGLint){.
|
|||
dynlib: dllname, importc: "glGetTexParameteriv".}
|
||||
proc glHint*(target, mode: TGLenum){.dynlib: dllname, importc: "glHint".}
|
||||
proc glIndexMask*(mask: TGLuint){.dynlib: dllname, importc: "glIndexMask".}
|
||||
proc glIndexPointer*(atype: TGLenum, stride: TGLsizei, pointer: Pointer){.
|
||||
proc glIndexPointer*(atype: TGLenum, stride: TGLsizei, p: pointer){.
|
||||
dynlib: dllname, importc: "glIndexPointer".}
|
||||
proc glIndexd*(c: TGLdouble){.dynlib: dllname, importc: "glIndexd".}
|
||||
proc glIndexdv*(c: PGLdouble){.dynlib: dllname, importc: "glIndexdv".}
|
||||
|
|
@ -1215,7 +1215,7 @@ proc glIndexsv*(c: PGLshort){.dynlib: dllname, importc: "glIndexsv".}
|
|||
proc glIndexub*(c: TGLubyte){.dynlib: dllname, importc: "glIndexub".}
|
||||
proc glIndexubv*(c: PGLubyte){.dynlib: dllname, importc: "glIndexubv".}
|
||||
proc glInitNames*(){.dynlib: dllname, importc: "glInitNames".}
|
||||
proc glInterleavedArrays*(format: TGLenum, stride: TGLsizei, pointer: Pointer){.
|
||||
proc glInterleavedArrays*(format: TGLenum, stride: TGLsizei, p: pointer){.
|
||||
dynlib: dllname, importc: "glInterleavedArrays".}
|
||||
proc glIsEnabled*(cap: TGLenum): TGLboolean{.dynlib: dllname,
|
||||
importc: "glIsEnabled".}
|
||||
|
|
@ -1288,7 +1288,7 @@ proc glNormal3i*(nx, ny, nz: TGLint){.dynlib: dllname, importc: "glNormal3i".}
|
|||
proc glNormal3iv*(v: PGLint){.dynlib: dllname, importc: "glNormal3iv".}
|
||||
proc glNormal3s*(nx, ny, nz: TGLshort){.dynlib: dllname, importc: "glNormal3s".}
|
||||
proc glNormal3sv*(v: PGLshort){.dynlib: dllname, importc: "glNormal3sv".}
|
||||
proc glNormalPointer*(atype: TGLenum, stride: TGLsizei, pointer: Pointer){.
|
||||
proc glNormalPointer*(atype: TGLenum, stride: TGLsizei, p: pointer){.
|
||||
dynlib: dllname, importc: "glNormalPointer".}
|
||||
proc glOrtho*(left, right, bottom, top, zNear, zFar: TGLdouble){.
|
||||
dynlib: dllname, importc: "glOrtho".}
|
||||
|
|
@ -1360,7 +1360,7 @@ proc glRasterPos4s*(x, y, z, w: TGLshort){.dynlib: dllname,
|
|||
proc glRasterPos4sv*(v: PGLshort){.dynlib: dllname, importc: "glRasterPos4sv".}
|
||||
proc glReadBuffer*(mode: TGLenum){.dynlib: dllname, importc: "glReadBuffer".}
|
||||
proc glReadPixels*(x, y: TGLint, width, height: TGLsizei,
|
||||
format, atype: TGLenum, pixels: Pointer){.dynlib: dllname,
|
||||
format, atype: TGLenum, pixels: pointer){.dynlib: dllname,
|
||||
importc: "glReadPixels".}
|
||||
proc glRectd*(x1, y1, x2, y2: TGLdouble){.dynlib: dllname, importc: "glRectd".}
|
||||
proc glRectdv*(v1: PGLdouble, v2: PGLdouble){.dynlib: dllname,
|
||||
|
|
@ -1383,7 +1383,7 @@ proc glScissor*(x, y: TGLint, width, height: TGLsizei){.dynlib: dllname,
|
|||
proc glSelectBuffer*(size: TGLsizei, buffer: PGLuint){.dynlib: dllname,
|
||||
importc: "glSelectBuffer".}
|
||||
proc glShadeModel*(mode: TGLenum){.dynlib: dllname, importc: "glShadeModel".}
|
||||
proc glStencilFunc*(func: TGLenum, theref: TGLint, mask: TGLuint){.
|
||||
proc glStencilFunc*(fun: TGLenum, theref: TGLint, mask: TGLuint){.
|
||||
dynlib: dllname, importc: "glStencilFunc".}
|
||||
proc glStencilMask*(mask: TGLuint){.dynlib: dllname, importc: "glStencilMask".}
|
||||
proc glStencilOp*(fail, zfail, zpass: TGLenum){.dynlib: dllname,
|
||||
|
|
@ -1424,7 +1424,7 @@ proc glTexCoord4s*(s, t, r, q: TGLshort){.dynlib: dllname,
|
|||
importc: "glTexCoord4s".}
|
||||
proc glTexCoord4sv*(v: PGLshort){.dynlib: dllname, importc: "glTexCoord4sv".}
|
||||
proc glTexCoordPointer*(size: TGLint, atype: TGLenum, stride: TGLsizei,
|
||||
pointer: Pointer){.dynlib: dllname,
|
||||
p: pointer){.dynlib: dllname,
|
||||
importc: "glTexCoordPointer".}
|
||||
proc glTexEnvf*(target: TGLenum, pname: TGLenum, param: TGLfloat){.
|
||||
dynlib: dllname, importc: "glTexEnvf".}
|
||||
|
|
@ -1448,10 +1448,10 @@ proc glTexGeniv*(coord: TGLenum, pname: TGLenum, params: PGLint){.
|
|||
dynlib: dllname, importc: "glTexGeniv".}
|
||||
proc glTexImage1D*(target: TGLenum, level, internalformat: TGLint,
|
||||
width: TGLsizei, border: TGLint, format, atype: TGLenum,
|
||||
pixels: Pointer){.dynlib: dllname, importc: "glTexImage1D".}
|
||||
pixels: pointer){.dynlib: dllname, importc: "glTexImage1D".}
|
||||
proc glTexImage2D*(target: TGLenum, level, internalformat: TGLint,
|
||||
width, height: TGLsizei, border: TGLint,
|
||||
format, atype: TGLenum, pixels: Pointer){.dynlib: dllname,
|
||||
format, atype: TGLenum, pixels: pointer){.dynlib: dllname,
|
||||
importc: "glTexImage2D".}
|
||||
proc glTexParameterf*(target: TGLenum, pname: TGLenum, param: TGLfloat){.
|
||||
dynlib: dllname, importc: "glTexParameterf".}
|
||||
|
|
@ -1462,11 +1462,11 @@ proc glTexParameteri*(target: TGLenum, pname: TGLenum, param: TGLint){.
|
|||
proc glTexParameteriv*(target: TGLenum, pname: TGLenum, params: PGLint){.
|
||||
dynlib: dllname, importc: "glTexParameteriv".}
|
||||
proc glTexSubImage1D*(target: TGLenum, level, xoffset: TGLint, width: TGLsizei,
|
||||
format, atype: TGLenum, pixels: Pointer){.dynlib: dllname,
|
||||
format, atype: TGLenum, pixels: pointer){.dynlib: dllname,
|
||||
importc: "glTexSubImage1D".}
|
||||
proc glTexSubImage2D*(target: TGLenum, level, xoffset, yoffset: TGLint,
|
||||
width, height: TGLsizei, format, atype: TGLenum,
|
||||
pixels: Pointer){.dynlib: dllname,
|
||||
pixels: pointer){.dynlib: dllname,
|
||||
importc: "glTexSubImage2D".}
|
||||
proc glTranslated*(x, y, z: TGLdouble){.dynlib: dllname, importc: "glTranslated".}
|
||||
proc glTranslatef*(x, y, z: TGLfloat){.dynlib: dllname, importc: "glTranslatef".}
|
||||
|
|
@ -1495,7 +1495,7 @@ proc glVertex4iv*(v: PGLint){.dynlib: dllname, importc: "glVertex4iv".}
|
|||
proc glVertex4s*(x, y, z, w: TGLshort){.dynlib: dllname, importc: "glVertex4s".}
|
||||
proc glVertex4sv*(v: PGLshort){.dynlib: dllname, importc: "glVertex4sv".}
|
||||
proc glVertexPointer*(size: TGLint, atype: TGLenum, stride: TGLsizei,
|
||||
pointer: Pointer){.dynlib: dllname,
|
||||
p: pointer){.dynlib: dllname,
|
||||
importc: "glVertexPointer".}
|
||||
proc glViewport*(x, y: TGLint, width, height: TGLsizei){.dynlib: dllname,
|
||||
importc: "glViewport".}
|
||||
|
|
@ -1505,28 +1505,28 @@ type
|
|||
count: TGLsizei)
|
||||
PFN_GLVERTEX_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum,
|
||||
stride, count: TGLsizei,
|
||||
pointer: Pointer)
|
||||
p: pointer)
|
||||
PFN_GLNORMAL_POINTER_EXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei,
|
||||
pointer: Pointer)
|
||||
p: pointer)
|
||||
PFN_GLCOLOR_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum,
|
||||
stride, count: TGLsizei, pointer: Pointer)
|
||||
stride, count: TGLsizei, p: pointer)
|
||||
PFN_GLINDEX_POINTER_EXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei,
|
||||
pointer: Pointer)
|
||||
p: pointer)
|
||||
PFN_GLTEXCOORD_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum,
|
||||
stride, count: TGLsizei, pointer: Pointer)
|
||||
stride, count: TGLsizei, p: pointer)
|
||||
PFN_GLEDGEFLAG_POINTER_EXTPROC* = proc (stride, count: TGLsizei,
|
||||
pointer: PGLboolean)
|
||||
PFN_GLGET_POINTER_VEXT_PROC* = proc (pname: TGLenum, params: Pointer)
|
||||
PFN_GLGET_POINTER_VEXT_PROC* = proc (pname: TGLenum, params: pointer)
|
||||
PFN_GLARRAY_ELEMENT_ARRAY_EXTPROC* = proc (mode: TGLenum, count: TGLsizei,
|
||||
pi: Pointer) # WIN_swap_hint
|
||||
pi: pointer) # WIN_swap_hint
|
||||
PFN_GLADDSWAPHINT_RECT_WINPROC* = proc (x, y: TGLint, width, height: TGLsizei)
|
||||
PFN_GLCOLOR_TABLE_EXTPROC* = proc (target, internalFormat: TGLenum,
|
||||
width: TGLsizei, format, atype: TGLenum,
|
||||
data: Pointer)
|
||||
data: pointer)
|
||||
PFN_GLCOLOR_SUBTABLE_EXTPROC* = proc (target: TGLenum, start, count: TGLsizei,
|
||||
format, atype: TGLenum, data: Pointer)
|
||||
format, atype: TGLenum, data: pointer)
|
||||
PFN_GLGETCOLOR_TABLE_EXTPROC* = proc (target, format, atype: TGLenum,
|
||||
data: Pointer)
|
||||
data: pointer)
|
||||
PFN_GLGETCOLOR_TABLE_PARAMETER_IVEXTPROC* = proc (target, pname: TGLenum,
|
||||
params: PGLint)
|
||||
PFN_GLGETCOLOR_TABLE_PARAMETER_FVEXTPROC* = proc (target, pname: TGLenum,
|
||||
|
|
|
|||
|
|
@ -4,14 +4,14 @@ template filterIt2*(seq, pred: expr, body: stmt): stmt {.immediate, dirty.} =
|
|||
for it in items(seq):
|
||||
if pred: body
|
||||
|
||||
proc map*[A, B](x: seq[A], func: proc(y: A): B {.closure.}): seq[B] =
|
||||
proc map*[A, B](x: seq[A], fun: proc(y: A): B {.closure.}): seq[B] =
|
||||
result = @[]
|
||||
for item in x.items:
|
||||
result.add func(item)
|
||||
result.add fun(item)
|
||||
|
||||
proc mapInPlace*[A](x: var seq[A], func: proc(y: A): A {.closure.}) =
|
||||
proc mapInPlace*[A](x: var seq[A], fun: proc(y: A): A {.closure.}) =
|
||||
for i in 0..x.len-1:
|
||||
x[i] = func(x[i])
|
||||
x[i] = fun(x[i])
|
||||
|
||||
template unless*(condition: expr; body: stmt): stmt {.dirty.} =
|
||||
if not(condition):
|
||||
|
|
@ -38,4 +38,4 @@ when isMainModule:
|
|||
var someSeq = @[9,8,7,6,5,4,3,2,1] ## numbers < 6 or even
|
||||
filterIt2 someSeq, it < 6 or (it and 1) == 0:
|
||||
echo(it)
|
||||
echo "-----------"
|
||||
echo "-----------"
|
||||
|
|
|
|||
|
|
@ -122,9 +122,9 @@ var
|
|||
nameToBulletID*: TTable[string, int]
|
||||
activeState = Lobby
|
||||
|
||||
proc newSprite(filename: string; errors: var seq[string]): PSpriteSheet
|
||||
proc newSprite*(filename: string; errors: var seq[string]): PSpriteSheet
|
||||
proc load*(ss: PSpriteSheet): bool {.discardable.}
|
||||
proc newSound(filename: string; errors: var seq[string]): PSoundRecord
|
||||
proc newSound*(filename: string; errors: var seq[string]): PSoundRecord
|
||||
proc load*(s: PSoundRecord): bool {.discardable.}
|
||||
|
||||
proc validateSettings*(settings: PJsonNode; errors: var seq[string]): bool
|
||||
|
|
@ -146,7 +146,7 @@ proc importHandling(data: PJsonNode): THandlingRecord
|
|||
proc importBullet(data: PJsonNode; errors: var seq[string]): PBulletRecord
|
||||
proc importSoul(data: PJsonNode): TSoulRecord
|
||||
proc importExplosion(data: PJsonNode; errors: var seq[string]): TExplosionRecord
|
||||
proc importSound(data: PJsonNode; errors: var seq[string]; fieldName: string = nil): PSoundRecord
|
||||
proc importSound*(data: PJsonNode; errors: var seq[string]; fieldName: string = nil): PSoundRecord
|
||||
|
||||
## this is the only pipe between lobby and main.nim
|
||||
proc getActiveState*(): TGameState =
|
||||
|
|
@ -466,7 +466,7 @@ proc importPhys(data: PJsonNode): TPhysicsRecord =
|
|||
phys.getField("radius", result.radius)
|
||||
phys.getField("mass", result.mass)
|
||||
when not defined(NoChipmunk):
|
||||
result.moment = momentForCircle(result.mass, 0.0, result.radius, vectorZero) * MomentMult
|
||||
result.moment = momentForCircle(result.mass, 0.0, result.radius, VectorZero) * MomentMult
|
||||
proc importHandling(data: PJsonNode): THandlingRecord =
|
||||
result.thrust = 45.0
|
||||
result.topSpeed = 100.0 #unused
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ template idpacket(pktName, id, s2c, c2s: expr): stmt {.immediate, dirty.} =
|
|||
defPacket(`Sc pktName`, s2c)
|
||||
defPacket(`Cs pktName`, c2s)
|
||||
|
||||
forwardPacketT(Uint8, int8)
|
||||
forwardPacketT(Uint16, int16)
|
||||
forwardPacketT(uint8, int8)
|
||||
forwardPacketT(uint16, int16)
|
||||
forwardPacketT(TPort, int16)
|
||||
|
||||
idPacket(Login, 'a',
|
||||
|
|
@ -51,7 +51,7 @@ defPacket(ScTeamList, tuple[teams: seq[ScTeam]])
|
|||
let HTeamChange* = 't'
|
||||
|
||||
idPacket(ZoneQuery, 'Q',
|
||||
tuple[playerCount: Uint16], ##i should include a time here or something
|
||||
tuple[playerCount: uint16], ##i should include a time here or something
|
||||
tuple[pad: char = '\0'])
|
||||
|
||||
type SpawnKind = enum
|
||||
|
|
|
|||
|
|
@ -9,22 +9,22 @@ proc accel*(obj: PVehicle, dt: float) =
|
|||
# sin(obj.angle) * obj.record.handling.thrust.float * dt)
|
||||
obj.body.applyImpulse(
|
||||
vectorForAngle(obj.body.getAngle()) * dt * obj.record.handling.thrust,
|
||||
vectorZero)
|
||||
VectorZero)
|
||||
proc reverse*(obj: PVehicle, dt: float) =
|
||||
#obj.velocity += vec2f(
|
||||
# -cos(obj.angle) * obj.record.handling.reverse.float * dt,
|
||||
# -sin(obj.angle) * obj.record.handling.reverse.float * dt)
|
||||
obj.body.applyImpulse(
|
||||
-vectorForAngle(obj.body.getAngle()) * dt * obj.record.handling.reverse,
|
||||
vectorZero)
|
||||
VectorZero)
|
||||
proc strafe_left*(obj: PVehicle, dt: float) =
|
||||
obj.body.applyImpulse(
|
||||
vectorForAngle(obj.body.getAngle()).perp() * obj.record.handling.strafe * dt,
|
||||
vectorZero)
|
||||
VectorZero)
|
||||
proc strafe_right*(obj: PVehicle, dt: float) =
|
||||
obj.body.applyImpulse(
|
||||
vectorForAngle(obj.body.getAngle()).rperp()* obj.record.handling.strafe * dt,
|
||||
vectorZero)
|
||||
VectorZero)
|
||||
proc turn_right*(obj: PVehicle, dt: float) =
|
||||
#obj.angle = (obj.angle + (obj.record.handling.rotation.float / 10.0 * dt)) mod TAU
|
||||
obj.body.setTorque(obj.record.handling.rotation)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ proc compress*(source: string): string =
|
|||
result.setLen destLen
|
||||
var res = zlib.compress(cstring(result), addr destLen, cstring(source), sourceLen)
|
||||
if res != Z_OK:
|
||||
echo "Error occured: ", res
|
||||
echo "Error occurred: ", res
|
||||
elif destLen < result.len:
|
||||
result.setLen(destLen)
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ proc uncompress*(source: string, destLen: var int): string =
|
|||
result.setLen destLen
|
||||
var res = zlib.uncompress(cstring(result), addr destLen, cstring(source), source.len)
|
||||
if res != Z_OK:
|
||||
echo "Error occured: ", res
|
||||
echo "Error occurred: ", res
|
||||
|
||||
|
||||
when isMainModule:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,7 @@
|
|||
discard """
|
||||
errormsg: "expression 'generate(builder)' has no type (or is ambiguous)"
|
||||
"""
|
||||
|
||||
# bug #898
|
||||
|
||||
proc measureTime(e: auto) =
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ accept bar(vbar)
|
|||
accept baz(vbar)
|
||||
accept baz(vbaz)
|
||||
|
||||
reject baz(vnotbaz)
|
||||
#reject baz(vnotbaz) # XXX this really shouldn't compile
|
||||
reject bar(vfoo)
|
||||
|
||||
# https://github.com/Araq/Nim/issues/517
|
||||
|
|
|
|||
19
tests/metatype/tmatrix3.nim
Normal file
19
tests/metatype/tmatrix3.nim
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
discard """
|
||||
output: ""
|
||||
"""
|
||||
|
||||
type Matrix[M,N: static[int]] = array[M, array[N, float]]
|
||||
|
||||
let a = [[1.0, 1.0, 1.0, 1.0],
|
||||
[2.0, 4.0, 8.0, 16.0],
|
||||
[3.0, 9.0, 27.0, 81.0],
|
||||
[4.0, 16.0, 64.0, 256.0]]
|
||||
|
||||
proc `$`(m: Matrix): string =
|
||||
result = ""
|
||||
|
||||
proc `*`[M,N,M2,N2](a: Matrix[M,N2]; b: Matrix[M2,N]): Matrix[M,N] =
|
||||
discard
|
||||
|
||||
echo a * a
|
||||
|
||||
|
|
@ -14,6 +14,7 @@ AST b
|
|||
20Test
|
||||
20
|
||||
'''
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
import macros
|
||||
17
tests/metatype/tstaticvector.nim
Normal file
17
tests/metatype/tstaticvector.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
|
||||
type
|
||||
RectArray*[R, C: static[int], T] = distinct array[R * C, T]
|
||||
|
||||
StaticMatrix*[R, C: static[int], T] = object
|
||||
elements*: RectArray[R, C, T]
|
||||
|
||||
StaticVector*[N: static[int], T] = StaticMatrix[N, 1, T]
|
||||
|
||||
proc foo*[N, T](a: StaticVector[N, T]): T = 0.T
|
||||
proc foobar*[N, T](a, b: StaticVector[N, T]): T = 0.T
|
||||
|
||||
|
||||
var a: StaticVector[3, int]
|
||||
|
||||
echo foo(a) # OK
|
||||
echo foobar(a, a) # <--- hangs compiler
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
discard """
|
||||
msg: "int\nstring\nTBar[int]"
|
||||
output: "int\nstring\nTBar[int]\nint\nrange 0..2(int)\nstring"
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
import typetraits
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
discard """
|
||||
errormsg: "type mismatch: got (string) but expected 'ptr'"
|
||||
line: 20
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
import typetraits
|
||||
|
|
|
|||
11
tests/metatype/typedesc_as_value.nim
Normal file
11
tests/metatype/typedesc_as_value.nim
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
discard """
|
||||
errormsg: "'typedesc' metatype is not valid here; typed '=' instead of ':'?"
|
||||
"""
|
||||
|
||||
|
||||
var x = int
|
||||
|
||||
echo x
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
discard """
|
||||
line: 8
|
||||
errormsg: "public implementation 'tmismatchedvisibility.foo(a: int): int' has non-public forward declaration in tmismatchedvisibility.nim(6,5)"
|
||||
errormsg: "public implementation 'tmismatchedvisibility.foo(a: int)' has non-public forward declaration in "
|
||||
"""
|
||||
|
||||
proc foo(a: int): int
|
||||
|
||||
proc foo*(a: int): int =
|
||||
result = a + a
|
||||
result = a + a
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
discard """
|
||||
file: "tests/reject/trecincb.nim"
|
||||
line: 9
|
||||
errormsg: "recursive dependency: 'tests/module/trecincb.nim'"
|
||||
errormsg: "recursive dependency: 'trecincb.nim'"
|
||||
"""
|
||||
# Test recursive includes
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
discard """
|
||||
file: "trecincb.nim"
|
||||
line: 9
|
||||
errormsg: "recursive dependency: 'tests/module/trecincb.nim'"
|
||||
errormsg: "recursive dependency: 'trecincb.nim'"
|
||||
"""
|
||||
# Test recursive includes
|
||||
|
||||
27
tests/notnil/tnotnil_in_generic.nim
Normal file
27
tests/notnil/tnotnil_in_generic.nim
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
discard """
|
||||
errormsg: "cannot prove 'x' is not nil"
|
||||
"""
|
||||
|
||||
# bug #2216
|
||||
|
||||
type
|
||||
A[T] = ref object
|
||||
x: int
|
||||
ud: T
|
||||
|
||||
proc good[T](p: A[T]) =
|
||||
discard
|
||||
|
||||
proc bad[T](p: A[T] not nil) =
|
||||
discard
|
||||
|
||||
|
||||
proc go() =
|
||||
let s = A[int](x: 1)
|
||||
|
||||
good(s)
|
||||
bad(s)
|
||||
var x: A[int]
|
||||
bad(x)
|
||||
|
||||
go()
|
||||
|
|
@ -7,8 +7,11 @@ discard """
|
|||
1
|
||||
2
|
||||
3'''
|
||||
disabled: "true"
|
||||
"""
|
||||
|
||||
# Disabled since some versions of GCC ignore the 'packed' attribute
|
||||
|
||||
# Test
|
||||
|
||||
type
|
||||
|
|
|
|||
27
tests/objects/trefobjsyntax.nim
Normal file
27
tests/objects/trefobjsyntax.nim
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
discard """
|
||||
output: '''wohoo
|
||||
baz'''
|
||||
"""
|
||||
|
||||
# Test to ensure the popular 'ref T' syntax works everywhere
|
||||
|
||||
type
|
||||
Foo = object
|
||||
a, b: int
|
||||
s: string
|
||||
|
||||
FooBar = object of RootObj
|
||||
n, m: string
|
||||
Baz = object of FooBar
|
||||
|
||||
proc invoke(a: ref Baz) =
|
||||
echo "baz"
|
||||
|
||||
# check object construction:
|
||||
let x = (ref Foo)(a: 0, b: 45, s: "wohoo")
|
||||
echo x.s
|
||||
|
||||
var y: ref FooBar = (ref Baz)(n: "n", m: "m")
|
||||
|
||||
invoke((ref Baz)(y))
|
||||
|
||||
27
tests/objvariant/treassign.nim
Normal file
27
tests/objvariant/treassign.nim
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
discard """
|
||||
output: "SUCCESS"
|
||||
"""
|
||||
|
||||
type
|
||||
BasicNumber = object of RootObj
|
||||
value: float32
|
||||
RefChild* = ref object
|
||||
curr*: TokenObject
|
||||
Token* {.pure.} = enum
|
||||
foo,
|
||||
bar,
|
||||
TokenObject = object
|
||||
case kind*: Token
|
||||
of Token.foo:
|
||||
foo*: string
|
||||
of Token.bar:
|
||||
bar*: BasicNumber
|
||||
|
||||
|
||||
var t = RefChild()
|
||||
|
||||
t.curr = TokenObject(kind: Token.bar, bar: BasicNumber(value: 12.34))
|
||||
|
||||
t.curr = TokenObject(kind: Token.foo, foo: "foo")
|
||||
|
||||
echo "SUCCESS"
|
||||
|
|
@ -4,13 +4,16 @@ discard """
|
|||
"""
|
||||
import osproc, os, streams
|
||||
|
||||
doAssert fileExists(getCurrentDir() / "tests" / "osproc" / "ta.exe")
|
||||
const filename = when defined(Windows): "ta.exe" else: "ta"
|
||||
|
||||
var p = startProcess("ta.exe", getCurrentDir() / "tests" / "osproc")
|
||||
doAssert fileExists(getCurrentDir() / "tests" / "osproc" / filename)
|
||||
|
||||
var p = startProcess(filename, getCurrentDir() / "tests" / "osproc")
|
||||
p.inputStream.write("5\n")
|
||||
p.inputStream.flush()
|
||||
while true:
|
||||
let line = p.outputStream.readLine()
|
||||
if line != "":
|
||||
echo line
|
||||
else:
|
||||
break
|
||||
break
|
||||
|
|
|
|||
17
tests/overload/tparams_after_varargs.nim
Normal file
17
tests/overload/tparams_after_varargs.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
discard """
|
||||
output: '''a 1 b 2 x @[3, 4, 5] y 6 z 7
|
||||
yay
|
||||
12'''
|
||||
"""
|
||||
|
||||
proc test(a, b: int, x: varargs[int]; y, z: int) =
|
||||
echo "a ", a, " b ", b, " x ", @x, " y ", y, " z ", z
|
||||
|
||||
test 1, 2, 3, 4, 5, 6, 7
|
||||
|
||||
template takesBlock(a, b: int, x: varargs[expr]; blck: stmt) =
|
||||
blck
|
||||
echo a, b
|
||||
|
||||
takesBlock 1, 2, "some", 0.90, "random stuff":
|
||||
echo "yay"
|
||||
17
tests/overload/tprefer_tygenericinst.nim
Normal file
17
tests/overload/tprefer_tygenericinst.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
discard """
|
||||
output: "Version 2 was called."
|
||||
disabled: true
|
||||
"""
|
||||
|
||||
# bug #2220
|
||||
|
||||
type A[T] = object
|
||||
type B = A[int]
|
||||
|
||||
proc p[X](x: X) =
|
||||
echo "Version 1 was called."
|
||||
|
||||
proc p(x: B) =
|
||||
echo "Version 2 was called."
|
||||
|
||||
p(B()) # This call reported as ambiguous.
|
||||
11
tests/parser/twhen_in_enum.nim
Normal file
11
tests/parser/twhen_in_enum.nim
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
discard """
|
||||
errormsg: "identifier expected, but found 'keyword when'"
|
||||
"""
|
||||
|
||||
# bug #2123
|
||||
type num = enum
|
||||
NUM_NONE = 0
|
||||
NUM_ALL = 1
|
||||
when defined(macosx): NUM_OSX = 10 # only this differs for real
|
||||
NUM_XTRA = 20
|
||||
|
||||
|
|
@ -4,7 +4,7 @@ import dialogs, gtk2
|
|||
|
||||
gtk2.nimrod_init()
|
||||
|
||||
var x = ChooseFilesToOpen(nil)
|
||||
var x = chooseFilesToOpen(nil)
|
||||
for a in items(x):
|
||||
writeln(stdout, a)
|
||||
|
||||
|
|
@ -12,6 +12,6 @@ info(nil, "start with an info box")
|
|||
warning(nil, "now a warning ...")
|
||||
error(nil, "... and an error!")
|
||||
|
||||
writeln(stdout, ChooseFileToOpen(nil))
|
||||
writeln(stdout, ChooseFileToSave(nil))
|
||||
writeln(stdout, ChooseDir(nil))
|
||||
writeln(stdout, chooseFileToOpen(nil))
|
||||
writeln(stdout, chooseFileToSave(nil))
|
||||
writeln(stdout, chooseDir(nil))
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ proc caseOneAndTwo(followLink: bool) =
|
|||
try:
|
||||
discard getFileInfo(getAppFilename(), followLink)
|
||||
#echo("String : Existing File : Symlink $# : Success" % $followLink)
|
||||
except EOS:
|
||||
except OSError:
|
||||
echo("String : Existing File : Symlink $# : Failure" % $followLink)
|
||||
|
||||
proc caseThreeAndFour(followLink: bool) =
|
||||
|
|
@ -40,7 +40,8 @@ proc caseThreeAndFour(followLink: bool) =
|
|||
try:
|
||||
discard getFileInfo(invalidName, true)
|
||||
echo("String : Non-existing File : Symlink $# : Failure" % $followLink)
|
||||
except EOS:
|
||||
except OSError:
|
||||
discard
|
||||
#echo("String : Non-existing File : Symlink $# : Success" % $followLink)
|
||||
|
||||
proc testGetFileInfo =
|
||||
|
|
@ -82,12 +83,14 @@ proc testGetFileInfo =
|
|||
discard getFileInfo(testFile)
|
||||
echo("Handle : Invalid File : Failure")
|
||||
except EIO, EOS:
|
||||
discard
|
||||
#echo("Handle : Invalid File : Success")
|
||||
|
||||
try:
|
||||
discard getFileInfo(testHandle)
|
||||
echo("Handle : Invalid File : Failure")
|
||||
except EIO, EOS:
|
||||
discard
|
||||
#echo("Handle : Invalid File : Success")
|
||||
|
||||
testGetFileInfo()
|
||||
testGetFileInfo()
|
||||
|
|
|
|||
|
|
@ -1,452 +0,0 @@
|
|||
import irc, sockets, asyncio, json, os, strutils, times, redis
|
||||
|
||||
type
|
||||
TDb* = object
|
||||
r*: TRedis
|
||||
lastPing: float
|
||||
|
||||
TBuildResult* = enum
|
||||
bUnknown, bFail, bSuccess
|
||||
|
||||
TTestResult* = enum
|
||||
tUnknown, tFail, tSuccess
|
||||
|
||||
TEntry* = tuple[c: TCommit, p: seq[TPlatform]]
|
||||
|
||||
TCommit* = object
|
||||
commitMsg*, username*, hash*: string
|
||||
date*: TTime
|
||||
|
||||
TPlatform* = object
|
||||
buildResult*: TBuildResult
|
||||
testResult*: TTestResult
|
||||
failReason*, platform*: string
|
||||
total*, passed*, skipped*, failed*: biggestInt
|
||||
csources*: bool
|
||||
|
||||
const
|
||||
listName = "commits"
|
||||
failOnExisting = False
|
||||
|
||||
proc open*(host = "localhost", port: TPort): TDb =
|
||||
result.r = redis.open(host, port)
|
||||
result.lastPing = epochTime()
|
||||
|
||||
discard """proc customHSet(database: TDb, name, field, value: string) =
|
||||
if database.r.hSet(name, field, value).int == 0:
|
||||
if failOnExisting:
|
||||
assert(false)
|
||||
else:
|
||||
echo("[Warning:REDIS] ", field, " already exists in ", name)"""
|
||||
|
||||
proc updateProperty*(database: TDb, commitHash, platform, property,
|
||||
value: string) =
|
||||
var name = platform & ":" & commitHash
|
||||
if database.r.hSet(name, property, value).int == 0:
|
||||
echo("[INFO:REDIS] '$1' field updated in hash" % [property])
|
||||
else:
|
||||
echo("[INFO:REDIS] '$1' new field added to hash" % [property])
|
||||
|
||||
proc globalProperty*(database: TDb, commitHash, property, value: string) =
|
||||
if database.r.hSet(commitHash, property, value).int == 0:
|
||||
echo("[INFO:REDIS] '$1' field updated in hash" % [property])
|
||||
else:
|
||||
echo("[INFO:REDIS] '$1' new field added to hash" % [property])
|
||||
|
||||
proc addCommit*(database: TDb, commitHash, commitMsg, user: string) =
|
||||
# Add the commit hash to the `commits` list.
|
||||
discard database.r.lPush(listName, commitHash)
|
||||
# Add the commit message, current date and username as a property
|
||||
globalProperty(database, commitHash, "commitMsg", commitMsg)
|
||||
globalProperty(database, commitHash, "date", $int(getTime()))
|
||||
globalProperty(database, commitHash, "username", user)
|
||||
|
||||
proc keepAlive*(database: var TDb) =
|
||||
## Keep the connection alive. Ping redis in this case. This functions does
|
||||
## not guarantee that redis will be pinged.
|
||||
var t = epochTime()
|
||||
if t - database.lastPing >= 60.0:
|
||||
echo("PING -> redis")
|
||||
assert(database.r.ping() == "PONG")
|
||||
database.lastPing = t
|
||||
|
||||
proc getCommits*(database: TDb,
|
||||
plStr: var seq[string]): seq[TEntry] =
|
||||
result = @[]
|
||||
var commitsRaw = database.r.lrange("commits", 0, -1)
|
||||
for c in items(commitsRaw):
|
||||
var commit: TCommit
|
||||
commit.hash = c
|
||||
for key, value in database.r.hPairs(c):
|
||||
case normalize(key)
|
||||
of "commitmsg": commit.commitMsg = value
|
||||
of "date": commit.date = TTime(parseInt(value))
|
||||
of "username": commit.username = value
|
||||
else:
|
||||
echo(key)
|
||||
assert(false)
|
||||
|
||||
var platformsRaw = database.r.lrange(c & ":platforms", 0, -1)
|
||||
var platforms: seq[TPlatform] = @[]
|
||||
for p in items(platformsRaw):
|
||||
var platform: TPlatform
|
||||
for key, value in database.r.hPairs(p & ":" & c):
|
||||
case normalize(key)
|
||||
of "buildresult":
|
||||
platform.buildResult = parseInt(value).TBuildResult
|
||||
of "testresult":
|
||||
platform.testResult = parseInt(value).TTestResult
|
||||
of "failreason":
|
||||
platform.failReason = value
|
||||
of "total":
|
||||
platform.total = parseBiggestInt(value)
|
||||
of "passed":
|
||||
platform.passed = parseBiggestInt(value)
|
||||
of "skipped":
|
||||
platform.skipped = parseBiggestInt(value)
|
||||
of "failed":
|
||||
platform.failed = parseBiggestInt(value)
|
||||
of "csources":
|
||||
platform.csources = if value == "t": true else: false
|
||||
else:
|
||||
echo(normalize(key))
|
||||
assert(false)
|
||||
|
||||
platform.platform = p
|
||||
|
||||
platforms.add(platform)
|
||||
if p notin plStr:
|
||||
plStr.add(p)
|
||||
result.add((commit, platforms))
|
||||
|
||||
proc commitExists*(database: TDb, commit: string, starts = false): bool =
|
||||
# TODO: Consider making the 'commits' list a set.
|
||||
for c in items(database.r.lrange("commits", 0, -1)):
|
||||
if starts:
|
||||
if c.startsWith(commit): return true
|
||||
else:
|
||||
if c == commit: return true
|
||||
return false
|
||||
|
||||
proc platformExists*(database: TDb, commit: string, platform: string): bool =
|
||||
for p in items(database.r.lrange(commit & ":" & "platforms", 0, -1)):
|
||||
if p == platform: return true
|
||||
|
||||
proc expandHash*(database: TDb, commit: string): string =
|
||||
for c in items(database.r.lrange("commits", 0, -1)):
|
||||
if c.startsWith(commit): return c
|
||||
assert false
|
||||
|
||||
proc isNewest*(database: TDb, commit: string): bool =
|
||||
return database.r.lIndex("commits", 0) == commit
|
||||
|
||||
proc getNewest*(database: TDb): string =
|
||||
return database.r.lIndex("commits", 0)
|
||||
|
||||
proc addPlatform*(database: TDb, commit: string, platform: string) =
|
||||
assert database.commitExists(commit)
|
||||
assert (not database.platformExists(commit, platform))
|
||||
var name = platform & ":" & commit
|
||||
if database.r.exists(name):
|
||||
if failOnExisting: quit("[FAIL] " & name & " already exists!", 1)
|
||||
else: echo("[Warning] " & name & " already exists!")
|
||||
|
||||
discard database.r.lPush(commit & ":" & "platforms", platform)
|
||||
|
||||
proc `[]`*(p: seq[TPlatform], name: string): TPlatform =
|
||||
for platform in items(p):
|
||||
if platform.platform == name:
|
||||
return platform
|
||||
raise newException(EInvalidValue, name & " platforms not found in commits.")
|
||||
|
||||
proc contains*(p: seq[TPlatform], s: string): bool =
|
||||
for i in items(p):
|
||||
if i.platform == s:
|
||||
return True
|
||||
|
||||
|
||||
type
|
||||
PState = ref TState
|
||||
TState = object of TObject
|
||||
dispatcher: PDispatcher
|
||||
sock: PAsyncSocket
|
||||
ircClient: PAsyncIRC
|
||||
hubPort: TPort
|
||||
database: TDb
|
||||
dbConnected: bool
|
||||
|
||||
TSeenType = enum
|
||||
PSeenJoin, PSeenPart, PSeenMsg, PSeenNick, PSeenQuit
|
||||
|
||||
TSeen = object
|
||||
nick: string
|
||||
channel: string
|
||||
timestamp: TTime
|
||||
case kind*: TSeenType
|
||||
of PSeenJoin: nil
|
||||
of PSeenPart, PSeenQuit, PSeenMsg:
|
||||
msg: string
|
||||
of PSeenNick:
|
||||
newNick: string
|
||||
|
||||
const
|
||||
ircServer = "irc.freenode.net"
|
||||
joinChans = @["#nim"]
|
||||
botNickname = "NimBot"
|
||||
|
||||
proc setSeen(d: TDb, s: TSeen) =
|
||||
discard d.r.del("seen:" & s.nick)
|
||||
|
||||
var hashToSet = @[("type", $s.kind.int), ("channel", s.channel),
|
||||
("timestamp", $s.timestamp.int)]
|
||||
case s.kind
|
||||
of PSeenJoin: discard
|
||||
of PSeenPart, PSeenMsg, PSeenQuit:
|
||||
hashToSet.add(("msg", s.msg))
|
||||
of PSeenNick:
|
||||
hashToSet.add(("newnick", s.newNick))
|
||||
|
||||
d.r.hMSet("seen:" & s.nick, hashToSet)
|
||||
|
||||
proc getSeen(d: TDb, nick: string, s: var TSeen): bool =
|
||||
if d.r.exists("seen:" & nick):
|
||||
result = true
|
||||
s.nick = nick
|
||||
# Get the type first
|
||||
s.kind = d.r.hGet("seen:" & nick, "type").parseInt.TSeenType
|
||||
|
||||
for key, value in d.r.hPairs("seen:" & nick):
|
||||
case normalize(key)
|
||||
of "type":
|
||||
#s.kind = value.parseInt.TSeenType
|
||||
of "channel":
|
||||
s.channel = value
|
||||
of "timestamp":
|
||||
s.timestamp = TTime(value.parseInt)
|
||||
of "msg":
|
||||
s.msg = value
|
||||
of "newnick":
|
||||
s.newNick = value
|
||||
|
||||
template createSeen(typ: TSeenType, n, c: string): stmt {.immediate, dirty.} =
|
||||
var seenNick: TSeen
|
||||
seenNick.kind = typ
|
||||
seenNick.nick = n
|
||||
seenNick.channel = c
|
||||
seenNick.timestamp = getTime()
|
||||
|
||||
proc parseReply(line: string, expect: string): Bool =
|
||||
var jsonDoc = parseJson(line)
|
||||
return jsonDoc["reply"].str == expect
|
||||
|
||||
proc limitCommitMsg(m: string): string =
|
||||
## Limits the message to 300 chars and adds ellipsis.
|
||||
var m1 = m
|
||||
if NewLines in m1:
|
||||
m1 = m1.splitLines()[0]
|
||||
|
||||
if m1.len >= 300:
|
||||
m1 = m1[0..300]
|
||||
|
||||
if m1.len >= 300 or NewLines in m: m1.add("... ")
|
||||
|
||||
if NewLines in m: m1.add($m.splitLines().len & " more lines")
|
||||
|
||||
return m1
|
||||
|
||||
proc handleWebMessage(state: PState, line: string) =
|
||||
echo("Got message from hub: " & line)
|
||||
var json = parseJson(line)
|
||||
if json.hasKey("payload"):
|
||||
for i in 0..min(4, json["payload"]["commits"].len-1):
|
||||
var commit = json["payload"]["commits"][i]
|
||||
# Create the message
|
||||
var message = ""
|
||||
message.add(json["payload"]["repository"]["owner"]["name"].str & "/" &
|
||||
json["payload"]["repository"]["name"].str & " ")
|
||||
message.add(commit["id"].str[0..6] & " ")
|
||||
message.add(commit["author"]["name"].str & " ")
|
||||
message.add("[+" & $commit["added"].len & " ")
|
||||
message.add("±" & $commit["modified"].len & " ")
|
||||
message.add("-" & $commit["removed"].len & "]: ")
|
||||
message.add(limitCommitMsg(commit["message"].str))
|
||||
|
||||
# Send message to #nim.
|
||||
state.ircClient.privmsg(joinChans[0], message)
|
||||
elif json.hasKey("redisinfo"):
|
||||
assert json["redisinfo"].hasKey("port")
|
||||
#let redisPort = json["redisinfo"]["port"].num
|
||||
state.dbConnected = true
|
||||
|
||||
proc hubConnect(state: PState)
|
||||
proc handleConnect(s: PAsyncSocket, state: PState) =
|
||||
try:
|
||||
# Send greeting
|
||||
var obj = newJObject()
|
||||
obj["name"] = newJString("irc")
|
||||
obj["platform"] = newJString("?")
|
||||
state.sock.send($obj & "\c\L")
|
||||
|
||||
# Wait for reply.
|
||||
var line = ""
|
||||
sleep(1500)
|
||||
if state.sock.recvLine(line):
|
||||
assert(line != "")
|
||||
doAssert parseReply(line, "OK")
|
||||
echo("The hub accepted me!")
|
||||
else:
|
||||
raise newException(EInvalidValue,
|
||||
"Hub didn't accept me. Waited 1.5 seconds.")
|
||||
|
||||
# ask for the redis info
|
||||
var riobj = newJObject()
|
||||
riobj["do"] = newJString("redisinfo")
|
||||
state.sock.send($riobj & "\c\L")
|
||||
|
||||
except EOS:
|
||||
echo(getCurrentExceptionMsg())
|
||||
s.close()
|
||||
echo("Waiting 5 seconds...")
|
||||
sleep(5000)
|
||||
state.hubConnect()
|
||||
|
||||
proc handleRead(s: PAsyncSocket, state: PState) =
|
||||
var line = ""
|
||||
if state.sock.recvLine(line):
|
||||
if line != "":
|
||||
# Handle the message
|
||||
state.handleWebMessage(line)
|
||||
else:
|
||||
echo("Disconnected from hub: ", OSErrorMsg())
|
||||
s.close()
|
||||
echo("Reconnecting...")
|
||||
state.hubConnect()
|
||||
else:
|
||||
echo(OSErrorMsg())
|
||||
|
||||
proc hubConnect(state: PState) =
|
||||
state.sock = AsyncSocket()
|
||||
state.sock.connect("127.0.0.1", state.hubPort)
|
||||
state.sock.handleConnect =
|
||||
proc (s: PAsyncSocket) =
|
||||
handleConnect(s, state)
|
||||
state.sock.handleRead =
|
||||
proc (s: PAsyncSocket) =
|
||||
handleRead(s, state)
|
||||
|
||||
state.dispatcher.register(state.sock)
|
||||
|
||||
proc handleIrc(irc: PAsyncIRC, event: TIRCEvent, state: PState) =
|
||||
case event.typ
|
||||
of EvConnected: discard
|
||||
of EvDisconnected:
|
||||
while not state.ircClient.isConnected:
|
||||
try:
|
||||
state.ircClient.connect()
|
||||
except:
|
||||
echo("Error reconnecting: ", getCurrentExceptionMsg())
|
||||
|
||||
echo("Waiting 5 seconds...")
|
||||
sleep(5000)
|
||||
echo("Reconnected successfully!")
|
||||
of EvMsg:
|
||||
echo("< ", event.raw)
|
||||
case event.cmd
|
||||
of MPrivMsg:
|
||||
let msg = event.params[event.params.len-1]
|
||||
let words = msg.split(' ')
|
||||
template pm(msg: string): stmt =
|
||||
state.ircClient.privmsg(event.origin, msg)
|
||||
case words[0]
|
||||
of "!ping": pm("pong")
|
||||
of "!lag":
|
||||
if state.ircClient.getLag != -1.0:
|
||||
var lag = state.ircClient.getLag
|
||||
lag = lag * 1000.0
|
||||
pm($int(lag) & "ms between me and the server.")
|
||||
else:
|
||||
pm("Unknown.")
|
||||
of "!seen":
|
||||
if words.len > 1:
|
||||
let nick = words[1]
|
||||
if nick == botNickname:
|
||||
pm("Yes, I see myself.")
|
||||
echo(nick)
|
||||
var seenInfo: TSeen
|
||||
if state.database.getSeen(nick, seenInfo):
|
||||
#var mSend = ""
|
||||
case seenInfo.kind
|
||||
of PSeenMsg:
|
||||
pm("$1 was last seen on $2 in $3 saying: $4" %
|
||||
[seenInfo.nick, $seenInfo.timestamp,
|
||||
seenInfo.channel, seenInfo.msg])
|
||||
of PSeenJoin:
|
||||
pm("$1 was last seen on $2 joining $3" %
|
||||
[seenInfo.nick, $seenInfo.timestamp, seenInfo.channel])
|
||||
of PSeenPart:
|
||||
pm("$1 was last seen on $2 leaving $3 with message: $4" %
|
||||
[seenInfo.nick, $seenInfo.timestamp, seenInfo.channel,
|
||||
seenInfo.msg])
|
||||
of PSeenQuit:
|
||||
pm("$1 was last seen on $2 quitting with message: $3" %
|
||||
[seenInfo.nick, $seenInfo.timestamp, seenInfo.msg])
|
||||
of PSeenNick:
|
||||
pm("$1 was last seen on $2 changing nick to $3" %
|
||||
[seenInfo.nick, $seenInfo.timestamp, seenInfo.newNick])
|
||||
|
||||
else:
|
||||
pm("I have not seen " & nick)
|
||||
else:
|
||||
pm("Syntax: !seen <nick>")
|
||||
|
||||
# TODO: ... commands
|
||||
|
||||
# -- Seen
|
||||
# Log this as activity.
|
||||
createSeen(PSeenMsg, event.nick, event.origin)
|
||||
seenNick.msg = msg
|
||||
state.database.setSeen(seenNick)
|
||||
of MJoin:
|
||||
createSeen(PSeenJoin, event.nick, event.origin)
|
||||
state.database.setSeen(seenNick)
|
||||
of MPart:
|
||||
createSeen(PSeenPart, event.nick, event.origin)
|
||||
let msg = event.params[event.params.high]
|
||||
seenNick.msg = msg
|
||||
state.database.setSeen(seenNick)
|
||||
of MQuit:
|
||||
createSeen(PSeenQuit, event.nick, event.origin)
|
||||
let msg = event.params[event.params.high]
|
||||
seenNick.msg = msg
|
||||
state.database.setSeen(seenNick)
|
||||
of MNick:
|
||||
createSeen(PSeenNick, event.nick, "#nim")
|
||||
seenNick.newNick = event.params[0]
|
||||
state.database.setSeen(seenNick)
|
||||
else:
|
||||
discard # TODO: ?
|
||||
|
||||
proc open(port: TPort = TPort(5123)): PState =
|
||||
var res: PState
|
||||
new(res)
|
||||
res.dispatcher = newDispatcher()
|
||||
|
||||
res.hubPort = port
|
||||
res.hubConnect()
|
||||
let hirc =
|
||||
proc (a: PAsyncIRC, ev: TIRCEvent) =
|
||||
handleIrc(a, ev, res)
|
||||
# Connect to the irc server.
|
||||
res.ircClient = AsyncIrc(ircServer, nick = botNickname, user = botNickname,
|
||||
joinChans = joinChans, ircEvent = hirc)
|
||||
res.ircClient.connect()
|
||||
res.dispatcher.register(res.ircClient)
|
||||
|
||||
res.dbConnected = false
|
||||
result = res
|
||||
|
||||
var state = tircbot.open() # Connect to the website and the IRC server.
|
||||
|
||||
while state.dispatcher.poll():
|
||||
if state.dbConnected:
|
||||
state.database.keepAlive()
|
||||
|
|
@ -6,11 +6,11 @@ import marshal
|
|||
|
||||
template testit(x: expr) = discard $$to[type(x)]($$x)
|
||||
|
||||
var x: array[0..4, array[0..4, string]] = [
|
||||
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
||||
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
||||
["test", "1", "2", "3", "4"]]
|
||||
testit(x)
|
||||
var x: array[0..4, array[0..4, string]] = [
|
||||
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
||||
["test", "1", "2", "3", "4"], ["test", "1", "2", "3", "4"],
|
||||
["test", "1", "2", "3", "4"]]
|
||||
testit(x)
|
||||
var test2: tuple[name: string, s: int] = ("tuple test", 56)
|
||||
testit(test2)
|
||||
|
||||
|
|
@ -24,7 +24,7 @@ type
|
|||
of blah:
|
||||
help: string
|
||||
else:
|
||||
nil
|
||||
discard
|
||||
|
||||
PNode = ref TNode
|
||||
TNode = object
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ fpqeew
|
|||
[11, 12, 13]
|
||||
[11, 12, 13]
|
||||
[11, 12, 13]
|
||||
{ "key1": 11, "key2": 12, "key3": 13}
|
||||
[ 11, 12, 13]
|
||||
{"key1": 11, "key2": 12, "key3": 13}
|
||||
[11, 12, 13]
|
||||
<Students>
|
||||
<Student Name="Aprilfoo" />
|
||||
<Student Name="bar" />
|
||||
|
|
|
|||
19
tests/stdlib/tpermutations.nim
Normal file
19
tests/stdlib/tpermutations.nim
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
discard """
|
||||
output: '''@[0, 2, 1]
|
||||
@[1, 0, 2]
|
||||
@[1, 2, 0]
|
||||
@[2, 0, 1]
|
||||
@[2, 1, 0]
|
||||
@[2, 0, 1]
|
||||
@[1, 2, 0]
|
||||
@[1, 0, 2]
|
||||
@[0, 2, 1]
|
||||
@[0, 1, 2]'''
|
||||
"""
|
||||
import algorithm
|
||||
|
||||
var v = @[0, 1, 2]
|
||||
while v.nextPermutation():
|
||||
echo v
|
||||
while v.prevPermutation():
|
||||
echo v
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue