diff options
Diffstat (limited to 'input.lisp')
-rw-r--r-- | input.lisp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/input.lisp b/input.lisp new file mode 100644 index 0000000..d6dd4b3 --- /dev/null +++ b/input.lisp @@ -0,0 +1,40 @@ +(in-package #:input) + +(defstruct input + (cursor 0) + (file nil :read-only t) + (data nil :read-only t)) + +(defun has-data? (input) + (< (input-cursor input) + (length (input-data input)))) + +(defun element (input) + (char (input-data input) + (input-cursor input))) + +(defun advance (input) + (let ((new-input (copy-structure input))) + (incf (input-cursor new-input)) + new-input)) + +(declaim (ftype (function (simple-string) (values input &optional)) from-string)) +(defun from-string (str) + (make-input :data str)) + +(declaim (ftype (function (simple-string) (values input &optional)) from-file)) +(defun from-file (filename) + (make-input :file filename :data (str:read-file filename))) + +(defun generate-report (input message) + (let ((line 0) (column 0)) + (dotimes (i (input-cursor input)) + (let ((c (char (input-data input) i))) + (case c + (#\Newline + (incf line) + (setf column 1)) + (t (incf column))))) + (if (input-file input) + (format nil "~a:~a:~a: ~a" (input-file input) line column message) + (format nil "~a:~a: ~a" line column message)))) |