(define (generate-rom)

  (define open-output-string open-output-bytevector)
  (define (get-output-string port)
    (list->string (map integer->char (bytevector->list (get-output-bytevector port)))))

  (define (with-output-to-string thunk)
    (let ((port (open-output-string)))
      (parameterize ((current-output-port port))
        (thunk)
        (let ((s (get-output-string port)))
          (close-port port)
          s))))

  (define text
    (with-output-to-string
      (lambda ()
        (write (read)))))

  (define (escape-string s)
    (with-output-to-string
      (lambda ()
        (string-for-each
         (lambda (c)
           (case c
             ((#\\) (display "\\\\"))
             ((#\") (display "\\\""))
             ((#\newline) (display "\\n"))
             (else (display c))))
         s))))

  (define (group-string i s)
    (let loop ((t s) (n (string-length s)) (acc '()))
      (if (= n 0)
          (reverse acc)
          (if (< n i)
              (loop "" 0 (cons t acc))
              (loop (string-copy t i) (- n i) (cons (string-copy t 0 i) acc))))))

  (define lines (map escape-string (group-string 80 text)))

  (let loop ((lines lines) (acc ""))
       (if (null? lines)
           acc
           (loop (cdr lines) (string-append acc "\"" (car lines) "\",\n")))))


(for-each
 display
 `("#include \"picrin.h\"\n"
   "#include \"picrin/extra.h\"\n"
   "\n"
   "static const char lib_rom[][80] = {\n"
   ,(generate-rom)
   "};\n"
   "\n"
   "void\n"
   "pic_init_lib(pic_state *PIC_UNUSED(pic))\n"
   "{\n"
   "  pic_value port;\n"
   "  port = pic_fmemopen(pic, &lib_rom[0][0], strlen(&lib_rom[0][0]), \"r\");\n"
   "  pic_funcall(pic, \"eval\", 1, pic_funcall(pic, \"read\", 1, port));\n"
   "}\n"))