C C $Id: simple_c2f1_ibm.f,v 1.1 1993/11/16 23:36:16 idl Exp $ C C NAME: C simple_c2f1 C C PURPOSE: C C This Fortran function is used to demonstrate how to pass all IDL C simple varable types to a FORTRAN routine via a C wrapper function. C Each variable is squared and returned to the calling C function. C C CATEGORY: C Dynamic Link C C CALLING SEQUENCE: C This function is called in IDL by using the following command C Access to this function is achived via a C 'wrapper' function. C C IDL> result = CALL_EXTERNAL('simple_c2f.so', '_simple_c2f', $ C IDL> bytevar, shortvar, longvar, floatvar, doublevar, stringvar) C C INPUTS: C C Byte_var: A scalar byte variable C C Short_var: A scalar short integer variable C C Long_var: A scalar long integer variable C C Float_var: A scalar float variable C C Double_var: A scalar float variable C C String_var: A scalar string value C C OUTPUTS: C The value of each variable is squared. Since you should not C change the value of an IDL string. A new string is created, C two copies of the original string placed in it and the C string is returned as the value of this function. C C SIDE EFFECTS: C None. C C RESTRICTIONS: C None. C C EXAMPLE: C----------------------------------------------------------------------------- C;; The following are the commands that would be used to call this C;; routine in IDL. This calls the C function that calls this FORTRAN C;; Subprogram. C;; C byte_var = 1b C short_var = 2 C long_var = 3l C float_var = 4.0 C double_var = 5d0 C string_var = "SIX" C C result = CALL_EXTERNAL('simple_c2f.so', '_simple_c2f', $ C byte_var, short_var, long_var, float_var, $ C double_var, string_var ) C C----------------------------------------------------------------------------- C C MODIFICATION HISTORY: C Written October, 1993 KDB SUBROUTINE SIMPLE_C2F1(BYTE_VAR, SHORT_VAR, LONG_VAR, & FLOAT_VAR, DOUBLE_VAR, STRING_VAR, RTR_STR, RTR_LEN ) C Declare subroutine passed in variables BYTE BYTE_VAR !IDL byte variable INTEGER*2 SHORT_VAR !IDL integer variable INTEGER*4 LONG_VAR !IDL long integer INTEGER*4 RTR_LEN REAL FLOAT_VAR !IDL float variable DOUBLE PRECISION DOUBLE_VAR !IDL double variable CHARACTER*(*) STRING_VAR !IDL string variable CHARACTER*(*) RTR_STR C Declare local variables INTEGER LN !Length of input string INTEGER LEFT, EN C Print out each variable that was passed in. WRITE(*,10) 10 FORMAT(1X,/,52('-') ) WRITE(*,20) 20 FORMAT(1X,'Inside Fortran function simple_c2f1 ',/ & '(Called from IDL using CALL_EXTERNAL via A C function)',/) WRITE(*,30) 30 FORMAT(1X,'Scalar Values Passed in From IDL via a C function:') WRITE(*,100)BYTE_VAR 100 FORMAT(10X,'BYTE Parameter:',T50,I4) WRITE(*,110)SHORT_VAR 110 FORMAT(10X,'SHORT Parameter:',T50,I4) WRITE(*,120)LONG_VAR 120 FORMAT(10X,'LONG Parameter:',T50,I4) WRITE(*,130)FLOAT_VAR 130 FORMAT(10X,'FLOAT Parameter:',T50,F4.1) WRITE(*,140)DOUBLE_VAR 140 FORMAT(10X,'Double Parameter:',T50,F4.1) WRITE(*,150)STRING_VAR 150 FORMAT(10X,'String Parameter:',T50,A) WRITE(*,10) C Square each variable BYTE_VAR = BYTE_VAR**2 SHORT_VAR = SHORT_VAR**2 LONG_VAR = LONG_VAR**2 FLOAT_VAR = FLOAT_VAR**2 DOUBLE_VAR = DOUBLE_VAR**2 C Now to duplicate the string RTR_STR = STRING_VAR LN = len(STRING_VAR) LEFT = RTR_LEN - LN IF( LEFT .gt. LN) LEFT = LN EN = LN*2 IF(EN .gt. RTR_LEN) EN = RTR_LEN RTR_STR(LN+1:EN) = STRING_VAR(1:LEFT) C That is all that this subroutine does. Return to the C calling C function. RETURN END