/*! * \brief * Stops using the current input stream and reverts to any prior * input stream on the stack. * * \param lexer * Description of parameter lexer. * * Pointer to a function that abandons the current input stream, whether it * is empty or not and reverts to the previous stacked input stream. * * \remark * The function fails silently if there are no prior input streams. */ static void popCharStream (pANTLR3_LEXER lexer) { pANTLR3_INPUT_STREAM input; // If we do not have a stream stack or we are already at the // stack bottom, then do nothing. // if (lexer->rec->state->streams != NULL && lexer->rec->state->streams->size(lexer->rec->state->streams) > 0) { // We just leave the current stream to its fate, we do not close // it or anything as we do not know what the programmer intended // for it. This method can always be overridden of course. // So just find out what was currently saved on the stack and use // that now, then pop it from the stack. // input = (pANTLR3_INPUT_STREAM)(lexer->rec->state->streams->top); lexer->rec->state->streams->pop(lexer->rec->state->streams); // Now install the stream as the current one. // lexer->setCharStream(lexer, input); lexer->input->istream->rewindLast(lexer->input->istream); } return; }
/*! * \brief * Change to a new input stream, remembering the old one. * * \param lexer * Pointer to the lexer instance to switch input streams for. * * \param input * New input stream to install as the current one. * * Switches the current character input stream to * a new one, saving the old one, which we will revert to at the end of this * new one. */ static void pushCharStream (pANTLR3_LEXER lexer, pANTLR3_INPUT_STREAM input) { // Do we need a new input stream stack? // if (lexer->rec->state->streams == NULL) { // This is the first call to stack a new // stream and so we must create the stack first. // lexer->rec->state->streams = antlr3StackNew(0); if (lexer->rec->state->streams == NULL) { // Could not do this, we just fail to push it. // TODO: Consider if this is what we want to do, but then // any programmer can override this method to do something else. return; } } // We have a stack, so we can save the current input stream // into it. // lexer->input->istream->mark(lexer->input->istream); lexer->rec->state->streams->push(lexer->rec->state->streams, lexer->input, NULL); // And now we can install this new one // lexer->setCharStream(lexer, input); }