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
00039
00040
00041
00042 static char USMID[] = "@(#) libf/fio/flush.c 92.3 11/16/99 15:43:33";
00043
00044 #include <stdio.h>
00045 #include <errno.h>
00046 #include <liberrno.h>
00047 #include "fio.h"
00048 #ifdef _ABSOFT
00049 #include "ac_sysdep.h"
00050 #else
00051
00052 #if defined(_LITTLE_ENDIAN)
00053 #ifndef FILE_FLAG
00054 #define FILE_FLAG(__f) (__f)->_flag
00055 #endif
00056
00057 #ifndef IOWRT
00058 #define IOWRT = _IO_CURRENTLY_PUTTING
00059 #endif
00060
00061 #else
00062
00063 #ifndef FILE_FLAG
00064 #define FILE_FLAG(__f) (__f)->_flag
00065 #endif
00066
00067 #endif
00068
00069 #endif
00070
00071 #define FLUSH_ERROR(_ERROR_) { \
00072 if (statp) \
00073 *rstat = _ERROR_; \
00074 else \
00075 _ferr(&cfs, _ERROR_); \
00076 }
00077
00078 #define FLUSH_ERROR1(_ERROR_, _DATA_) { \
00079 if (statp) { \
00080 *rstat = _ERROR_; \
00081 goto flush_done; \
00082 } \
00083 else \
00084 _ferr(&cfs, _ERROR_, _DATA_);\
00085 }
00086
00087
00088
00089
00090
00091
00092 #define FLUSH_OK 0
00093 #define NOT_SUPPORTED (-1)
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 void
00105 #ifdef _UNICOS
00106 FLUSH(
00107 #elif defined(__mips) || defined(_LITTLE_ENDIAN)
00108 __flush_f90(
00109 #else
00110 flush_(
00111 #endif
00112 const unum_t *unump,
00113 _f_int *istat
00114 )
00115 {
00116 register short statp;
00117 int *rstat;
00118 int errn;
00119 register unum_t unum;
00120 unit *cup;
00121 struct fiostate cfs;
00122
00123 #ifdef KEY
00124
00125 if (0 == unump) {
00126
00127
00128 unit *uptr;
00129 for (uptr = _get_next_unit(NULL, 0, 0); uptr != NULL;
00130 uptr = _get_next_unit(uptr, 0, 0)) {
00131 unum_t unum = uptr->uid;
00132
00133 if (OPEN_UPTR(uptr) && uptr->ufs != FS_AUX) {
00134 __flush_f90(&unum, 0);
00135 }
00136 }
00137 return;
00138 }
00139 #endif
00140
00141 unum = *unump;
00142 statp =
00143 #ifdef _UNICOS
00144 (_numargs() >= 2)
00145 #else
00146 (istat != NULL)
00147 #endif
00148 ? 1 : 0;
00149
00150 rstat = statp ? istat : &errn;
00151 *rstat = FLUSH_OK;
00152
00153 STMT_BEGIN(unum, 0, T_FLUSH, NULL, &cfs, cup);
00154
00155 if (cup == NULL) {
00156 if (!GOOD_UNUM(unum))
00157 errn = FEIVUNIT;
00158 else {
00159 #ifdef KEY
00160
00161
00162
00163
00164
00165 goto flush_done;
00166 #else
00167
00168
00169
00170 if (RSVD_UNUM(unum))
00171 goto flush_done;
00172
00173 errn = FENOTOPN;
00174 #endif
00175 }
00176
00177 FLUSH_ERROR1(errn, unum);
00178 }
00179
00180 if (cup->useq == 0) {
00181 *rstat = NOT_SUPPORTED;
00182 goto flush_done;
00183 }
00184
00185 if ( ! cup->uwrt)
00186 goto flush_done;
00187
00188 switch (cup->ufs) {
00189 struct ffsw fstat;
00190
00191 case FS_FDC:
00192 if (__ffflush(cup->ufp.fdc, &fstat) < 0)
00193 FLUSH_ERROR(fstat.sw_error);
00194 break;
00195
00196 case FS_TEXT:
00197 #ifdef KEY
00198 {
00199 # if defined(BUILD_OS_DARWIN)
00200 int writeable = cup->ufp.std->_flags & (__SWR | __SRW);
00201 # else
00202 int writeable = !(cup->ufp.std->_flags & _IO_NO_WRITES);
00203 # endif
00204 if (writeable)
00205 if (fflush(cup->ufp.std) == EOF)
00206 FLUSH_ERROR(errno);
00207 }
00208 break;
00209 #endif
00210 case STD:
00211 #if !defined(_LITTLE_ENDIAN)
00212 if (FILE_FLAG(cup->ufp.std) & _IOWRT)
00213 if (fflush(cup->ufp.std) == EOF)
00214 FLUSH_ERROR(errno);
00215 #endif
00216 break;
00217
00218 default:
00219 *rstat = NOT_SUPPORTED;
00220 }
00221
00222 flush_done:
00223 STMT_END(cup, T_FLUSH, NULL, &cfs);
00224
00225 return;
00226 }
00227
00228 #if defined(_LITTLE_ENDIAN)
00229 #ifdef KEY
00230 #pragma weak flush_
00231
00232 void
00233 flush_(_f_int4 *unump) {
00234 unum_t unum = (0 == unump) ? 0 : *unump;
00235 __flush_f90((0 == unump) ? 0 : (&unum), 0);
00236 }
00237 #else
00238 void
00239 flush_( const unum_t *unump)
00240 {
00241 _f_int istt;
00242 __flush_f90(unump, &istt);
00243 return;
00244 }
00245 #endif
00246 #endif
00247
00248 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00249
00250
00251
00252
00253
00254
00255 void
00256 flush_stat_8_(
00257 _f_int8 *unump,
00258 _f_int8 *istat)
00259 {
00260 unum_t unum;
00261 _f_int istt;
00262
00263 unum = *unump;
00264 __flush_f90(&unum, &istt);
00265 *istat = (_f_int8) istt;
00266
00267 return;
00268 }
00269
00270 void
00271 flush_stat_4_(
00272 unum_t *unump,
00273 _f_int *istat)
00274 {
00275 __flush_f90(unump, istat);
00276
00277 return;
00278 }
00279
00280 void
00281 flush_stat_4_8_(
00282 _f_int *unump,
00283 _f_int8 *istat)
00284 {
00285 unum_t unum;
00286 _f_int istt;
00287
00288 unum = *unump;
00289 __flush_f90(&unum, &istt);
00290 *istat = (_f_int8) istt;
00291 return;
00292 }
00293
00294 void
00295 flush_stat_8_4_(
00296 _f_int8 *unump,
00297 _f_int *istat)
00298 {
00299 unum_t unum;
00300
00301 unum = *unump;
00302 __flush_f90(&unum, istat);
00303 return;
00304 }
00305
00306 void
00307 flush_f90_4_( _f_int *unump)
00308 {
00309 unum_t unum;
00310 _f_int istat;
00311
00312 unum = *unump;
00313 __flush_f90(&unum, &istat);
00314 return;
00315 }
00316
00317 void
00318 flush_f90_8_( _f_int8 *unump)
00319 {
00320 _f_int istat;
00321 unum_t unum;
00322
00323 unum = *unump;
00324 __flush_f90(&unum, &istat);
00325 return;
00326 }
00327
00328 #ifdef KEY
00329
00330 void
00331 pathf90_flush(_f_int *unump, _f_int *istat)
00332 {
00333 unum_t unum = (0 == unump) ? 0 : *unump;
00334 __flush_f90((0 == unump) ? 0 : (&unum), istat);
00335 }
00336
00337 #endif
00338
00339 #endif