(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defconstant +loop-count+ 1000000)
(defconstant +expected-checksum+ 15000001)

(declaim (ftype (function () fixnum) configured-loop-count))
(defun configured-loop-count ()
  (handler-case
      (let ((line (read-line *standard-input* nil nil)))
        (if line
            (let ((value (parse-integer line :junk-allowed t)))
              (if (> value 0) value +loop-count+))
            +loop-count+))
    (error () +loop-count+)))

(declaim (ftype (function () string) configured-target))
(defun configured-target ()
  (or (second sb-ext:*posix-argv*) "slo\"vo\\path"))

(declaim (ftype (function (string) string) quote-json-string))
(defun quote-json-string (value)
  (with-output-to-string (out)
    (write-char #\" out)
    (loop for ch across value
          do (case ch
               (#\" (write-string "\\\"" out))
               (#\\ (write-string "\\\\" out))
               (#\Newline (write-string "\\n" out))
               (#\Tab (write-string "\\t" out))
               (#\Return (write-string "\\r" out))
               (otherwise (write-char ch out))))
    (write-char #\" out)))

(declaim (ftype (function (fixnum string) fixnum) json-quote-loop))
(defun json-quote-loop (limit target)
  (declare (type fixnum limit)
           (type string target))
  (loop with i of-type fixnum = 0
        with acc of-type fixnum = 1
        while (< i limit)
        do (setf acc (+ acc (length (quote-json-string target)))
                 i (+ i 1))
        finally (return acc)))

(let ((result (json-quote-loop (configured-loop-count) (configured-target))))
  (format t "~D~%" result)
  (sb-ext:exit :code (if (= result +expected-checksum+) 0 1)))
