1 /* 2 char id_iio[] = "@(#)iio.c 1.6"; 3 * 4 * internal (character array) i/o 5 */ 6 7 #include "fio.h" 8 #include "lio.h" 9 10 extern int rd_ed(),rd_ned(),w_ed(),w_ned(); 11 extern int l_read(),l_write(); 12 int z_wnew(),z_rnew(),z_tab(); 13 14 z_getc() 15 { 16 if(icptr >= icend && !recpos) /* new rec beyond eof */ 17 { leof = EOF; 18 return(EOF); 19 } 20 if(recpos++ < svic->icirlen) return(*icptr++); 21 if(formatted == LISTDIRECTED) return(EOF); 22 return(' '); 23 } 24 25 z_putc(c) char c; 26 { 27 if(icptr < icend) 28 { if(c=='\n') return(z_wnew()); 29 if(recpos++ < svic->icirlen) 30 { *icptr++ = c; 31 return(OK); 32 } 33 else err(errflag,F_EREREC,"iio") 34 } 35 leof = EOF; 36 #ifndef KOSHER 37 err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */ 38 #endif 39 #ifdef KOSHER 40 err(errflag,F_EREREC,"iio") 41 #endif 42 } 43 44 z_ungetc(ch,cf) char ch; 45 { if(ch==EOF || --recpos >= svic->icirlen) return(OK); 46 if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio") 47 *icptr = ch; 48 return(OK); 49 } 50 51 s_rsfi(a) icilist *a; 52 { 53 reading = YES; 54 doed=rd_ed; 55 doned=rd_ned; 56 getn=z_getc; 57 doend = donewrec = z_rnew; 58 dorevert = z_rnew; 59 dotab = z_tab; 60 return(c_si(a)); 61 } 62 63 s_wsfi(a) icilist *a; 64 { 65 reading = NO; 66 doed=w_ed; 67 doned=w_ned; 68 putn=z_putc; 69 doend = donewrec = z_wnew; 70 dorevert = z_wnew; 71 dotab = z_tab; 72 return(c_si(a)); 73 } 74 75 s_rdfi(a) icilist *a; 76 { 77 reading = YES; 78 doed = rd_ed; 79 doned = rd_ned; 80 getn = z_getc; 81 donewrec = z_rnew; 82 dorevert = doend = z_rnew; 83 dotab = z_tab; 84 return(c_di(a)); 85 } 86 87 s_wdfi(a) icilist *a; 88 { 89 reading = NO; 90 doed = w_ed; 91 doned = w_ned; 92 putn = z_putc; 93 donewrec = z_wnew; 94 dorevert = doend = z_wnew; 95 dotab = z_tab; 96 return(c_di(a)); 97 } 98 99 c_fi(a) icilist *a; 100 { 101 fmtbuf=a->icifmt; 102 formatted = FORMATTED; 103 external = NO; 104 cblank=cplus=NO; 105 scale=cursor=0; 106 radix = 10; 107 signit = YES; 108 elist = YES; 109 svic = a; 110 recpos=reclen=0; 111 icend = a->iciunit + a->icirnum*a->icirlen; 112 errflag = a->icierr; 113 endflag = a->iciend; 114 if(pars_f()) err(errflag,F_ERFMT,"ifio") 115 fmt_bg(); 116 return(OK); 117 } 118 119 c_si(a) icilist *a; 120 { 121 sequential = YES; 122 recnum = 0; 123 icptr = a->iciunit; 124 return(c_fi(a)); 125 } 126 127 c_di(a) icilist *a; 128 { 129 sequential = NO; 130 recnum = a->icirec - 1; 131 icptr = a->iciunit + recnum*a->icirlen; 132 return(c_fi(a)); 133 } 134 135 z_rnew() 136 { 137 icptr = svic->iciunit + (++recnum)*svic->icirlen; 138 recpos = reclen = cursor = 0; 139 return(OK); 140 } 141 142 z_wnew() 143 { 144 if(reclen > recpos) 145 { icptr += (reclen - recpos); 146 recpos = reclen; 147 } 148 while(recpos < svic->icirlen) (*putn)(' '); 149 recpos = reclen = cursor = 0; 150 recnum++; 151 return(OK); 152 } 153 154 z_tab() 155 { int n; 156 if(reclen < recpos) reclen = recpos; 157 if((recpos + cursor) < 0) cursor = -recpos; /* to BOR */ 158 n = reclen - recpos; 159 if(!reading && (cursor-n) > 0) 160 { icptr += n; 161 recpos = reclen; 162 cursor -= n; 163 while(cursor--) if(n=(*putn)(' ')) return(n); 164 } 165 else 166 { icptr += cursor; 167 recpos += cursor; 168 } 169 return(cursor=0); 170 } 171 172 e_rsfi() 173 { int n; 174 n = en_fio(); 175 fmtbuf = NULL; 176 return(n); 177 } 178 179 e_wsfi() 180 { 181 return(e_rsfi()); 182 } 183 184 e_rdfi() 185 { 186 return(e_rsfi()); 187 } 188 189 e_wdfi() 190 { 191 return(e_wsfi()); 192 } 193 194 c_li(a) icilist *a; 195 { 196 fmtbuf="int list io"; 197 sequential = formatted = LISTDIRECTED; 198 external = NO; 199 elist = YES; 200 svic = a; 201 recnum = recpos = 0; 202 cplus = cblank = NO; 203 icptr = a->iciunit; 204 icend = icptr + a->icirlen * a->icirnum; 205 errflag = a->icierr; 206 endflag = a->iciend; 207 leof = NO; 208 return(OK); 209 } 210 211 s_rsli(a) icilist *a; 212 { 213 reading = YES; 214 lioproc = l_read; 215 getn = z_getc; 216 ungetn = z_ungetc; 217 l_first = YES; 218 lcount = 0; 219 lquit = NO; 220 return(c_li(a)); 221 } 222 223 s_wsli(a) icilist *a; 224 { 225 reading = NO; 226 putn = z_putc; 227 lioproc = l_write; 228 line_len = a->icirlen; 229 return(c_li(a)); 230 } 231 232 e_rsli() 233 { fmtbuf = NULL; 234 return(OK); 235 } 236 237 e_wsli() 238 { fmtbuf = NULL; 239 reclen = recpos; 240 return(z_wnew()); 241 } 242 243 ftnint 244 iiorec_() 245 { return(recnum); } 246 247 ftnint 248 iiopos_() 249 { return(recpos); } 250