ElftosbLexer.cpp revision 1.1 1 1.1 jkunz /*
2 1.1 jkunz * File: ElftosbLexer.cpp
3 1.1 jkunz *
4 1.1 jkunz * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5 1.1 jkunz * See included license file for license details.
6 1.1 jkunz */
7 1.1 jkunz #include "ElftosbLexer.h"
8 1.1 jkunz #include <algorithm>
9 1.1 jkunz #include "HexValues.h"
10 1.1 jkunz
11 1.1 jkunz using namespace elftosb;
12 1.1 jkunz
13 1.1 jkunz ElftosbLexer::ElftosbLexer(istream & inputStream)
14 1.1 jkunz : yyFlexLexer(&inputStream), m_line(1), m_blob(0), m_blobFirstLine(0)
15 1.1 jkunz {
16 1.1 jkunz }
17 1.1 jkunz
18 1.1 jkunz void ElftosbLexer::getSymbolValue(YYSTYPE * value)
19 1.1 jkunz {
20 1.1 jkunz if (!value)
21 1.1 jkunz {
22 1.1 jkunz return;
23 1.1 jkunz }
24 1.1 jkunz *value = m_symbolValue;
25 1.1 jkunz }
26 1.1 jkunz
27 1.1 jkunz void ElftosbLexer::addSourceName(std::string * ident)
28 1.1 jkunz {
29 1.1 jkunz m_sources.push_back(*ident);
30 1.1 jkunz }
31 1.1 jkunz
32 1.1 jkunz bool ElftosbLexer::isSourceName(std::string * ident)
33 1.1 jkunz {
34 1.1 jkunz string_vector_t::iterator it = find(m_sources.begin(), m_sources.end(), *ident);
35 1.1 jkunz return it != m_sources.end();
36 1.1 jkunz }
37 1.1 jkunz
38 1.1 jkunz void ElftosbLexer::LexerError(const char * msg)
39 1.1 jkunz {
40 1.1 jkunz throw elftosb::lexical_error(msg);
41 1.1 jkunz }
42 1.1 jkunz
43 1.1 jkunz //! Reads the \a in string and writes to the \a out string. These strings can be the same
44 1.1 jkunz //! string since the read head is always in front of the write head.
45 1.1 jkunz //!
46 1.1 jkunz //! \param[in] in Input string containing C-style escape sequences.
47 1.1 jkunz //! \param[out] out Output string. All escape sequences in the input string have been converted
48 1.1 jkunz //! to the actual characters. May point to the same string as \a in.
49 1.1 jkunz //! \return The length of the resulting \a out string. This length is necessary because
50 1.1 jkunz //! the string may have contained escape sequences that inserted null characters.
51 1.1 jkunz int ElftosbLexer::processStringEscapes(const char * in, char * out)
52 1.1 jkunz {
53 1.1 jkunz int count = 0;
54 1.1 jkunz while (*in)
55 1.1 jkunz {
56 1.1 jkunz switch (*in)
57 1.1 jkunz {
58 1.1 jkunz case '\\':
59 1.1 jkunz {
60 1.1 jkunz // start of an escape sequence
61 1.1 jkunz char c = *++in;
62 1.1 jkunz switch (c)
63 1.1 jkunz {
64 1.1 jkunz case 0: // end of the string, bail
65 1.1 jkunz break;
66 1.1 jkunz case 'x':
67 1.1 jkunz {
68 1.1 jkunz // start of a hex char escape sequence
69 1.1 jkunz
70 1.1 jkunz // read high and low nibbles, checking for end of string
71 1.1 jkunz char hi = *++in;
72 1.1 jkunz if (hi == 0) break;
73 1.1 jkunz char lo = *++in;
74 1.1 jkunz if (lo == 0) break;
75 1.1 jkunz
76 1.1 jkunz if (isHexDigit(hi) && isHexDigit(lo))
77 1.1 jkunz {
78 1.1 jkunz if (hi >= '0' && hi <= '9')
79 1.1 jkunz c = (hi - '0') << 4;
80 1.1 jkunz else if (hi >= 'A' && hi <= 'F')
81 1.1 jkunz c = (hi - 'A' + 10) << 4;
82 1.1 jkunz else if (hi >= 'a' && hi <= 'f')
83 1.1 jkunz c = (hi - 'a' + 10) << 4;
84 1.1 jkunz
85 1.1 jkunz if (lo >= '0' && lo <= '9')
86 1.1 jkunz c |= lo - '0';
87 1.1 jkunz else if (lo >= 'A' && lo <= 'F')
88 1.1 jkunz c |= lo - 'A' + 10;
89 1.1 jkunz else if (lo >= 'a' && lo <= 'f')
90 1.1 jkunz c |= lo - 'a' + 10;
91 1.1 jkunz
92 1.1 jkunz *out++ = c;
93 1.1 jkunz count++;
94 1.1 jkunz }
95 1.1 jkunz else
96 1.1 jkunz {
97 1.1 jkunz // not hex digits, the \x must have wanted an 'x' char
98 1.1 jkunz *out++ = 'x';
99 1.1 jkunz *out++ = hi;
100 1.1 jkunz *out++ = lo;
101 1.1 jkunz count += 3;
102 1.1 jkunz }
103 1.1 jkunz break;
104 1.1 jkunz }
105 1.1 jkunz case 'n':
106 1.1 jkunz *out++ = '\n';
107 1.1 jkunz count++;
108 1.1 jkunz break;
109 1.1 jkunz case 't':
110 1.1 jkunz *out++ = '\t';
111 1.1 jkunz count++;
112 1.1 jkunz break;
113 1.1 jkunz case 'r':
114 1.1 jkunz *out++ = '\r';
115 1.1 jkunz count++;
116 1.1 jkunz break;
117 1.1 jkunz case 'b':
118 1.1 jkunz *out++ = '\b';
119 1.1 jkunz count++;
120 1.1 jkunz break;
121 1.1 jkunz case 'f':
122 1.1 jkunz *out++ = '\f';
123 1.1 jkunz count++;
124 1.1 jkunz break;
125 1.1 jkunz case '0':
126 1.1 jkunz *out++ = '\0';
127 1.1 jkunz count++;
128 1.1 jkunz break;
129 1.1 jkunz default:
130 1.1 jkunz *out++ = c;
131 1.1 jkunz count++;
132 1.1 jkunz break;
133 1.1 jkunz }
134 1.1 jkunz break;
135 1.1 jkunz }
136 1.1 jkunz
137 1.1 jkunz default:
138 1.1 jkunz // copy all other chars directly
139 1.1 jkunz *out++ = *in++;
140 1.1 jkunz count++;
141 1.1 jkunz }
142 1.1 jkunz }
143 1.1 jkunz
144 1.1 jkunz // place terminating null char on output
145 1.1 jkunz *out = 0;
146 1.1 jkunz return count;
147 1.1 jkunz }
148 1.1 jkunz
149 1.1 jkunz
150