Sorry, the indentation of my example code got messed up by tabs.
Here it is again:

  (use-modules (system foreign))

  (define libglut-obj (dynamic-link "libglut"))

  ;; (glut-init args), where args is the complete list of command
  ;; arguments (starting with the program name), calls glutInit and
  ;; returns the (possibly) modified list of arguments.
  (define glut-init
    (let ((foo-init-raw (pointer->procedure
                         void
                         (dynamic-func "glutInit" libglut-obj)
                         (list '* '*)))
          (saved-c-strings '()))
      (lambda (args)
        (let* ((num-args (length args))
               (c-strings (map string->pointer args))
               (argcp (make-c-struct (list int)
                                     (list num-args)))
               (argv (make-c-struct (make-list (+ 1 num-args) '*)
                                    (append c-strings
                                            (list %null-pointer)))))
          (set! saved-c-strings (append c-strings saved-c-strings))
          (foo-init-raw argcp argv)
          (let ((argc (car (parse-c-struct argcp (list int)))))
            (map pointer->string
                 (parse-c-struct argv
                                 (make-list argc '*))))))))

  ;; Example usage
  (set-program-arguments (glut-init (program-arguments)))

     Mark


Reply via email to