// $Id$
//
-// Copyright (C) 2004 Matthias Braun <matze@braunis.de>
-// code in this file based on lispreader from Mark Probst
+// SuperTux
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
#include <config.h>
#include <sstream>
+#include <cstring>
#include <stdexcept>
#include <iostream>
-#include "lexer.h"
+#include "lexer.hpp"
namespace lisp
{
c = 0;
bufend = 0;
nextChar();
- } catch(EOFException& e) {
+ } catch(EOFException& ) {
}
}
throw EOFException();
stream.read(buffer, BUFFER_SIZE);
size_t bytes_read = stream.gcount();
-
+
c = buffer;
bufend = buffer + bytes_read;
++linenumber;
nextChar();
};
-
+
token_length = 0;
-
+
switch(*c) {
case ';': // comment
while(true) {
nextChar();
if(*c == '"')
break;
+ else if (*c == '\r') // XXX this breaks with pure \r EOL
+ continue;
else if(*c == '\n')
linenumber++;
else if(*c == '\\') {
} catch(EOFException& ) {
std::stringstream msg;
msg << "Parse error in line " << startline << ": "
- << "EOF while parsing string.";
+ << "EOF while parsing string.";
throw std::runtime_error(msg.str());
}
nextChar();
case '#': // constant
try {
nextChar();
-
+
while(isalnum(*c) || *c == '_') {
if(token_length < MAX_TOKEN_LENGTH)
token_string[token_length++] = *c;
bool have_nondigits = false;
bool have_digits = false;
int have_floating_point = 0;
-
+
do {
if(isdigit(*c))
have_digits = true;
else if(*c == '.')
++have_floating_point;
else if(isalnum(*c) || *c == '_')
- have_nondigits = true;
-
+ have_nondigits = true;
+
if(token_length < MAX_TOKEN_LENGTH)
token_string[token_length++] = *c;
} while(!isspace(*c) && !strchr(delims, *c));
token_string[token_length] = 0;
-
+
// no nextChar
if(have_nondigits || !have_digits || have_floating_point > 1)
nextChar();
} while(!isspace(*c) && !strchr(delims, *c));
token_string[token_length] = 0;
-
+
// no nextChar
return TOKEN_SYMBOL;
- }
+ }
}
} catch(EOFException& ) {
return TOKEN_EOF;
}
} // end of namespace lisp
-