00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #pragma ident "@(#) libf/fort/argshck.c 92.1 06/24/99 10:18:36"
00039
00040 #include <fortran.h>
00041 #include <stdio.h>
00042 #include <strings.h>
00043 #include <liberrno.h>
00044 #include <cray/nassert.h>
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #define MAX_FORT_DIM 7
00056 #define MAX_NAME_LEN 48
00057 #define MAX_EXT_STR 80
00058 #define MAX_ENT_LEN 32
00059
00060 typedef enum { ERR_NONE, ERR_WARN, ERR_FATAL } Error_type;
00061
00062 extern int _who_called_me();
00063
00064 static void ext_msg(char *label, int ext[], int rank, char extents_str[] );
00065
00066 static void issue_msg(int errnum, char *arg_name, char *actual_extents,
00067 char *dummy_extents);
00068
00069 void
00070 $ARGSHCK(
00071 void *act_sdd,
00072 int *frml_dims,
00073 int exts[],
00074 int loc[] )
00075 {
00076 Error_type error_type = ERR_NONE;
00077 int prev_cyc_ebp = 0;
00078 int act_ext[ MAX_FORT_DIM ];
00079 char arg_name[ MAX_NAME_LEN ];
00080 char actual_extents[ MAX_EXT_STR ];
00081 char dummy_extents[ MAX_EXT_STR ];
00082 int act_rank;
00083 int dimx;
00084 int i, j;
00085
00086 assert ( _issddptr(act_sdd) );
00087
00088 for (dimx = 0; dimx < MAX_FORT_DIM; ++dimx) {
00089 int cyc_ebp = _sdd_read_cyc_ebp( act_sdd, dimx+1 );
00090 if ( cyc_ebp == 0 )
00091 break;
00092 act_ext[ dimx ] = 1 << (cyc_ebp - prev_cyc_ebp);
00093 prev_cyc_ebp = cyc_ebp;
00094 }
00095 act_rank = dimx;
00096
00097 if ( act_rank < *frml_dims ) {
00098 error_type = ERR_FATAL;
00099 } else {
00100 int last_dimx = *frml_dims - 1;
00101
00102 if ( act_ext[ last_dimx ] < exts[ last_dimx ] ) {
00103 error_type = ERR_WARN;
00104 }
00105 for (dimx = 0; dimx < last_dimx; ++dimx) {
00106 if ( exts[ dimx ] != act_ext[ dimx ] ) {
00107 error_type = ERR_FATAL;
00108 break;
00109 }
00110 }
00111 }
00112
00113 if ( error_type == ERR_NONE )
00114 return;
00115
00116
00117
00118
00119 i = 0;
00120 for (j = 0; loc[ i ]; ++i ) {
00121 arg_name[ j++ ] = (char) loc[ i ] ;
00122 }
00123 arg_name[ j ] = '\0';
00124
00125 ext_msg( "actual_arg", act_ext, act_rank, actual_extents );
00126 ext_msg( "dummy_arg ", exts, *frml_dims, dummy_extents );
00127
00128 switch ( error_type ) {
00129
00130 case ERR_FATAL:
00131 issue_msg( FEARGSHP, arg_name, actual_extents, dummy_extents );
00132 break;
00133
00134 case ERR_WARN:
00135 issue_msg( FWARGSHP, arg_name, actual_extents, dummy_extents );
00136 break;
00137 }
00138 }
00139
00140 static void
00141 ext_msg(
00142 char *label,
00143 int ext[],
00144 int rank,
00145 char extents_str[] )
00146 {
00147 int sx;
00148 int i;
00149
00150 if ( rank > 0 ) {
00151 sx = sprintf( extents_str, "a %d", ext[ 0 ] );
00152 for (i = 1; i < rank; ++i) {
00153 sx += sprintf( &extents_str[ sx ], " x %d", ext[ i ]);
00154 }
00155 sprintf( &extents_str[ sx ], " element array." );
00156 } else {
00157 strcpy( extents_str, "a scalar." );
00158 }
00159 }
00160
00161 static void
00162 issue_msg(
00163 int errnum,
00164 char *arg_name,
00165 char *actual_extents,
00166 char *dummy_extents)
00167 {
00168 int nc, lineno, temp;
00169 char caller[MAX_ENT_LEN];
00170 char callee[MAX_ENT_LEN];
00171
00172 nc = _who_called_me(&lineno, caller, MAX_ENT_LEN, 3);
00173 if (nc < 0)
00174 strcpy(caller, "???");
00175 else
00176 caller[nc] = '\0';
00177
00178 nc = _who_called_me(&temp, callee, MAX_ENT_LEN, 2);
00179 if (nc < 0)
00180 strcpy(callee, "???");
00181 else
00182 callee[nc] = '\0';
00183
00184
00185 switch (errnum) {
00186
00187 case FWARGSHP:
00188 (void) _lwarn(errnum, callee, caller, lineno,
00189 arg_name, actual_extents, dummy_extents);
00190 break;
00191
00192 case FEARGSHP:
00193 (void) _lerror( _LELVL_ABORT, errnum, callee, caller, lineno,
00194 arg_name, actual_extents, dummy_extents);
00195 break;
00196
00197 default:
00198 break;
00199 }
00200 }