setvbuf.c 679 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. /*
  2. * pANS stdio -- setvbuf
  3. */
  4. #include "iolib.h"
  5. #include <stdlib.h>
  6. int setvbuf(FILE *f, char *buf, int mode, size_t size){
  7. if(f->state!=OPEN){
  8. f->state=ERR;
  9. return -1;
  10. }
  11. f->state=RDWR;
  12. switch(mode){
  13. case _IOLBF:
  14. f->flags|=LINEBUF;
  15. case _IOFBF:
  16. if(buf==0){
  17. buf=malloc(size);
  18. if(buf==0){
  19. f->state=ERR;
  20. return -1;
  21. }
  22. f->flags|=BALLOC;
  23. }
  24. f->bufl=size;
  25. break;
  26. case _IONBF:
  27. buf=f->unbuf;
  28. f->bufl=0;
  29. break;
  30. }
  31. f->rp=f->wp=f->lp=f->buf=buf;
  32. f->state=RDWR;
  33. return 0;
  34. }
  35. int _IO_setvbuf(FILE *f){
  36. if(f==stderr || (f==stdout && isatty(1)))
  37. return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
  38. return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
  39. }