libc: Add getline() and getdelim()
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
apio 2023-05-20 15:36:30 +02:00
parent 5117b410db
commit 47d505dcbb
Signed by: apio
GPG Key ID: B8A7D06E42258954
5 changed files with 74 additions and 5 deletions

View File

@ -33,7 +33,7 @@ char* getpass()
return nullptr;
}
static char buf[1024];
static char buf[BUFSIZ];
char* rc = fgets(buf, sizeof(buf), stdin);
restore_terminal();

View File

@ -26,6 +26,8 @@ extern FILE* stderr;
#define stdout stdout
#define stderr stderr
#define BUFSIZ 1024
#ifdef __cplusplus
extern "C"
{
@ -96,6 +98,12 @@ extern "C"
/* Read a line from stream. */
char* fgets(char* buf, size_t size, FILE* stream);
/* Read a line from stream and store it in a dynamically-allocated buffer. */
ssize_t getline(char** linep, size_t* n, FILE* stream);
/* Read a line from stream and store it in a dynamically-allocated buffer. */
ssize_t getdelim(char** linep, size_t* n, int delim, FILE* stream);
/* Clear the error and end-of-file indicators in stream. */
void clearerr(FILE* stream);

View File

@ -236,6 +236,66 @@ extern "C"
return buf;
}
ssize_t getline(char** linep, size_t* n, FILE* stream)
{
return getdelim(linep, n, '\n', stream);
}
ssize_t getdelim(char** linep, size_t* n, int delim, FILE* stream)
{
if (!n || !linep)
{
errno = EINVAL;
return -1;
}
char* buf = *linep;
size_t size = *n;
size_t len = 0;
if (!buf)
{
buf = (char*)malloc(BUFSIZ);
size = BUFSIZ;
if (!buf) return -1;
*linep = buf;
*n = size;
}
while (1)
{
int c = fgetc(stream);
if (c == EOF) break;
if (len == size)
{
buf = (char*)realloc(buf, size + 64);
size += 64;
if (!buf) return -1;
*linep = buf;
*n = size;
}
buf[len++] = (char)c;
if (c == delim) break;
}
if (len == 0) return -1;
if (len == size)
{
buf = (char*)realloc(buf, size + 16);
size += 16;
if (!buf) return -1;
*linep = buf;
*n = size;
}
buf[len] = '\0';
return (ssize_t)len;
}
void clearerr(FILE* stream)
{
stream->_eof = stream->_err = 0;

View File

@ -36,7 +36,7 @@ static bool try_format(strftime_state& state, const char* format, ...)
va_list ap;
va_start(ap, format);
char buf[1024];
char buf[BUFSIZ];
vsnprintf(buf, sizeof(buf), format, ap);
va_end(ap);

View File

@ -4,6 +4,7 @@
#include <luna/Vector.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
@ -347,17 +348,17 @@ extern "C"
}
else
{
buf = (char*)malloc(1024);
buf = (char*)malloc(BUFSIZ);
if (!buf) return nullptr;
ssize_t rc = __getcwd_wrapper(buf, 1024);
ssize_t rc = __getcwd_wrapper(buf, BUFSIZ);
if (rc < 0)
{
free(buf);
return nullptr;
}
if (rc > 1024)
if (rc > BUFSIZ)
{
free(buf);