1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)c_iio.c 5.2 07/30/85 7 */ 8 9 /* 10 * internal (character array) i/o: common portions 11 */ 12 13 #include "fio.h" 14 #include "lio.h" 15 16 LOCAL icilist *svic; /* active internal io list */ 17 LOCAL lio_nl; 18 19 int z_wnew(); 20 21 z_getc() 22 { 23 if(formatted == LISTDIRECTED ) 24 { 25 if( lio_nl == YES ) 26 { 27 recnum++; 28 recpos = 0; 29 } 30 else if (recpos == svic->icirlen) 31 { 32 lio_nl = YES; 33 return('\n'); 34 } 35 lio_nl = NO; 36 } 37 38 if(icptr >= icend && !recpos) /* new rec beyond eof */ 39 { leof = EOF; 40 return(EOF); 41 } 42 if(recpos++ < svic->icirlen) return(*icptr++); 43 return(' '); 44 } 45 46 z_putc(c) char c; 47 { 48 if(icptr < icend) 49 { if(c=='\n') return(z_wnew()); 50 if(recpos++ < svic->icirlen) 51 { *icptr++ = c; 52 return(OK); 53 } 54 else err(errflag,F_EREREC,"iio") 55 } 56 leof = EOF; 57 #ifndef KOSHER 58 err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */ 59 #endif 60 #ifdef KOSHER 61 err(errflag,F_EREREC,"iio") 62 #endif 63 } 64 65 z_ungetc(ch,cf) char ch; 66 { 67 if( lio_nl == YES ) 68 { 69 lio_nl = NO; 70 return(OK); 71 } 72 if(ch==EOF || --recpos >= svic->icirlen) return(OK); 73 if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio") 74 *icptr = ch; 75 return(OK); 76 } 77 78 LOCAL 79 c_fi(a) icilist *a; 80 { 81 fmtbuf=a->icifmt; 82 formatted = FORMATTED; 83 external = NO; 84 cblank=cplus=NO; 85 scale=cursor=0; 86 radix = 10; 87 signit = YES; 88 elist = YES; 89 svic = a; 90 recpos=reclen=0; 91 icend = a->iciunit + a->icirnum*a->icirlen; 92 errflag = a->icierr; 93 endflag = a->iciend; 94 return(OK); 95 } 96 97 c_si(a) icilist *a; 98 { 99 sequential = YES; 100 recnum = 0; 101 icptr = a->iciunit; 102 return(c_fi(a)); 103 } 104 105 c_di(a) icilist *a; 106 { 107 sequential = NO; 108 recnum = a->icirec - 1; 109 icptr = a->iciunit + recnum*a->icirlen; 110 return(c_fi(a)); 111 } 112 113 z_rnew() 114 { 115 icptr = svic->iciunit + (++recnum)*svic->icirlen; 116 recpos = reclen = cursor = 0; 117 return(OK); 118 } 119 120 z_wnew() 121 { 122 if(reclen > recpos) 123 { icptr += (reclen - recpos); 124 recpos = reclen; 125 } 126 while(recpos < svic->icirlen) (*putn)(' '); 127 recpos = reclen = cursor = 0; 128 recnum++; 129 return(OK); 130 } 131 132 z_tab() 133 { int n; 134 if(reclen < recpos) reclen = recpos; 135 if((recpos + cursor) < 0) cursor = -recpos; /* to BOR */ 136 n = reclen - recpos; 137 if(!reading && (cursor-n) > 0) 138 { icptr += n; 139 recpos = reclen; 140 cursor -= n; 141 while(cursor--) if(n=(*putn)(' ')) return(n); 142 } 143 else 144 { icptr += cursor; 145 recpos += cursor; 146 } 147 return(cursor=0); 148 } 149 150 c_li(a) icilist *a; 151 { 152 fmtbuf="int list io"; 153 sequential = YES; 154 formatted = LISTDIRECTED; 155 external = NO; 156 elist = YES; 157 svic = a; 158 recnum = recpos = 0; 159 cplus = cblank = NO; 160 lio_nl = NO; 161 icptr = a->iciunit; 162 icend = icptr + a->icirlen * a->icirnum; 163 errflag = a->icierr; 164 endflag = a->iciend; 165 leof = NO; 166 return(OK); 167 } 168