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/fio/write.c 92.2 06/21/99 10:37:55"
00039
00040
00041
00042
00043
00044 #include <errno.h>
00045 #include <foreign.h>
00046 #include <fortran.h>
00047 #include <liberrno.h>
00048 #include "fio.h"
00049
00050 #define UBC 4
00051 #define STATUS 5
00052
00053 #undef WRITE
00054
00055 static void __WRITE();
00056
00057
00058
00059
00060
00061 _f_int
00062 WRITE(
00063 _f_int *unump,
00064 _f_int *uda,
00065 _f_int *wordsp,
00066 _f_int *ubc,
00067 _f_int *status)
00068 {
00069 _f_int locubc, *ubcp;
00070 _f_int *statp;
00071
00072 if (_numargs() < UBC) {
00073 locubc = 0;
00074 ubcp = &locubc;
00075 }
00076 else
00077 ubcp = ubc;
00078
00079 statp = (_numargs() < STATUS) ? NULL : status;
00080
00081 __WRITE(FULL, unump, uda, wordsp, ubcp, statp);
00082
00083 return(0);
00084 }
00085
00086
00087
00088
00089
00090 void
00091 WRITEP(
00092 _f_int *unump,
00093 _f_int *uda,
00094 _f_int *wordsp,
00095 _f_int *ubc,
00096 _f_int *status)
00097 {
00098 _f_int locubc, *ubcp;
00099 _f_int *statp;
00100
00101 if (_numargs() < UBC) {
00102 locubc = 0;
00103 ubcp = &locubc;
00104 }
00105 else
00106 ubcp = ubc;
00107
00108 statp = (_numargs() < STATUS) ? NULL : status;
00109
00110 __WRITE(PARTIAL, unump, uda, wordsp, ubcp, statp);
00111
00112 return;
00113 }
00114
00115 static void
00116 __WRITE(
00117 int fulp,
00118 _f_int *unump,
00119 _f_int *uda,
00120 _f_int *wordsp,
00121 _f_int *ubc,
00122 _f_int *status)
00123 {
00124 register int ret;
00125 register int errn;
00126 int wstat;
00127 int wubc;
00128 register unum_t unum;
00129 unit *cup;
00130 type_packet tip;
00131 struct fiostate cfs;
00132
00133 unum = *unump;
00134 wubc = *ubc;
00135 errn = 0;
00136
00137 STMT_BEGIN(unum, 0, T_WSU, NULL, &cfs, cup);
00138
00139
00140
00141 if (cup == NULL) {
00142 int ostat;
00143
00144 cup = _imp_open(&cfs, SEQ, UNF, unum, (status != NULL),
00145 &ostat);
00146
00147 if (cup == NULL) {
00148 errn = ostat;
00149 goto done;
00150 }
00151 }
00152
00153 if (!cup->ok_wr_seq_unf) {
00154 errn = _get_mismatch_error(1, T_WSU, cup, &cfs);
00155 goto done;
00156 }
00157
00158 cup->uwrt = 1;
00159
00160 if (cup->uend) {
00161
00162
00163
00164
00165 if (!cup->umultfil && !cup->uspcproc) {
00166 errn = FEWRAFEN;
00167 goto done;
00168 }
00169
00170
00171
00172
00173
00174 if ((cup->uend == LOGICAL_ENDFILE) && !(cup->uspcproc)) {
00175 if (XRCALL(cup->ufp.fdc, weofrtn)cup->ufp.fdc,
00176 &cup->uffsw) < 0) {
00177 errn = cup->uffsw.sw_error;
00178 goto done;
00179 }
00180 }
00181 cup->uend = BEFORE_ENDFILE;
00182 }
00183
00184 tip.type90 = DVTYPE_TYPELESS;
00185 tip.type77 = -1;
00186 tip.intlen = sizeof(long) << 3;
00187 tip.extlen = tip.intlen;
00188 tip.elsize = sizeof(long);
00189 tip.cnvindx = 0;
00190 tip.count = *wordsp;
00191 tip.stride = 1;
00192
00193 ret = _fwwd(cup, uda, &tip, fulp, &wubc, (long *) NULL, &wstat);
00194
00195 if ( ret == IOERR ) {
00196 errn = errno;
00197 goto done;
00198 }
00199
00200 if (status != NULL)
00201 *status = 0;
00202
00203 done:
00204 if (errn != 0) {
00205 if (status == NULL)
00206 _ferr(&cfs, errn);
00207 else
00208 *status = errn;
00209 }
00210
00211 *ubc = wubc;
00212
00213 STMT_END(cup, TF_WRITE, NULL, &cfs);
00214
00215 return;
00216 }