mirror of
https://github.com/boostorg/build.git
synced 2026-02-15 13:02:11 +00:00
96 lines
2.2 KiB
C
96 lines
2.2 KiB
C
/* (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and
|
|
* distribute this software is granted provided this copyright notice appears
|
|
* in all copies. This software is provided "as is" without express or implied
|
|
* warranty, and with no claim as to its suitability for any purpose.
|
|
*/
|
|
#include "modules.h"
|
|
#include "jam.h"
|
|
#include "string.h"
|
|
#include "hash.h"
|
|
#include "newstr.h"
|
|
#include "lists.h"
|
|
#include "parse.h"
|
|
#include "rules.h"
|
|
#include "variable.h"
|
|
#include "strings.h"
|
|
|
|
static struct hash* module_hash = 0;
|
|
|
|
static char* new_module_str( module* m, char* suffix )
|
|
{
|
|
char* result;
|
|
string s;
|
|
string_copy( &s, m->name );
|
|
string_append( &s, suffix );
|
|
result = newstr( s.value );
|
|
string_free( &s );
|
|
return result;
|
|
}
|
|
|
|
module* bindmodule( char* name )
|
|
{
|
|
string s;
|
|
module m_, *m = &m_;
|
|
|
|
if( !module_hash )
|
|
module_hash = hashinit( sizeof( module ), "modules" );
|
|
|
|
string_new( &s );
|
|
if (name)
|
|
{
|
|
string_append( &s, name );
|
|
string_push_back( &s, '.' );
|
|
}
|
|
|
|
m->name = s.value;
|
|
|
|
if ( hashenter( module_hash, (HASHDATA **)&m ) )
|
|
{
|
|
m->name = newstr( m->name );
|
|
m->local_names = 0;
|
|
m->locals = 0;
|
|
m->rules = hashinit( sizeof( RULE ), new_module_str( m, "rules" ) );
|
|
}
|
|
string_free( &s );
|
|
return m;
|
|
}
|
|
|
|
module* root_module()
|
|
{
|
|
static module* root = 0;
|
|
if ( !root )
|
|
root = bindmodule(0);
|
|
return root;
|
|
}
|
|
|
|
/*
|
|
* bind_module_var --
|
|
*
|
|
* Add the symbol to the module's list of symbols if it is not already in the
|
|
* module. m is assumed to be the current module and if the symbol is new, any
|
|
* current value is replaced by an empty list until the module is exited.
|
|
*
|
|
*/
|
|
void bind_module_var( module* m, char* symbol )
|
|
{
|
|
char** name = &symbol;
|
|
|
|
if ( !m->local_names )
|
|
m->local_names = hashinit( sizeof( char* ), new_module_str( m, "variables" ) );
|
|
|
|
if ( hashenter( m->local_names, (HASHDATA **)&name ) )
|
|
{
|
|
m->locals = addsettings( m->locals, 0, symbol, var_swap( symbol, 0 ) );
|
|
}
|
|
}
|
|
|
|
void enter_module( module* m )
|
|
{
|
|
pushsettings( m->locals );
|
|
}
|
|
|
|
void exit_module( module* m )
|
|
{
|
|
popsettings( m->locals );
|
|
}
|