gpp4  1.3.1
src/ccp4_fortran.h
Go to the documentation of this file.
00001 /*
00002      ccp4_fortran.h: header file for Fortran APIs
00003      Copyright (C) 2001   Eugene Krissinel
00004      Copyright (C) 2007   Morten Kjeldgaard
00005 
00006      This library is free software: you can redistribute it and/or
00007      modify it under the terms of the GNU Lesser General Public
00008      License as published by the Free Software Foundation, either
00009      version 3 of the License, or (at your option) any later version.
00010 
00011      This library is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014      Lesser General Public License for more details.
00015 
00016      You should have received a copy of the GNU Lesser General Public
00017      License along with This library.  If not, see
00018      <http://www.gnu.org/licenses/>.
00019 
00020 */
00021 
00030 #ifndef __CCP4_FORTRAN
00031 #define __CCP4_FORTRAN
00032 
00033 #include "ccp4_types.h"
00034 
00035 /* stardent is now obsolete, but we retain this category in case it is useful later */
00036 #ifdef CALL_LIKE_STARDENT
00037   /* SStrParam is used in Ardent-like machines' fortran calls */
00038   /* for passing a string parameter */
00039   DefineStructure(SStrPar)
00040   struct SStrPar  {
00041     pstr S;
00042     int  len;
00043     int  id;
00044   };
00045 #endif
00046 
00047 #define _LVTOB(l) ((long) ((l) == 0 ? 0 : 1))  
00048 #define _BTOLV(l) ((int) ((l) == 0 ? 0 : 1))
00049 #if defined (__OSF1__) || defined (__osf__)
00050 #undef _BTOLV
00051 #define _BTOLV(l) ((int) ((l) == 0 ? 0 : -1))  
00052 #endif    
00053 
00174 #if  defined(CALL_LIKE_SUN)
00175 
00176   typedef pstr fpstr;
00177 
00178 #define FTN_STR(s)  s
00179 #define FTN_LEN(s)  s##_len
00180 
00181 #define char_struct(s)           \
00182     pstr  s;                       \
00183     int   s##_len;
00184 #define fill_char_struct(s,str)  \
00185     s  = str;                      \
00186     s##_len = strlen(str);
00187 #define init_char_struct(s,str,size)  \
00188     s  = str;                      \
00189     s##_len = size;
00190 
00191 #define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00192     void name##_ p_sun
00193 #define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00194     name##_ p_sun
00195 #define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00196     val name##_ p_sun
00197 #elif defined(CALL_LIKE_HPUX)
00198 
00199   typedef pstr fpstr;
00200 
00201 #  define FTN_STR(s)  s
00202 #  define FTN_LEN(s)  s##_len
00203 
00204 #  define char_struct(s)  \
00205     pstr  s;              \
00206     int   s##_len;
00207 #  define fill_char_struct(s,str)  \
00208     s  = str;                      \
00209     s##_len = strlen(str);
00210 #  define init_char_struct(s,str,size)  \
00211     s  = str;                      \
00212     s##_len = size;
00213 
00214 #  define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00215     void name p_sun
00216 #  define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00217     name p_sun
00218 #  define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00219     val name p_sun
00220 #elif defined(CALL_LIKE_STARDENT)
00221 
00222   typedef PStrPar fpstr;
00223 
00224 #  define FTN_STR(s)  s->Str_pointer
00225 #  define FTN_LEN(s)  s->Str_length
00226 
00227 #  define char_struct(s)           \
00228     SStrPar s;
00229 #  define fill_char_struct(s,str)  \
00230     s.S   = str;                   \
00231     s.len = strlen(FName);         \
00232     s.id  = 0;
00233 #  define init_char_struct(s,str,size)  \
00234     s.S   = str;                   \
00235     s.len = size;         \
00236     s.id  = 0;
00237 
00238 #  define FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) \
00239     void NAME p_stardent
00240 #  define FORTRAN_CALL(NAME,name,p_send,p_sstruct,p_sflw) \
00241     NAME p_stardent
00242 #  define FORTRAN_FUN(val,NAME,name,p_send,p_sstruct,p_sflw) \
00243     val NAME p_stardent
00244 
00245 #elif defined(CALL_LIKE_VMS)
00246 
00247   typedef dsc$descriptor_s * fpstr;
00248 
00249 #  define FTN_STR(s)  s->dsc$a_pointer;
00250 #  define FTN_LEN(s)  s->dsc$w_length;
00251 
00252 #  define char_struct(s)                \
00253     dsc$descriptor_s s;
00254 #  define fill_char_struct(s,str)     \
00255     s.dsc$a_pointer = str;            \
00256     s.dsc$w_length  = strlen(str);    \
00257     s.dsc$b_dtype   = DSC$K_DTYPE_T;  \
00258     s.dsc$b_class   = DSC$K_CLASS_S;
00259 #  define init_char_struct(s,str,size)     \
00260     s.dsc$a_pointer = str;            \
00261     s.dsc$w_length  = size;    \
00262     s.dsc$b_dtype   = DSC$K_DTYPE_T;  \
00263     s.dsc$b_class   = DSC$K_CLASS_S;
00264 
00265 #  define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00266     void NAME p_stardent
00267 #  define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00268     NAME p_stardent
00269 #  define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00270     val NAME p_stardent
00271 
00272 #elif defined(CALL_LIKE_MVS)
00273 
00274 #if (CALL_LIKE_MVS == 2)
00275 
00276   typedef pstr fpstr;
00277 
00278 #define FTN_STR(s)  s
00279 #define FTN_LEN(s)  s##_len
00280 
00281 #define char_struct(s)           \
00282     pstr  s;                       \
00283     int   s##_len;
00284 #define fill_char_struct(s,str)  \
00285     s  = str;          \
00286         s##_len = strlen(str);
00287 #define init_char_struct(s,str,size)  \
00288     s  = str;                   \
00289         s##_len = size;
00290 
00291 #define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00292     void NAME p_sun
00293 #define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00294     NAME p_sun
00295 #define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00296     val NAME p_sun
00297 
00298 #else
00299 
00300   typedef pstr fpstr;
00301 
00302 #  define FTN_STR(s)  s
00303 #  define FTN_LEN(s)  s##_len
00304 
00305 #  define char_struct(s)  \
00306     pstr  s;              \
00307     int   s##_len;
00308 #  define fill_char_struct(s,str)  \
00309     s  = str;                      \
00310     s##_len = strlen(str);
00311 #  define init_char_struct(s,str,size)  \
00312     s  = str;                      \
00313     s##_len = size;
00314 
00315 #  define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00316     void __stdcall NAME p_mvs
00317 #  define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00318     NAME p_mvs
00319 #  define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00320     val __stdcall NAME p_mvs
00321 
00322 # endif
00323 
00324 #else
00325 
00326 #  error  Unknown machine!!!
00327 
00328   typedef pstr fpstr;
00329 
00330 #  define FTN_STR(s)  s
00331 #  define FTN_LEN(s)  s##_len
00332 
00333 #  define char_struct(s)  \
00334     pstr  s;              \
00335     int   s##_len;
00336 #  define fill_char_struct(s,str)  \
00337     s  = str;                      \
00338     s##_len = strlen(str);
00339 #  define init_char_struct(s,str,size)  \
00340     s  = str;                      \
00341     s##_len = size;
00342 
00351 #  define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \
00352     void name##_ p_sun
00353 
00361 #  define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \
00362     name##_ p_sun
00363 
00373 #  define FORTRAN_FUN(val,NAME,name,p_sun,p_stardent,p_mvs) \
00374     val name##_ p_sun
00375 
00376 #endif
00377 
00378 /* Define Fortran logical */
00379 typedef unsigned int ftn_logical;
00380 #if defined (KNOWN_MACHINE)
00381 #  define FORTRAN_LOGICAL_TRUE  1
00382 #  define FORTRAN_LOGICAL_FALSE 0
00383 #endif
00384 #if defined (__OSF1__) || defined (__osf__)
00385 #  undef FORTRAN_LOGICAL_TRUE
00386 #  define FORTRAN_LOGICAL_TRUE  -1
00387 #endif     
00388 
00389 char *ccp4_FtoCString(fpstr str1, int str1_len);
00390 void ccp4_CtoFString(fpstr str1, int str1_len, const char *cstring);
00391 
00392 #endif    /* __CCP4_FORTRAN */
00393 
00394 /*
00395   Local variables:
00396   mode: font-lock
00397   End:
00398 */