char* GTokenizer::nullTerminate() { if(m_pBufPos == m_pBufEnd) growBuf(); *m_pBufPos = '\0'; return m_pBufStart; }
void GTokenizer::bufferChar(char c) { if(m_pBufPos == m_pBufEnd) growBuf(); *m_pBufPos = c; m_pBufPos++; }
char* GTokenizer::nextWhile(GCharSet& set, size_t minLen) { m_pBufPos = m_pBufStart; while(m_len > 0) { char c = m_pStream->peek(); if(!set.find(c)) break; c = get(); bufferChar(c); } if((size_t)(m_pBufPos - m_pBufStart) < minLen) ThrowError("Unexpected token on line ", to_str(m_line), ", col ", to_str(col())); if(m_pBufPos == m_pBufEnd) growBuf(); *m_pBufPos = '\0'; return m_pBufStart; }
char* GTokenizer::nextUntilNotEscaped(char escapeChar, GCharSet& delimeters) { m_pBufPos = m_pBufStart; char cCur = '\0'; while(m_len > 0) { char c = m_pStream->peek(); if(delimeters.find(c) && cCur != escapeChar) break; c = get(); bufferChar(c); cCur = c; } if(m_pBufPos == m_pBufEnd) growBuf(); *m_pBufPos = '\0'; return m_pBufStart; }
char* GTokenizer::nextArg(GCharSet& delimiters, char escapeChar) { char c = m_pStream->peek(); if(c == '"') { advance(1); nextUntil(charSet("\"\n")); if(peek() != '"') ThrowError("Expected matching double-quotes on line ", to_str(m_line), ", col ", to_str(col())); advance(1); return m_pBufStart; } else if(c == '\'') { advance(1); nextUntil(charSet("'\n")); if(peek() != '\'') ThrowError("Expected a matching single-quote on line ", to_str(m_line), ", col ", to_str(col())); advance(1); return m_pBufStart; } //else m_pBufPos = m_pBufStart; bool inEscapeMode = false; while(m_len > 0) { char c = m_pStream->peek(); if(inEscapeMode) { if(c == '\n') { ThrowError("Error: '", to_str(escapeChar), "' character used as " "last character on a line to attempt to extend string over " "two lines on line" , to_str(m_line), ", col ", to_str(col()) ); } c = get(); bufferChar(c); inEscapeMode = false; } else { if(c == '\n' || delimiters.find(c)){ break; } c = get(); if(c == escapeChar) { inEscapeMode = true; } else { bufferChar(c); } } } if(m_pBufPos == m_pBufEnd) { growBuf(); } *m_pBufPos = '\0'; // std::cerr << "nextArg: '" << m_pBufStart << "'\n"; //DEBUG return m_pBufStart; }
void ram (void) { uint8_t key = BTN_RIGHT, button; lcdClear(); while (1) { switch (key) { case BTN_ENTER: // exit return; case BTN_RIGHT: if (direction != DIRECTION_LEFT) direction = DIRECTION_RIGHT; break; case BTN_UP: if (direction != DIRECTION_DOWN) direction = DIRECTION_UP; break; case BTN_LEFT: if (direction != DIRECTION_RIGHT) direction = DIRECTION_LEFT; break; case BTN_DOWN: if (direction != DIRECTION_UP) direction = DIRECTION_DOWN; break; //Default: No keystroke received. Assuming last keystroke. } point newendpoint = snake.endpoint; shiftPoint (&newendpoint, direction); bool resetBacon = false; if (newendpoint.x == bacon.x && newendpoint.y == bacon.y) { growBuf (&snake, direction); resetBacon = true; } else { setGamePixel(snake.startpoint.x, snake.startpoint.y, 0); shiftBuf (&snake, direction); } if (getGamePixel(snake.endpoint.x, snake.endpoint.y)) break; setGamePixel(snake.endpoint.x, snake.endpoint.y, 1); while (resetBacon) { bacon.x = getRandom() % GAME_WIDTH; bacon.y = getRandom() % GAME_HEIGHT; if (!getGamePixel(bacon.x, bacon.y)) resetBacon = false; } drawFood (bacon.x, bacon.y); lcdRefresh(); key = BTN_NONE; for (i=0; i < ( TIME_PER_MOVE / 50 ); ++i) { delayms(50); if ((button = getInputRaw()) != BTN_NONE) key = button; } } // Game ended, show results lcdClear(); lcdNl(); lcdPrintln("Game Over"); lcdPrintln("Your score:"); lcdPrintInt(getLength(&snake) - INITIAL_LENGTH + 1); lcdNl(); lcdPrintln("Press any key"); lcdPrintln("to continue."); lcdRefresh(); delayms(500); while(getInputRaw() == BTN_NONE) delayms(25); }