/*
* Copyright (c) 2003 Nikodemus Siivola
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
{
int cmp = strcmp (str, tmp->str);
if (0 == cmp)
- return 1;
-
+ return 1;
+
if (0 < cmp)
- break;
+ break;
/* printf ("-skip- (%s)\n", tmp->str);*/
node = malloc (sizeof (node_t));
if (!node)
return 0;
-
+
node->next = tmp;
node->str = strdup (str);
if (! pre)
collection = node;
- else
+ else
pre->next = node;
return 1;
root = NULL;
node_t * tmp = collection;
while (len && tmp)
- {
- if (0 == strncmp (str, tmp->str, len))
- {
- root = tmp;
- return strdup (root->str);
- }
- else
- tmp = tmp->next;
- }
+ {
+ if (0 == strncmp (str, tmp->str, len))
+ {
+ root = tmp;
+ return strdup (root->str);
+ }
+ else
+ tmp = tmp->next;
+ }
return (char *)NULL;
}
else if (root && (0 == strncmp (str, root->str, len)))
/*
* Copyright (c) 2003 Nikodemus Siivola
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
return 1;
}
-
+
void
restore_term (void)
{
state_t * tmp = stack;
if (!stack) return;
-
+
tcsetattr (STDIN_FILENO, TCSANOW, stack->attr);
stack = stack->next;
int
no_echo (void)
{
- struct termios attr;
- if (! (isatty (STDIN_FILENO) && save_term ()))
+ struct termios attr;
+ if (! (isatty (STDIN_FILENO) && save_term ()))
return 0;
tcgetattr (STDIN_FILENO, &attr);
;; Copyright (c) 2003 Nikodemus Siivola
-;;
+;;
;; Permission is hereby granted, free of charge, to any person obtaining
;; a copy of this software and associated documentation files (the
;; "Software"), to deal in the Software without restriction, including
;; distribute, sublicense, and/or sell copies of the Software, and to
;; permit persons to whom the Software is furnished to do so, subject to
;; the following conditions:
-;;
+;;
;; The above copyright notice and this permission notice shall be included
;; in all copies or substantial portions of the Software.
-;;
+;;
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
(defpackage readline
(:nicknames rl)
- (:use cl uffi)
+ (:use cl uffi)
(:export
add-completion
add-history
))
(uffi:load-foreign-library "/lib/libreadline.so.4"
- :module "readline")
+ :module "readline")
(uffi:load-foreign-library "cl-readline.o"
- :module "cl-readline")
+ :module "cl-readline")
(uffi:load-foreign-library "cl-termios.o"
- :module "cl-termios")
+ :module "cl-termios")
;; Copyright (c) 2003 Nikodemus Siivola
-;;
+;;
;; Permission is hereby granted, free of charge, to any person obtaining
;; a copy of this software and associated documentation files (the
;; "Software"), to deal in the Software without restriction, including
;; distribute, sublicense, and/or sell copies of the Software, and to
;; permit persons to whom the Software is furnished to do so, subject to
;; the following conditions:
-;;
+;;
;; The above copyright notice and this permission notice shall be included
;; in all copies or substantial portions of the Software.
-;;
+;;
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
+
(in-package readline)
(defvar *whitespace* (list #\Space #\Tab))
(defmacro ignore-end-of-file (&body forms)
`(catch 'end-of-file
(handler-bind ((end-of-file (lambda (e)
- (declare (ignore e))
- (throw 'end-of-file nil))))
+ (declare (ignore e))
+ (throw 'end-of-file nil))))
,@forms)))
(def-function ("readline" c-readline)
:returning :void)
(let (pkg)
-
+
(defun add-completion (string)
"Add STRING as a custom-completion."
(setq pkg nil)
"Clear all custom-completions."
(setq pkg nil)
(c-clear-completions))
-
+
(defun use-package-complete (package)
"Load symbols in package CL-USER as custom-completions."
(unless (eql pkg package)
(setq pkg package)
(clear-completions)
(do-symbols (sym (find-package package))
- (add-completion (string-downcase (string sym)))))
+ (add-completion (string-downcase (string sym)))))
(use-custom-complete)
nil))
(with-cstring (c-string string)
(c-add-history c-string))
string)
-
+
(defun readline (&key (prompt "") (history t))
"Read a line from current TTY with line-editing."
(with-cstring (c-prompt prompt)
(let* ((str (convert-and-free-foreign-string (c-readline c-prompt)))
- (str2 (string-trim *whitespace* str)))
+ (str2 (string-trim *whitespace* str)))
(when (and history (not (string= "" str2)))
- (add-history str2))
+ (add-history str2))
str)))
(defun readexpr (&key
- (primary-prompt "=> ")
- (secondary-prompt "| ")
- (history t))
+ (primary-prompt "=> ")
+ (secondary-prompt "| ")
+ (history t))
"Read an expression from current TTY with line-editing."
(let (expr)
(do* ((str (readline :prompt primary-prompt :history history)
- (readline :prompt secondary-prompt :history history))
- (input str (concatenate 'string input " " str)))
- ((ignore-end-of-file
- (setq expr (with-input-from-string (in input)
- (read in nil nil))))
- expr))))
+ (readline :prompt secondary-prompt :history history))
+ (input str (concatenate 'string input " " str)))
+ ((ignore-end-of-file
+ (setq expr (with-input-from-string (in input)
+ (read in nil nil))))
+ expr))))
;;
;; Termios