summary refs log tree commit diff stats
path: root/lib/wrappers/linenoise/linenoise.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/wrappers/linenoise/linenoise.nim')
-rw-r--r--lib/wrappers/linenoise/linenoise.nim72
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