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 }