Usermode/libc - Adding features
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / fileIO.c
index 60def89..c0013c9 100644 (file)
@@ -19,7 +19,7 @@
 #define        _stdout 1\r
 \r
 // === PROTOTYPES ===\r
-EXPORT void    itoa(char *buf, uint64_t num, uint base, int minLength, char pad, int bSigned);\r
+EXPORT void    itoa(char *buf, uint64_t num, size_t base, int minLength, char pad, int bSigned);\r
 struct sFILE   *get_file_struct();\r
 \r
 // === GLOBALS ===\r
@@ -82,7 +82,7 @@ EXPORT FILE *freopen(const char *file, const char *mode, FILE *fp)
        case 'x':       openFlags = OPENFLAG_EXEC;\r
                break;\r
        }\r
-       \r
+\r
        //Open File\r
        if(fp->FD != -1)\r
                fp->FD = reopen(fp->FD, file, openFlags);\r
@@ -131,7 +131,26 @@ EXPORT void fflush(FILE *fp)
        ///\todo Implement\r
 }\r
 \r
-EXPORT long int ftell(FILE *fp)\r
+EXPORT void clearerr(FILE *stream)\r
+{\r
+       /// \todo Impliment\r
+}\r
+\r
+EXPORT int feof(FILE *stream)\r
+{\r
+       return 0;       //stream->;     // ?\r
+}\r
+\r
+EXPORT int ferror(FILE *stream)\r
+{\r
+       return 0;\r
+}\r
+EXPORT int fileno(FILE *stream)\r
+{\r
+       return stream->FD;\r
+}\r
+\r
+EXPORT off_t ftell(FILE *fp)\r
 {\r
        if(!fp || !fp->FD)      return -1;\r
        \r
@@ -154,27 +173,14 @@ EXPORT int vfprintf(FILE *fp, const char *format, va_list args)
 {\r
        va_list tmpList;\r
         int    size;\r
-       char    sbuf[1024];\r
-       char    *buf = sbuf;\r
 \r
        if(!fp || !format)      return -1;\r
 \r
        va_copy(tmpList, args);\r
        \r
-       size = vsnprintf(sbuf, sizeof(sbuf), (char*)format, tmpList);\r
-       \r
-       if( size >= sizeof(sbuf) )\r
-       {\r
-               buf = (char*)malloc(size+1);\r
-               if(!buf) {\r
-                       WRITE_STR(_stdout, "vfprintf ERROR: malloc() failed");\r
-                       return 0;\r
-               }\r
-               buf[size] = '\0';\r
-       \r
-               // Print\r
-               vsnprintf(buf, size+1, (char*)format, args);\r
-       }\r
+       size = vsnprintf(NULL, 0, (char*)format, tmpList);\r
+       char    buf[size+1];\r
+       vsnprintf(buf, size+1, (char*)format, args);\r
        \r
        // Write to stream\r
        write(fp->FD, buf, size);\r
@@ -225,7 +231,8 @@ EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp)
 {\r
         int    ret;\r
        if(!fp || !fp->FD)      return -1;\r
-       \r
+\r
+       // TODO: Fit the spec better with the return value      \r
        ret = read(fp->FD, ptr, size*num);\r
        \r
        return ret;\r
@@ -427,7 +434,7 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg
                        _addchar('*');\r
                        _addchar('0');\r
                        _addchar('x');\r
-                       arg = va_arg(args, uint32_t);\r
+                       arg = va_arg(args, intptr_t);\r
                        itoa(tmp, arg, 16, minSize, pad, 0);\r
                        precision = -1;\r
                        goto sprintf_puts;\r
@@ -457,8 +464,7 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg
 \r
                // String\r
                case 's':\r
-                       arg = va_arg(args, uint32_t);\r
-                       p = (void*)(intptr_t)arg;\r
+                       p = va_arg(args, char*);\r
                sprintf_puts:\r
                        if(!p)  p = "(null)";\r
                        //_SysDebug("vsnprintf: p = '%s'", p);\r
@@ -543,29 +549,17 @@ EXPORT int printf(const char *format, ...)
 {\r
        #if 1\r
         int    size;\r
-       char    sbuf[1024];\r
-       char    *buf = sbuf;\r
        va_list args;\r
        \r
        // Get final size\r
        va_start(args, format);\r
-       size = vsnprintf(sbuf, 1024, (char*)format, args);\r
+       size = vsnprintf(NULL, 0, (char*)format, args);\r
+       va_end(args);\r
+       char buf[size+1];\r
+       // Fill Buffer\r
+       va_start(args, format);\r
+       vsnprintf(buf, size+1, (char*)format, args);\r
        va_end(args);\r
-       \r
-       if( size >= 1024 ) {\r
-               // Allocate buffer\r
-               buf = (char*)malloc(size+1);\r
-               if(buf) {\r
-                       WRITE_STR(_stdout, "PRINTF ERROR: malloc() failed\n");\r
-                       return 0;\r
-               }\r
-               buf[size] = '\0';\r
-       \r
-               // Fill Buffer\r
-               va_start(args, format);\r
-               vsnprintf(buf, size+1, (char*)format, args);\r
-               va_end(args);\r
-       }\r
        \r
        // Send to stdout\r
        write(_stdout, buf, size+1);\r

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