2020-09-30 17:12:29 +02:00

236 lines
8.9 KiB
C

/*** globals.c - global variables/needed across modules ************************
*
* Copyright (c) 1988-1990, Microsoft Corporation. All rights reserved.
*
* Purpose:
* This is the routine in which global variables reside.
*
* HackAlert:
* The functionality explained in the Notes below work only because of the way
* Microsoft Compiler's upto C6.0A allocate initialized data ... in the order
* in which it is specified. All variables between startOfSave and endOfSave
* have to be initialized. According to ChuckG this functionality is not
* guaranteed in C7.0 and so these should be moved to a struct.
*
* Notes:
* This module was created for an interesting reason. NMAKE handles recursive
* calls by saving its global variables somewhere in memory. It handles this by
* allocating all global variables which have value changes in each recursive
* in adjacent memory. The routine called recursively is doMake() and before it
* is called the address of this chunk of memory is stored. When the recursive
* call returns the memory is restored using the stored address. startOfSave and
* endOfSave give the location of this chunk. The reason this method was opted
* for is that spawning of NMAKE would consume a lot of memory under DOS. This
* might not be very efficient under OS/2 because the code gets shared.
*
* Revision History:
* 15-Nov-1993 JR Major speed improvements
* 04-Apr-1990 SB Add fHeapChk
* 01-Dec-1989 SB Made some variables near and pushed some into saveArea
* 19-Oct-1989 SB variable fOptionK added (ifdef SLASHK)
* 02-Oct-1989 SB add dynamic inline file handling support
* 18-May-1989 SB Support of H and NOLOGO in MAKEFLAGS
* 24-Apr-1989 SB Added ext_size, filename_size, filenameext_size &
* resultbuf_size for OS/2 1.2 support
* 05-Apr-1989 SB made revList, delList, scriptFileList NEAR
* 22-Mar-1989 SB removed tmpFileStack and related variables
* 16-Feb-1989 SB added delList to have scriptfile deletes at end of make
* 21-Dec-1988 SB Added scriptFileList to handle multiple script files
* removed tmpScriptFile and fKeep (not reqd anymore)
* 19-Dec-1988 SB Added fKeep to handle KEEP/NOKEEP
* 14-Dec-1988 SB Added tmpScriptFile to handle 'z' option
* 30-Nov-1988 SB Added revList to handle 'z' option
* 23-Nov-1988 SB Added CmdLine[] to handle extmake syntax
* made pCmdLineCopy Global in build.c
* 21-Oct-1988 SB Added fInheritUserEnv to inherit macros
* 15-Sep-1988 RB Move some def's here for completeness.
* 17-Aug-1988 RB Declare everything near.
* 06-Jul-1988 rj Ditched shell and argVector globals.
*
*******************************************************************************/
#include "nmake.h"
#include "nmmsg.h"
#include "proto.h"
#include "globals.h"
#include "grammar.h"
#if defined(STATISTICS)
unsigned long CntfindMacro;
unsigned long CntmacroChains;
unsigned long CntinsertMacro;
unsigned long CntfindTarget;
unsigned long CnttargetChains;
unsigned long CntStriCmp;
unsigned long CntunQuotes;
unsigned long CntFreeStrList;
unsigned long CntAllocStrList;
#endif
/* start of SAVE BLOCK is address of the following BYTE - a dummy */
UCHAR NEAR startOfSave = 0;
BOOL NEAR fOptionK = FALSE; /* TRUE if user specifies /K */
BOOL NEAR fDescRebuildOrder = FALSE; /* TRUE if user specifies /O */
BOOL NEAR fNoEmsXms = FALSE; /* TRUE if user specified /M */
BOOL NEAR fSlashKStatus = TRUE; // no error when slash K specified
/* Used by action.c & nmake.c
*
* Required to make NMAKE inherit user modified changes to the environment. To
* be set to true before defineMacro() is called so that user defined changes
* in environment variables are reflected in the environment. If set to false
* then these changes are made only in NMAKE tables and the environment remains
* unchanged
*/
BOOL NEAR fInheritUserEnv = FALSE;
/*
* TRUE if /b specified, Rebuild on tie
*/
BOOL NEAR fRebuildOnTie = FALSE;
/*
* TRUE if /v specified, Inherit macros to child
*/
#if defined(SELF_RECURSE)
BOOL NEAR fInheritMacros = FALSE;
#endif
/* Used by action.c and nmake.c
*
* delList is the list of delete commands for deleting inline files which are
* not required anymore (have a NOKEEP action specified.
*/
STRINGLIST * NEAR delList = NULL;
/* Complete list of generated inline files. Required to avoid duplicate names
* NOTNEEDED
*/
STRINGLIST * NEAR inlineFileList = NULL;
#ifndef NO_OPTION_Z
/* Used by print.c and build.c and nmake.c
*
* revList is the list of Commands in reverse order required for
* implementing 'z' option. Used by printReverseFile().
*/
STRINGLIST * NEAR revList = NULL;
#endif
/* from NMAKE.C */
/* No of blanks is same as no of Allowed options in NMAKE; currently 14 */
/* L = nologo, H = help */
/* corr to ACDEHILNPQRSTZ */
char NEAR makeflags[] = "MAKEFLAGS= ";
BOOL NEAR firstToken = FALSE; /* to initialize parser */
BOOL NEAR bannerDisplayed = FALSE;
UCHAR NEAR flags = 0; /* holds -d -s -n -i */
UCHAR NEAR gFlags = 0; /* "global" -- all targets*/
FILE * NEAR file = NULL;
STRINGLIST * NEAR makeTargets = NULL; /* list of targets to make*/
STRINGLIST * NEAR makeFiles = NULL; /* user can specify > 1 */
BOOL NEAR fDebug = FALSE;
MACRODEF * NEAR pMacros = NULL;
STRINGLIST * NEAR pValues = NULL;
/* from LEXER.C */
/* global flag set if at column zero of a makefile/tools.ini */
BOOL NEAR colZero = TRUE;
unsigned NEAR line = 0;
char * NEAR fName = NULL;
char * NEAR string = NULL;
INCLUDEINFO NEAR incStack[MAXINCLUDE]; //Assume this is initialized to null
int NEAR incTop = 0;
/* Inline file list -- Gets created in lexer.c and is used by action.c to
* produce a delete command when 'NOKEEP' or Z option is set
*/
SCRIPTLIST * NEAR scriptFileList = NULL;
/* from PARSER.C */
/* global boolean value to indicate if tools.ini is being parsed */
BOOL NEAR init = FALSE;
UCHAR NEAR stack[STACKSIZE] = {0};
int NEAR top = -1; /* gets pre-incremented before use*/
unsigned NEAR currentLine = 0; /* used for all error messages */
/* from ACTION.C */
MACRODEF * NEAR macroTable[MAXMACRO] = {NULL};
MAKEOBJECT * NEAR targetTable[MAXTARGET] = {NULL};
STRINGLIST * NEAR macros = NULL;
STRINGLIST * NEAR dotSuffixList = NULL;
STRINGLIST * NEAR dotPreciousList = NULL;
RULELIST * NEAR rules = NULL;
STRINGLIST * NEAR list = NULL;
char * NEAR name = NULL;
BUILDBLOCK * NEAR block = NULL;
UCHAR NEAR currentFlags = FALSE;
UCHAR NEAR actionFlags = FALSE;
/* from BUILD.C */
long NEAR errorLevel = 0L;
unsigned NEAR numCommands = 0;
char * NEAR progName = NULL;
char * NEAR shellName = NULL;
char NEAR bufPath[512];
char * NEAR pCmdLineCopy = NULL;
char CmdLine[MAXCMDLINELENGTH];
/* from IFEXPR.C */
UCHAR NEAR ifStack[IFSTACKSIZE] = {0};
int NEAR ifTop = -1; /* pre-incremented */
char * NEAR lbufPtr = NULL; /* ptr to alloced buf */
char * NEAR prevDirPtr = NULL; /* ptr to directive */
unsigned NEAR lbufSize = 0; /* initial size */
int NEAR chBuf = -1;
/* from UTIL.C */
char * NEAR dollarDollarAt = NULL;
char * NEAR dollarLessThan = NULL;
char * NEAR dollarStar = NULL;
char * NEAR dollarAt = NULL;
STRINGLIST * NEAR dollarQuestion = NULL;
STRINGLIST * NEAR dollarStarStar = NULL;
int NEAR DirHandle = 0;
/* from parser.c */
char NEAR buf[MAXBUF] = {0};
/* end of SAVE BLOCK is address of the following BYTE - a dummy */
UCHAR NEAR endOfSave = 0;
/* from action.c */
char NEAR suffixes[] = ".SUFFIXES";
char NEAR ignore[] = ".IGNORE";
char NEAR silent[] = ".SILENT";
char NEAR precious[] = ".PRECIOUS";
unsigned NEAR ext_size = 4; /* default .ext size */
unsigned NEAR filename_size = 8; /* filename size */
unsigned NEAR filenameext_size = 13; /* filename.ext size */
unsigned NEAR resultbuf_size = 36; /* fileFindBuf size */
/* This flag activates special heap functionality.
*
* When TRUE allocate() asks for extra bytes from CRT functions and adds
* signatures before and after the allocation. Any subsequent calls to
* free_memory() and realloc_memory() check for the presence of these
* sentinels and assert when such trashing occurs.
*/
#ifdef HEAP
BOOL fHeapChk = TRUE;
#endif