Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / stdio.c
index af8f007..39d37a4 100644 (file)
@@ -109,16 +109,16 @@ EXPORT FILE *freopen(const char *file, const char *mode, FILE *fp)
 \r
        //Open File\r
        if(fp->FD != -1)\r
-               fp->FD = reopen(fp->FD, file, openFlags);\r
+               fp->FD = _SysReopen(fp->FD, file, openFlags);\r
        else\r
-               fp->FD = open(file, openFlags);\r
+               fp->FD = _SysOpen(file, openFlags);\r
        if(fp->FD == -1) {\r
                fp->Flags = 0;\r
                return NULL;\r
        }\r
        \r
        if( (fp->Flags & FILE_FLAG_MODE_MASK) == FILE_FLAG_MODE_APPEND ) {\r
-               seek(fp->FD, 0, SEEK_END);      //SEEK_END\r
+               _SysSeek(fp->FD, 0, SEEK_END);  //SEEK_END\r
        }\r
        \r
        return fp;\r
@@ -168,7 +168,7 @@ EXPORT int fclose(FILE *fp)
 {\r
        fflush(fp);\r
        if( fp->FD != -1 ) {\r
-               close(fp->FD);\r
+               _SysClose(fp->FD);\r
        }\r
        fp->Flags = 0;\r
        fp->FD = -1;\r
@@ -221,7 +221,7 @@ EXPORT off_t ftell(FILE *fp)
        if( fp->FD == -2 )\r
                return fp->Pos; \r
        else\r
-               return tell(fp->FD);\r
+               return _SysTell(fp->FD);\r
 }\r
 \r
 EXPORT int fseek(FILE *fp, long int amt, int whence)\r
@@ -251,7 +251,7 @@ EXPORT int fseek(FILE *fp, long int amt, int whence)
                return 0;\r
        }\r
        else\r
-               return seek(fp->FD, amt, whence);\r
+               return _SysSeek(fp->FD, amt, whence);\r
 }\r
 \r
 \r
@@ -300,7 +300,7 @@ EXPORT int fprintf(FILE *fp, const char *format, ...)
  * \fn EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)\r
  * \brief Write to a stream\r
  */\r
-EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)\r
+EXPORT size_t fwrite(const void *ptr, size_t size, size_t num, FILE *fp)\r
 {\r
        size_t  ret;\r
        \r
@@ -318,7 +318,7 @@ EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)
                ret = num;\r
        }\r
        else {  \r
-               ret = write(fp->FD, ptr, size*num);\r
+               ret = _SysWrite(fp->FD, ptr, size*num);\r
                ret /= size;\r
        }\r
        \r
@@ -347,13 +347,46 @@ EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp)
                ret = num;\r
        }\r
        else {\r
-               ret = read(fp->FD, ptr, size*num);\r
+               ret = _SysRead(fp->FD, ptr, size*num);\r
+               if( ret == (size_t)-1)\r
+                       return -1;\r
+               if( ret == 0 && size*num > 0 ) {\r
+                       fp->Flags |= FILE_FLAG_EOF;\r
+                       return 0;\r
+               }\r
                ret /= size;\r
        }\r
                \r
        return ret;\r
 }\r
 \r
+/**\r
+ * \brief Write a string to a stream (without trailing \n)\r
+ */\r
+EXPORT int fputs(const char *s, FILE *fp)\r
+{\r
+       int len = strlen(s);\r
+       return fwrite(s, 1, len, fp);\r
+}\r
+\r
+/**\r
+ * \brief Read a line (and possible trailing \n into a buffer)\r
+ */\r
+EXPORT char *fgets(char *s, int size, FILE *fp)\r
+{\r
+       int ofs = 0;\r
+       char    ch = '\0';\r
+       while( ofs < size && ch != '\n' )\r
+       {\r
+               if( fread(&ch, 1, 1, fp) != 1 )\r
+                       break;\r
+               s[ofs ++] = ch;\r
+       }\r
+       if( ofs < size )\r
+               s[ofs] = '\0';\r
+       return s;\r
+}\r
+\r
 /**\r
  * \fn EXPORT int fputc(int c, FILE *fp)\r
  * \brief Write a single character to the stream\r
@@ -366,7 +399,7 @@ EXPORT int fputc(int c, FILE *fp)
 EXPORT int putchar(int c)\r
 {\r
        c &= 0xFF;\r
-       return write(_stdout, &c, 1);\r
+       return _SysWrite(_stdout, &c, 1);\r
 }\r
 \r
 /**\r
@@ -376,7 +409,7 @@ EXPORT int putchar(int c)
 EXPORT int fgetc(FILE *fp)\r
 {\r
        char    ret = 0;\r
-       if( fread(&ret, 1, 1, fp) == (size_t)-1 )\r
+       if( fread(&ret, 1, 1, fp) != 1 )\r
                return -1;\r
        return ret;\r
 }\r
@@ -384,7 +417,7 @@ EXPORT int fgetc(FILE *fp)
 EXPORT int getchar(void)\r
 {\r
        char    ret = 0;\r
-       if(read(_stdin, &ret, 1) != 1)  return -1;\r
+       if(_SysRead(_stdin, &ret, 1) != 1)      return -1;\r
        return ret;\r
 }\r
 \r
@@ -415,8 +448,8 @@ EXPORT int puts(const char *str)
        if(!str)        return 0;\r
        len = strlen(str);\r
        \r
-       len = write(_stdout, str, len);\r
-       write(_stdout, "\n", 1);\r
+       len = _SysWrite(_stdout, str, len);\r
+       _SysWrite(_stdout, "\n", 1);\r
        return len;\r
 }\r
 \r
@@ -425,7 +458,7 @@ EXPORT int vsprintf(char * __s, const char *__format, va_list __args)
        return vsnprintf(__s, 0x7FFFFFFF, __format, __args);\r
 }\r
 \r
-//sprintfv\r
+\r
 /**\r
  * \fn EXPORT void vsnprintf(char *buf, const char *format, va_list args)\r
  * \brief Prints a formatted string to a buffer\r
@@ -443,11 +476,11 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg
        uint64_t        arg;\r
         int    bLongLong, bPadLeft;\r
 \r
-       void _addchar(char ch)\r
-       {\r
-               if(buf && pos < __maxlen)       buf[pos] = ch;\r
-               pos ++;\r
-       }\r
+       #define _addchar(ch) do { \\r
+               if(buf && pos < __maxlen)       buf[pos] = (ch); \\r
+               else (void)(ch); \\r
+               pos ++; \\r
+       } while(0)\r
 \r
        tmp[32] = '\0';\r
        \r
@@ -610,6 +643,7 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg
        }\r
        _addchar('\0');\r
        pos --;\r
+       #undef _addchar\r
        \r
        //_SysDebug("vsnprintf: buf = '%s'", buf);\r
        \r
@@ -681,7 +715,7 @@ EXPORT int printf(const char *format, ...)
        va_end(args);\r
        \r
        // Send to stdout\r
-       write(_stdout, buf, size+1);\r
+       _SysWrite(_stdout, buf, size);\r
        \r
        // Free buffer\r
        free(buf);\r

UCC git Repository :: git.ucc.asn.au