fread.c 662 B

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