fread.c 609 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * pANS stdio -- fread
  3. */
  4. #include "iolib.h"
  5. #define BIGN (BUFSIZ/2)
  6. long fread(void *p, long recl, long nrec, FILE *f){
  7. char *s;
  8. int n, d, c;
  9. s=(char *)p;
  10. n=recl*nrec;
  11. while(n>0){
  12. d=f->wp-f->rp;
  13. if(d>0){
  14. if(d>n)
  15. d=n;
  16. memmove(s, f->rp, d);
  17. f->rp+=d;
  18. }else{
  19. if(n >= BIGN && f->state==RD && !(f->flags&STRING) && f->buf!=f->unbuf){
  20. d=read(f->fd, s, n);
  21. if(d<=0){
  22. f->state=(d==0)?END:ERR;
  23. goto ret;
  24. }
  25. }else{
  26. c=_IO_getc(f);
  27. if(c==EOF)
  28. goto ret;
  29. *s=c;
  30. d=1;
  31. }
  32. }
  33. s+=d;
  34. n-=d;
  35. }
  36. ret:
  37. return (s-(char *)p)/(recl?recl:1);
  38. }