From 185d7d97506315bcf48bae38d410f68af50eba4a Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Fri, 28 Oct 2005 23:16:17 +0200 Subject: check.c (gfc_check_alarm_sub, [...]): New functions. * check.c (gfc_check_alarm_sub, gfc_check_signal, gfc_check_signal_sub): New functions. * gfortran.h (gfc_generic_isym_id): Add GFC_ISYM_SIGNAL. * intrinsic.c (add_functions): Add signal intrinsic. (add_subroutines): Add signal and alarm intrinsics. * intrinsic.texi: Document the new intrinsics. * iresolve.c (gfc_resolve_signal, gfc_resolve_alarm_sub, gfc_resolve_signal_sub): New functions. * trans-intrinsic.c (gfc_conv_intrinsic_function): Add case for GFC_ISYM_SIGNAL. * intrinsic.h: Add prototypes for gfc_check_alarm_sub, gfc_check_signal, gfc_check_signal_sub, gfc_resolve_signal, gfc_resolve_alarm_sub, gfc_resolve_signal_sub. * Makefile.am (intrinsics): Add signal.c. * Makefile.in: Regenerate. * configure.ac: Checks for signal and alarm. * config.h.in: Regenerate. * configure: Regenerate. * intrinsics/signal.c: New file for SIGNAL and ALARM intrinsics. From-SVN: r105967 --- libgfortran/intrinsics/signal.c | 170 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 libgfortran/intrinsics/signal.c (limited to 'libgfortran/intrinsics/signal.c') diff --git a/libgfortran/intrinsics/signal.c b/libgfortran/intrinsics/signal.c new file mode 100644 index 0000000..9e40358 --- /dev/null +++ b/libgfortran/intrinsics/signal.c @@ -0,0 +1,170 @@ +/* Implementation of the SIGNAL and ALARM g77 intrinsics + Contributed by François-Xavier Coudert + +This file is part of the GNU Fortran 95 runtime library (libgfortran). + +Libgfortran 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 2 of the License, or (at your option) any later version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +Libgfortran 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 libgfortran; see the file COPYING. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "libgfortran.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SIGNAL_H +#include +#endif + +#include + +/* SIGNAL subroutine with PROCEDURE as handler */ +extern void signal_sub (int *, void (*)(int), int *); +iexport_proto(signal_sub); + +void +signal_sub (int *number, void (*handler)(int), int *status) +{ +#ifdef HAVE_SIGNAL + if (status != NULL) + *status = (int) signal (*number, handler); + else + signal (*number, handler); +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(signal_sub); + + +/* SIGNAL subroutine with INTEGER as handler */ +extern void signal_sub_int (int *, int *, int *); +iexport_proto(signal_sub_int); + +void +signal_sub_int (int *number, int *handler, int *status) +{ +#ifdef HAVE_SIGNAL + if (status != NULL) + *status = (int) signal (*number, (void (*)(int)) *handler); + else + signal (*number, (void (*)(int)) *handler); +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(signal_sub_int); + + +/* SIGNAL function with PROCEDURE as handler */ +extern int signal_func (int *, void (*)(int)); +iexport_proto(signal_func); + +int +signal_func (int *number, void (*handler)(int)) +{ + int status; + signal_sub (number, handler, &status); + return status; +} +iexport(signal_func); + + +/* SIGNAL function with INTEGER as handler */ +extern int signal_func_int (int *, int *); +iexport_proto(signal_func_int); + +int +signal_func_int (int *number, int *handler) +{ + int status; + signal_sub_int (number, handler, &status); + return status; +} +iexport(signal_func_int); + + + +/* ALARM intrinsic with PROCEDURE as handler */ +extern void alarm_sub (int *, void (*)(int), int *); +iexport_proto(alarm_sub); + +void +alarm_sub (int *seconds, void (*handler)(int), int *status) +{ +#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) + if (status != NULL) + { + if (signal (SIGALRM, handler) == SIG_ERR) + *status = -1; + else + *status = alarm (*seconds); + } + else + { + signal (SIGALRM, handler); + alarm (*seconds); + } +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(alarm_sub); + + +/* ALARM intrinsic with INTEGER as handler */ +extern void alarm_sub_int (int *, int *, int *); +iexport_proto(alarm_sub_int); + +void +alarm_sub_int (int *seconds, int *handler, int *status) +{ +#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL) + if (status != NULL) + { + if (signal (SIGALRM, (void (*)(int)) handler) == SIG_ERR) + *status = -1; + else + *status = alarm (*seconds); + } + else + { + signal (SIGALRM, (void (*)(int)) handler); + alarm (*seconds); + } +#else + errno = ENOSYS; + if (status != NULL) + *status = -1; +#endif +} +iexport(alarm_sub_int); + -- cgit v1.1