/*
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *%	  Copyright (C) 1986,1991 by WATCOM Systems Inc. All rights %
 *%	  reserved. No part of this software may be reproduced	    %
 *%	  in any form or by any means - graphic, electronic or	    %
 *%	  mechanical, including photocopying, recording, taping     %
 *%	  or information storage and retrieval systems - except     %
 *%	  with the written permission of WATCOM Systems Inc.	    %
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  Modified:	By:		Reason:
  ---------	---		-------
  18-mar-92	Craig Eisler	defined for NT
  17-nov-92	F.W.Crigger	call  __NTMainInit
  23-nov-92	Craig Eisler	exception handling
--------------------------------------------------------Version-11.0---------
  22-feb-95	Greg Bentz	alpha support
  15-sep-95	Greg Bentz	ppc support
  02-may-96	Greg Bentz	wide character startup
--------------------------------------------------------Version-11.0c--------
  05-apr-00	J.B.Schueler	Added a 2nd arg to __NewExceptionHandler to
				indicate that the unhandled exception filter
				should be installed.
*/

#include "variety.h"
#include "widechar.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
#include "ntex.h"
#include "sigtab.h"
#include "initfini.h"

#ifdef __SW_BR
    _WCRTLINK extern	void	(*__process_fini)(unsigned,unsigned);
    _WCRTLINK extern	int	___Argc;	/* argument count */
    _WCRTLINK extern	int	___wArgc;	/* argument count */
    _WCRTLINK extern	char	**___Argv;	/* argument vector */
    _WCRTLINK extern	wchar_t **___wArgv;	/* argument vector */
    extern	void	__CommonInit( void );
    extern	int	wmain( int, wchar_t ** );
    extern	int	main( int, char ** );
#else
    extern	void		__NTMainInit( void *, void * );
    #ifdef __WIDECHAR__
	extern	void		__wCMain( void );
	#if defined(_M_IX86)
	    #pragma aux __wCMain  "*"
	#endif
    #else
	extern	void		__CMain( void );
	#if defined(_M_IX86)
	    #pragma aux __CMain  "*"
	#endif
    #endif
    extern	unsigned	__ThreadDataSize;
#endif

void __F_NAME(__NTMain,__wNTMain)( void )
/***************************************/
{

    #if defined(__SW_BR)
    {
	#if defined(_M_IX86)
	    REGISTRATION_RECORD rr;
            __NewExceptionFilter( &rr );
	#endif
	__process_fini = &__FiniRtns;
	__InitRtns( 255 );
	__CommonInit();
	#ifdef __WIDECHAR__
	    exit( wmain( ___Argc, ___wArgv ) );
	#else
	    exit( main( ___Argc, ___Argv ) );
	#endif
    }
    #else
    {
	REGISTRATION_RECORD	rr;
	thread_data		*tdata;
	__InitRtns( 1 );
	tdata = __alloca( __ThreadDataSize );
	memset( tdata, 0, __ThreadDataSize );
	// tdata->__allocated = 0;
	tdata->__data_size = __ThreadDataSize;

	__NTMainInit( &rr, tdata );
	__F_NAME(__CMain,__wCMain)();
    }
    #endif
}
#ifdef __WIDECHAR__
    #if defined(_M_IX86)
	#pragma aux __wNTMain "*"
    #endif
#else
    #if defined(_M_IX86)
	#pragma aux __NTMain "*"
    #endif
#endif
