00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined (octave_f77_fcn_h)
00025 #define octave_f77_fcn_h 1
00026
00027 #include "quit.h"
00028
00029 #ifdef __cplusplus
00030 extern "C" {
00031 #endif
00032
00033
00034 #define xSTRINGIZE(x) #x
00035 #define STRINGIZE(x) xSTRINGIZE(x)
00036
00037
00038
00039 #define F77_XFCN_ERROR(f, F) \
00040 (*current_liboctave_error_handler) \
00041 ("exception encountered in Fortran subroutine %s", \
00042 STRINGIZE (F77_FUNC (f, F)))
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #define F77_XFCN(f, F, args) \
00053 do \
00054 { \
00055 octave_jmp_buf saved_context; \
00056 sig_atomic_t saved_octave_interrupt_immediately = octave_interrupt_immediately; \
00057 f77_exception_encountered = 0; \
00058 octave_save_current_context (saved_context); \
00059 if (octave_set_current_context) \
00060 { \
00061 octave_interrupt_immediately = saved_octave_interrupt_immediately; \
00062 octave_restore_current_context (saved_context); \
00063 if (f77_exception_encountered) \
00064 F77_XFCN_ERROR (f, F); \
00065 else if (octave_allocation_error) \
00066 octave_throw_bad_alloc (); \
00067 else \
00068 octave_throw_interrupt_exception (); \
00069 } \
00070 else \
00071 { \
00072 octave_interrupt_immediately++; \
00073 F77_FUNC (f, F) args; \
00074 octave_interrupt_immediately--; \
00075 octave_restore_current_context (saved_context); \
00076 } \
00077 } \
00078 while (0)
00079
00080
00081 CRUFT_API extern int f77_exception_encountered;
00082
00083 #if !defined (F77_FCN)
00084 #define F77_FCN(f, F) F77_FUNC (f, F)
00085 #endif
00086
00087 #if defined (F77_USES_CRAY_CALLING_CONVENTION)
00088
00089 #include <fortran.h>
00090
00091
00092 #define F77_CHAR_ARG(x) octave_make_cray_ftn_ch_dsc (x, strlen (x))
00093 #define F77_CONST_CHAR_ARG(x) \
00094 octave_make_cray_const_ftn_ch_dsc (x, strlen (x))
00095 #define F77_CHAR_ARG2(x, l) octave_make_cray_ftn_ch_dsc (x, l)
00096 #define F77_CONST_CHAR_ARG2(x, l) octave_make_cray_const_ftn_ch_dsc (x, l)
00097 #define F77_CXX_STRING_ARG(x) \
00098 octave_make_cray_const_ftn_ch_dsc (x.c_str (), x.length ())
00099 #define F77_CHAR_ARG_LEN(l)
00100 #define F77_CHAR_ARG_DECL octave_cray_ftn_ch_dsc
00101 #define F77_CONST_CHAR_ARG_DECL octave_cray_ftn_ch_dsc
00102 #define F77_CHAR_ARG_LEN_DECL
00103
00104
00105
00106 #define F77_CHAR_ARG_DEF(s, len) octave_cray_ftn_ch_dsc s
00107 #define F77_CONST_CHAR_ARG_DEF(s, len) octave_cray_ftn_ch_dsc s
00108 #define F77_CHAR_ARG_LEN_DEF(len)
00109 #define F77_CHAR_ARG_USE(s) s.ptr
00110 #define F77_CHAR_ARG_LEN_USE(s, len) (s.mask.len>>3)
00111
00112 #define F77_RET_T int
00113 #define F77_RETURN(retval) return retval;
00114
00115
00116
00117
00118 typedef union
00119 {
00120 const char *const_ptr;
00121 char *ptr;
00122 struct
00123 {
00124 unsigned off : 6;
00125 unsigned len : 26;
00126 unsigned add : 32;
00127 } mask;
00128 } octave_cray_descriptor;
00129
00130 typedef void *octave_cray_ftn_ch_dsc;
00131
00132 #ifdef __cplusplus
00133 #define OCTAVE_F77_FCN_INLINE inline
00134 #else
00135 #define OCTAVE_F77_FCN_INLINE
00136 #endif
00137
00138 static OCTAVE_F77_FCN_INLINE octave_cray_ftn_ch_dsc
00139 octave_make_cray_ftn_ch_dsc (char *ptr_arg, unsigned long len_arg)
00140 {
00141 octave_cray_descriptor desc;
00142 desc.ptr = ptr_arg;
00143 desc.mask.len = len_arg << 3;
00144 return *((octave_cray_ftn_ch_dsc *) &desc);
00145 }
00146
00147 static OCTAVE_F77_FCN_INLINE octave_cray_ftn_ch_dsc
00148 octave_make_cray_const_ftn_ch_dsc (const char *ptr_arg, unsigned long len_arg)
00149 {
00150 octave_cray_descriptor desc;
00151 desc.const_ptr = ptr_arg;
00152 desc.mask.len = len_arg << 3;
00153 return *((octave_cray_ftn_ch_dsc *) &desc);
00154 }
00155
00156 #ifdef __cplusplus
00157 #undef OCTAVE_F77_FCN_INLINE
00158 #endif
00159
00160 #elif defined (F77_USES_VISUAL_FORTRAN_CALLING_CONVENTION)
00161
00162
00163 #define F77_CHAR_ARG(x) x, strlen (x)
00164 #define F77_CONST_CHAR_ARG(x) F77_CHAR_ARG (x)
00165 #define F77_CHAR_ARG2(x, l) x, l
00166 #define F77_CONST_CHAR_ARG2(x, l) F77_CHAR_ARG2 (x, l)
00167 #define F77_CXX_STRING_ARG(x) F77_CONST_CHAR_ARG2 (x.c_str (), x.length ())
00168 #define F77_CHAR_ARG_LEN(l)
00169 #define F77_CHAR_ARG_DECL char *, int
00170 #define F77_CONST_CHAR_ARG_DECL const char *, int
00171 #define F77_CHAR_ARG_LEN_DECL
00172
00173
00174
00175 #define F77_CHAR_ARG_DEF(s, len) char *s, int len
00176 #define F77_CONST_CHAR_ARG_DEF(s, len) const char *s, int len
00177 #define F77_CHAR_ARG_LEN_DEF(len)
00178 #define F77_CHAR_ARG_USE(s) s
00179 #define F77_CHAR_ARG_LEN_USE(s, len) len
00180
00181 #define F77_RET_T void
00182 #define F77_RETURN(retval)
00183
00184 #else
00185
00186
00187
00188
00189 #define F77_CHAR_ARG(x) x
00190 #define F77_CONST_CHAR_ARG(x) F77_CHAR_ARG (x)
00191 #define F77_CHAR_ARG2(x, l) x
00192 #define F77_CONST_CHAR_ARG2(x, l) F77_CHAR_ARG2 (x, l)
00193 #define F77_CXX_STRING_ARG(x) F77_CONST_CHAR_ARG2 (x.c_str (), x.length ())
00194 #define F77_CHAR_ARG_LEN(l) , l
00195 #define F77_CHAR_ARG_DECL char *
00196 #define F77_CONST_CHAR_ARG_DECL const char *
00197 #define F77_CHAR_ARG_LEN_DECL , long
00198
00199
00200
00201 #define F77_CHAR_ARG_DEF(s, len) char *s
00202 #define F77_CONST_CHAR_ARG_DEF(s, len) const char *s
00203 #define F77_CHAR_ARG_LEN_DEF(len) , long len
00204 #define F77_CHAR_ARG_USE(s) s
00205 #define F77_CHAR_ARG_LEN_USE(s, len) len
00206
00207 #define F77_RET_T int
00208 #define F77_RETURN(retval) return retval;
00209
00210 #endif
00211
00212
00213
00214
00215
00216
00217
00218 #define F77_CSTRING(s, len, cs) \
00219 OCTAVE_LOCAL_BUFFER (char, cs, F77_CHAR_ARG_LEN_USE (s, len) + 1); \
00220 memcpy (cs, F77_CHAR_ARG_USE (s), F77_CHAR_ARG_LEN_USE (s, len)); \
00221 cs[F77_CHAR_ARG_LEN_USE(s, len)] = '\0'
00222
00223
00224 extern CRUFT_API F77_RET_T
00225 F77_FUNC (xstopx, XSTOPX) (F77_CONST_CHAR_ARG_DECL
00226 F77_CHAR_ARG_LEN_DECL) GCC_ATTR_NORETURN;
00227
00228 #ifdef __cplusplus
00229 }
00230 #endif
00231
00232 #endif
00233
00234
00235
00236
00237
00238