25#include <fast_float/fast_float.h> 
   32#include <wx/translation.h> 
   34#define FMT_CLIPBOARD       _( "clipboard" ) 
   55                    FILE* aFile, 
const wxString& aFilename ) :
 
 
   75                    const std::string& aClipboardTxt, 
const wxString& aSource ) :
 
 
  245        KEYWORD_MAP::const_iterator it = 
keywordsLookup->find( tok.c_str() );
 
 
  265        ret = 
"string_quote";   
 
  268        ret = 
"quoted text delimiter";
 
  286        ret = 
"quoted string";
 
  289        ret = 
"end of input";
 
 
  311        ret = 
"token too big";
 
 
  321    ret << wxT(
"'") << wxString::FromUTF8( 
GetTokenText(aTok) ) << wxT(
"'");
 
 
  344    wxString errText = wxString::Format( 
_( 
"Expecting '%s'" ), 
GetTokenString( aTok ) );
 
 
  359    wxString errText = wxString::Format( 
_( 
"Unexpected '%s'" ), 
GetTokenString( aTok ) );
 
 
  366    wxString errText = wxString::Format( 
_( 
"%s is a duplicate" ), 
GetTokenString( aTok ).GetData() );
 
 
  373    wxString errText = wxString::Format( 
_( 
"Unexpected %s" ), wxString::FromUTF8( 
text ) );
 
 
  433        wxString errText = wxString::Format( 
_( 
"need a number for '%s'" ),
 
  434                                             wxString::FromUTF8( aExpectation ).GetData() );
 
 
  452    if( (
unsigned char) cc <= 
' ' )
 
  454        switch( (
unsigned char) cc )
 
 
  471    return '0' <= cc && cc <= 
'9';
 
 
  491static bool isNumber( 
const char* cp, 
const char* limit )
 
  496    bool sawNumber = 
false;
 
  498    if( cp < limit && ( *cp==
'-' || *cp==
'+' ) )
 
  501    while( cp < limit && 
isDigit( *cp ) )
 
  507    if( cp < limit && *cp == 
'.' )
 
  511        while( cp < limit && 
isDigit( *cp ) )
 
  520        if( cp < limit && ( *cp==
'E' || *cp==
'e' ) )
 
  526            if( cp < limit && ( *cp==
'-' || *cp==
'+' )  )
 
  529            while( cp < limit && 
isDigit( *cp ) )
 
  537    return sawNumber && cp==limit;
 
 
  543    const char*   cur  = 
next;
 
  544    const char*   head = cur;
 
  577        if( cur<
limit && *cur==
'#' )
 
  584                while( 
limit[-1] == 
'\n' || 
limit[-1] == 
'\r' )
 
  661                    if( ++head >= 
limit )
 
  667                    case '\\':  c = head[-1];   
break;
 
  668                    case 'a':   c = 
'\x07';     
break;
 
  669                    case 'b':   c = 
'\x08';     
break;
 
  670                    case 'f':   c = 
'\x0c';     
break;
 
  671                    case 'n':   c = 
'\n';       
break;
 
  672                    case 'r':   c = 
'\r';       
break;
 
  673                    case 't':   c = 
'\x09';     
break;
 
  674                    case 'v':   c = 
'\x0b';     
break;
 
  677                        for( i = 0; i < 2; ++i )
 
  679                            if( !isxdigit( head[i] ) )
 
  688                            c = (char) strtoul( tbuf, 
nullptr, 16 );
 
  700                            if( head[i] < 
'0' || head[i] > 
'7' )
 
  709                            c = (char) strtoul( tbuf, 
nullptr, 8 );
 
  720                else if( *head == 
'"' )     
 
  733            wxString errtxt( 
_( 
"Unterminated delimited string" ) );
 
  755            static const wxString errtxt( 
_(
"String delimiter must be a single character of " 
  794                wxString errtxt( 
_( 
"Un-terminated delimited string" ) );
 
 
  841    wxArrayString*  ret = 
nullptr;
 
  847        ret = 
new wxArrayString();
 
 
  866    const std::string& str = 
CurStr();
 
  869    fast_float::from_chars_result 
res = fast_float::from_chars( str.data(), str.data() + str.size(), dval,
 
  870                                                                fast_float::chars_format::skip_white_space );
 
  872    if( 
res.ec != std::errc() )
 
 
int NeedSYMBOLorNUMBER()
Call NextTok() and then verifies that the token read in satisfies bool IsSymbol() or the next token i...
 
void NeedLEFT()
Call NextTok() and then verifies that the token read in is a DSN_LEFT.
 
std::string curText
The text of the current token.
 
unsigned keywordCount
Count of keywords table.
 
void NeedBAR()
Call NextTok() and then verifies that the token read in is a DSN_BAR.
 
int NeedNUMBER(const char *aExpectation)
Call NextTok() and then verifies that the token read is type DSN_NUMBER.
 
bool commentsAreTokens
True if should return comments as tokens.
 
int findToken(const std::string &aToken) const
Take aToken string and looks up the string in the keywords table.
 
static bool IsSymbol(int aTok)
Test a token to see if it is a symbol.
 
const char * GetTokenText(int aTok) const
Return the C string representation of a DSN_T value.
 
wxArrayString * ReadCommentLines()
Check the next sequence of tokens and reads them into a wxArrayString if they are comments.
 
int curTok
The current token obtained on last NextTok().
 
std::string curSeparator
The text of the separator preceeding the current text.
 
bool space_in_quoted_tokens
Blank spaces within quoted strings.
 
bool specctraMode
if true, then: 1) stringDelimiter can be changed 2) Kicad quoting protocol is not in effect 3) space_...
 
int NextTok()
Return the next token found in the input file or DSN_EOF when reaching the end of file.
 
int NeedSYMBOL()
Call NextTok() and then verifies that the token read in satisfies IsSymbol().
 
int curOffset
Offset within current line of the current token.
 
LINE_READER * reader
No ownership. ownership is via readerStack, maybe, if iOwnReaders.
 
bool isStringTerminator(char cc) const
 
const KEYWORD * keywords
Table sorted by CMake for bsearch().
 
void NeedRIGHT()
Call NextTok() and then verifies that the token read in is a DSN_RIGHT.
 
static bool IsNumber(int aTok)
 
READER_STACK readerStack
all the LINE_READERs by pointer.
 
char dummy[1]
When there is no reader.
 
double parseDouble()
Parse the current token as an ASCII numeric string with possible leading whitespace into a double pre...
 
void SetSpecctraMode(bool aMode)
Change the behavior of this lexer into or out of "specctra mode".
 
wxString FromUTF8() const
Return the current token text as a wxString, assuming that the input byte stream is UTF8 encoded.
 
void Expecting(int aTok) const
Throw an IO_ERROR exception with an input file specific error message.
 
const wxString & CurSource() const
Return the current LINE_READER source.
 
LINE_READER * PopReader()
Delete the top most LINE_READER from an internal stack of LINE_READERs and in the case of FILE_LINE_R...
 
void Duplicate(int aTok)
Throw an IO_ERROR exception with a message saying specifically that aTok is a duplicate of one alread...
 
const std::string & CurStr() const
Return a reference to current token in std::string form.
 
void SetKnowsBar(bool knowsBar=true)
 
const char * CurLine() const
Return the current line of text from which the CurText() would return its token.
 
bool SetCommentsAreTokens(bool val)
Change the handling of comments.
 
wxString GetTokenString(int aTok) const
Return a quote wrapped wxString representation of a token value.
 
int CurTok() const
Return whatever NextTok() returned the last time it was called.
 
int CurOffset() const
Return the byte offset within the current line, using a 1 based index.
 
void InitParserState()
Reinit variables used during parsing, to ensure od states are not used in a new parsing must be calle...
 
int prevTok
curTok from previous NextTok() call.
 
const KEYWORD_MAP * keywordsLookup
Fast, specialized "C string" hashtable.
 
static const char * Syntax(int aTok)
 
DSNLEXER(const KEYWORD *aKeywordTable, unsigned aKeywordCount, const KEYWORD_MAP *aKeywordMap, FILE *aFile, const wxString &aFileName)
Initialize a DSN lexer and prepares to read from aFile which is already open and has aFilename.
 
bool SyncLineReaderWith(DSNLEXER &aLexer)
Usable only for DSN lexers which share the same LINE_READER.
 
bool m_knowsBar
True if the lexer knows about the bar token.
 
void Unexpected(int aTok) const
Throw an IO_ERROR exception with an input file specific error message.
 
int CurLineNumber() const
Return the current line number within my LINE_READER.
 
bool iOwnReaders
On readerStack, should I delete them?
 
void PushReader(LINE_READER *aLineReader)
Manage a stack of LINE_READERs in order to handle nested file inclusion.
 
A LINE_READER that reads from an open file.
 
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
 
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
 
static bool isNumber(const char *cp, const char *limit)
Return true if the next sequence of text is a number: either an integer, fixed point,...
 
static bool isSpace(char cc)
Test for whitespace.
 
static const KEYWORD empty_keywords[1]
 
std::unordered_map< const char *, int, fnv_1a, iequal_to > KEYWORD_MAP
A hashtable made of a const char* and an int.
 
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
 
Hold a keyword string and its unique integer token.