diff options
author | Kenneth Heafield <github@kheafield.com> | 2012-05-12 14:01:52 -0400 |
---|---|---|
committer | Kenneth Heafield <github@kheafield.com> | 2012-05-12 14:01:52 -0400 |
commit | 3faecf9a00512dcbc8712c4bca9adae72fb64410 (patch) | |
tree | 9761b50d12f81a675fb7cbc663ceebad15079f78 /jam-files/engine/modules.c | |
parent | c806a8fff63043f63773874986301f2822a2b552 (diff) |
Give in and copy bjam into cdec source code
Diffstat (limited to 'jam-files/engine/modules.c')
-rw-r--r-- | jam-files/engine/modules.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/jam-files/engine/modules.c b/jam-files/engine/modules.c new file mode 100644 index 00000000..72952594 --- /dev/null +++ b/jam-files/engine/modules.c @@ -0,0 +1,168 @@ +/* + * Copyright 2001-2004 David Abrahams. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + */ +#include "jam.h" + +#include "modules.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" +#include <assert.h> + +static struct hash * module_hash = 0; + + +static char * new_module_str( module_t * 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_t * bindmodule( char * name ) +{ + PROFILE_ENTER( BINDMODULE ); + + string s; + module_t m_; + module_t * m = &m_; + + if ( !module_hash ) + module_hash = hashinit( sizeof( module_t ), "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->variables = 0; + m->rules = 0; + m->imported_modules = 0; + m->class_module = 0; + m->native_rules = 0; + m->user_module = 0; + } + string_free( &s ); + + PROFILE_EXIT( BINDMODULE ); + + return m; +} + +/* + * demand_rules() - Get the module's "rules" hash on demand. + */ +struct hash * demand_rules( module_t * m ) +{ + if ( !m->rules ) + m->rules = hashinit( sizeof( RULE ), new_module_str( m, "rules" ) ); + return m->rules; +} + + +/* + * delete_module() - wipe out the module's rules and variables. + */ + +static void delete_rule_( void * xrule, void * data ) +{ + rule_free( (RULE *)xrule ); +} + + +void delete_module( module_t * m ) +{ + /* Clear out all the rules. */ + if ( m->rules ) + { + hashenumerate( m->rules, delete_rule_, (void *)0 ); + hashdone( m->rules ); + m->rules = 0; + } + + if ( m->variables ) + { + var_hash_swap( &m->variables ); + var_done(); + var_hash_swap( &m->variables ); + m->variables = 0; + } +} + + +module_t * root_module() +{ + static module_t * root = 0; + if ( !root ) + root = bindmodule( 0 ); + return root; +} + +void enter_module( module_t * m ) +{ + var_hash_swap( &m->variables ); +} + + +void exit_module( module_t * m ) +{ + var_hash_swap( &m->variables ); +} + + +void import_module( LIST * module_names, module_t * target_module ) +{ + PROFILE_ENTER( IMPORT_MODULE ); + + struct hash * h; + + if ( !target_module->imported_modules ) + target_module->imported_modules = hashinit( sizeof( char * ), "imported" ); + h = target_module->imported_modules; + + for ( ; module_names; module_names = module_names->next ) + { + char * s = module_names->string; + char * * ss = &s; + hashenter( h, (HASHDATA * *)&ss ); + } + + PROFILE_EXIT( IMPORT_MODULE ); +} + + +static void add_module_name( void * r_, void * result_ ) +{ + char * * r = (char * *)r_; + LIST * * result = (LIST * *)result_; + + *result = list_new( *result, copystr( *r ) ); +} + + +LIST * imported_modules( module_t * module ) +{ + LIST * result = L0; + if ( module->imported_modules ) + hashenumerate( module->imported_modules, add_module_name, &result ); + return result; +} |