diff options
Diffstat (limited to 'lib/wrappers/linenoise/linenoise.nim')
-rw-r--r-- | lib/wrappers/linenoise/linenoise.nim | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/wrappers/linenoise/linenoise.nim b/lib/wrappers/linenoise/linenoise.nim new file mode 100644 index 000000000..186b3b252 --- /dev/null +++ b/lib/wrappers/linenoise/linenoise.nim @@ -0,0 +1,72 @@ +# +# +# Nim's Runtime Library +# (c) Copyright 2015 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +type + Completions* = object + len*: csize_t + cvec*: cstringArray + + CompletionCallback* = proc (a2: cstring; a3: ptr Completions) {.cdecl.} + +{.compile: "linenoise.c".} + +proc setCompletionCallback*(a2: CompletionCallback) {. + importc: "linenoiseSetCompletionCallback".} +proc addCompletion*(a2: ptr Completions; a3: cstring) {. + importc: "linenoiseAddCompletion".} +proc readLine*(prompt: cstring): cstring {.importc: "linenoise".} +proc historyAdd*(line: cstring): cint {.importc: "linenoiseHistoryAdd", + discardable.} +proc historySetMaxLen*(len: cint): cint {.importc: "linenoiseHistorySetMaxLen".} +proc historySave*(filename: cstring): cint {.importc: "linenoiseHistorySave".} +proc historyLoad*(filename: cstring): cint {.importc: "linenoiseHistoryLoad".} +proc clearScreen*() {.importc: "linenoiseClearScreen".} +proc setMultiLine*(ml: cint) {.importc: "linenoiseSetMultiLine".} +proc printKeyCodes*() {.importc: "linenoisePrintKeyCodes".} + +proc free*(s: cstring) {.importc: "free", header: "<stdlib.h>".} + +when defined(nimExperimentalLinenoiseExtra) and not defined(windows): + # C interface + type LinenoiseStatus = enum + linenoiseStatus_ctrl_unknown + linenoiseStatus_ctrl_C + linenoiseStatus_ctrl_D + + type LinenoiseData* = object + status: LinenoiseStatus + + proc linenoiseExtra(prompt: cstring, data: ptr LinenoiseData): cstring {.importc.} + + # stable nim interface + type Status* = enum + lnCtrlUnkown + lnCtrlC + lnCtrlD + + type ReadLineResult* = object + line*: string + status*: Status + + proc readLineStatus*(prompt: string, result: var ReadLineResult) = + ## line editing API that allows returning the line entered and an indicator + ## of which control key was entered, allowing user to distinguish between + ## for example ctrl-C vs ctrl-D. + runnableExamples("-d:nimExperimentalLinenoiseExtra -r:off"): + var ret: ReadLineResult + while true: + readLineStatus("name: ", ret) # ctrl-D will exit, ctrl-C will go to next prompt + if ret.line.len > 0: echo ret.line + if ret.status == lnCtrlD: break + echo "exiting" + var data: LinenoiseData + let buf = linenoiseExtra(prompt, data.addr) + result.line = $buf + free(buf) + result.status = data.status.ord.Status |