📄 wcl.c
字号:
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: C/C++ Compile and Link utility.
*
****************************************************************************/
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#ifndef __UNIX__
#include <direct.h>
#else
#include <dirent.h>
#endif
#include <process.h>
#include <malloc.h>
#include <conio.h>
#include "clcommon.h"
#include "banner.h"
#undef _BANEXTRA
#define _BANEXTRA _BANEXSHORT
#ifdef WCLAXP
#define WCLNAME "wclaxp" /* Name of Compile and Link Utility*/
#define CC "wccaxp" /* Open Watcom C compiler */
#define CCXX "wppaxp" /* Open Watcom C++ compiler */
#define WCLENV "WCLAXP" /* name of environment variable */
#define STACKSIZE "8192" /* default stack size */
#define _NAME_ "C/C++ Alpha AXP "
#elif defined(WCLPPC)
#define WCLNAME "wclppc" /* Name of Compile and Link Utility*/
#define CC "wccppc" /* Open Watcom C compiler */
#define CCXX "wppppc" /* Open Watcom C++ compiler */
#define WCLENV "WCLPPC" /* name of environment variable */
#define STACKSIZE "8192" /* default stack size */
#define _NAME_ "C/C++ PowerPC "
#elif defined(WCL386)
#define WCLNAME "wcl386" /* Name of Compile and Link Utility*/
#define CC "wcc386" /* Open Watcom C compiler */
#define CCXX "wpp386" /* Open Watcom C++ compiler */
#define WCLENV "WCL386" /* name of environment variable */
#define STACKSIZE "8192" /* default stack size */
#define _NAME_ "C/C++32 "
#else
#define WCLNAME "wcl" /* Name of Compile and Link Utility*/
#define CC "wcc" /* Open Watcom C compiler */
#define CCXX "wpp" /* Open Watcom C++ compiler */
#define WCLENV "WCL" /* name of environment variable */
#define STACKSIZE "4096" /* default stack size */
#define _NAME_ "C/C++16 "
#endif
#ifdef __UNIX__
#define PATH_SEP_STR "/"
#else
#define PATH_SEP_STR "\\"
#endif
#define LINK "wlink" /* Open Watcom linker */
#define TEMPFILE "@__WCL__.LNK" /* temporary linker directive file */
/* mask for illegal file types */
static char *Cmd; /* command line parameters */
static char *Word; /* one parameter */
static char *SystemName; /* system to link for */
static char Files[MAX_CMD]; /* list of filenames from Cmd */
char Libs[MAX_CMD]; /* list of libraires from Cmd */
static char CC_Opts[MAX_CMD]; /* list of compiler options from Cmd */
static char CC_Path[_MAX_PATH]; /* path name for wcc.exe */
static char PathBuffer[_MAX_PATH];/* buffer for path name of tool */
FILE *Fp; /* file pointer for Temp_Link */
static char *Link_Name; /* name for Temp_Link if /fd specified*/
static char *Temp_Link; /* temporary linker directive file */
struct list *Obj_List; /* linked list of object filenames */
static struct directives *Directive_List; /* linked list of directives */
static char Switch_Chars[4]; /* valid switch characters */
char Exe_Name[_MAX_PATH];/* name of executable */
char *Map_Name; /* name of map file */
char *Obj_Name; /* object file name pattern */
static char *StackSize; /* size of stack */
static char DebugFlag; /* debug info wanted */
static char Conventions; /* 'r' for -3r or 's' for -3s */
struct flags Flags;
/*
* Static function prototypes
*/
int Parse( void );
int CompLink( void );
char *SkipSpaces( char * );
void Fputnl( char *, FILE * );
void *MemAlloc( int );
void MakeName( char *, char * );
void Usage( void );
#if defined( __UNIX__ )
#define _dos_switch_char() '-'
#elif defined( __OS2__ ) || defined( __NT__ )
#define _dos_switch_char() '/'
#else
extern int _dos_switch_char();
#endif
#ifdef __UNIX__
#define EXE_EXT ""
#else
#define EXE_EXT ".exe"
#endif
char *EnglishMsgs[] = {
#undef pick
#undef E
#undef J
#define E(msg) msg
#define J(msg)
#define pick(code,english) english
#include "wclmsg.h"
};
char *JapaneseMsgs[] = {
#undef pick
#undef E
#undef J
#define E(msg)
#define J(msg) msg
#define pick(code,japanese) japanese
#include "wclmsg.h"
};
char **WclMsgs = EnglishMsgs;
void print_banner( void )
{
static int done;
if( done ) return;
puts( banner1w( _NAME_ "Compile and Link Utility",_WCL_VERSION_) );
puts( banner2( "1988" ) );
puts( banner3 );
puts( banner3a );
done = 1;
}
void main()
/**********/
{
int rc;
char *wcl_env;
char *p;
char *q;
// determine language to use and set WclMsgs
CC_Opts[0] = '\0';
Switch_Chars[0] = '-';
Switch_Chars[1] = _dos_switch_char();
Switch_Chars[2] = '\0';
Word = MemAlloc( MAX_CMD );
Cmd = MemAlloc( MAX_CMD*2 ); /*enough for cmd line & wcl variable*/
/* add wcl environment variable to Cmd */
/* unless /y is specified in either Cmd or wcl */
wcl_env = getenv( WCLENV );
if( wcl_env != NULL ) {
strcpy( Cmd, wcl_env );
strcat( Cmd, " " );
p = Cmd + strlen( Cmd );
getcmd( p );
q = Cmd;
while( ( q = strpbrk( q, Switch_Chars ) ) != NULL ) {
if( tolower( *(++q) ) == 'y' ) {
getcmd( Cmd );
p = Cmd;
break;
}
}
} else {
getcmd( Cmd );
p = Cmd;
}
p = SkipSpaces( p );
if( *p == NULLCHAR || strncmp( p, "? ", 2 ) == NULL ) {
Usage();
exit( 1 );
}
Temp_Link = TEMPFILE;
if( ( Fp = fopen( &Temp_Link[ 1 ], "w" ) ) == NULL ) {
PrintMsg( WclMsgs[ UNABLE_TO_OPEN_TEMPORARY_FILE ] );
exit( 1 );
}
Map_Name = NULL;
Obj_Name = NULL;
Directive_List = NULL;
rc = Parse();
if( rc == 0 ) {
if( ! Flags.be_quiet ) {
print_banner();
}
rc = CompLink();
}
if( rc == 1 ) fclose( Fp );
if( Link_Name != NULL ) {
if( stricmp( Link_Name, &Temp_Link[ 1 ] ) != 0 ) {
remove( Link_Name );
rename( &Temp_Link[ 1 ], Link_Name );
}
} else {
remove( &Temp_Link[ 1 ] );
}
exit( rc == 0 ? 0 : 1 );
}
static char *ScanFName( char *end, int len )
{
int quoted;
if( *Word == '=' ) {
quoted = ( *(Word + 1) == '"' );
} else {
quoted = ( *Word == '"' );
}
quoted ^= ( *(end - 1) == '"' );
for(;;) { /* 15-jan-89: Allow '-' in filenames */
if( *end == '\0' ) break;
if( !quoted ) {
if( *end == ' ' ) break;
if( *end == '\t' ) break; /* 16-mar-91 */
#ifndef __UNIX__
if( *end == Switch_Chars[1] ) break;
#endif
} else if( *end == '"' ) {
quoted = 0;
}
Word[ len ] = *end;
++len;
++end;
}
Word[ len ] = NULLCHAR;
return( end );
}
static int FileExtension( char *p, char *ext )
{
char *dot;
dot = NULL;
while( *p != '\0' ) {
if( *p == '.' ) dot = p;
++p;
}
if( dot != NULL ) {
if( stricmp( dot, ext ) == 0 ) {
return( 1 ); // indicate file extension matches
}
}
return( 0 ); // indicate no match
}
static void AddDirective( int len )
/*********************************/
{
struct directives *p;
struct directives *p2;
p = MemAlloc( sizeof(struct directives) );
p->next = NULL;
p->directive = MemAlloc( len + 1 );
strcpy( p->directive, Word );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -