Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmcurl/lib/curl_get_line.c
3153 views
1
/***************************************************************************
2
* _ _ ____ _
3
* Project ___| | | | _ \| |
4
* / __| | | | |_) | |
5
* | (__| |_| | _ <| |___
6
* \___|\___/|_| \_\_____|
7
*
8
* Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9
*
10
* This software is licensed as described in the file COPYING, which
11
* you should have received as part of this distribution. The terms
12
* are also available at https://curl.se/docs/copyright.html.
13
*
14
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
15
* copies of the Software, and permit persons to whom the Software is
16
* furnished to do so, under the terms of the COPYING file.
17
*
18
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
* KIND, either express or implied.
20
*
21
* SPDX-License-Identifier: curl
22
*
23
***************************************************************************/
24
25
#include "curl_setup.h"
26
27
#if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) || \
28
!defined(CURL_DISABLE_HSTS) || !defined(CURL_DISABLE_NETRC)
29
30
#include "curl_get_line.h"
31
#include "curl_memory.h"
32
/* The last #include file should be: */
33
#include "memdebug.h"
34
35
static int appendnl(struct dynbuf *buf)
36
{
37
CURLcode result = curlx_dyn_addn(buf, "\n", 1);
38
if(result)
39
/* too long line or out of memory */
40
return 0; /* error */
41
return 1; /* all good */
42
}
43
44
/*
45
* Curl_get_line() makes sure to only return complete whole lines that end
46
* newlines.
47
*/
48
int Curl_get_line(struct dynbuf *buf, FILE *input)
49
{
50
CURLcode result;
51
char buffer[128];
52
curlx_dyn_reset(buf);
53
while(1) {
54
char *b = fgets(buffer, sizeof(buffer), input);
55
size_t rlen;
56
57
if(b) {
58
rlen = strlen(b);
59
60
if(!rlen)
61
break;
62
63
result = curlx_dyn_addn(buf, b, rlen);
64
if(result)
65
/* too long line or out of memory */
66
return 0; /* error */
67
68
else if(b[rlen-1] == '\n')
69
/* end of the line */
70
return 1; /* all good */
71
72
else if(feof(input))
73
/* append a newline */
74
return appendnl(buf);
75
}
76
else {
77
rlen = curlx_dyn_len(buf);
78
if(rlen) {
79
b = curlx_dyn_ptr(buf);
80
81
if(b[rlen-1] != '\n')
82
/* append a newline */
83
return appendnl(buf);
84
85
return 1; /* all good */
86
}
87
else
88
break;
89
}
90
}
91
return 0;
92
}
93
94
#endif /* if not disabled */
95
96