Home | History | Annotate | Line # | Download | only in elftosb2
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