summaryrefslogtreecommitdiffstats
path: root/ast/ferror.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2019-05-10 16:18:58 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2019-05-10 16:18:58 (GMT)
commit5492ad5105428df25cca70ab260229f757427278 (patch)
treee2bc900ba8c297d483518d1e86405e2e0f86f0ea /ast/ferror.c
parent9646e8d50bc1481de77459d59738826f9c256ad6 (diff)
downloadblt-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.c120
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));
+
+
+}
+
+