diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 4d1f404b..66ff0c22 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -31,7 +31,6 @@ ASFLAGS=$(CPUASFLAGS) OBJS=\ ctype.o \ crc32.o \ -file.o \ fdio.o \ fpipe.o \ stdio.o \ @@ -115,6 +114,40 @@ strspn.o \ strstr.o \ strtok.o \ strtok_r.o \ +clearerr.o \ +fbufsize.o \ +fclose.o \ +fcloseall.o \ +feof.o \ +ferror.o \ +fflush.o \ +fgetc.o \ +fgets.o \ +fileno.o \ +flbf.o \ +flushlfb.o \ +fnewline.o \ +fpending.o \ +fpurge.o \ +fputc.o \ +fputs.o \ +fread.o \ +freadable.o \ +freading.o \ +fregister.o \ +fseek.o \ +fseeko.o \ +fseterr.o \ +fsetlocking.o \ +ftell.o \ +ftello.o \ +fwritable.o \ +fwrite.o \ +fwriting.o \ +getc.o \ +putc.o \ +rewind.o \ +ungetc.o \ UNPROCHEADERDIRS:=$(shell find include -type d) UNPROCHEADERS:=$(shell find include -type f) diff --git a/libmaxsi/clearerr.cpp b/libmaxsi/clearerr.cpp new file mode 100644 index 00000000..3a860412 --- /dev/null +++ b/libmaxsi/clearerr.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + 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 . + + clearerr.cpp + Clears the error condition on a FILE. + +*******************************************************************************/ + +#include + +extern "C" void clearerr(FILE* fp) +{ + if ( fp->clearerr_func ) + fp->clearerr_func(fp->user); +} diff --git a/libmaxsi/fbufsize.cpp b/libmaxsi/fbufsize.cpp new file mode 100644 index 00000000..800ed532 --- /dev/null +++ b/libmaxsi/fbufsize.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 . + + fbufsize.cpp + Returns the size of the FILE's buffer. + +*******************************************************************************/ + +#include + +extern "C" size_t fbufsize(FILE* fp) +{ + return fp->buffersize; +} diff --git a/libmaxsi/fclose.cpp b/libmaxsi/fclose.cpp new file mode 100644 index 00000000..0020981a --- /dev/null +++ b/libmaxsi/fclose.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + 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 . + + fclose.cpp + Closes and flushes a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fclose(FILE* fp) +{ + int result = fflush(fp); + result |= fp->close_func ? fp->close_func(fp->user) : 0; + funregister(fp); + if ( fp->free_func ) { fp->free_func(fp); } + return result; +} diff --git a/libmaxsi/fcloseall.cpp b/libmaxsi/fcloseall.cpp new file mode 100644 index 00000000..98c3aec7 --- /dev/null +++ b/libmaxsi/fcloseall.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + fcloseall.cpp + Closes and flushes all open registered files. + +*******************************************************************************/ + +#include + +extern "C" int fcloseall(void) +{ + int result = 0; + while ( _firstfile ) { result |= fclose(_firstfile); } + return (result) ? EOF : 0; +} diff --git a/libmaxsi/feof.cpp b/libmaxsi/feof.cpp new file mode 100644 index 00000000..cf4740e4 --- /dev/null +++ b/libmaxsi/feof.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + 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 . + + feof.cpp + Returns whether the end of file condition is set on a FILE. + +*******************************************************************************/ + +#include + +extern "C" int feof(FILE* fp) +{ + if ( fp->numpushedback ) + return 0; + if ( fp->eof_func ) + return fp->eof_func(fp->user); + return 0; +} diff --git a/libmaxsi/ferror.cpp b/libmaxsi/ferror.cpp new file mode 100644 index 00000000..8393523b --- /dev/null +++ b/libmaxsi/ferror.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + ferror.cpp + Returns whether the error condition is set on a FILE. + +*******************************************************************************/ + +#include + +extern "C" int ferror(FILE* fp) +{ + if ( fp->error_func ) + return fp->error_func(fp->user); + return 0; +} diff --git a/libmaxsi/fflush.cpp b/libmaxsi/fflush.cpp new file mode 100644 index 00000000..0fe0a021 --- /dev/null +++ b/libmaxsi/fflush.cpp @@ -0,0 +1,42 @@ +/******************************************************************************* + + 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 . + + fflush.cpp + Flushes a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" int fflush(FILE* fp) +{ + if ( !fp ) + { + int result = 0; + for ( fp = _firstfile; fp; fp = fp->next ) { result |= fflush(fp); } + return result; + } + if ( !fp->write_func ) { errno = EBADF; return EOF; } + if ( !fp->bufferused ) { return 0; } + size_t written = fp->write_func(fp->buffer, 1, fp->bufferused, fp->user); + if ( written < fp->bufferused ) { return EOF; } + fp->bufferused = 0; + return 0; +} diff --git a/libmaxsi/fgetc.cpp b/libmaxsi/fgetc.cpp new file mode 100644 index 00000000..9eacea73 --- /dev/null +++ b/libmaxsi/fgetc.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + fgetc.cpp + Reads a single character from a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fgetc(FILE* fp) +{ + unsigned char c; + if ( fread(&c, 1, sizeof(c), fp) < sizeof(c) ) { return EOF; } + return c; +} diff --git a/libmaxsi/fgets.cpp b/libmaxsi/fgets.cpp new file mode 100644 index 00000000..8419a6ad --- /dev/null +++ b/libmaxsi/fgets.cpp @@ -0,0 +1,47 @@ +/******************************************************************************* + + 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 . + + fgets.cpp + Reads a string from a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" char* fgets(char* dest, int size, FILE* fp) +{ + if ( size <= 0 ) { errno = EINVAL; return NULL; } + int i; + for ( i = 0; i < size-1; i++ ) + { + int c = getc(fp); + if ( c == EOF ) + { + if ( ferror(fp) ) { return NULL; } + else { i++; break; } /* EOF */ + } + dest[i] = c; + if ( c == '\n' ) { i++; break; } + } + + dest[i] = '\0'; + return dest; +} + diff --git a/libmaxsi/file.c b/libmaxsi/file.c deleted file mode 100644 index 4307e5ac..00000000 --- a/libmaxsi/file.c +++ /dev/null @@ -1,340 +0,0 @@ -/****************************************************************************** - - COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011. - - 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 . - - file.c - FILE* in libmaxsi is an interface to various implementations of the FILE* - API. This allows stuff like fmemopen, but also allows the application - programmers to provide their own backends. - -******************************************************************************/ - -#include -#include -#include -#include -#include - -FILE* firstfile = NULL; - -void fregister(FILE* fp) -{ - fp->flags |= _FILE_REGISTERED; - if ( !firstfile ) { firstfile = fp; return; } - fp->next = firstfile; - firstfile->prev = fp; - firstfile = fp; -} - -void funregister(FILE* fp) -{ - if ( !(fp->flags & _FILE_REGISTERED) ) { return; } - if ( !fp->prev ) { firstfile = fp->next; } - if ( fp->prev ) { fp->prev->next = fp->next; } - if ( fp->next ) { fp->next->prev = fp->prev; } - fp->flags &= ~_FILE_REGISTERED; -} - -size_t fread(void* ptr, size_t size, size_t nmemb, FILE* fp) -{ - if ( fp->numpushedback && size != 1 ) { errno = ENOSYS; return 0; } - if ( fp->numpushedback && nmemb ) - { - unsigned char* buf = (unsigned char*) ptr; - size_t amount = nmemb < fp->numpushedback ? nmemb : fp->numpushedback; - for ( size_t i = 0; i < amount; i++ ) - { - buf[i] = fp->pushedback[--(fp->numpushedback)]; - } - if ( nmemb <= amount ) { return nmemb; } - return amount + fread(buf + amount, size, nmemb - amount, fp); - } - if ( !fp->read_func ) { errno = EBADF; return 0; } - fp->flags &= ~_FILE_LAST_WRITE; fp->flags |= _FILE_LAST_READ; - return fp->read_func(ptr, size, nmemb, fp->user); -} - -size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* fp) -{ - if ( !fp->write_func ) { errno = EBADF; return 0; } - fp->flags &= ~_FILE_LAST_READ; fp->flags |= _FILE_LAST_WRITE; - char* str = (char*) ptr; - size_t total = size * nmemb; - size_t sofar = 0; - while ( sofar < total ) - { - size_t left = total - sofar; - if ( (!fp->bufferused && fp->buffersize <= left) || (fp->flags & _FILE_NO_BUFFER) ) - { - return sofar + fp->write_func(str + sofar, 1, left, fp->user); - } - - size_t available = fp->buffersize - fp->bufferused; - size_t count = ( left < available ) ? left : available; - count = left; - for ( size_t i = 0; i < count; i++ ) - { - char c = str[sofar++]; - fp->buffer[fp->bufferused++] = c; - if ( c == '\n' ) - { - if ( fflush(fp) ) { return sofar; } - break; - } - } - - if ( fp->buffersize <= fp->bufferused ) - { - if ( fflush(fp) ) { return sofar; } - } - } - return sofar; -} - -int fseeko(FILE* fp, off_t offset, int whence) -{ - fp->numpushedback = 0; - return (fp->seek_func) ? fp->seek_func(fp->user, offset, whence) : 0; -} - -int fseek(FILE* fp, long offset, int whence) -{ - return fseeko(fp, offset, whence); -} - -void fseterr(FILE* fp) -{ - if ( fp->seterr_func ) { fp->seterr_func(fp->user); } -} - -void clearerr(FILE* fp) -{ - if ( fp->clearerr_func ) { fp->clearerr_func(fp->user); } -} - -int ferror(FILE* fp) -{ - if ( !fp->error_func ) { return 0; } - return fp->error_func(fp->user); -} - -int feof(FILE* fp) -{ - if ( fp->numpushedback ) { return 0; } - if ( !fp->eof_func ) { return 0; } - return fp->eof_func(fp->user); -} - -void rewind(FILE* fp) -{ - fseek(fp, 0L, SEEK_SET); - clearerr(fp); -} - -off_t ftello(FILE* fp) -{ - if ( !fp->tell_func ) { errno = EBADF; return -1; } - return fp->tell_func(fp->user) - fp->numpushedback; -} - -long ftell(FILE* fp) -{ - return (long) ftello(fp); -} - -int ungetc(int c, FILE* fp) -{ - if ( fp->numpushedback == _FILE_MAX_PUSHBACK ) { errno = ERANGE; return EOF; } - unsigned char uc = c; - fp->pushedback[fp->numpushedback++] = uc; - return uc; -} - -int fflush(FILE* fp) -{ - if ( !fp ) - { - int result = 0; - for ( fp = firstfile; fp; fp = fp->next ) { result |= fflush(fp); } - return result; - } - if ( !fp->write_func ) { errno = EBADF; return EOF; } - if ( !fp->bufferused ) { return 0; } - size_t written = fp->write_func(fp->buffer, 1, fp->bufferused, fp->user); - if ( written < fp->bufferused ) { return EOF; } - fp->bufferused = 0; - return 0; -} - -int fclose(FILE* fp) -{ - int result = fflush(fp); - result |= (fp->close_func) ? fp->close_func(fp->user) : 0; - funregister(fp); - if ( fp->free_func ) { fp->free_func(fp); } - return result; -} - -int fileno(FILE* fp) -{ - int result = (fp->fileno_func) ? fp->fileno_func(fp->user) : -1; - if ( result < 0 ) { errno = EBADF; } - return result; -} - -size_t fbufsize(FILE* fp) -{ - return fp->buffersize; -} - -int freading(FILE* fp) -{ - if ( fp->read_func ) { return 1; } - if ( fp->flags & _FILE_LAST_READ ) { return 1; } - return 0; -} - -int fwriting(FILE* fp) -{ - if ( fp->write_func ) { return 1; } - if ( fp->flags & _FILE_LAST_WRITE ) { return 1; } - return 0; -} - -int freadable(FILE* fp) -{ - return fp->read_func != NULL; -} - -int fwritable(FILE* fp) -{ - return fp->write_func != NULL; -} - -int flbf(FILE* fp) -{ - return !(fp->flags & _FILE_NO_BUFFER); -} - -void fpurge(FILE* fp) -{ - fp->bufferused = 0; -} - -size_t fpending(FILE* fp) -{ - return fp->bufferused; -} - -int fsetlocking(FILE* fp, int type) -{ - switch ( type ) - { - case FSETLOCKING_INTERNAL: fp->flags |= _FILE_AUTO_LOCK; - case FSETLOCKING_BYCALLER: fp->flags &= ~_FILE_AUTO_LOCK; - } - return (fp->flags & _FILE_AUTO_LOCK) ? FSETLOCKING_INTERNAL - : FSETLOCKING_BYCALLER; -} - -static void ffreefile(FILE* fp) -{ - free(fp->buffer); - free(fp); -} - -FILE* fnewfile(void) -{ - FILE* fp = (FILE*) calloc(sizeof(FILE), 1); - if ( !fp ) { return NULL; } - fp->buffersize = BUFSIZ; - fp->buffer = (char*) malloc(fp->buffersize); - if ( !fp->buffer ) { free(fp); return NULL; } - fp->flags = _FILE_AUTO_LOCK; - fp->free_func = ffreefile; - fregister(fp); - return fp; -} - -int fcloseall(void) -{ - int result = 0; - while ( firstfile ) { result |= fclose(firstfile); } - return (result) ? EOF : 0; -} - -void flushlbf(void) -{ - for ( FILE* fp = firstfile; fp; fp = fp->next ) - { - fflush(fp); - } -} - -int fgetc(FILE* fp) -{ - unsigned char c; - if ( fread(&c, 1, sizeof(c), fp) < sizeof(c) ) { return EOF; } - return c; -} - -int fputc(int cint, FILE* fp) -{ - unsigned char c = (unsigned char) cint; - if ( fwrite(&c, 1, sizeof(c), fp) < sizeof(c) ) { return EOF; } - return c; -} - -int getc(FILE* fp) -{ - return fgetc(fp); -} - -int putc(int c, FILE* fp) -{ - return fputc(c, fp); -} - -int fputs(const char* str, FILE* fp) -{ - size_t stringlen = strlen(str); - int result = fwrite(str, 1, stringlen, fp); - if ( result < stringlen ) { return EOF; } - return result; -} - -char* fgets(char* dest, int size, FILE* fp) -{ - if ( size <= 0 ) { errno = EINVAL; return NULL; } - int i; - for ( i = 0; i < size-1; i++ ) - { - int c = getc(fp); - if ( c == EOF ) - { - if ( ferror(fp) ) { return NULL; } - else { i++; break; } /* EOF */ - } - dest[i] = c; - if ( c == '\n' ) { i++; break; } - } - - dest[i] = '\0'; - return dest; -} - diff --git a/libmaxsi/fileno.cpp b/libmaxsi/fileno.cpp new file mode 100644 index 00000000..a67ef41b --- /dev/null +++ b/libmaxsi/fileno.cpp @@ -0,0 +1,33 @@ +/******************************************************************************* + + 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 . + + fileno.cpp + Returns the underlying file descriptor of a FILE if applicable. + +*******************************************************************************/ + +#include +#include + +extern "C" int fileno(FILE* fp) +{ + int result = fp->fileno_func ? fp->fileno_func(fp->user) : -1; + if ( result < 0 ) { errno = EBADF; } + return result; +} diff --git a/libmaxsi/flbf.cpp b/libmaxsi/flbf.cpp new file mode 100644 index 00000000..a93ec624 --- /dev/null +++ b/libmaxsi/flbf.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 . + + flbf.cpp + Returns whether a FILE is line buffered. + +*******************************************************************************/ + +#include + +extern "C" int flbf(FILE* fp) +{ + return !(fp->flags & _FILE_NO_BUFFER); +} diff --git a/libmaxsi/flushlfb.cpp b/libmaxsi/flushlfb.cpp new file mode 100644 index 00000000..7a39bf79 --- /dev/null +++ b/libmaxsi/flushlfb.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + 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 . + + flushlbf.cpp + Flushes all line buffered registered files. + +*******************************************************************************/ + +#include + +extern "C" void flushlbf(void) +{ + for ( FILE* fp = _firstfile; fp; fp = fp->next ) + fflush(fp); +} diff --git a/libmaxsi/fnewline.cpp b/libmaxsi/fnewline.cpp new file mode 100644 index 00000000..f1522a9c --- /dev/null +++ b/libmaxsi/fnewline.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + + 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 . + + fnewfile.cpp + Allocates and initializes a simple FILE object ready for construction. + +*******************************************************************************/ + +#include +#include + +static void ffreefile(FILE* fp) +{ + free(fp->buffer); + free(fp); +} + +extern "C" FILE* fnewfile(void) +{ + FILE* fp = (FILE*) calloc(sizeof(FILE), 1); + if ( !fp ) { return NULL; } + fp->buffersize = BUFSIZ; + fp->buffer = (char*) malloc(fp->buffersize); + if ( !fp->buffer ) { free(fp); return NULL; } + fp->flags = _FILE_AUTO_LOCK; + fp->free_func = ffreefile; + fregister(fp); + return fp; +} diff --git a/libmaxsi/fpending.cpp b/libmaxsi/fpending.cpp new file mode 100644 index 00000000..da02269c --- /dev/null +++ b/libmaxsi/fpending.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 . + + fpending.cpp + Returns the number of bytes pending in the output buffer. + +*******************************************************************************/ + +#include + +extern "C" size_t fpending(FILE* fp) +{ + return fp->bufferused; +} diff --git a/libmaxsi/fpurge.cpp b/libmaxsi/fpurge.cpp new file mode 100644 index 00000000..7a89cf2d --- /dev/null +++ b/libmaxsi/fpurge.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 . + + fpurge.cpp + Discards all contents in the FILE's buffer. + +*******************************************************************************/ + +#include + +extern "C" void fpurge(FILE* fp) +{ + fp->bufferused = 0; +} diff --git a/libmaxsi/fputc.cpp b/libmaxsi/fputc.cpp new file mode 100644 index 00000000..2c4cc46f --- /dev/null +++ b/libmaxsi/fputc.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + fputc.cpp + Writes a character to a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fputc(int cint, FILE* fp) +{ + unsigned char c = (unsigned char) cint; + if ( fwrite(&c, 1, sizeof(c), fp) < sizeof(c) ) { return EOF; } + return c; +} diff --git a/libmaxsi/fputs.cpp b/libmaxsi/fputs.cpp new file mode 100644 index 00000000..8b4f2acf --- /dev/null +++ b/libmaxsi/fputs.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + 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 . + + fputs.cpp + Writes a string to a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" int fputs(const char* str, FILE* fp) +{ + size_t stringlen = strlen(str); + int result = fwrite(str, 1, stringlen, fp); + if ( result < stringlen ) { return EOF; } + return result; +} diff --git a/libmaxsi/fread.cpp b/libmaxsi/fread.cpp new file mode 100644 index 00000000..29071ad9 --- /dev/null +++ b/libmaxsi/fread.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + + 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 . + + fread.cpp + Reads data from a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" size_t fread(void* ptr, size_t size, size_t nmemb, FILE* fp) +{ + if ( fp->numpushedback && size != 1 ) { errno = ENOSYS; return 0; } + if ( fp->numpushedback && nmemb ) + { + unsigned char* buf = (unsigned char*) ptr; + size_t amount = nmemb < fp->numpushedback ? nmemb : fp->numpushedback; + for ( size_t i = 0; i < amount; i++ ) + { + buf[i] = fp->pushedback[--(fp->numpushedback)]; + } + if ( nmemb <= amount ) { return nmemb; } + return amount + fread(buf + amount, size, nmemb - amount, fp); + } + if ( !fp->read_func ) { errno = EBADF; return 0; } + fp->flags &= ~_FILE_LAST_WRITE; fp->flags |= _FILE_LAST_READ; + return fp->read_func(ptr, size, nmemb, fp->user); +} diff --git a/libmaxsi/freadable.cpp b/libmaxsi/freadable.cpp new file mode 100644 index 00000000..985174c3 --- /dev/null +++ b/libmaxsi/freadable.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 . + + freadable.cpp + Returns whether this FILE can be read from. + +*******************************************************************************/ + +#include + +extern "C" int freadable(FILE* fp) +{ + return fp->read_func != NULL; +} diff --git a/libmaxsi/freading.cpp b/libmaxsi/freading.cpp new file mode 100644 index 00000000..923b7477 --- /dev/null +++ b/libmaxsi/freading.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + freading.cpp + Returns whether the last operation was a read or FILE is read only. + +*******************************************************************************/ + +#include + +extern "C" int freading(FILE* fp) +{ + if ( fp->read_func ) { return 1; } + if ( fp->flags & _FILE_LAST_READ ) { return 1; } + return 0; +} diff --git a/libmaxsi/fregister.cpp b/libmaxsi/fregister.cpp new file mode 100644 index 00000000..bf38fd1a --- /dev/null +++ b/libmaxsi/fregister.cpp @@ -0,0 +1,46 @@ +/******************************************************************************* + + 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 . + + fregister.cpp + Registers a FILE in the global list of open FILES, which allows the standard + library to close and flush all open files upon program exit. + +*******************************************************************************/ + +#include + +extern "C" { FILE* _firstfile = NULL; } + +extern "C" void fregister(FILE* fp) +{ + fp->flags |= _FILE_REGISTERED; + if ( !_firstfile ) { _firstfile = fp; return; } + fp->next = _firstfile; + _firstfile->prev = fp; + _firstfile = fp; +} + +extern "C" void funregister(FILE* fp) +{ + if ( !(fp->flags & _FILE_REGISTERED) ) { return; } + if ( !fp->prev ) { _firstfile = fp->next; } + if ( fp->prev ) { fp->prev->next = fp->next; } + if ( fp->next ) { fp->next->prev = fp->prev; } + fp->flags &= ~_FILE_REGISTERED; +} diff --git a/libmaxsi/fseek.cpp b/libmaxsi/fseek.cpp new file mode 100644 index 00000000..6d3b8677 --- /dev/null +++ b/libmaxsi/fseek.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 . + + fseeko.cpp + Changes the current offset in a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fseek(FILE* fp, long offset, int whence) +{ + return fseeko(fp, offset, whence); +} diff --git a/libmaxsi/fseeko.cpp b/libmaxsi/fseeko.cpp new file mode 100644 index 00000000..8341c583 --- /dev/null +++ b/libmaxsi/fseeko.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + 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 . + + fseeko.cpp + Changes the current offset in a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fseeko(FILE* fp, off_t offset, int whence) +{ + fp->numpushedback = 0; + return (fp->seek_func) ? fp->seek_func(fp->user, offset, whence) : 0; +} diff --git a/libmaxsi/fseterr.cpp b/libmaxsi/fseterr.cpp new file mode 100644 index 00000000..d0bda4f0 --- /dev/null +++ b/libmaxsi/fseterr.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + 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 . + + fseterr.cpp + Sets the error condition bit on a FILE. + +*******************************************************************************/ + +#include + +extern "C" void fseterr(FILE* fp) +{ + if ( fp->seterr_func ) + fp->seterr_func(fp->user); +} diff --git a/libmaxsi/fsetlocking.cpp b/libmaxsi/fsetlocking.cpp new file mode 100644 index 00000000..047dbeff --- /dev/null +++ b/libmaxsi/fsetlocking.cpp @@ -0,0 +1,36 @@ +/******************************************************************************* + + 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 . + + fsetlocking.cpp + Sets the desired locking semantics on a FILE. + +*******************************************************************************/ + +#include + +extern "C" int fsetlocking(FILE* fp, int type) +{ + switch ( type ) + { + case FSETLOCKING_INTERNAL: fp->flags |= _FILE_AUTO_LOCK; + case FSETLOCKING_BYCALLER: fp->flags &= ~_FILE_AUTO_LOCK; + } + return (fp->flags & _FILE_AUTO_LOCK) ? FSETLOCKING_INTERNAL + : FSETLOCKING_BYCALLER; +} diff --git a/libmaxsi/ftell.cpp b/libmaxsi/ftell.cpp new file mode 100644 index 00000000..bb6900dd --- /dev/null +++ b/libmaxsi/ftell.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 . + + ftell.cpp + Returns the current offset of a FILE. + +*******************************************************************************/ + +#include + +extern "C" long ftell(FILE* fp) +{ + return (long) ftello(fp); +} diff --git a/libmaxsi/ftello.cpp b/libmaxsi/ftello.cpp new file mode 100644 index 00000000..d86ed819 --- /dev/null +++ b/libmaxsi/ftello.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + ftello.cpp + Returns the current offset of a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" off_t ftello(FILE* fp) +{ + if ( !fp->tell_func ) { errno = EBADF; return -1; } + return fp->tell_func(fp->user) - fp->numpushedback; +} diff --git a/libmaxsi/fwritable.cpp b/libmaxsi/fwritable.cpp new file mode 100644 index 00000000..63b06228 --- /dev/null +++ b/libmaxsi/fwritable.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 . + + fwritable.cpp + Returns whether this FILE can be written to. + +*******************************************************************************/ + +#include + +extern "C" int fwritable(FILE* fp) +{ + return fp->write_func != NULL; +} diff --git a/libmaxsi/fwrite.cpp b/libmaxsi/fwrite.cpp new file mode 100644 index 00000000..9100f3f7 --- /dev/null +++ b/libmaxsi/fwrite.cpp @@ -0,0 +1,64 @@ +/******************************************************************************* + + 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 . + + fwrote.cpp + Writes data to a FILE. + +*******************************************************************************/ + +#include +#include + +extern "C" size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* fp) +{ + if ( !fp->write_func ) { errno = EBADF; return 0; } + fp->flags &= ~_FILE_LAST_READ; fp->flags |= _FILE_LAST_WRITE; + char* str = (char*) ptr; + size_t total = size * nmemb; + size_t sofar = 0; + while ( sofar < total ) + { + size_t left = total - sofar; + if ( (!fp->bufferused && fp->buffersize <= left) || + (fp->flags & _FILE_NO_BUFFER) ) + { + return sofar + fp->write_func(str + sofar, 1, left, fp->user); + } + + size_t available = fp->buffersize - fp->bufferused; + size_t count = ( left < available ) ? left : available; + count = left; + for ( size_t i = 0; i < count; i++ ) + { + char c = str[sofar++]; + fp->buffer[fp->bufferused++] = c; + if ( c == '\n' ) + { + if ( fflush(fp) ) { return sofar; } + break; + } + } + + if ( fp->buffersize <= fp->bufferused ) + { + if ( fflush(fp) ) { return sofar; } + } + } + return sofar; +} diff --git a/libmaxsi/fwriting.cpp b/libmaxsi/fwriting.cpp new file mode 100644 index 00000000..d6f569ee --- /dev/null +++ b/libmaxsi/fwriting.cpp @@ -0,0 +1,32 @@ +/******************************************************************************* + + 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 . + + fwriting.cpp + Returns whether the last operation was a write or FILE is write only. + +*******************************************************************************/ + +#include + +extern "C" int fwriting(FILE* fp) +{ + if ( fp->write_func ) { return 1; } + if ( fp->flags & _FILE_LAST_WRITE ) { return 1; } + return 0; +} diff --git a/libmaxsi/getc.cpp b/libmaxsi/getc.cpp new file mode 100644 index 00000000..5a460ddd --- /dev/null +++ b/libmaxsi/getc.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 . + + getc.cpp + Reads a single character from a FILE. + +*******************************************************************************/ + +#include + +extern "C" int getc(FILE* fp) +{ + return fgetc(fp); +} diff --git a/libmaxsi/include/stdio.h b/libmaxsi/include/stdio.h index 71e18188..7d5e97ec 100644 --- a/libmaxsi/include/stdio.h +++ b/libmaxsi/include/stdio.h @@ -1,6 +1,6 @@ -/****************************************************************************** +/******************************************************************************* - COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. This file is part of LibMaxsi. @@ -11,8 +11,8 @@ 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. + 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 . @@ -20,7 +20,7 @@ stdio.h Standard buffered input/output. -******************************************************************************/ +*******************************************************************************/ #ifndef _STDIO_H #define _STDIO_H 1 @@ -167,6 +167,10 @@ void funregister(FILE* fp); FILE* fnewfile(void); int fcloseall(void); int fpipe(FILE* pipes[2]); +/* Internally used by standard library. */ +#if defined(LIBMAXSI_LIBRARY) +extern FILE* _firstfile; +#endif #endif #if __SORTIX_STDLIB_REDIRECTS diff --git a/libmaxsi/putc.cpp b/libmaxsi/putc.cpp new file mode 100644 index 00000000..2064f2fc --- /dev/null +++ b/libmaxsi/putc.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 . + + putc.cpp + Writes a character to a FILE. + +*******************************************************************************/ + +#include + +extern "C" int putc(int c, FILE* fp) +{ + return fputc(c, fp); +} diff --git a/libmaxsi/rewind.cpp b/libmaxsi/rewind.cpp new file mode 100644 index 00000000..a053316b --- /dev/null +++ b/libmaxsi/rewind.cpp @@ -0,0 +1,31 @@ +/******************************************************************************* + + 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 . + + rewind.cpp + Sets the offset of a FILE to the start and clears any error condition. + +*******************************************************************************/ + +#include + +extern "C" void rewind(FILE* fp) +{ + fseek(fp, 0L, SEEK_SET); + clearerr(fp); +} diff --git a/libmaxsi/ungetc.cpp b/libmaxsi/ungetc.cpp new file mode 100644 index 00000000..a9e182ed --- /dev/null +++ b/libmaxsi/ungetc.cpp @@ -0,0 +1,35 @@ +/******************************************************************************* + + 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 . + + ungetc.cpp + Inserts data in front of the current read queue, allowing applications to + peek the incoming data and pretend they didn't. + +*******************************************************************************/ + +#include +#include + +extern "C" int ungetc(int c, FILE* fp) +{ + if ( fp->numpushedback == _FILE_MAX_PUSHBACK ) { errno = ERANGE; return EOF; } + unsigned char uc = c; + fp->pushedback[fp->numpushedback++] = uc; + return uc; +}