xref: /netbsd-src/external/bsd/elftosb/dist/common/EvalContext.cpp (revision 993229b6fea628ff8b1fa09146c80b0cfb2768eb)
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 
EvalContext()14 EvalContext::EvalContext()
15 :	m_sourcesManager(0)
16 {
17 }
18 
~EvalContext()19 EvalContext::~EvalContext()
20 {
21 }
22 
isVariableDefined(const std::string & name)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 
getVariableValue(const std::string & name)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 
getVariableSize(const std::string & name)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 
setVariable(const std::string & name,uint32_t value,int_size_t size)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 
isVariableLocked(const std::string & name)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 
lockVariable(const std::string & name)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 
unlockVariable(const std::string & name)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 
dump()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 
112