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