\r
#define DEBUG_BUILD 0\r
\r
+#define LOG_WARN(f,...) _SysDebug("WARN: %s: "f, __func__ ,## __VA_ARGS__)\r
+#define LOG_NOTICE(f,...) _SysDebug("NOTE: %s: "f, __func__ ,## __VA_ARGS__)\r
+\r
// === CONSTANTS ===\r
#define _stdin 0\r
#define _stdout 1\r
\r
// === GLOBALS ===\r
struct sFILE _iob[STDIO_MAX_STREAMS]; // IO Buffer\r
-struct sFILE *stdin; // Standard Input\r
-struct sFILE *stdout; // Standard Output\r
-struct sFILE *stderr; // Standard Error\r
+struct sFILE *stdin = &_iob[0]; // Standard Input\r
+struct sFILE *stdout = &_iob[1]; // Standard Output\r
+struct sFILE *stderr = &_iob[2]; // Standard Error\r
///\note Initialised in SoMain\r
static const int STDIN_BUFSIZ = 512;\r
static const int STDOUT_BUFSIZ = 512;\r
void _stdio_init(void)\r
{\r
// Init FileIO Pointers\r
- stdin = &_iob[0];\r
stdin->FD = 0;\r
stdin->Flags = FILE_FLAG_ALLOC|FILE_FLAG_MODE_READ|FILE_FLAG_LINEBUFFERED|FILE_FLAG_OURBUFFER;\r
stdin->Buffer = malloc(STDIN_BUFSIZ);\r
stdin->BufferSpace = STDIN_BUFSIZ;\r
\r
- stdout = &_iob[1];\r
stdout->FD = 1;\r
stdout->Flags = FILE_FLAG_ALLOC|FILE_FLAG_MODE_WRITE|FILE_FLAG_LINEBUFFERED|FILE_FLAG_OURBUFFER;\r
stdout->Buffer = malloc(STDOUT_BUFSIZ);\r
stdout->BufferSpace = STDOUT_BUFSIZ;\r
\r
- stderr = &_iob[2];\r
stderr->FD = 2;\r
stderr->Flags = FILE_FLAG_ALLOC|FILE_FLAG_MODE_WRITE;\r
}\r
return ret;\r
}\r
\r
+EXPORT FILE *fdopen(int fd, const char *mode)\r
+{\r
+ FILE *ret;\r
+ \r
+ if( fd < 0 || !mode ) return NULL;\r
+ \r
+ ret = get_file_struct();\r
+ \r
+ ret->FD = fd;\r
+ ret->Flags = _fopen_modetoflags(mode);\r
+ if(ret->Flags == -1) {\r
+ ret->Flags = 0;\r
+ return NULL;\r
+ }\r
+ \r
+ ret->Buffer = NULL;\r
+ ret->BufferPos = 0;\r
+ ret->BufferSpace = 0;\r
+ \r
+ return ret;\r
+}\r
+\r
+EXPORT FILE *tmpfile(void)\r
+{\r
+ return NULL;\r
+}\r
+\r
EXPORT int fclose(FILE *fp)\r
{\r
if( !(fp->Flags & FILE_FLAG_ALLOC) )\r
return ret;\r
}\r
\r
-EXPORT void fflush(FILE *fp)\r
+EXPORT int fflush(FILE *fp)\r
{\r
if( !fp || fp->FD == FD_NOTOPEN )\r
- return ;\r
+ return EBADF;\r
\r
// Nothing to do for memory files\r
if( fp->FD == FD_MEMFILE )\r
- return ;\r
+ return 0;\r
// Memory streams, update pointers\r
if( fp->FD == FD_MEMSTREAM ) {\r
*fp->BufPtr = fp->Buffer;\r
*fp->LenPtr = fp->BufferPos;\r
- return ;\r
+ return 0;\r
}\r
\r
_fflush_int(fp);\r
+ return 0;\r
}\r
\r
EXPORT void clearerr(FILE *fp)\r
return 0;\r
}\r
\r
-EXPORT int fseek(FILE *fp, long int amt, int whence)\r
+EXPORT int fseeko(FILE *fp, off_t amt, int whence)\r
{\r
if(!fp || fp->FD == FD_NOTOPEN) {\r
errno = EBADF;\r
}\r
}\r
\r
+EXPORT int fseek(FILE *fp, long int amt, int whence)\r
+{\r
+ return fseeko(fp, amt, whence);\r
+}\r
+\r
size_t _fwrite_unbuffered(FILE *fp, size_t size, size_t num, const void *data)\r
{\r
size_t ret = 0, bytes;\r
\r
size_t _fread_buffered(void *ptr, size_t size, FILE *fp)\r
{\r
- _SysDebug("%p: %i-%i <= %i", fp,\r
- (int)fp->Pos, (int)fp->BufferOfs, (int)fp->BufferPos);\r
+ //_SysDebug("%p: %i-%i <= %i", fp,\r
+ // (int)fp->Pos, (int)fp->BufferOfs, (int)fp->BufferPos);\r
if( fp->BufferPos > 0 ) {\r
- assert( fp->Pos - fp->BufferOfs <= fp->BufferPos );\r
+ assert( fp->Pos - fp->BufferOfs <= (int)fp->BufferPos );\r
}\r
- if( fp->BufferPos == 0 || fp->Pos - fp->BufferOfs == fp->BufferPos )\r
+ if( fp->BufferPos == 0 || fp->Pos - fp->BufferOfs == (int)fp->BufferPos )\r
{\r
int rv = _SysRead(fp->FD, fp->Buffer, fp->BufferSpace);\r
if( rv <= 0 ) {\r
\r
fp->BufferPos = rv;\r
fp->BufferOfs = fp->Pos;\r
- _SysDebug("%p: Buffered %i at %i", fp, rv, fp->Pos);\r
+ //_SysDebug("%p: Buffered %i at %i", fp, rv, fp->Pos);\r
}\r
\r
size_t inner_ofs = fp->Pos - fp->BufferOfs;\r
if(size > fp->BufferPos - inner_ofs)\r
size = fp->BufferPos - inner_ofs;\r
\r
- _SysDebug("%p: Read %i from %i+%i", fp, size,\r
- (int)fp->BufferOfs, inner_ofs);\r
+ //_SysDebug("%p: Read %i from %i+%i", fp, size,\r
+ // (int)fp->BufferOfs, inner_ofs);\r
memcpy(ptr, fp->Buffer + inner_ofs, size);\r
fp->Pos += size;\r
return size;\r
{\r
size_t ret;\r
\r
- if(!fp || fp->FD == -1)\r
+ if(!fp || fp->FD == -1) {\r
+ LOG_WARN("bad fp %p", fp);\r
return -1;\r
+ }\r
if( size == 0 || num == 0 )\r
return 0;\r
\r
if( _GetFileMode(fp) != FILE_FLAG_MODE_READ ) {\r
errno = 0;\r
+ LOG_WARN("not open for read");\r
+ if( fp == stdin ) {\r
+ LOG_WARN("BUGCHECK FAIL: stdin was not open for read");\r
+ exit(129);\r
+ }\r
return -1;\r
}\r
\r
// Don't read if EOF is set\r
- if( fp->Flags & FILE_FLAG_EOF )\r
+ if( fp->Flags & FILE_FLAG_EOF ) {\r
+ LOG_NOTICE("EOF");\r
return 0;\r
+ }\r
\r
\r
if( fp->FD == FD_MEMFILE ) {\r
}\r
else if( fp->FD == FD_MEMSTREAM ) {\r
//return _fread_memstream(ptr, size, num, fp);\r
+ LOG_WARN("Reading from a mem stream");\r
errno = EBADF;\r
return 0;\r
}\r
extra, size, num\r
);\r
}\r
+ LOG_NOTICE("Incomplete read %i/%i bytes (object size %i)",\r
+ ret, bytes, size);\r
}\r
\r
return ret / size;\r
EXPORT int fputs(const char *s, FILE *fp)\r
{\r
int len = strlen(s);\r
- return fwrite(s, 1, len, fp);\r
+ return fwrite(s, len, 1, fp);\r
}\r
\r
/**\r
*/\r
EXPORT int fputc(int c, FILE *fp)\r
{\r
- char ch = c;\r
+ unsigned char ch = c;\r
return fwrite(&ch, 1, 1, fp);\r
}\r
\r
EXPORT int putchar(int c)\r
{\r
- c &= 0xFF;\r
return fputc(c, stdout);\r
}\r
\r
*/\r
EXPORT int fgetc(FILE *fp)\r
{\r
- char ret = 0;\r
+ unsigned char ret = 0;\r
if( fread(&ret, 1, 1, fp) != 1 )\r
return -1;\r
return ret;\r
\r
EXPORT int getchar(void)\r
{\r
+ fflush(stdout);\r
return fgetc(stdin);\r
}\r
\r
EXPORT int puts(const char *str)\r
{\r
- \r
if(!str) return 0;\r
int len = strlen(str);\r
\r