7 Commits

Author SHA1 Message Date
8657f3c13d add quotes to error messages
All checks were successful
continuous-integration/drone/tag Build is passing
2021-07-28 20:15:40 -07:00
93954add96 remove duplicate error message 2021-07-28 18:23:35 -07:00
5793a18358 fix drone config
All checks were successful
continuous-integration/drone/tag Build is passing
2021-07-28 18:17:21 -07:00
a7d531e4b7 restrict CI to tag events 2021-07-28 17:06:25 -07:00
b30b12962d v0.2.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-28 17:03:29 -07:00
2a7de7dab2 add CI config
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-28 17:02:09 -07:00
74795db477 more refactoring 2021-07-28 17:01:49 -07:00
8 changed files with 63 additions and 27 deletions

33
.drone.yml Normal file
View File

@ -0,0 +1,33 @@
kind: pipeline
type: docker
name: main
trigger:
event: tag
steps:
- name: build-windows
image: nimlang/nim
commands:
- apt update
- apt install -y mingw-w64
- nimble build -y -d:mingw
- name: build-linux
image: nimlang/nim
commands:
- nimble build -y
- mv passphrase passphrase_linux
- name: release
image: plugins/gitea-release
depends_on:
- build-windows
- build-linux
settings:
base_url: 'https://git.jfmonty2.com'
files:
- passphrase_linux
- passphrase.exe
api_key:
from_secret: gitea_token

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
*.exe
BNC/*
data/BNC/*

View File

@ -1,6 +1,6 @@
# Package
version = "0.1.0"
version = "0.3.1"
author = "Joseph Montanaro"
description = "Passphrase generator and dictionary builder"
license = "none"
@ -16,7 +16,6 @@ requires "nimcrypto >= 0.4.8"
# Tasks n scripts
import strutils
proc runCmd(command: string, input = "", cache = ""): string =
let (output, exitCode) = gorgeEx(command, input, cache)
@ -29,10 +28,10 @@ proc runCmd(command: string, input = "", cache = ""): string =
task(dictionary, "Generate dictionary from BNC XML files"):
echo "Building dictionary"
let output = runCmd("nim c --run --threads:on -d:release -d:lto src/process.nim BNC/2554/download/Texts src/")
let output = runCmd("nim c --run --threads:on -d:release -d:lto src/process.nim data/BNC/2554/download/Texts src/")
echo output.strip().splitlines()[^1]
before(build):
if not fileExists("src/dictionary.txt"):
if not fileExists("data/dictionary.txt"):
dictionaryTask()

View File

@ -23,7 +23,7 @@ proc len(d: Dictionary): int =
proc loadWords(): Dictionary =
for word in staticRead("dictionary.txt").strip().splitLines():
for word in staticRead("../data/dictionary.txt").strip().splitLines():
let startIdx = result.words.len.uint32
result.offsets.add(startIdx)
result.words.add(word)
@ -33,9 +33,6 @@ const dict = loadWords()
proc genPassphrase(length, dictSize: int): string =
if dictSize < 100 or dictSize > dict.len:
quit("Dictionary size must be between 100 and " & $dict.len, 1)
var rands = newSeq[uint64](length)
discard randomBytes(rands)
@ -65,7 +62,7 @@ proc parseInput(): (int, int) =
try:
length = parseInt(params[0])
except ValueError:
quit(params[0] & " is not a valid passphrase length.", 1)
quit('"' & params[0] & "\" is not a valid passphrase length.", 1)
if params.len > 1:
try:
@ -73,7 +70,7 @@ proc parseInput(): (int, int) =
if dictSize < 100 or dictSize > dict.len:
quit("Dictionary size must be between 100 and " & $dict.len, 1)
except ValueError:
quit(params[1] & " is not a valid dictionary size.", 1)
quit('"' & params[1] & "\" is not a valid dictionary size.", 1)
result = (length, dictSize)

1
src/passphrase.nims Normal file
View File

@ -0,0 +1 @@
--d: release

View File

@ -27,6 +27,24 @@ proc save(wordCounts: CountTable; dictName, countName: string) =
break
type Config = object
srcPath: string
dstPath: string
proc parseInput(): Config =
result.srcPath = r"../data/BNC/2554/download/Texts/"
result.dstPath = "."
if paramCount() > 0:
result.srcPath = paramStr(1)
if paramCount() > 1:
result.dstPath = paramStr(2)
if not dirExists(result.srcPath):
quit("Could not locate datafiles: directory " & result.srcPath & " does not exist.")
var
threadResults: Channel[CountTable[string]]
progress: Channel[int]
@ -46,17 +64,10 @@ proc processFiles(filenames: seq[string]) =
when isMainModule:
let start = getMonoTime()
let basePath =
if paramCount() > 0:
paramStr(1)
else:
r"../BNC/2554/download/Texts/"
if not dirExists(basePath):
quit("Could not locate datafiles: directory " & basePath & " does not exist.")
let config = parseInput()
var paths: seq[string]
for path in walkDirRec(basePath):
for path in walkDirRec(config.srcPath):
if path.endsWith(".xml"):
paths.add(path)
@ -79,15 +90,10 @@ when isMainModule:
counts.inc(word, count)
counts.sort()
let outPath =
if paramCount() > 1:
paramStr(2)
else:
"."
let
dPath = joinPath(outPath, "dictionary.txt")
cPath = joinPath(outPath, "counts.txt")
dPath = joinPath(config.dstPath, "dictionary.txt")
cPath = joinPath(config.dstPath, "counts.txt")
save(counts, dPath, cPath)
echo "Done. Finished in ", (getMonoTime() - start).inMilliseconds.float / 1000, " seconds."