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;
+}