fdgetc.c (1916B)
1 /* -*-comment-start: "//";comment-end:""-*- 2 * GNU Mes --- Maxwell Equations of Software 3 * Copyright © 2016,2017,2018,2019 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 <errno.h> 23 #include <limits.h> 24 #include <stdlib.h> 25 #include <string.h> 26 #include <sys/resource.h> 27 #include <unistd.h> 28 29 int *__ungetc_buf; 30 31 int 32 __ungetc_p (int filedes) 33 { 34 if (__ungetc_buf == 0) 35 __ungetc_init (); 36 return __ungetc_buf[filedes] >= 0; 37 } 38 39 void 40 __ungetc_init () 41 { 42 if (__ungetc_buf == 0) 43 { 44 int save_errno = errno; 45 __ungetc_buf = malloc ((__FILEDES_MAX + 1) * sizeof (int)); 46 errno = save_errno; 47 memset (__ungetc_buf, -1, (__FILEDES_MAX + 1) * sizeof (int)); 48 } 49 } 50 51 void 52 __ungetc_clear (int filedes) 53 { 54 if (__ungetc_buf == 0) 55 __ungetc_init (); 56 __ungetc_buf[filedes] = -1; 57 } 58 59 void 60 __ungetc_set (int filedes, int c) 61 { 62 if (__ungetc_buf == 0) 63 __ungetc_init (); 64 __ungetc_buf[filedes] = c; 65 } 66 67 int 68 fdgetc (int fd) 69 { 70 if (__ungetc_buf == 0) 71 __ungetc_init (); 72 73 char c; 74 int i = __ungetc_buf[fd]; 75 if (i >= 0) 76 __ungetc_buf[fd] = -1; 77 else 78 { 79 int r = read (fd, &c, 1); 80 if (r < 1) 81 return -1; 82 i = c; 83 } 84 if (i < 0) 85 i = i + 256; 86 87 return i; 88 }