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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)filewrite.c 1.9 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 "io.h"
  22. static char _writeerr[] = "file_write_err";
  23. #ifdef HAVE_USG_STDIO
  24. int filewrite (f, vbuf, len)
  25. register FILE *f;
  26. void *vbuf;
  27. int len;
  28. {
  29. register int n;
  30. int cnt;
  31. char *buf = vbuf;
  32. down2(f, _IOWRT, _IORW);
  33. if (f->_flag & _IONBF){
  34. cnt = write (fileno(f), buf, len);
  35. if (cnt < 0){
  36. f->_flag |= _IOERR;
  37. if (!(my_flag(f) & _IONORAISE))
  38. raisecond(_writeerr, 0L);
  39. }
  40. return cnt;
  41. }
  42. cnt = 0;
  43. while (len > 0) {
  44. if (f->_cnt <= 0){
  45. if (_flsbuf((unsigned char) *buf++, f) == EOF)
  46. break;
  47. cnt++;
  48. if (--len == 0)
  49. break;
  50. }
  51. if ((n = f->_cnt >= len ? len : f->_cnt) > 0) {
  52. f->_ptr = (unsigned char *)movebytes (buf, f->_ptr, n);
  53. buf += n;
  54. f->_cnt -= n;
  55. cnt += n;
  56. len -= n;
  57. }
  58. }
  59. if (!ferror(f))
  60. return cnt;
  61. if (!(my_flag(f) & _IONORAISE))
  62. raisecond(_writeerr, 0L);
  63. return -1;
  64. }
  65. #else
  66. int filewrite (f, vbuf, len)
  67. register FILE *f;
  68. void *vbuf;
  69. int len;
  70. {
  71. int cnt;
  72. char *buf = vbuf;
  73. down2(f, _IOWRT, _IORW);
  74. if (my_flag(f) & _IOUNBUF)
  75. return write(fileno(f), buf, len);
  76. cnt = fwrite(buf, 1, len, f);
  77. if (!ferror(f))
  78. return cnt;
  79. if (!(my_flag(f) & _IONORAISE))
  80. raisecond(_writeerr, 0L);
  81. return -1;
  82. }
  83. #endif /* HAVE_USG_STDIO */