On Sunday, April 6, 2014 12:37:04 PM UTC-7, Frank DG1SBG wrote:
|
| (defun cleanup-adat-response (response-list &optional (char-list (list #\Return #\Newline #\Nul)))
| (let ((in-string nil)
| (result (list))
| (current-string ""))
| (loop
| for c in response-list
| do
| (cond
| ((and (not in-string)
| (member c char-list))
| nil) ;;; Do nothing
|
| ((and (not in-string)
| (not (member c char-list)))
| (progn
| (setq in-string t)
| (setq current-string
| (concatenate 'string current-string (string c)))
| c))
|
| ((and in-string
| (member c char-list))
| (progn
| (setq in-string nil)
| (setq result (append result (list current-string)))
| (setq current-string "")
| nil))
|
| ((and in-string
| (not (member c char-list)))
| (progn
| (setq in-string t)
| (setq current-string
| (concatenate 'string current-string (string c)))
| c))
| ))
| result))
When you remove the debugging aids and restructure it a bit
it isn't all that bad looking:
(defun cleanup-adat-response (response-list &optional (delimiter-list '(#\Return #\Newline #\Nul)))
(let ((in-string nil)
(result nil)
(current-chars nil))
(loop
for c in response-list
do (if in-string
(if (member c delimiter-list)
(progn
(push (concatenate 'string (nreverse current-chars)) result)
(setq in-string nil
current-chars nil))
(push c current-chars))
(unless (member c delimiter-list)
(setq in-string t)
(push c current-chars)))
;; Handle the case where the last few characters aren't delimited:
finally (when (and in-string current-chars)
(push (concatenate 'string (nreverse current-chars)) result)))
(nreverse result)))