;;; .EnTete "Le-Lisp (c) version 15.2" " " "Test des appels externes Fortran"
;;; .EnPied "testfortran.ll" "%" " "
;;;
;;; .SuperTitre "Test des appels externes Fortran"
;;;
;;;
;;; .Centre "*****************************************************************"
;;; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA.  "
;;; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
;;; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA                 "
;;; .Centre "*****************************************************************"
;;;
;;; .Centre "$Header: testfortran.ll,v 1.2 88/12/27 01:32:03 nuyens Exp $"

(unless (>= (version) 15.2)
        (error 'load 'erricf 'testfortran))

(unless (featurep 'testcomm)
    (libload testcomm))


(defvar cfilf (catenate #:system:directory "lltest/testfortran.f"))
(defvar cfilo "/tmp/testfortran.o")

(when (and #:system:cloadp
	   (eq (getglobal "←rfix1←") 0))
      (print "compiling " cfilf)
      (comline (catenate "f77 -c " cfilf " -o " cfilo))
      (print "cloading " cfilo)
      (cload cfilo)
      (comline (catenate "rm -f " cfilo)) )

(unless (or (featurep '64bitfloats)
	    (eq 0.0 0.0))
	(add-feature '64bitfloats))

;;; Tableau des correspondances de type:
;;;  Le-lisp  ;  Fortran        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;   rfix    ; INTEGER*4       ;
;;;  rfloat   ; REAL*8          ;
;;; fixvector ; INTEGER*4 (lg)  ;
;;;floatvector; REAL*4 (lg)     ; Impossible en 64bitfloats!!   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; lancement des tests
(testfn ())

          (test-serie "Test sur les entiers fortran" t)
(defextern ←rfix1← (rfix) fix)          ←rfix1←     ; rfix ==> INTEGER*4
(←rfix1← 2)                             4
(←rfix1← -2)                            -4
(←rfix1← 0)                             0
(←rfix1← 16383)                         32766
(←rfix1← -16384)                        -32768


          (test-serie "Test sur les flottants fortran")
(defextern ←rflt1← (rfloat) float)      ←rflt1←  ; rfloat ==> REAL*8
(←rflt1← 0.0)                           0.0
(←rflt1← 1.2)                           2.4
(←rflt1← -300.0)                        -600.0

          (test-serie "Test sur les entiers fortran, avec modification")

(defextern ←mfix← (fixvector) )        ←mfix←  ; fixvector ==> INTEGER*4
;;; Pour recuperer le re'sultat de l'ope'ration fortran, on passe
;;; un vecteur d'1 scalaire, lequel sera modifie' au retour.
(setq a #[3])                           #[3]
(progn (←mfix← a) a)                    #[4]

#-(featurep '64bitfloats)
  (test-serie "Test sur les flottants fortran, avec modification")
()
#+(featurep '64bitfloats)
  (test-serie "Pas de FLOATVECTOR en 64BITFLOATS" ())

(defextern ←mflt← (floatvector)) 
    #.(if (featurep '64bitfloats)
	  '(errgen defextern "floatvector (64BITFLOATS)")
	'←mflt←)

(setq b #[2.3])                         #[2.3]
#-(featurep '64bitfloats)
  (progn (←mflt← b)
	 b)                             #-(featurep '64bitfloats)#[4.6]

          (test-serie "Test sur les tableaux d'entiers fortran")

(defextern ←tabfix← (rfix fixvector))   ←tabfix←; rfix & fixvector=> INTEGER*4
(setq c #[1 2 3 4 5 9])                 #[1 2 3 4 5 9]
(progn (←tabfix← 6 c)
       c)                               #[2 3 4 5 6 10]
(setq d #[1 2 -32767 4 5 9])            #[1 2 -32767 4 5 9]
(progn (←tabfix← 6 d)
       d)                               #[2 3 -32766 5 6 10]

#-(featurep '64bitfloats)
  (test-serie "Test sur les tableaux de flottants fortran")
()
#+(featurep '64bitfloats)
  (test-serie "Pas de FLOATVECTOR en 64BITFLOATS" ())

(defextern ←tabflt← (rfix floatvector))
    #.(if (featurep '64bitfloats)
	  '(errgen defextern "floatvector (64BITFLOATS)")
	'←tabflt←)
(setq d #[1.2 4.0 9.9 .25])             #[1.2 4.0 9.9 .25]
#-(featurep '64bitfloats)
(progn (←tabflt← 4 d)                        
       d)                               #-(featurep '64bitfloats)
                                          #[2.4 8.0 19.8 .5]

          (test-serie "Fin du test" ())
()                                      ()