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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)fgetline.c 1.3 96/05/09 Copyright 1986 J. Schilling */
  2. /*
  3.  * Copyright (c) 1986 J. Schilling
  4.  */
  5. /* This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2, or (at your option)
  8.  * any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; see the file COPYING.  If not, write to
  17.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  */
  19. #include <stdio.h>
  20. #include "io.h"
  21. /*
  22.  * XXX should we check if HAVE_USG_STDIO is defined and
  23.  * XXX use something line memccpy to speed things up ???
  24.  */
  25. int fgetline(f, buf, len)
  26. register FILE *f;
  27. char *buf;
  28. register int len;
  29. {
  30. register int c = '';
  31. register char *bp = buf;
  32. register int nl = 'n';
  33. down2(f, _IOREAD, _IORW);
  34. for(;;) {
  35. if((c = getc(f)) < 0)
  36. break;
  37. if(c == nl)
  38. break;
  39. if (--len > 0) {
  40. *bp++ = c;
  41. } else {
  42. /*
  43.  * Read up to end of line
  44.  */
  45. while ((c = getc(f)) >= 0 && c != nl)
  46. ;
  47. break;
  48. }
  49. }
  50. *bp = '';
  51. /*
  52.  * If buffer is empty and we hit EOF, return EOF
  53.  */
  54. if(c < 0 && bp == buf)
  55. return (c);
  56. return (bp - buf);
  57. }
  58. int getline(buf, len)
  59. char *buf;
  60. int len;
  61. {
  62. return (fgetline(stdin, buf, len));
  63. }