boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

fread.c (1920B)


      1 /* -*-comment-start: "//";comment-end:""-*-
      2  * GNU Mes --- Maxwell Equations of Software
      3  * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
      4  *
      5  * This file is part of GNU Mes.
      6  *
      7  * GNU Mes is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by
      9  * the Free Software Foundation; either version 3 of the License, or (at
     10  * your option) any later version.
     11  *
     12  * GNU Mes is distributed in the hope that it will be useful, but
     13  * WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  * GNU General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU General Public License
     18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
     19  */
     20 
     21 #include <mes/lib.h>
     22 #include <stdio.h>
     23 #include <string.h>
     24 #include <unistd.h>
     25 
     26 int
     27 __fungetc_p (FILE * stream)
     28 {
     29   return __ungetc_p ((int) (long) stream);
     30 }
     31 
     32 size_t
     33 fread (void *data, size_t size, size_t count, FILE * stream)
     34 {
     35   if (!size || !count)
     36     return 0;
     37 
     38   size_t todo = size * count;
     39   char *buf = (char *) data;
     40 
     41   int bytes = 0;
     42   while (__fungetc_p (stream) && todo-- && ++bytes)
     43     *buf++ = fgetc (stream);
     44   int filedes = (long) stream;
     45   if (todo)
     46     {
     47       int r = read (filedes, buf, todo);
     48       if (r < 0 && !bytes)
     49         bytes = r;
     50       else
     51         bytes += r;
     52     }
     53 
     54   if (__mes_debug ())
     55     {
     56       static char debug_buf[4096];
     57       eputs ("fread fd=");
     58       eputs (itoa (filedes));
     59       eputs (" bytes=");
     60       eputs (itoa (bytes));
     61       eputs ("\n");
     62       if (bytes > 0 && bytes < sizeof (debug_buf))
     63         {
     64           strncpy (debug_buf, data, bytes);
     65           buf[bytes] = 0;
     66           eputs ("fread buf=");
     67           eputs (debug_buf);
     68           eputs ("\n");
     69         }
     70     }
     71 
     72   if (bytes > 0)
     73     return bytes / size;
     74 
     75   return 0;
     76 }