ReactOS  0.4.12-dev-90-g2e2e63e
fgetline.c
Go to the documentation of this file.
1 /* @(#)fgetline.c 1.14 16/11/07 Copyright 1986, 1996-2016 J. Schilling */
2 /*
3  * Copyright (c) 1986, 1996-2016 J. Schilling
4  *
5  * This is an interface that exists in the public since 1982.
6  * The POSIX.1-2008 standard did ignore POSIX rules not to
7  * redefine existing public interfaces and redefined the interfaces
8  * forcing us to add a js_*() prefix to the original functions.
9  */
10 /*
11  * The contents of this file are subject to the terms of the
12  * Common Development and Distribution License, Version 1.0 only
13  * (the "License"). You may not use this file except in compliance
14  * with the License.
15  *
16  * See the file CDDL.Schily.txt in this distribution for details.
17  * A copy of the CDDL is also available via the Internet at
18  * http://www.opensource.org/licenses/cddl1.txt
19  *
20  * When distributing Covered Code, include this CDDL HEADER in each
21  * file and include the License file CDDL.Schily.txt from this distribution.
22  */
23 
24 #define fgetline __no__fgetline__
25 #define getline __no__getline__
26 
27 #define FAST_GETC_PUTC /* Will be reset if not possible */
28 #include "schilyio.h"
29 
30 #ifdef LIB_SHEDIT
31 #undef HAVE_USG_STDIO
32 #undef FAST_GETC_PUTC
33 #endif
34 
35 #ifndef NO_GETLINE_COMPAT /* Define to disable backward compatibility */
36 #undef fgetline
37 #undef getline
38 #ifdef HAVE_PRAGMA_WEAK
39 #pragma weak fgetline = js_fgetline
40 #pragma weak getline = js_getline
41 #else
42 
43 EXPORT int fgetline __PR((FILE *, char *, int));
44 EXPORT int getline __PR((char *, int));
45 
46 EXPORT int
48  FILE *f;
49  char *buf;
50  int len;
51 {
52  return (js_fgetline(f, buf, len));
53 }
54 
55 EXPORT int
56 getline(buf, len)
57  char *buf;
58  int len;
59 {
60  return (js_fgetline(stdin, buf, len));
61 }
62 #endif
63 #endif
64 
65 #if !defined(getc) && defined(USE_FGETS_FOR_FGETLINE)
66 #include <schily/string.h>
67 
68 /*
69  * Warning: this prevents us from being able to have embedded null chars.
70  */
71 EXPORT int
72 js_fgetline(f, buf, len)
73  register FILE *f;
74  char *buf;
75  register int len;
76 {
77  char *bp = fgets(buf, len, f);
78 
79  if (bp) {
80  len = strlen(bp);
81 
82  if (len > 0) {
83  if (bp[len-1] == '\n')
84  bp[--len] = '\0';
85  }
86  return (len);
87  }
88  buf[0] = '\0';
89  return (-1);
90 }
91 
92 #else
93 EXPORT int
94 js_fgetline(f, buf, len)
95  register FILE *f;
96  char *buf;
97  register int len;
98 {
99  register char *bp = buf;
100 #if defined(HAVE_USG_STDIO) || defined(FAST_GETC_PUTC)
101  register char *p;
102 #else
103  register int nl = '\n';
104  register int c = '\0';
105 #endif
106 
107  down2(f, _IOREAD, _IORW);
108 
109  if (len <= 0)
110  return (0);
111 
112  *bp = '\0';
113  for (;;) {
114 #if defined(HAVE_USG_STDIO) || defined(FAST_GETC_PUTC)
115  size_t n;
116 
117  if ((__c f)->_cnt <= 0) {
118  if (usg_filbuf(f) == EOF) {
119  /*
120  * If buffer is empty and we hit EOF, return EOF
121  */
122  if (bp == buf)
123  return (EOF);
124  break;
125  }
126  (__c f)->_cnt++;
127  (__c f)->_ptr--;
128  }
129 
130  n = len;
131  if (n > (__c f)->_cnt)
132  n = (__c f)->_cnt;
133  p = movecbytes((__c f)->_ptr, bp, '\n', n);
134  if (p) {
135  n = p - bp;
136  }
137  (__c f)->_ptr += n;
138  (__c f)->_cnt -= n;
139  bp += n;
140  len -= n;
141  if (p != NULL) {
142  bp--; /* Remove '\n' */
143  break;
144  }
145 #else
146  if ((c = getc(f)) < 0) {
147  /*
148  * If buffer is empty and we hit EOF, return EOF
149  */
150  if (bp == buf)
151  return (c);
152  break;
153  }
154  if (c == nl)
155  break;
156  if (--len > 0) {
157  *bp++ = (char)c;
158  } else {
159 #ifdef __never__
160  /*
161  * Read up to end of line
162  */
163  while ((c = getc(f)) >= 0 && c != nl)
164  /* LINTED */
165  ;
166 #endif
167  break;
168  }
169 #endif
170  }
171  *bp = '\0';
172 
173  return (bp - buf);
174 }
175 #endif
176 
177 EXPORT int
178 js_getline(buf, len)
179  char *buf;
180  int len;
181 {
182  return (js_fgetline(stdin, buf, len));
183 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define getline
Definition: fgetline.c:25
_Check_return_ _CRTIMP int __cdecl getc(_Inout_ FILE *_File)
FILE * stdin
EXPORT int fgetline __PR((FILE *, char *, int))
#define __c
Definition: schilyio.h:209
EXPORT int js_fgetline(register FILE *f, char *buf, register int len)
Definition: fgetline.c:94
GLuint n
Definition: s_context.h:57
#define _IOREAD
Definition: stdio.h:125
smooth NULL
Definition: ftsmooth.c:416
unsigned char
Definition: typeof.h:27
#define fgetline
Definition: fgetline.c:24
GLfloat f
Definition: glext.h:7540
const GLubyte * c
Definition: glext.h:8905
GLenum GLsizei len
Definition: glext.h:6722
#define down2(f, fl1, fl2)
Definition: schilyio.h:218
_Check_return_opt_ _CRTIMP char *__cdecl fgets(_Out_writes_z_(_MaxCount) char *_Buf, _In_ int _MaxCount, _Inout_ FILE *_File)
#define f
Definition: ke_i.h:83
#define EOF
Definition: stdio.h:24
GLfloat GLfloat p
Definition: glext.h:8902
#define _IORW
Definition: stdio.h:136
EXPORT int js_getline(char *buf, int len)
Definition: fgetline.c:178