case consistency part 7

This commit is contained in:
Araq 2013-12-28 01:36:35 +01:00
commit 7e0da3e8f7
5 changed files with 63 additions and 65 deletions

View file

@ -65,38 +65,38 @@ template rawInsertImpl() {.dirty.} =
data[h].key = key data[h].key = key
data[h].slot = seFilled data[h].slot = seFilled
proc RawGet[A](s: TSet[A], key: A): int = proc rawGet[A](s: TSet[A], key: A): int =
rawGetImpl() rawGetImpl()
proc contains*[A](s: TSet[A], key: A): bool = proc contains*[A](s: TSet[A], key: A): bool =
## returns true iff `key` is in `s`. ## returns true iff `key` is in `s`.
var index = RawGet(s, key) var index = rawGet(s, key)
result = index >= 0 result = index >= 0
proc RawInsert[A](s: var TSet[A], data: var TKeyValuePairSeq[A], key: A) = proc rawInsert[A](s: var TSet[A], data: var TKeyValuePairSeq[A], key: A) =
rawInsertImpl() rawInsertImpl()
proc Enlarge[A](s: var TSet[A]) = proc enlarge[A](s: var TSet[A]) =
var n: TKeyValuePairSeq[A] var n: TKeyValuePairSeq[A]
newSeq(n, len(s.data) * growthFactor) newSeq(n, len(s.data) * growthFactor)
for i in countup(0, high(s.data)): for i in countup(0, high(s.data)):
if s.data[i].slot == seFilled: RawInsert(s, n, s.data[i].key) if s.data[i].slot == seFilled: rawInsert(s, n, s.data[i].key)
swap(s.data, n) swap(s.data, n)
template inclImpl() {.dirty.} = template inclImpl() {.dirty.} =
var index = RawGet(s, key) var index = rawGet(s, key)
if index < 0: if index < 0:
if mustRehash(len(s.data), s.counter): Enlarge(s) if mustRehash(len(s.data), s.counter): enlarge(s)
RawInsert(s, s.data, key) rawInsert(s, s.data, key)
inc(s.counter) inc(s.counter)
template containsOrInclImpl() {.dirty.} = template containsOrInclImpl() {.dirty.} =
var index = RawGet(s, key) var index = rawGet(s, key)
if index >= 0: if index >= 0:
result = true result = true
else: else:
if mustRehash(len(s.data), s.counter): Enlarge(s) if mustRehash(len(s.data), s.counter): enlarge(s)
RawInsert(s, s.data, key) rawInsert(s, s.data, key)
inc(s.counter) inc(s.counter)
proc incl*[A](s: var TSet[A], key: A) = proc incl*[A](s: var TSet[A], key: A) =
@ -105,7 +105,7 @@ proc incl*[A](s: var TSet[A], key: A) =
proc excl*[A](s: var TSet[A], key: A) = proc excl*[A](s: var TSet[A], key: A) =
## excludes `key` from the set `s`. ## excludes `key` from the set `s`.
var index = RawGet(s, key) var index = rawGet(s, key)
if index >= 0: if index >= 0:
s.data[index].slot = seDeleted s.data[index].slot = seDeleted
dec(s.counter) dec(s.counter)
@ -122,7 +122,7 @@ proc initSet*[A](initialSize=64): TSet[A] =
result.counter = 0 result.counter = 0
newSeq(result.data, initialSize) newSeq(result.data, initialSize)
proc toSet*[A](keys: openarray[A]): TSet[A] = proc toSet*[A](keys: openArray[A]): TSet[A] =
## creates a new hash set that contains the given `keys`. ## creates a new hash set that contains the given `keys`.
result = initSet[A](nextPowerOfTwo(keys.len+10)) result = initSet[A](nextPowerOfTwo(keys.len+10))
for key in items(keys): result.incl(key) for key in items(keys): result.incl(key)
@ -169,15 +169,15 @@ iterator items*[A](s: TOrderedSet[A]): A =
forAllOrderedPairs: forAllOrderedPairs:
yield s.data[h].key yield s.data[h].key
proc RawGet[A](s: TOrderedSet[A], key: A): int = proc rawGet[A](s: TOrderedSet[A], key: A): int =
rawGetImpl() rawGetImpl()
proc contains*[A](s: TOrderedSet[A], key: A): bool = proc contains*[A](s: TOrderedSet[A], key: A): bool =
## returns true iff `key` is in `s`. ## returns true iff `key` is in `s`.
var index = RawGet(s, key) var index = rawGet(s, key)
result = index >= 0 result = index >= 0
proc RawInsert[A](s: var TOrderedSet[A], proc rawInsert[A](s: var TOrderedSet[A],
data: var TOrderedKeyValuePairSeq[A], key: A) = data: var TOrderedKeyValuePairSeq[A], key: A) =
rawInsertImpl() rawInsertImpl()
data[h].next = -1 data[h].next = -1
@ -185,7 +185,7 @@ proc RawInsert[A](s: var TOrderedSet[A],
if s.last >= 0: data[s.last].next = h if s.last >= 0: data[s.last].next = h
s.last = h s.last = h
proc Enlarge[A](s: var TOrderedSet[A]) = proc enlarge[A](s: var TOrderedSet[A]) =
var n: TOrderedKeyValuePairSeq[A] var n: TOrderedKeyValuePairSeq[A]
newSeq(n, len(s.data) * growthFactor) newSeq(n, len(s.data) * growthFactor)
var h = s.first var h = s.first
@ -194,7 +194,7 @@ proc Enlarge[A](s: var TOrderedSet[A]) =
while h >= 0: while h >= 0:
var nxt = s.data[h].next var nxt = s.data[h].next
if s.data[h].slot == seFilled: if s.data[h].slot == seFilled:
RawInsert(s, n, s.data[h].key) rawInsert(s, n, s.data[h].key)
h = nxt h = nxt
swap(s.data, n) swap(s.data, n)
@ -216,7 +216,7 @@ proc initOrderedSet*[A](initialSize=64): TOrderedSet[A] =
result.last = -1 result.last = -1
newSeq(result.data, initialSize) newSeq(result.data, initialSize)
proc toOrderedSet*[A](keys: openarray[A]): TOrderedSet[A] = proc toOrderedSet*[A](keys: openArray[A]): TOrderedSet[A] =
## creates a new ordered hash set that contains the given `keys`. ## creates a new ordered hash set that contains the given `keys`.
result = initOrderedSet[A](nextPowerOfTwo(keys.len+10)) result = initOrderedSet[A](nextPowerOfTwo(keys.len+10))
for key in items(keys): result.incl(key) for key in items(keys): result.incl(key)
@ -224,5 +224,3 @@ proc toOrderedSet*[A](keys: openarray[A]): TOrderedSet[A] =
proc `$`*[A](s: TOrderedSet[A]): string = proc `$`*[A](s: TOrderedSet[A]): string =
## The `$` operator for ordered hash sets. ## The `$` operator for ordered hash sets.
dollarImpl() dollarImpl()

View file

@ -88,7 +88,7 @@ proc xmlCheckedTag*(e: PNimrodNode, tag: string,
result.add(newStrLitNode("</")) result.add(newStrLitNode("</"))
result.add(newStrLitNode(tag)) result.add(newStrLitNode(tag))
result.add(newStrLitNode(">")) result.add(newStrLitNode(">"))
result = NestList(!"&", result) result = nestList(!"&", result)
macro a*(e: expr): expr {.immediate.} = macro a*(e: expr): expr {.immediate.} =

View file

@ -16,9 +16,9 @@ type
MD5Digest* = array[0..15, int8] MD5Digest* = array[0..15, int8]
MD5Buffer = array[0..63, int8] MD5Buffer = array[0..63, int8]
MD5Context* {.final.} = object MD5Context* {.final.} = object
State: MD5State state: MD5State
Count: array[0..1, int32] count: array[0..1, int32]
Buffer: MD5Buffer buffer: MD5Buffer
const const
padding: cstring = "\x80\0\0\0" & padding: cstring = "\x80\0\0\0" &
@ -32,16 +32,16 @@ const
"\0\0\0\0" "\0\0\0\0"
proc F(x, y, z: int32): int32 {.inline.} = proc F(x, y, z: int32): int32 {.inline.} =
Result = (x and y) or ((not x) and z) result = (x and y) or ((not x) and z)
proc G(x, y, z: int32): int32 {.inline.} = proc G(x, y, z: int32): int32 {.inline.} =
Result = (x and z) or (y and (not z)) result = (x and z) or (y and (not z))
proc H(x, y, z: int32): int32 {.inline.} = proc H(x, y, z: int32): int32 {.inline.} =
Result = x xor y xor z result = x xor y xor z
proc I(x, y, z: int32): int32 {.inline.} = proc I(x, y, z: int32): int32 {.inline.} =
Result = y xor (x or (not z)) result = y xor (x or (not z))
proc rot(x: var int32, n: int8) {.inline.} = proc rot(x: var int32, n: int8) {.inline.} =
x = toU32(x shl ze(n)) or (x shr toU32(32 -% ze(n))) x = toU32(x shl ze(n)) or (x shr toU32(32 -% ze(n)))
@ -75,7 +75,7 @@ proc encode(dest: var MD5Block, src: cstring) =
ord(src[j+3]) shl 24) ord(src[j+3]) shl 24)
inc(j, 4) inc(j, 4)
proc decode(dest: var openarray[int8], src: openarray[int32]) = proc decode(dest: var openArray[int8], src: openArray[int32]) =
var i = 0 var i = 0
for j in 0..high(src): for j in 0..high(src):
dest[i] = toU8(src[j] and 0xff'i32) dest[i] = toU8(src[j] and 0xff'i32)
@ -87,7 +87,7 @@ proc decode(dest: var openarray[int8], src: openarray[int32]) =
proc transform(Buffer: pointer, State: var MD5State) = proc transform(Buffer: pointer, State: var MD5State) =
var var
myBlock: MD5Block myBlock: MD5Block
encode(myBlock, cast[cstring](buffer)) encode(myBlock, cast[cstring](Buffer))
var a = State[0] var a = State[0]
var b = State[1] var b = State[1]
var c = State[2] var c = State[2]
@ -161,7 +161,7 @@ proc transform(Buffer: pointer, State: var MD5State) =
State[2] = State[2] +% c State[2] = State[2] +% c
State[3] = State[3] +% d State[3] = State[3] +% d
proc MD5Init*(c: var MD5Context) = proc md5Init*(c: var MD5Context) =
## initializes a MD5Context ## initializes a MD5Context
c.State[0] = 0x67452301'i32 c.State[0] = 0x67452301'i32
c.State[1] = 0xEFCDAB89'i32 c.State[1] = 0xEFCDAB89'i32
@ -169,64 +169,64 @@ proc MD5Init*(c: var MD5Context) =
c.State[3] = 0x10325476'i32 c.State[3] = 0x10325476'i32
c.Count[0] = 0'i32 c.Count[0] = 0'i32
c.Count[1] = 0'i32 c.Count[1] = 0'i32
ZeroMem(addr(c.Buffer), SizeOf(MD5Buffer)) zeroMem(addr(c.Buffer), sizeof(MD5Buffer))
proc MD5Update*(c: var MD5Context, input: cstring, len: int) = proc md5Update*(c: var MD5Context, input: cstring, len: int) =
## updates the MD5Context with the `input` data of length `len` ## updates the MD5Context with the `input` data of length `len`
var input = input var input = input
var Index = (c.Count[0] shr 3) and 0x3F var Index = (c.count[0] shr 3) and 0x3F
c.Count[0] = c.count[0] +% toU32(len shl 3) c.Count[0] = c.count[0] +% toU32(len shl 3)
if c.Count[0] < (len shl 3): c.Count[1] = c.count[1] +% 1'i32 if c.Count[0] < (len shl 3): c.Count[1] = c.count[1] +% 1'i32
c.Count[1] = c.count[1] +% toU32(len shr 29) c.Count[1] = c.count[1] +% toU32(len shr 29)
var PartLen = 64 - Index var PartLen = 64 - Index
if len >= PartLen: if len >= PartLen:
CopyMem(addr(c.Buffer[Index]), Input, PartLen) copyMem(addr(c.Buffer[Index]), input, PartLen)
transform(addr(c.Buffer), c.State) transform(addr(c.Buffer), c.State)
var i = PartLen var i = PartLen
while i + 63 < len: while i + 63 < len:
Transform(addr(Input[I]), c.State) transform(addr(input[i]), c.State)
inc(i, 64) inc(i, 64)
CopyMem(addr(c.Buffer[0]), addr(Input[i]), len-i) copyMem(addr(c.Buffer[0]), addr(input[i]), len-i)
else: else:
CopyMem(addr(c.Buffer[Index]), addr(Input[0]), len) copyMem(addr(c.Buffer[Index]), addr(input[0]), len)
proc MD5Final*(c: var MD5Context, digest: var MD5Digest) = proc md5Final*(c: var MD5Context, digest: var MD5Digest) =
## finishes the MD5Context and stores the result in `digest` ## finishes the MD5Context and stores the result in `digest`
var var
Bits: MD5CBits Bits: MD5CBits
PadLen: int PadLen: int
decode(bits, c.Count) decode(Bits, c.Count)
var Index = (c.Count[0] shr 3) and 0x3F var Index = (c.Count[0] shr 3) and 0x3F
if Index < 56: PadLen = 56 - Index if Index < 56: PadLen = 56 - Index
else: PadLen = 120 - Index else: PadLen = 120 - Index
MD5Update(c, padding, PadLen) md5Update(c, padding, PadLen)
MD5Update(c, cast[cstring](addr(Bits)), 8) md5Update(c, cast[cstring](addr(Bits)), 8)
decode(digest, c.State) decode(digest, c.State)
ZeroMem(addr(c), SizeOf(MD5Context)) zeroMem(addr(c), sizeof(MD5Context))
proc toMD5*(s: string): MD5Digest = proc toMD5*(s: string): MD5Digest =
## computes the MD5Digest value for a string `s` ## computes the MD5Digest value for a string `s`
var c: MD5Context var c: MD5Context
MD5Init(c) md5Init(c)
MD5Update(c, cstring(s), len(s)) md5Update(c, cstring(s), len(s))
MD5Final(c, result) md5Final(c, result)
proc `$`*(D: MD5Digest): string = proc `$`*(D: MD5Digest): string =
## converts a MD5Digest value into its string representation ## converts a MD5Digest value into its string representation
const digits = "0123456789abcdef" const digits = "0123456789abcdef"
result = "" result = ""
for i in 0..15: for i in 0..15:
add(result, Digits[(D[I] shr 4) and 0xF]) add(result, Digits[(D[i] shr 4) and 0xF])
add(result, Digits[D[I] and 0xF]) add(result, Digits[D[i] and 0xF])
proc getMD5*(s: string): string = proc getMD5*(s: string): string =
## computes an MD5 value of `s` and returns its string representation ## computes an MD5 value of `s` and returns its string representation
var var
c: MD5Context c: MD5Context
d: MD5Digest d: MD5Digest
MD5Init(c) md5Init(c)
MD5Update(c, cstring(s), len(s)) md5Update(c, cstring(s), len(s))
MD5Final(c, d) md5Final(c, d)
result = $d result = $d
proc `==`*(D1, D2: MD5Digest): bool = proc `==`*(D1, D2: MD5Digest): bool =

View file

@ -34,7 +34,7 @@ proc main(dir, outfile: string) =
else: else:
quit("Cannot open for writing: " & outfile) quit("Cannot open for writing: " & outfile)
if ParamCount() != 2: if paramCount() != 2:
quit "Usage: cmerge directory outfile" quit "Usage: cmerge directory outfile"
else: else:
main(ParamStr(1), addFileExt(ParamStr(2), "c")) main(paramStr(1), addFileExt(paramStr(2), "c"))

View file

@ -200,32 +200,32 @@ proc parseIniFile(c: var TConfigData) =
# ------------------- main ---------------------------------------------------- # ------------------- main ----------------------------------------------------
proc Exec(cmd: string) = proc exec(cmd: string) =
echo(cmd) echo(cmd)
if os.execShellCmd(cmd) != 0: quit("external program failed") if os.execShellCmd(cmd) != 0: quit("external program failed")
proc buildDoc(c: var TConfigData, destPath: string) = proc buildDoc(c: var TConfigData, destPath: string) =
# call nim for the documentation: # call nim for the documentation:
for d in items(c.doc): for d in items(c.doc):
Exec("nimrod rst2html $# -o:$# --index:on $#" % exec("nimrod rst2html $# -o:$# --index:on $#" %
[c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d]) [c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d])
for d in items(c.srcdoc): for d in items(c.srcdoc):
Exec("nimrod doc $# -o:$# --index:on $#" % exec("nimrod doc $# -o:$# --index:on $#" %
[c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d]) [c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d])
for d in items(c.srcdoc2): for d in items(c.srcdoc2):
Exec("nimrod doc2 $# -o:$# --index:on $#" % exec("nimrod doc2 $# -o:$# --index:on $#" %
[c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d]) [c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d])
Exec("nimrod buildIndex -o:$1/theindex.html $1" % [destPath]) exec("nimrod buildIndex -o:$1/theindex.html $1" % [destPath])
proc buildPdfDoc(c: var TConfigData, destPath: string) = proc buildPdfDoc(c: var TConfigData, destPath: string) =
if os.execShellCmd("pdflatex -version") != 0: if os.execShellCmd("pdflatex -version") != 0:
echo "pdflatex not found; no PDF documentation generated" echo "pdflatex not found; no PDF documentation generated"
else: else:
for d in items(c.pdf): for d in items(c.pdf):
Exec("nimrod rst2tex $# $#" % [c.nimrodArgs, d]) exec("nimrod rst2tex $# $#" % [c.nimrodArgs, d])
# call LaTeX twice to get cross references right: # call LaTeX twice to get cross references right:
Exec("pdflatex " & changeFileExt(d, "tex")) exec("pdflatex " & changeFileExt(d, "tex"))
Exec("pdflatex " & changeFileExt(d, "tex")) exec("pdflatex " & changeFileExt(d, "tex"))
# delete all the crappy temporary files: # delete all the crappy temporary files:
var pdf = splitFile(d).name & ".pdf" var pdf = splitFile(d).name & ".pdf"
moveFile(dest=destPath / pdf, source=pdf) moveFile(dest=destPath / pdf, source=pdf)
@ -239,7 +239,7 @@ proc buildPdfDoc(c: var TConfigData, destPath: string) =
proc buildAddDoc(c: var TConfigData, destPath: string) = proc buildAddDoc(c: var TConfigData, destPath: string) =
# build additional documentation (without the index): # build additional documentation (without the index):
for d in items(c.webdoc): for d in items(c.webdoc):
Exec("nimrod doc $# -o:$# $#" % exec("nimrod doc $# -o:$# $#" %
[c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d]) [c.nimrodArgs, destPath / changeFileExt(splitFile(d).name, "html"), d])
proc parseNewsTitles(inputFilename: string): seq[TRssItem] = proc parseNewsTitles(inputFilename: string): seq[TRssItem] =
@ -253,7 +253,7 @@ proc parseNewsTitles(inputFilename: string): seq[TRssItem] =
if not open(input, inputFilename): if not open(input, inputFilename):
quit("Could not read $1 for rss generation" % [inputFilename]) quit("Could not read $1 for rss generation" % [inputFilename])
finally: input.close() finally: input.close()
while input.readline(line): while input.readLine(line):
if line =~ reYearMonthDayTitle: if line =~ reYearMonthDayTitle:
result.add(TRssItem(year: matches[0], month: matches[1], day: matches[2], result.add(TRssItem(year: matches[0], month: matches[1], day: matches[2],
title: matches[3])) title: matches[3]))
@ -332,7 +332,7 @@ proc main(c: var TConfigData) =
for i in 0..c.tabs.len-1: for i in 0..c.tabs.len-1:
var file = c.tabs[i].val var file = c.tabs[i].val
let rss = if file in ["news", "index"]: extractFilename(rssUrl) else: "" let rss = if file in ["news", "index"]: extractFilename(rssUrl) else: ""
Exec(cmd % [c.nimrodArgs, file]) exec(cmd % [c.nimrodArgs, file])
var temp = "web" / changeFileExt(file, "temp") var temp = "web" / changeFileExt(file, "temp")
var content: string var content: string
try: try: