mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 19:22:40 +00:00
280 lines
5.3 KiB
Nim
280 lines
5.3 KiB
Nim
discard """
|
|
output: '''(repo: "", package: "meo", ext: "")
|
|
doing shady stuff...
|
|
3
|
|
6
|
|
(@[1], @[2])
|
|
192.168.0.1
|
|
192.168.0.1
|
|
192.168.0.1
|
|
192.168.0.1'''
|
|
cmd: '''nim c --gc:arc --expandArc:newTarget --expandArc:delete --expandArc:p1 --expandArc:tt --hint:Performance:off --assertions:off --expandArc:extractConfig $file'''
|
|
nimout: '''--expandArc: newTarget
|
|
|
|
var
|
|
splat
|
|
:tmp
|
|
:tmp_1
|
|
:tmp_2
|
|
splat = splitFile(path)
|
|
:tmp = splat.dir
|
|
wasMoved(splat.dir)
|
|
:tmp_1 = splat.name
|
|
wasMoved(splat.name)
|
|
:tmp_2 = splat.ext
|
|
wasMoved(splat.ext)
|
|
result = (
|
|
let blitTmp = :tmp
|
|
blitTmp,
|
|
let blitTmp_1 = :tmp_1
|
|
blitTmp_1,
|
|
let blitTmp_2 = :tmp_2
|
|
blitTmp_2)
|
|
`=destroy`(splat)
|
|
-- end of expandArc ------------------------
|
|
--expandArc: delete
|
|
|
|
var
|
|
sibling
|
|
saved
|
|
`=copy`(sibling, target.parent.left)
|
|
`=copy`(saved, sibling.right)
|
|
`=copy`(sibling.right, saved.left)
|
|
`=sink`(sibling.parent, saved)
|
|
`=destroy`(sibling)
|
|
-- end of expandArc ------------------------
|
|
--expandArc: p1
|
|
|
|
var
|
|
lresult
|
|
lvalue
|
|
lnext
|
|
_
|
|
lresult = @[123]
|
|
_ = (
|
|
let blitTmp = lresult
|
|
blitTmp, ";")
|
|
lvalue = _[0]
|
|
lnext = _[1]
|
|
result.value = move lvalue
|
|
`=destroy`(lnext)
|
|
`=destroy_1`(lvalue)
|
|
-- end of expandArc ------------------------
|
|
--expandArc: tt
|
|
|
|
var
|
|
it_cursor
|
|
a
|
|
:tmpD
|
|
:tmpD_1
|
|
:tmpD_2
|
|
try:
|
|
it_cursor = x
|
|
a = (
|
|
wasMoved(:tmpD)
|
|
`=copy`(:tmpD, it_cursor.key)
|
|
:tmpD,
|
|
wasMoved(:tmpD_1)
|
|
`=copy`(:tmpD_1, it_cursor.val)
|
|
:tmpD_1)
|
|
echo [
|
|
:tmpD_2 = `$`(a)
|
|
:tmpD_2]
|
|
finally:
|
|
`=destroy`(:tmpD_2)
|
|
`=destroy_1`(a)
|
|
-- end of expandArc ------------------------
|
|
--expandArc: extractConfig
|
|
|
|
var lan_ip
|
|
try:
|
|
lan_ip = ""
|
|
block :tmp:
|
|
var line
|
|
var i = 0
|
|
let L = len(txt)
|
|
block :tmp_1:
|
|
while i < L:
|
|
var splitted
|
|
try:
|
|
line = txt[i]
|
|
splitted = split(line, " ", -1)
|
|
if splitted[0] == "opt":
|
|
`=copy`(lan_ip, splitted[1])
|
|
echo [lan_ip]
|
|
echo [splitted[1]]
|
|
inc(i, 1)
|
|
finally:
|
|
`=destroy`(splitted)
|
|
finally:
|
|
`=destroy_1`(lan_ip)
|
|
-- end of expandArc ------------------------'''
|
|
"""
|
|
|
|
import os
|
|
|
|
type Target = tuple[repo, package, ext: string]
|
|
|
|
proc newTarget*(path: string): Target =
|
|
let splat = path.splitFile
|
|
result = (repo: splat.dir, package: splat.name, ext: splat.ext)
|
|
|
|
echo newTarget("meo")
|
|
|
|
type
|
|
Node = ref object
|
|
left, right, parent: Node
|
|
value: int
|
|
|
|
proc delete(target: var Node) =
|
|
var sibling = target.parent.left # b3
|
|
var saved = sibling.right # b3.right -> r4
|
|
|
|
sibling.right = saved.left # b3.right -> r4.left = nil
|
|
sibling.parent = saved # b3.parent -> r5 = r4
|
|
|
|
#[after this proc:
|
|
b 5
|
|
/ \
|
|
b 3 b 6
|
|
]#
|
|
|
|
|
|
#[before:
|
|
r 5
|
|
/ \
|
|
b 3 b 6 - to delete
|
|
/ \
|
|
empty r 4
|
|
]#
|
|
proc main =
|
|
var five = Node(value: 5)
|
|
|
|
var six = Node(value: 6)
|
|
six.parent = five
|
|
five.right = six
|
|
|
|
var three = Node(value: 3)
|
|
three.parent = five
|
|
five.left = three
|
|
|
|
var four = Node(value: 4)
|
|
four.parent = three
|
|
three.right = four
|
|
|
|
echo "doing shady stuff..."
|
|
delete(six)
|
|
# need both of these echos
|
|
echo five.left.value
|
|
echo five.right.value
|
|
|
|
main()
|
|
|
|
type
|
|
Maybe = object
|
|
value: seq[int]
|
|
|
|
proc p1(): Maybe =
|
|
let lresult = @[123]
|
|
var lvalue: seq[int]
|
|
var lnext: string
|
|
(lvalue, lnext) = (lresult, ";")
|
|
|
|
result.value = move lvalue
|
|
|
|
proc tissue15130 =
|
|
doAssert p1().value == @[123]
|
|
|
|
tissue15130()
|
|
|
|
type
|
|
KeyValue = tuple[key, val: seq[int]]
|
|
|
|
proc tt(x: KeyValue) =
|
|
var it = x
|
|
let a = (it.key, it.val)
|
|
echo a
|
|
|
|
proc encodedQuery =
|
|
var query: seq[KeyValue]
|
|
query.add (key: @[1], val: @[2])
|
|
|
|
for elem in query:
|
|
elem.tt()
|
|
|
|
encodedQuery()
|
|
|
|
# bug #15147
|
|
|
|
proc s(input: string): (string, string) =
|
|
result = (";", "")
|
|
|
|
proc charmatch(input: string): (string, string) =
|
|
result = ("123", input[0 .. input.high])
|
|
|
|
proc plus(input: string) =
|
|
var
|
|
lvalue, rvalue: string # cursors
|
|
lnext: string # must be cursor!!!
|
|
rnext: string # cursor
|
|
let lresult = charmatch(input)
|
|
(lvalue, lnext) = lresult
|
|
|
|
let rresult = s(lnext)
|
|
(rvalue, rnext) = rresult
|
|
|
|
plus("123;")
|
|
|
|
func substrEq(s: string, pos: int, substr: string): bool =
|
|
var i = 0
|
|
var length = substr.len
|
|
while i < length and pos+i < s.len and s[pos+i] == substr[i]:
|
|
inc i
|
|
return i == length
|
|
|
|
template stringHasSep(s: string, index: int, sep: string): bool =
|
|
s.substrEq(index, sep)
|
|
|
|
template splitCommon(s, sep, maxsplit, sepLen) =
|
|
var last = 0
|
|
var splits = maxsplit
|
|
|
|
while last <= len(s):
|
|
var first = last
|
|
while last < len(s) and not stringHasSep(s, last, sep):
|
|
inc(last)
|
|
if splits == 0: last = len(s)
|
|
yield substr(s, first, last-1)
|
|
if splits == 0: break
|
|
dec(splits)
|
|
inc(last, sepLen)
|
|
|
|
iterator split(s: string, sep: string, maxsplit = -1): string =
|
|
splitCommon(s, sep, maxsplit, sep.len)
|
|
|
|
template accResult(iter: untyped) =
|
|
result = @[]
|
|
for x in iter: add(result, x)
|
|
|
|
func split*(s: string, sep: string, maxsplit = -1): seq[string] =
|
|
accResult(split(s, sep, maxsplit))
|
|
|
|
|
|
let txt = @["opt 192.168.0.1", "static_lease 192.168.0.1"]
|
|
|
|
# bug #17033
|
|
|
|
proc extractConfig() =
|
|
var lan_ip = ""
|
|
|
|
for line in txt:
|
|
let splitted = line.split(" ")
|
|
if splitted[0] == "opt":
|
|
lan_ip = splitted[1] # "borrow" is conditional and inside a loop.
|
|
# Not good enough...
|
|
# we need a flag that live-ranges are disjoint
|
|
echo lan_ip
|
|
echo splitted[1] # Without this line everything works
|
|
|
|
extractConfig()
|