/* Glibc.c provides access to some libc functions. Copyright (C) 2016-2023 Free Software Foundation, Inc. Contributed by Gaius Mulley . This file is part of GNU Modula-2. GNU Modula-2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Modula-2; see the file COPYING3. If not see . */ #include "config.h" #include "system.h" #if defined(__cplusplus) #define EXTERN extern "C" #else #define EXTERN #endif EXTERN int libc_read (int fd, void *a, int nbytes) { return read (fd, a, nbytes); } EXTERN int libc_write (int fd, void *a, int nbytes) { return write (fd, a, nbytes); } EXTERN int libc_close (int fd) { return close (fd); } EXTERN int libc_exit (int code) { exit (code); } EXTERN void libc_perror (char *s) { perror (s); } EXTERN int libc_abort () { abort (); } EXTERN int libc_strlen (char *s) { return strlen (s); } EXTERN time_t libc_time (time_t *buf) { return time (buf); } EXTERN void * libc_localtime (time_t *epochtime) { return localtime (epochtime); } EXTERN int libc_printf (char *_format, unsigned int _format_high, ...) { va_list arg; int done; char format[_format_high + 1]; unsigned int i = 0; unsigned int j = 0; char *c; do { c = index (&_format[i], '\\'); if (c == NULL) strcpy (&format[j], &_format[i]); else { memcpy (&format[j], &_format[i], (c - _format) - i); i = c - _format; j += c - _format; if (_format[i + 1] == 'n') format[j] = '\n'; else format[j] = _format[i + 1]; j++; i += 2; } } while (c != NULL); va_start (arg, _format_high); done = vfprintf (stdout, format, arg); va_end (arg); return done; } EXTERN int libc_snprintf (char *dest, size_t length, char *_format, unsigned int _format_high, ...) { va_list arg; int done; char format[_format_high + 1]; unsigned int i = 0; unsigned int j = 0; char *c; do { c = index (&_format[i], '\\'); if (c == NULL) strcpy (&format[j], &_format[i]); else { memcpy (&format[j], &_format[i], (c - _format) - i); i = c - _format; j += c - _format; if (_format[i + 1] == 'n') format[j] = '\n'; else format[j] = _format[i + 1]; j++; i += 2; } } while (c != NULL); va_start (arg, _format_high); done = vsnprintf (dest, length, format, arg); va_end (arg); return done; } EXTERN void * libc_malloc (unsigned int size) { return malloc (size); } EXTERN void libc_free (void *p) { free (p); } EXTERN char * libc_strcpy (char *dest, char *src) { return strcpy (dest, src); } EXTERN char * libc_strncpy (char *dest, char *src, int n) { return strncpy (dest, src, n); } EXTERN int libc_unlink (char *p) { return unlink (p); } EXTERN int libc_system (char *command) { return system (command); } EXTERN void * libc_memcpy (void *dest, void *src, int n) { return memcpy (dest, src, n); } EXTERN char * libc_getenv (char *name) { return getenv (name); } EXTERN int libc_putenv (char *name) { return putenv (name); } EXTERN int libc_creat (char *p, mode_t mode) { return creat (p, mode); } EXTERN int libc_open (char *p, int flags, mode_t mode) { return open (p, flags, mode); } EXTERN off_t libc_lseek (int fd, off_t offset, int whence) { return lseek (fd, offset, whence); } EXTERN void * libc_realloc (void *ptr, size_t size) { return realloc (ptr, size); } EXTERN void * libc_memset (void *s, int c, size_t n) { return memset (s, c, n); } EXTERN void * libc_memmove (void *dest, void *src, size_t n) { return memmove (dest, src, n); } EXTERN int libc_getpid (void) { return getpid (); } EXTERN unsigned int libc_sleep (unsigned int s) { return sleep (s); } EXTERN int libc_atexit (void (*function) (void)) { return atexit (function); }