diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2019-05-10 16:18:58 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2019-05-10 16:18:58 (GMT) |
commit | 5492ad5105428df25cca70ab260229f757427278 (patch) | |
tree | e2bc900ba8c297d483518d1e86405e2e0f86f0ea /ast/ferror.c | |
parent | 9646e8d50bc1481de77459d59738826f9c256ad6 (diff) | |
download | blt-5492ad5105428df25cca70ab260229f757427278.zip blt-5492ad5105428df25cca70ab260229f757427278.tar.gz blt-5492ad5105428df25cca70ab260229f757427278.tar.bz2 |
upgrade ast 8.7.1
Diffstat (limited to 'ast/ferror.c')
-rw-r--r-- | ast/ferror.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/ast/ferror.c b/ast/ferror.c new file mode 100644 index 0000000..7407b0f --- /dev/null +++ b/ast/ferror.c @@ -0,0 +1,120 @@ +/* +*+ +* Name: +* ferror.c + +* Purpose: +* Define a FORTRAN 77 interface to the AST Error module. + +* Type of Module: +* C source file. + +* Description: +* This file defines FORTRAN 77-callable C functions which provide +* a public FORTRAN 77 interface to the Error module. + +* Routines Defined: +* None. + +* Copyright: +* Copyright (C) 1997-2006 Council for the Central Laboratory of the +* Research Councils + +* Licence: +* This program is free software: you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation, either +* version 3 of the License, or (at your option) any later +* version. +* +* This program 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 Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General +* License along with this program. If not, see +* <http://www.gnu.org/licenses/>. + +* Authors: +* RFWS: R.F. Warren-Smith (Starlink) + +* History: +* 15-JUL-1996 (RFWS): +* Original version. +*/ + +/* Define the astFORTRAN77 macro which prevents error messages from + AST C functions from reporting the file and line number where the + error occurred (since these would refer to this file, they would + not be useful). */ +#define astFORTRAN77 + +#define MXSTRLEN 80 /* String length at which truncation starts + within astPutErr */ +/* Header files. */ +/* ============= */ +#include "f77.h" /* FORTRAN <-> C interface macros (SUN/209) */ +#include "error.h" /* C interface to the Error module */ +#include "c2f77.h" /* F77 <-> C support functions/macros */ + + +/* Prototypes for external functions. */ +/* ================================== */ +/* This is the null function defined by the FORTRAN interface in +fobject.c. */ +F77_SUBROUTINE(ast_null)( void ); + +static void FPutErrWrapper( AstPutErrFun, int, const char * ); + + +/* Wrapper functions */ +/* ================= */ +F77_SUBROUTINE(ast_setputerr)( AstPutErrFun FUN, INTEGER(STATUS) ) { + AstPutErrFun fun; + const char *class; /* Object class */ + const char *method; /* Current method */ + + method = "AST_GRFSET"; + class = "Plot"; + + astAt( method, NULL, 0 ); + astWatchSTATUS( + +/* Set the function pointer to NULL if a pointer to + the null routine AST_NULL has been supplied. */ + fun = FUN; + if ( fun == (AstPutErrFun) F77_EXTERNAL_NAME(ast_null) ) { + fun = NULL; + } + +/* Store the function pointer in the error module. */ + astSetPutErr( fun ); + +/* The above call assumes that "fun" uses C calling conventions. Since in + fact "fun" uses Fortran calling conventions, we need to tell the error + module to call "fun" via a wrapper that converts strings etc from C to + Fortran. */ + astSetPutErrWrapper( FPutErrWrapper ); + ) +} + + +static void FPutErrWrapper( AstPutErrFun fun, int status_value, const char *message ){ + + DECLARE_CHARACTER(LMESSAGE,MXSTRLEN); + int fmessage_length; + + fmessage_length = strlen( message ); + if( fmessage_length > LMESSAGE_length ) fmessage_length = LMESSAGE_length; + astStringExport( message, LMESSAGE, fmessage_length ); + + ( *(void (*)( INTEGER(status_value), CHARACTER(LMESSAGE) + TRAIL(fmessage) ) ) fun)(INTEGER_ARG(&status_value), + CHARACTER_ARG(LMESSAGE) + TRAIL_ARG(fmessage)); + + +} + + |