diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 85ab8d37..63204f5d 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -69,6 +69,8 @@ ftello.o \ fwritable.o \ fwrite.o \ fwriting.o \ +getdelim.o \ +getline.o \ heap.o \ integer.o \ mbtowc.o \ diff --git a/libmaxsi/getdelim.cpp b/libmaxsi/getdelim.cpp new file mode 100644 index 00000000..3b82a811 --- /dev/null +++ b/libmaxsi/getdelim.cpp @@ -0,0 +1,63 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + getdelim.cpp + Delimited string input. + +*******************************************************************************/ + +#include +#include +#include + +ssize_t getdelim(char** lineptr, size_t* n, int delim, FILE* fp) +{ + if ( !lineptr || (*lineptr && !n) || !fp ) { errno = EINVAL; return -1; } + const size_t DEFAULT_BUFSIZE = 32UL; + int malloced = !*lineptr; + if ( malloced ) { *lineptr = (char*) malloc(DEFAULT_BUFSIZE); } + if ( !*lineptr ) { return -1; } + size_t bufsize = malloced ? DEFAULT_BUFSIZE : *n; + if ( n ) { *n = bufsize; } + ssize_t written = 0; + int c; + do + { + if ( (c = getc(fp)) == EOF ) + { + if ( written ) { break; } else { goto cleanup; } + } + if ( bufsize <= (size_t) written + 1UL ) + { + size_t newbufsize = 2UL * bufsize; + char* newbuf = (char*) realloc(*lineptr, newbufsize); + if ( !newbuf ) { goto cleanup; } + bufsize = newbufsize; + if ( n ) { *n = bufsize; } + *lineptr = newbuf; + } + (*lineptr)[written++] = c; + } while ( c != delim ); + (*lineptr)[written] = 0; + return written; + +cleanup: + free(malloced ? *lineptr : NULL); + return -1; +} diff --git a/libmaxsi/getline.cpp b/libmaxsi/getline.cpp new file mode 100644 index 00000000..68b294b8 --- /dev/null +++ b/libmaxsi/getline.cpp @@ -0,0 +1,30 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + getline.cpp + Reads a line from a FILE. + +*******************************************************************************/ + +#include + +ssize_t getline(char** lineptr, size_t* n, FILE* fp) +{ + return getdelim(lineptr, n, '\n', fp); +} diff --git a/libmaxsi/stdio.c b/libmaxsi/stdio.c index 2fd512e1..ecd49812 100644 --- a/libmaxsi/stdio.c +++ b/libmaxsi/stdio.c @@ -51,47 +51,6 @@ int putchar(int c) return fputc(c, stdout); } -ssize_t getdelim(char** lineptr, size_t* n, int delim, FILE* fp) -{ - if ( !lineptr || (*lineptr && !n) || !fp ) { errno = EINVAL; return -1; } - const size_t DEFAULT_BUFSIZE = 32UL; - int malloced = !*lineptr; - if ( malloced ) { *lineptr = (char*) malloc(DEFAULT_BUFSIZE); } - if ( !*lineptr ) { return -1; } - size_t bufsize = malloced ? DEFAULT_BUFSIZE : *n; - if ( n ) { *n = bufsize; } - ssize_t written = 0; - int c; - do - { - if ( (c = getc(fp)) == EOF ) - { - if ( written ) { break; } else { goto cleanup; } - } - if ( bufsize <= (size_t) written + 1UL ) - { - size_t newbufsize = 2UL * bufsize; - char* newbuf = (char*) realloc(*lineptr, newbufsize); - if ( !newbuf ) { goto cleanup; } - bufsize = newbufsize; - if ( n ) { *n = bufsize; } - *lineptr = newbuf; - } - (*lineptr)[written++] = c; - } while ( c != delim ); - (*lineptr)[written] = 0; - return written; - -cleanup: - free(malloced ? *lineptr : NULL); - return -1; -} - -ssize_t getline(char** lineptr, size_t* n, FILE* fp) -{ - return getdelim(lineptr, n, '\n', fp); -} - char* sortix_gets(void) { char* buf = NULL; @@ -106,4 +65,3 @@ int puts(const char* str) { return printf("%s\n", str) < 0 ? EOF : 1; } -