(defparameter *battery-file* "/proc/acpi/battery/BAT0/state")

(defun split-string (string delim)
  (let ((pos (position delim string)))
    (if (null pos)
        (cons string nil)
        (cons (subseq string 0 pos)
              (split-string (subseq string pos))))))

(defun get-battery-status ()
  (let ((remaining-charge
         (get-value-from-file *battery-file* "remaining capacity"))
        (present-rate (get-value-from-file *battery-file* "present rate")))
    (format t "Remaining battery time: ~a hrs" (/ (float present-rate)
                                                  (float remaining-charge)))))

(defun get-value-from-file (file str)
  (with-open-file (stream file)
    (let ((parts (do ((line (read-line stream nil)
                            (read-line stream nil)))
                     ((or (null line)
                          (not (null (search str line)))) line))))
      (if (null parts)
          nil
          (parse-integer (string-trim " " (cadr (split-string parts #\:)))
                         :junk-allowed t)))))

(get-battery-status)