text: /*************************************************************************
  * Copyright (c) 2015, Synopsys, Inc.                                     *
  * All rights reserved.                                                   *
  *                                                                        *
  * Redistribution and use in source and binary forms, with or without     *
  * modification, are permitted provided that the following conditions are *
  * met:                                                                   *
  *                                                                        *
  * 1. Redistributions of source code must retain the above copyright      *
  * notice, this list of conditions and the following disclaimer.          *
  *                                                                        *
  * 2. Redistributions in binary form must reproduce the above copyright   *
  * notice, this list of conditions and the following disclaimer in the    *
  * documentation and/or other materials provided with the distribution.   *
  *                                                                        *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS    *
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      *
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  *
  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT   *
  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT       *
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  *
  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  *
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT    *
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  *
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   *
  *************************************************************************/
  // env_table.cxx
  // environment block lookup/modification for makefile parsing
  // 3.feb.98 kit transue
  
  #include <windows.h>
  
  #include <cassert>
  #include <iostream>
  
  #include "env_table.h"
  
  
  
  // construct/copy/destroy
  
  env_table::env_table()
  {
  	// allocate the environment here in the constructor rather than doing
  	// a lazy lookup for one reason: maintains constness of lookup
  
  	// make sure WinNT sets up the _environ pointer
  	if (_environ == NULL)
  		getenv("dummy");
  
  	char ** envline = _environ;
  	while (*envline != NULL) {
  		char * equals = strchr(*envline, '=');
  		assert(equals != NULL);
  		string key(*envline, equals - *envline);
  		// environment variables converted to upper case by nmake:
  		for (string::iterator i = key.begin(); i != key.end(); ++i)
  			*i = toupper(*i);
  
  		insert(key, macro_node(equals + 1, -1), true);
  		++envline;
  	}
  }
  
  
  env_table::~env_table()
  {
  }
  
  
  
  // access
  
  
  // modify
  
  bool
  env_table::insert(string const & key, macro_node const &value, bool force)
  {
  	// TODO: actually modify environment if appropriate
  	bool ret = false;
  
  	if (force || &lookup(key) != macro_node::null_macro) {
  		ret = cached_vartable::insert(key, value, force);
  	}
  	return ret;
  }
  
  