Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/tools/jam/src/modules.c @ 29

Last change on this file since 29 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 3.3 KB
Line 
1/*
2 *  Copyright 2001-2004 David Abrahams.
3 *  Distributed under the Boost Software License, Version 1.0.
4 *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
5 */
6#include "jam.h"
7#include "debug.h"
8
9#include "modules.h"
10#include "string.h"
11#include "hash.h"
12#include "newstr.h"
13#include "lists.h"
14#include "parse.h"
15#include "rules.h"
16#include "variable.h"
17#include "strings.h"
18#include <assert.h>
19
20static struct hash* module_hash = 0;
21
22static char* new_module_str( module_t* m, char* suffix )
23{
24    char* result;
25    string s;
26    string_copy( &s, m->name );
27    string_append( &s, suffix );
28    result = newstr( s.value );
29    string_free( &s );
30    return result;
31}
32
33module_t* bindmodule( char* name )
34{
35    PROFILE_ENTER(BINDMODULE);
36   
37    string s;
38    module_t m_, *m = &m_;
39
40    if( !module_hash )
41        module_hash = hashinit( sizeof( module_t ), "modules" );
42
43    string_new( &s );
44    if (name)
45    {
46        string_append( &s, name );
47        string_push_back( &s, '.' );
48    }
49       
50    m->name = s.value;
51   
52    if ( hashenter( module_hash, (HASHDATA **)&m ) )
53    {
54        m->name = newstr( m->name );
55        m->variables = 0;
56        m->rules = 0;
57        m->imported_modules = 0;
58        m->class_module = 0;
59        m->native_rules = 0;
60        m->user_module = 0;
61    }
62    string_free( &s );
63
64    PROFILE_EXIT(BINDMODULE);
65
66    return m;
67}
68
69/*
70 * demand_rules() - Get the module's "rules" hash on demand
71 */
72struct hash* demand_rules( module_t* m )
73{
74    if ( !m->rules )
75        m->rules = hashinit( sizeof( RULE ), new_module_str( m, "rules" ) );
76    return m->rules;
77}
78
79/*
80 * delete_module() - wipe out the module's rules and variables
81 */
82static void delete_rule_( void* xrule, void* data )
83{
84    rule_free( (RULE*)xrule );
85}
86
87void delete_module( module_t* m )
88{
89    /* clear out all the rules */
90    if ( m->rules )
91    {
92        hashenumerate( m->rules, delete_rule_, (void*)0 );
93        hashdone( m->rules );
94        m->rules = 0;
95    }
96
97    if ( m->variables )
98    {
99        var_hash_swap( &m->variables );
100        var_done();
101        var_hash_swap( &m->variables );
102        m->variables = 0;
103    }
104}
105
106module_t* root_module()
107{
108    static module_t* root = 0;
109    if ( !root )
110        root = bindmodule(0);
111    return root;
112}
113
114void enter_module( module_t* m )
115{
116    var_hash_swap( &m->variables );
117}
118
119void exit_module( module_t* m )
120{
121    var_hash_swap( &m->variables );
122}
123
124void import_module(LIST* module_names, module_t* target_module)
125{
126    PROFILE_ENTER(IMPORT_MODULE);
127   
128    struct hash* h;
129   
130    if (!target_module->imported_modules)
131        target_module->imported_modules = hashinit( sizeof(char*), "imported");
132    h = target_module->imported_modules;
133
134    for(;module_names; module_names = module_names->next) {
135       
136        char* s = module_names->string;
137        char** ss = &s;
138       
139        hashenter(h, (HASHDATA**)&ss);
140    }
141   
142    PROFILE_EXIT(IMPORT_MODULE);
143}
144
145static void add_module_name( void* r_, void* result_ )
146{
147    char** r = (char**)r_;
148    LIST** result = (LIST**)result_;
149
150    *result = list_new( *result, copystr( *r ) );
151}
152
153LIST* imported_modules(module_t* module)
154{
155    LIST *result = L0;
156
157    if ( module->imported_modules )
158        hashenumerate( module->imported_modules, add_module_name, &result );
159
160    return result;
161}
Note: See TracBrowser for help on using the repository browser.