summaryrefslogtreecommitdiff
path: root/dmake/imacs.c
diff options
context:
space:
mode:
Diffstat (limited to 'dmake/imacs.c')
-rw-r--r--dmake/imacs.c206
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;
+}