diff options
Diffstat (limited to 'dmake/imacs.c')
-rw-r--r-- | dmake/imacs.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/dmake/imacs.c b/dmake/imacs.c new file mode 100644 index 000000000000..437a2a53c8a6 --- /dev/null +++ b/dmake/imacs.c @@ -0,0 +1,206 @@ +/* RCS $Id: imacs.c,v 1.9 2008-03-05 18:29:01 kz Exp $ +-- +-- SYNOPSIS +-- Define default internal macros. +-- +-- DESCRIPTION +-- This file adds to the internal macro tables the set of default +-- internal macros, and for those that are accessible internally via +-- variables creates these variables, and initializes them to point +-- at the default values of these macros. +-- +-- AUTHOR +-- Dennis Vadura, dvadura@dmake.wticorp.com +-- +-- WWW +-- http://dmake.wticorp.com/ +-- +-- COPYRIGHT +-- Copyright (c) 1996,1997 by WTI Corp. All rights reserved. +-- +-- This program is NOT free software; you can redistribute it and/or +-- modify it under the terms of the Software License Agreement Provided +-- in the file <distribution-root>/readme/license.txt. +-- +-- LOG +-- Use cvs log to obtain detailed change logs. +*/ + +#include "extern.h" + +static void _set_int_var ANSI((char *, char *, int, int *)); +static void _set_string_var ANSI((char *, char *, int, char **)); +static void _set_bit_var ANSI((char *, char *, int)); + + +PUBLIC void +Make_rules()/* +============== + Parse the strings stored in Rule_tab (from ruletab.c). */ +{ + Parse(NIL(FILE)); +} + + +#define M_FLAG M_DEFAULT | M_EXPANDED + +/* +** Add to the macro table all of the internal macro variables plus +** create secondary variables which will give access to their values +** easily, both when needed and when the macro value is modified. +** The latter is accomplished by providing a flag in the macro and a field +** which gives a pointer to the value if it is a char or string macro value +** and a mask representing the bit of the global flag register that is affected +** by this macro's value. +*/ +PUBLIC void +Create_macro_vars() +{ + static char* switchar; + static char* version; + char swchar[2]; + char buf[20]; + + swchar[0] = Get_switch_char(), swchar[1] = '\0'; + _set_string_var("SWITCHAR", swchar, M_PRECIOUS, &switchar); + if (*swchar == '/') + DirSepStr = "\\"; + else +#if (_MPW) + DirSepStr = ":"; +#elif defined( __EMX__) + /* Use '\' for OS/2 port. */ + DirSepStr = "\\"; +#else + DirSepStr = "/"; +#endif + _set_string_var("DIRSEPSTR", DirSepStr, M_DEFAULT,&DirSepStr); + _set_string_var("DIRBRKSTR", DirBrkStr, M_DEFAULT, &DirBrkStr); + swchar[0] = DEF_ESCAPE_CHAR, swchar[1] = '\0'; + _set_string_var(".ESCAPE_PREFIX", swchar, M_FLAG, &Escape_char); + + /* Each one the following attributes corresponds to a bit of + * Glob_attr. */ + _set_bit_var(".SILENT", "", A_SILENT ); + _set_bit_var(".IGNORE", "", A_IGNORE ); + _set_bit_var(".PRECIOUS", "", A_PRECIOUS); + _set_bit_var(".EPILOG", "", A_EPILOG ); + _set_bit_var(".PROLOG", "", A_PROLOG ); + _set_bit_var(".NOINFER", "", A_NOINFER ); + _set_bit_var(".SEQUENTIAL","",A_SEQ ); + _set_bit_var(".USESHELL", "", A_SHELL ); + /* .SWAP (MSDOS) and .WINPATH (cygwin) share the same bit. */ + _set_bit_var(".SWAP", "", A_SWAP ); + _set_bit_var(".WINPATH", "", A_WINPATH ); + _set_bit_var(".MKSARGS", "", A_MKSARGS ); + _set_bit_var(".IGNOREGROUP","",A_IGNOREGROUP); + + Glob_attr = A_DEFAULT; /* set all flags to NULL */ + + _set_string_var("SHELL", "", M_DEFAULT, &Shell ); + _set_string_var("SHELLFLAGS", " ", M_DEFAULT, &Shell_flags ); + _set_string_var("SHELLCMDQUOTE","", M_DEFAULT, &Shell_quote ); + _set_string_var("GROUPSHELL", "", M_DEFAULT, &GShell ); + _set_string_var("GROUPFLAGS", " ", M_DEFAULT, &GShell_flags); + _set_string_var("SHELLMETAS", "", M_DEFAULT, &Shell_metas ); + _set_string_var("GROUPSUFFIX", "", M_DEFAULT, &Grp_suff ); + _set_string_var("AUGMAKE",NIL(char), M_DEFAULT, &Augmake ); + _set_string_var("OOODMAKEMODE", "", M_DEFAULT, &OOoDmMode ); + _set_string_var(".KEEP_STATE", "", M_DEFAULT, &Keep_state ); + _set_string_var(".NOTABS", "", M_MULTI, &Notabs ); + _set_string_var(".DIRCACHE", "y", M_DEFAULT, &UseDirCache ); + +#if CASE_INSENSITIVE_FS +#define DIRCACHERESPCASEDEFAULT "" +#else +#define DIRCACHERESPCASEDEFAULT "y" +#endif + _set_string_var(".DIRCACHERESPCASE", DIRCACHERESPCASEDEFAULT, M_DEFAULT, &DcacheRespCase); + + _set_string_var("MAKEDIR",Get_current_dir(),M_PRECIOUS|M_NOEXPORT, + &Makedir_macval); + Makedir = DmStrDup(Makedir_macval); /* Later done by Def_macro(). */ + _set_string_var("MAKEVERSION", VERSION, M_PRECIOUS, &version); + _set_string_var("PWD", Makedir, M_PRECIOUS|M_NOEXPORT, &Pwd_macval); + Pwd = DmStrDup(Pwd_macval); /* Later done by Def_macro(). */ + _set_string_var("TMD", ".", M_PRECIOUS|M_NOEXPORT, &Tmd_macval); + Tmd = DmStrDup(Tmd_macval); /* Later done by _set_tmd(). */ + + Def_macro("NULL", "", M_PRECIOUS|M_NOEXPORT|M_FLAG); + + /* Initialize a macro that contains a space. As leading and trailing + * spaces are stripped by Def_macro a little cheating is necessary. */ + _set_string_var("SPACECHAR", "x", M_PRECIOUS|M_NOEXPORT|M_FLAG, &Spacechar ); + Spacechar[0] = ' '; + + _set_int_var( "MAXLINELENGTH", "0", M_DEFAULT|M_NOEXPORT, &Buffer_size ); + _set_int_var( "PREP", "0", M_DEFAULT, &Prep ); + (void) Def_macro("MAXLINELENGTH", "1024", M_FLAG | M_DEFAULT); + + /* MAXPROCESSLIMIT is overwritten by the ruletab.c settings. Set its + * initial value high so that it allows MAXPROCESS to be changed + * from the command line. */ + _set_int_var( "MAXPROCESSLIMIT", "100", M_DEFAULT|M_NOEXPORT,&Max_proclmt ); +#if defined(USE_CREATEPROCESS) + /* Set the OS early enough. */ + Max_proclmt = MAXIMUM_WAIT_OBJECTS; +#endif + _set_int_var( "MAXPROCESS", "1", M_DEFAULT|M_NOEXPORT, &Max_proc ); + sprintf(buf,"%d",NAME_MAX); + _set_int_var( "NAMEMAX", buf, M_DEFAULT|M_NOEXPORT, &NameMax); +} + + +/* +** Define an integer variable value, and set up the macro. +*/ +static void +_set_int_var(name, val, flag, var) +char *name; +char *val; +int flag; +int *var; +{ + HASHPTR hp; + + hp = Def_macro(name, val, M_FLAG | flag); + hp->ht_flag |= M_VAR_INT | M_MULTI | M_INIT; + hp->MV_IVAR = var; + *var = atoi(val); +} + + +/* +** Define a string variables value, and set up the macro. +*/ +static void +_set_string_var(name, val, flag, var) +char *name; +char *val; +int flag; +char **var; +{ + HASHPTR hp; + + hp = Def_macro(name, val, M_FLAG | flag); + hp->ht_flag |= M_VAR_STRING | M_MULTI | M_INIT; + hp->MV_SVAR = var; + *var = hp->ht_value; +} + + +/* Define a bit variable value, and set up the macro. Each of the bits + * corresponds to an attribute bit of Glob_attr. */ +static void +_set_bit_var(name, val, mask) +char *name; +char *val; +int mask; +{ + HASHPTR hp; + + hp = Def_macro(name, val, M_FLAG); + hp->ht_flag |= M_VAR_BIT | M_MULTI | M_INIT; + hp->MV_MASK = mask; + hp->MV_BVAR = &Glob_attr; +} |