readc.c
Go to the documentation of this file.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/readc.c 92.3 06/21/99 10:37:55"
00039
00040
00041
00042
00043
00044 #include <errno.h>
00045 #include <foreign.h>
00046 #include <liberrno.h>
00047 #include "fio.h"
00048
00049 #define BLANK (long) ' '
00050
00051 #define ERET(err) { \
00052 chars = 0; \
00053 errn = err; \
00054 goto done; \
00055 }
00056
00057 static void __READC();
00058
00059
00060
00061
00062
00063 void
00064 READC(
00065 _f_int *unump,
00066 _f_int *uda,
00067 _f_int *charsp,
00068 _f_int *status )
00069 {
00070 __READC(FULL, unump, uda, charsp, status);
00071
00072 return;
00073 }
00074
00075
00076
00077
00078
00079 void
00080 READCP(
00081 _f_int *unump,
00082 _f_int *uda,
00083 _f_int *charsp,
00084 _f_int *status )
00085 {
00086 __READC(PARTIAL, unump, uda, charsp, status);
00087
00088 return;
00089 }
00090
00091
00092
00093
00094
00095
00096 static void
00097 __READC(
00098 int fulp,
00099 _f_int *unump,
00100 _f_int *uda,
00101 _f_int *charsp,
00102 _f_int *status)
00103 {
00104 register int ret;
00105 register int errn;
00106 long rstat;
00107 long chars;
00108 unum_t unum;
00109 unit *cup;
00110 struct fiostate cfs;
00111
00112 chars = *charsp;
00113 unum = *unump;
00114 errn = 0;
00115
00116 STMT_BEGIN(unum, 0, T_RSF, NULL, &cfs, cup);
00117
00118
00119
00120 if (cup == NULL) {
00121 int ostat;
00122
00123 cup = _imp_open(&cfs, SEQ, FMT, unum, 1, &ostat);
00124
00125 if (cup == NULL)
00126 ERET(ostat);
00127 }
00128
00129 if (!cup->ok_rd_seq_fmt) {
00130 errn = _get_mismatch_error(1, T_RSF, cup, &cfs);
00131 ERET(errn);
00132 }
00133
00134 cup->uwrt = 0;
00135
00136 ret = _frch(cup, (long *) uda, chars, fulp, &rstat );
00137
00138 if ( ret == IOERR ) {
00139 if (errno == FETAPUTE) {
00140
00141
00142 errn = 4;
00143 }
00144 else if (errno > 5) {
00145 chars = 0;
00146 errn = errno;
00147 }
00148 else{
00149 chars = 0;
00150
00151
00152
00153 switch (errno) {
00154 case 1:
00155 errn = FEKLUDG1;
00156 break;
00157 case 2:
00158 errn = FEKLUDG2;
00159 break;
00160 case 3:
00161 errn = FEKLUDG3;
00162 break;
00163 case 4:
00164 errn = FEKLUDG4;
00165 break;
00166 }
00167 }
00168 goto done;
00169 }
00170
00171 if (ret < chars)
00172 (void) _memwset(&uda[ret], BLANK, chars - ret);
00173
00174 if ( rstat == EOR ) {
00175 cup->uend = BEFORE_ENDFILE;
00176 errn = 0;
00177 if ( ret == 0 )
00178 errn = 1;
00179 chars = ret;
00180 }
00181 else if ( rstat == CNT ) {
00182 cup->uend = BEFORE_ENDFILE;
00183 errn = -1;
00184 chars = ret;
00185 }
00186 else if (rstat == EOD) {
00187 errn = 3;
00188 chars = 0;
00189 }
00190 else {
00191 cup->uend = PHYSICAL_ENDFILE;
00192 errn = 2;
00193 chars = 0;
00194 }
00195
00196 done:
00197
00198 *charsp = chars;
00199 *status = errn;
00200
00201 STMT_END(cup, TF_READ, NULL, &cfs);
00202
00203 return;
00204 }