Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / stdio.c
index 1dde9ad..39d37a4 100644 (file)
@@ -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
@@ -348,12 +348,45 @@ EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp)
        }\r
        else {\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
@@ -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
@@ -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
-       _SysWrite(_stdout, buf, size+1);\r
+       _SysWrite(_stdout, buf, size);\r
        \r
        // Free buffer\r
        free(buf);\r

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