summaryrefslogtreecommitdiffstats
path: root/private/crt32/startup/crt0msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/startup/crt0msg.c')
-rw-r--r--private/crt32/startup/crt0msg.c231
1 files changed, 231 insertions, 0 deletions
diff --git a/private/crt32/startup/crt0msg.c b/private/crt32/startup/crt0msg.c
new file mode 100644
index 000000000..5be8938e9
--- /dev/null
+++ b/private/crt32/startup/crt0msg.c
@@ -0,0 +1,231 @@
+/***
+*crt0msg.c - startup error messages
+*
+* Copyright (c) 1989-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Prints out banner for runtime error messages.
+*
+*Revision History:
+* 06-27-89 PHG Module created, based on asm version
+* 04-09-90 GJF Added #include <cruntime.h>. Made calling type
+* _CALLTYPE1. Also, fixed the copyright.
+* 04-10-90 GJF Fixed compiler warnings (-W3).
+* 06-04-90 GJF Revised to be more compatible with old scheme.
+* nmsghdr.c merged in.
+* 10-08-90 GJF New-style function declarators.
+* 10-11-90 GJF Added _RT_ABORT, _RT_FLOAT, _RT_HEAP.
+* 12-04-90 SRW Changed to include <oscalls.h> instead of <doscalls.h>
+* 12-06-90 SRW Added _CRUISER_ and _WIN32 conditionals.
+* 02-04-91 SRW Changed to call WriteFile (_WIN32_)
+* 02-25-91 MHL Adapt to ReadFile/WriteFile changes (_WIN32_)
+* 04-10-91 PNT Added _MAC_ conditional
+* 09-09-91 GJF Added _RT_ONEXIT error.
+* 09-18-91 GJF Added 3 math errors, also corrected comments for
+* errors that were changed in rterr.h, cmsgs.h.
+* 03-31-92 DJM POSIX support.
+* 10-23-92 GJF Added _RT_PUREVIRT.
+* 04-29-93 GJF Removed rterrs[] entries for _RT_STACK, _RT_INTDIV,
+* _RT_NONCONT and _RT_INVALDISP.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <internal.h>
+#include <stddef.h>
+#include <string.h>
+#include <rterr.h>
+#include <cmsgs.h>
+#include <oscalls.h>
+
+#ifdef _POSIX_
+#include <posix\sys\types.h>
+#include <posix\unistd.h>
+#endif
+
+/* struct used to lookup and access runtime error messages */
+
+struct rterrmsgs {
+ int rterrno; /* error number */
+ char *rterrtxt; /* text of error message */
+};
+
+/* runtime error messages */
+
+static struct rterrmsgs rterrs[] = {
+
+ /* 0 */
+ /* { _RT_STACK, _RT_STACK_TXT }, */
+
+ /* 2 */
+ { _RT_FLOAT, _RT_FLOAT_TXT },
+
+ /* 3 */
+ /* { _RT_INTDIV, _RT_INTDIV_TXT }, */
+
+ /* 8 */
+ { _RT_SPACEARG, _RT_SPACEARG_TXT },
+
+ /* 9 */
+ { _RT_SPACEENV, _RT_SPACEENV_TXT },
+
+ /* 10 */
+ { _RT_ABORT, _RT_ABORT_TXT },
+
+ /* 16 */
+ { _RT_THREAD, _RT_THREAD_TXT },
+
+ /* 17 */
+ { _RT_LOCK, _RT_LOCK_TXT },
+
+ /* 18 */
+ { _RT_HEAP, _RT_HEAP_TXT },
+
+ /* 19 */
+ { _RT_OPENCON, _RT_OPENCON_TXT },
+
+ /* 22 */
+ /* { _RT_NONCONT, _RT_NONCONT_TXT }, */
+
+ /* 23 */
+ /* { _RT_INVALDISP, _RT_INVALDISP_TXT }, */
+
+#ifdef _WIN32_
+
+ /* 24 */
+ { _RT_ONEXIT, _RT_ONEXIT_TXT },
+
+#endif
+
+ /* 25 */
+ { _RT_PUREVIRT, _RT_PUREVIRT_TXT },
+
+ /* 120 */
+ { _RT_DOMAIN, _RT_DOMAIN_TXT },
+
+ /* 121 */
+ { _RT_SING, _RT_SING_TXT },
+
+ /* 122 */
+ { _RT_TLOSS, _RT_TLOSS_TXT },
+
+ /* 252 */
+ { _RT_CRNL, _RT_CRNL_TXT },
+
+ /* 255 */
+ { _RT_BANNER, _RT_BANNER_TXT }
+
+};
+
+/* number of elements in rterrs[] */
+
+#define _RTERRCNT ( sizeof(rterrs) / sizeof(struct rterrmsgs) )
+
+/* For C, _FF_DBGMSG is inactive, so _adbgmsg is
+ set to null
+ For FORTRAN, _adbgmsg is set to point to
+ _FF_DBGMSG in dbginit initializer in dbgmsg.asm */
+
+void (*_adbgmsg)(void) = NULL;
+
+/***
+*_FF_MSGBANNER - writes out first part of run-time error messages
+*
+*Purpose:
+* This routine writes "\r\nrun-time error " to standard error.
+*
+* For FORTRAN $DEBUG error messages, it also uses the _FF_DBGMSG
+* routine whose address is stored in the _adbgmsg variable to print out
+* file and line number information associated with the run-time error.
+* If the value of _adbgmsg is found to be null, then the _FF_DBGMSG
+* routine won't be called from here (the case for C-only programs).
+*
+*Entry:
+* No arguments.
+*
+*Exit:
+* Nothing returned.
+*
+*Exceptions:
+* None handled.
+*
+*******************************************************************************/
+
+void _CRTAPI1 _FF_MSGBANNER (
+ void
+ )
+{
+ _NMSG_WRITE(_RT_CRNL); /* new line to begin error message */
+ if (_adbgmsg != 0)
+ _adbgmsg(); /* call __FF_DBGMSG for FORTRAN */
+ _NMSG_WRITE(_RT_BANNER); /* run-time error message banner */
+}
+
+
+/***
+*__NMSGWRITE(message) - write a given message to handle 2 (stderr)
+*
+*Purpose:
+* This routine writes the message associated with rterrnum
+* to stderr.
+*
+*Entry:
+* int rterrnum - runtime error number
+*
+*Exit:
+* no return value
+*
+*Exceptions:
+* none
+*
+*******************************************************************************/
+
+void _CRTAPI1 _NMSG_WRITE (
+ int rterrnum
+ )
+{
+ int tblindx;
+#ifndef _POSIX_
+ DWORD bytes_written; /* bytes written */
+#endif
+
+ for ( tblindx = 0 ; tblindx < _RTERRCNT ; tblindx++ )
+ if ( rterrnum == rterrs[tblindx].rterrno )
+ break;
+
+ if ( rterrnum == rterrs[tblindx].rterrno )
+#ifdef _CRUISER_
+
+ DOSWRITE(2, rterrs[tblindx].rterrtxt,
+ strlen(rterrs[tblindx].rterrtxt), &bytes_written);
+
+#else /* ndef _CRUISER_ */
+
+#ifdef _WIN32_
+
+ WriteFile((HANDLE)_osfhnd[2], rterrs[tblindx].rterrtxt,
+ strlen(rterrs[tblindx].rterrtxt), &bytes_written, NULL);
+
+#else /* ndef _WIN32_ */
+
+#ifdef _POSIX_
+ write(STDERR_FILENO,rterrs[tblindx].rterrtxt,
+ strlen(rterrs[tblindx].rterrtxt));
+#else
+
+#ifdef _MAC_
+
+ TBD();
+
+#else /* ndef _MAC_ */
+
+#error ERROR - ONLY CRUISER, WIN32, POSIX, OR MAC TARGET SUPPORTED!
+
+#endif /* _MAC_ */
+
+#endif /* _POSIX_ */
+
+#endif /* _WIN32_ */
+
+#endif /* _CRUISER_ */
+}