]> pd.if.org Git - pdclib/blobdiff - functions/stdio/fgets.c
Merged branch stdio_rewrite back into trunk.
[pdclib] / functions / stdio / fgets.c
index 203d3ff0306643de6527de273556f155266a36a1..a82818ad23542f9eaef5a14abc1883913b1024a5 100644 (file)
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/* fgets( char *, int, FILE * );
+/* fgets( char *, int, FILE * )
 
    This file is part of the Public Domain C Library (PDCLib).
    Permission is granted to use, modify, and / or redistribute at will.
 
 #ifndef REGTEST
 
-char * fgets( char * _PDCLIB_restrict s, int n, struct _PDCLIB_file_t * _PDCLIB_restrict stream )
+#define _PDCLIB_GLUE_H _PDCLIB_GLUE_H
+#include <_PDCLIB_glue.h>
+
+char * fgets( char * s, int size, struct _PDCLIB_file_t * stream )
 {
-    /* TODO: Implement. */
-    return NULL;
+    if ( size <= 1 )
+    {
+        /* TODO: This is the letter of the standard, but is it the right thing to do? */
+        *s = '\0';
+        return s;
+    }
+    if ( _PDCLIB_prepread( stdin ) == EOF )
+    {
+        return NULL;
+    }
+    char * dest = s;
+    while ( ( ( *dest = stdin->buffer[stdin->bufidx++] ) != '\n' ) && --size > 0 )
+    {
+        if ( stdin->bufidx == stdin->bufend )
+        {
+            if ( _PDCLIB_fillbuffer( stdin ) == EOF )
+            {
+                /* EOF adds \0, error leaves target indeterminate, so we can
+                   just add the \0 anyway.
+                */
+                *dest = '\0';
+                return NULL;
+            }
+        }
+        ++dest;
+    }
+    *dest = '\0';
+    return s;
 }
 
 #endif
@@ -28,3 +57,4 @@ int main( void )
 }
 
 #endif
+