]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/common/EvalContext.cpp
merged tx6dl-devel into denx master branch
[karo-tx-uboot.git] / tools / elftosb / common / EvalContext.cpp
1 /*
2  * File:        EvalContext.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7
8 #include "EvalContext.h"
9 #include <stdexcept>
10 #include "format_string.h"
11
12 using namespace elftosb;
13
14 EvalContext::EvalContext()
15 :       m_sourcesManager(0)
16 {
17 }
18
19 EvalContext::~EvalContext()
20 {
21 }
22
23 bool EvalContext::isVariableDefined(const std::string & name)
24 {
25         variable_map_t::const_iterator it = m_variables.find(name);
26         return it != m_variables.end();
27 }
28
29 uint32_t EvalContext::getVariableValue(const std::string & name)
30 {
31         variable_map_t::const_iterator it = m_variables.find(name);
32         if (it == m_variables.end())
33         {
34                 throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
35         }
36         
37         return it->second.m_value;
38 }
39
40 int_size_t EvalContext::getVariableSize(const std::string & name)
41 {
42         variable_map_t::const_iterator it = m_variables.find(name);
43         if (it == m_variables.end())
44         {
45                 throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
46         }
47         
48         return it->second.m_size;
49 }
50
51 void EvalContext::setVariable(const std::string & name, uint32_t value, int_size_t size)
52 {
53         // check if var is locked
54         variable_map_t::const_iterator it = m_variables.find(name);
55         if (it != m_variables.end() && it->second.m_isLocked)
56         {
57                 return;
58         }
59         
60         // set var info
61         variable_info_t info;
62         info.m_value = value;
63         info.m_size = size;
64         info.m_isLocked = false;
65         m_variables[name] = info;
66 }
67
68 bool EvalContext::isVariableLocked(const std::string & name)
69 {
70         variable_map_t::const_iterator it = m_variables.find(name);
71         if (it == m_variables.end())
72         {
73                 throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
74         }
75         
76         return it->second.m_isLocked;
77 }
78
79 void EvalContext::lockVariable(const std::string & name)
80 {
81         variable_map_t::iterator it = m_variables.find(name);
82         if (it == m_variables.end())
83         {
84                 throw std::runtime_error(format_string("undefined variable '%s'", name.c_str()));
85         }
86         
87         it->second.m_isLocked = true;
88 }
89
90 void EvalContext::unlockVariable(const std::string & name)
91 {
92         variable_map_t::iterator it = m_variables.find(name);
93         if (it == m_variables.end())
94         {
95                 throw std::runtime_error("undefined variable");
96         }
97         
98         it->second.m_isLocked = false;
99 }
100
101 void EvalContext::dump()
102 {
103         variable_map_t::iterator it = m_variables.begin();
104         for (; it != m_variables.end(); ++it)
105         {
106                 variable_info_t & info = it->second;
107                 const char * lockedString = info.m_isLocked ? "locked" : "unlocked";
108                 printf("%s = %u:%d (%s)\n", it->first.c_str(), info.m_value, (int)info.m_size, lockedString);
109         }
110 }
111