//  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 "precomp.h"
#pragma hdrstop

#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

BOOL          fOptionK;             // TRUE if user specifies /K
BOOL          fDescRebuildOrder;    // TRUE if user specifies /O
BOOL          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          fInheritUserEnv;

BOOL fRebuildOnTie;                 //  TRUE if /b specified, Rebuild on tie

// 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  * delList;

// Complete list of generated inline files. Required to avoid duplicate names
// NOTNEEDED

STRINGLIST  * inlineFileList;

// from NMAKE.C
      // No of blanks is same as no of Allowed options in NMAKE; currently 14
      // L = nologo, H = help
      //      corr to                  ABCDEHIKLNPQRSTUY?
char          makeflags[] = "MAKEFLAGS=                  ";
BOOL          firstToken;           // to initialize parser
BOOL          bannerDisplayed;
UCHAR         flags;                // holds -d -s -n -i -u
UCHAR         gFlags;               // "global" -- all targets
FILE        * file;
STRINGLIST  * makeTargets;          // list of targets to make
STRINGLIST  * makeFiles;            // user can specify > 1
BOOL          fDebug;
MACRODEF    * pMacros;
STRINGLIST  * pValues;

// from LEXER.C
BOOL          colZero       = TRUE; // global flag set if at column zero of a makefile/tools.ini
unsigned      line;
char        * fName;
char        * string;
INCLUDEINFO   incStack[MAXINCLUDE]; //Assume this is initialized to null
int           incTop;

// 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  * scriptFileList;

// from PARSER.C
BOOL          init;                 // global boolean value to indicate if tools.ini is being parsed
UCHAR         stack[STACKSIZE];
int           top       = -1;       // gets pre-incremented before use
unsigned      currentLine;          // used for all error messages

// from ACTION.C


MACRODEF    * macroTable[MAXMACRO];
MAKEOBJECT  * targetTable[MAXTARGET];
STRINGLIST  * macros;
STRINGLIST  * dotSuffixList;
STRINGLIST  * dotPreciousList;
RULELIST    * rules;
STRINGLIST  * list;
char        * name;
BUILDBLOCK  * block;
UCHAR         currentFlags;
UCHAR         actionFlags;

// from BUILD.C


unsigned      errorLevel;
unsigned      numCommands;
char        * shellName;
char        * pCmdLineCopy;
char          CmdLine[MAXCMDLINELENGTH];

// from IFEXPR.C

UCHAR         ifStack[IFSTACKSIZE];
int           ifTop     = -1;       // pre-incremented
char        * lbufPtr;              // ptr to alloced buf
char        * prevDirPtr;           // ptr to directive
unsigned      lbufSize;             // initial size
int           chBuf     = -1;


// from UTIL.C

char        * dollarDollarAt;
char        * dollarLessThan;
char        * dollarStar;
char        * dollarAt;
STRINGLIST  * dollarQuestion;
STRINGLIST  * dollarStarStar;

// from parser.c

char          buf[MAXBUF];

// from action.c

const char    suffixes[]  = ".SUFFIXES";
const char    ignore[]    = ".IGNORE";
const char    silent[]    = ".SILENT";
const char    precious[]  = ".PRECIOUS";