File: modules.c

package info (click to toggle)
boost 1.27.0-3
  • links: PTS
  • area: main
  • in suites: woody
  • size: 19,908 kB
  • ctags: 26,546
  • sloc: cpp: 122,225; ansic: 10,956; python: 4,412; sh: 855; yacc: 803; makefile: 257; perl: 165; lex: 90; csh: 6
file content (95 lines) | stat: -rw-r--r-- 2,243 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*  (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 );
}