fileread.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)fileread.c 1.8 97/04/20 Copyright 1986 J. Schilling */
  2. /*
  3.  * Copyright (c) 1986 J. Schilling
  4.  */
  5. /*
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2, or (at your option)
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  * 
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; see the file COPYING.  If not, write to
  18.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20. #include <stdio.h>
  21. #include <errno.h>
  22. #include "io.h"
  23. static char _readerr[] = "file_read_err";
  24. #ifdef HAVE_USG_STDIO
  25. int fileread(f, buf, len)
  26. register FILE *f;
  27. void *buf;
  28. int len;
  29. {
  30. int cnt;
  31. register int n;
  32. down2(f, _IOREAD, _IORW);
  33. if (f->_flag & _IONBF){
  34. cnt = _niread (fileno(f), buf, len);
  35. if (cnt < 0) {
  36. f->_flag |= _IOERR;
  37. if (!(my_flag(f) & _IONORAISE))
  38. raisecond(_readerr, 0L);
  39. }
  40. if (cnt == 0 && len)
  41. f->_flag |= _IOEOF;
  42. return cnt;
  43. }
  44. cnt = 0;
  45. while (len > 0) {
  46. if (f->_cnt <= 0){
  47. if (_filbuf(f) == EOF)
  48. break;
  49. f->_cnt++;
  50. f->_ptr--;
  51. }
  52. n = f->_cnt >= len ? len : f->_cnt;
  53. buf = (void *)movebytes (f->_ptr, buf, n);
  54. f->_ptr += n;
  55. f->_cnt -= n;
  56. cnt += n;
  57. len -= n;
  58. }
  59. if (!ferror(f))
  60. return cnt;
  61. if (!(my_flag(f) & _IONORAISE))
  62. raisecond(_readerr, 0L);
  63. return -1;
  64. }
  65. #else
  66. int fileread(f, buf, len)
  67. register FILE *f;
  68. void *buf;
  69. int len;
  70. {
  71. int cnt;
  72. down2(f, _IOREAD, _IORW);
  73. if (my_flag(f) & _IOUNBUF)
  74. return _niread(fileno(f), buf, len);
  75. cnt = fread(buf, 1, len, f);
  76. if (!ferror(f))
  77. return cnt;
  78. if (!(my_flag(f) & _IONORAISE))
  79. raisecond(_readerr, 0L);
  80. return -1;
  81. }
  82. #endif /* HAVE_USG_STDIO */