115 lines
2.3 KiB
C
115 lines
2.3 KiB
C
/*
|
|
* This file is part of the UCB release of Plan 9. It is subject to the license
|
|
* terms in the LICENSE file found in the top-level directory of this
|
|
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
|
* part of the UCB release of Plan 9, including this file, may be copied,
|
|
* modified, propagated, or distributed except according to the terms contained
|
|
* in the LICENSE file.
|
|
*/
|
|
|
|
/*
|
|
* pANS stdio -- _IO_putc, _IO_cleanup
|
|
*/
|
|
#include "iolib.h"
|
|
void _IO_cleanup(void){
|
|
fflush(NULL);
|
|
}
|
|
/*
|
|
* Look this over for simplification
|
|
*/
|
|
int _IO_putc(int c, FILE *f){
|
|
int cnt;
|
|
static int first=1;
|
|
switch(f->state){
|
|
case RD:
|
|
f->state=ERR;
|
|
case ERR:
|
|
case CLOSED:
|
|
return EOF;
|
|
case OPEN:
|
|
_IO_setvbuf(f);
|
|
/* fall through */
|
|
case RDWR:
|
|
case END:
|
|
f->rp=f->buf+f->bufl;
|
|
if(f->flags&LINEBUF){
|
|
f->wp=f->rp;
|
|
f->lp=f->buf;
|
|
}
|
|
else
|
|
f->wp=f->buf;
|
|
break;
|
|
}
|
|
if(first){
|
|
atexit(_IO_cleanup);
|
|
first=0;
|
|
}
|
|
if(f->flags&STRING){
|
|
f->rp=f->buf+f->bufl;
|
|
if(f->wp==f->rp){
|
|
if(f->flags&BALLOC)
|
|
f->buf=realloc(f->buf, f->bufl+BUFSIZ);
|
|
else{
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
if(f->buf==NULL){
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
f->rp=f->buf+f->bufl;
|
|
f->bufl+=BUFSIZ;
|
|
}
|
|
*f->wp++=c;
|
|
}
|
|
else if(f->flags&LINEBUF){
|
|
if(f->lp==f->rp){
|
|
cnt=f->lp-f->buf;
|
|
if(f->flags&APPEND) sys_seek(f->fd, 0L, 2);
|
|
if(cnt!=0 && jehanne_write(f->fd, f->buf, cnt)!=cnt){
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
f->lp=f->buf;
|
|
}
|
|
*f->lp++=c;
|
|
if(c=='\n'){
|
|
cnt=f->lp-f->buf;
|
|
if(f->flags&APPEND) sys_seek(f->fd, 0L, 2);
|
|
if(cnt!=0 && jehanne_write(f->fd, f->buf, cnt)!=cnt){
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
f->lp=f->buf;
|
|
}
|
|
}
|
|
else if(f->buf==f->unbuf){
|
|
f->unbuf[0]=c;
|
|
if(f->flags&APPEND) sys_seek(f->fd, 0L, 2);
|
|
if(jehanne_write(f->fd, f->buf, 1)!=1){
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
}
|
|
else{
|
|
if(f->wp==f->rp){
|
|
cnt=f->wp-f->buf;
|
|
if(f->flags&APPEND) sys_seek(f->fd, 0L, 2);
|
|
if(cnt!=0 && jehanne_write(f->fd, f->buf, cnt)!=cnt){
|
|
f->state=ERR;
|
|
return EOF;
|
|
}
|
|
f->wp=f->buf;
|
|
f->rp=f->buf+f->bufl;
|
|
}
|
|
*f->wp++=c;
|
|
}
|
|
f->state=WR;
|
|
/*
|
|
* Make sure EOF looks different from putc(-1)
|
|
* Should be able to cast to unsigned char, but
|
|
* there's a vc bug preventing that from working
|
|
*/
|
|
return c&0xff;
|
|
}
|