Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/stdio/fgets.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
#include "stdhdr.h"
25
26
extern char*
27
_stdgets(Sfio_t* f, char* us, int n, int isgets)
28
{
29
int p;
30
unsigned char* is;
31
unsigned char* ps;
32
33
if(n <= 0 || !us || (f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0))
34
return NIL(char*);
35
36
SFLOCK(f,0);
37
38
n -= 1;
39
is = (uchar*)us;
40
41
while(n)
42
{ /* peek the read buffer for data */
43
if((p = f->endb - (ps = f->next)) <= 0 )
44
{ f->getr = '\n';
45
f->mode |= SF_RC;
46
if(SFRPEEK(f,ps,p) <= 0)
47
break;
48
}
49
50
if(p > n)
51
p = n;
52
53
#if _lib_memccpy
54
if((ps = (uchar*)memccpy((char*)is,(char*)ps,'\n',p)) != NIL(uchar*))
55
p = ps-is;
56
is += p;
57
ps = f->next+p;
58
#else
59
if(!(f->flags&(SF_BOTH|SF_MALLOC)))
60
{ while(p-- && (*is++ = *ps++) != '\n')
61
;
62
p = ps-f->next;
63
}
64
else
65
{ reg int c = ps[p-1];
66
if(c != '\n')
67
ps[p-1] = '\n';
68
while((*is++ = *ps++) != '\n')
69
;
70
if(c != '\n')
71
{ f->next[p-1] = c;
72
if((ps-f->next) >= p)
73
is[-1] = c;
74
}
75
}
76
#endif
77
78
/* gobble up read data and continue */
79
f->next = ps;
80
if(is[-1] == '\n')
81
break;
82
else if(n > 0)
83
n -= p;
84
}
85
86
if((_Sfi = is - ((uchar*)us)) <= 0)
87
us = NIL(char*);
88
else if(isgets && is[-1] == '\n')
89
{ is[-1] = '\0';
90
_Sfi -= 1;
91
}
92
else *is = '\0';
93
94
SFOPEN(f,0);
95
return us;
96
}
97
98
char*
99
fgets(char* s, int n, Sfio_t* f)
100
{
101
STDIO_PTR(f, "fgets", char*, (char*, int, Sfio_t*), (s, n, f))
102
103
return _stdgets(f, s, n, 0);
104
}
105
106
char*
107
gets(char* s)
108
{
109
return _stdgets(sfstdin, s, BUFSIZ, 1);
110
}
111
112