1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Provides the debugging functions invoked by a recognizer 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// built using the debug generator mode of the antlr tool. 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// See antlr3debugeventlistener.h for documentation. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3.h> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Not everyone wishes to include the debugger stuff in their final deployment because 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// it will then rely on being linked with the socket libraries. Hence if the programmer turns 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// off the debugging, we do some dummy stuff that satifies compilers etc but means there is 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// no debugger and no reliance on the socket librarires. If you set this flag, then using the -debug 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// option to generate your code will produce code that just crashes, but then I presme you are smart 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// enough to realize that building the libraries without debugger support means you can't call the 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// debugger ;-) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_NODEBUGGER 47324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_DEBUG_EVENT_LISTENER 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3DebugListenerNew() 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_PRINTF("C runtime was compiled without debugger support. This program will crash!!"); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#else 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN handshake (pANTLR3_DEBUG_EVENT_LISTENER delboy); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void enterRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void enterAlt (pANTLR3_DEBUG_EVENT_LISTENER delboy, int alt); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void exitRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void enterSubRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void exitSubRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void enterDecision (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void exitDecision (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void consumeToken (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void consumeHiddenToken (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t); 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void LT (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_COMMON_TOKEN t); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void mark (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void rewindMark (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void rewindLast (pANTLR3_DEBUG_EVENT_LISTENER delboy); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void beginBacktrack (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void endBacktrack (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level, ANTLR3_BOOLEAN successful); 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void location (pANTLR3_DEBUG_EVENT_LISTENER delboy, int line, int pos); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void recognitionException (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_EXCEPTION e); 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void beginResync (pANTLR3_DEBUG_EVENT_LISTENER delboy); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void endResync (pANTLR3_DEBUG_EVENT_LISTENER delboy); 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void semanticPredicate (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_BOOLEAN result, const char * predicate); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void commence (pANTLR3_DEBUG_EVENT_LISTENER delboy); 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void terminate (pANTLR3_DEBUG_EVENT_LISTENER delboy); 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void consumeNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void LTT (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_BASE_TREE t); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void nilNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void errorNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void createNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t); 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void createNodeTok (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE node, pANTLR3_COMMON_TOKEN token); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void becomeRoot (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot); 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void addChild (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE root, pANTLR3_BASE_TREE child); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setTokenBoundaries (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t, ANTLR3_MARKER tokenStartIndex, ANTLR3_MARKER tokenStopIndex); 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void ack (pANTLR3_DEBUG_EVENT_LISTENER delboy); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Create and initialize a new debug event listener that can be connected to 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// by ANTLRWorks and any other debugger via a socket. 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 92324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_DEBUG_EVENT_LISTENER 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3DebugListenerNew() 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_DEBUG_EVENT_LISTENER delboy; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy = ANTLR3_CALLOC(1, sizeof(ANTLR3_DEBUG_EVENT_LISTENER)); 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy == NULL) 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Initialize the API 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->addChild = addChild; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->becomeRoot = becomeRoot; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->beginBacktrack = beginBacktrack; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->beginResync = beginResync; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->commence = commence; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->consumeHiddenToken = consumeHiddenToken; 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->consumeNode = consumeNode; 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->consumeToken = consumeToken; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->createNode = createNode; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->createNodeTok = createNodeTok; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->endBacktrack = endBacktrack; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->endResync = endResync; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->enterAlt = enterAlt; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->enterDecision = enterDecision; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->enterRule = enterRule; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->enterSubRule = enterSubRule; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->exitDecision = exitDecision; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->exitRule = exitRule; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->exitSubRule = exitSubRule; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->handshake = handshake; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->location = location; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->LT = LT; 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->LTT = LTT; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->mark = mark; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->nilNode = nilNode; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->recognitionException = recognitionException; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->rewind = rewindMark; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->rewindLast = rewindLast; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->semanticPredicate = semanticPredicate; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->setTokenBoundaries = setTokenBoundaries; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->terminate = terminate; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->errorNode = errorNode; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->PROTOCOL_VERSION = 2; // ANTLR 3.1 is at protocol version 2 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->port = DEFAULT_DEBUGGER_PORT; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return delboy; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_DEBUG_EVENT_LISTENER 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3DebugListenerNewPort(ANTLR3_UINT32 port) 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_DEBUG_EVENT_LISTENER delboy; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy = antlr3DebugListenerNew(); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy != NULL) 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->port = port; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return delboy; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//-------------------------------------------------------------------------------- 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Support functions for sending stuff over the socket interface 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic int 165324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversockSend(SOCKET sock, const char * ptr, int len) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int sent; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int thisSend; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sent = 0; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (sent < len) 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Send as many bytes as we can 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver thisSend = send(sock, ptr, len - sent, 0); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Check for errors and tell the user if we got one 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (thisSend == -1) 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Increment our offset by how many we were able to send 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ptr += thisSend; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sent += thisSend; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_TRUE; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhandshake (pANTLR3_DEBUG_EVENT_LISTENER delboy) 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Connection structure with which to wait and accept a connection from 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a debugger. 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SOCKET serverSocket; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Connection structures to deal with the client after we accept the connection 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and the server while we accept a connection. 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_SOCKADDRT client; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_SOCKADDRT server; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Buffer to construct our message in 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char message[256]; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Specifies the length of the connection structure to accept() 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Windows use int, everyone else uses size_t 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_SALENT sockaddr_len; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Option holder for setsockopt() 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int optVal; 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->initialized == ANTLR3_FALSE) 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Windows requires us to initialize WinSock. 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WORD wVersionRequested; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WSADATA wsaData; 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int err; // Return code from WSAStartup 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We must initialise the Windows socket system when the DLL is loaded. 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We are asking for Winsock 1.1 or better as we don't need anything 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // too complicated for this. 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver wVersionRequested = MAKEWORD( 1, 1); 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver err = WSAStartup( wVersionRequested, &wsaData ); 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( err != 0 ) 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Tell the user that we could not find a usable 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // WinSock DLL 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return FALSE; 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the server socket, we are the server because we just wait until 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // a debugger connects to the port we are listening on. 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver serverSocket = socket(AF_INET, SOCK_STREAM, 0); 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (serverSocket == INVALID_SOCKET) 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Set the listening port 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver server.sin_port = htons((unsigned short)delboy->port); 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver server.sin_family = AF_INET; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver server.sin_addr.s_addr = htonl (INADDR_ANY); 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We could allow a rebind on the same addr/port pair I suppose, but 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // I imagine that most people will just want to start debugging one parser at once. 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Maybe change this at some point, but rejecting the bind at this point will ensure 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that people realize they have left something running in the background. 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (bind(serverSocket, (pANTLR3_SOCKADDRC)&server, sizeof(server)) == -1) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We have bound the socket to the port and address so we now ask the TCP subsystem 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to start listening on that address/port 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (listen(serverSocket, 1) == -1) 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Some error, just fail 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we can try to accept a connection on the port 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sockaddr_len = sizeof(client); 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->socket = accept(serverSocket, (pANTLR3_SOCKADDRC)&client, &sockaddr_len); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Having accepted a connection, we can stop listening and close down the socket 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver shutdown (serverSocket, 0x02); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_CLOSESOCKET (serverSocket); 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->socket == -1) 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Disable Nagle as this is essentially a chat exchange 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver optVal = 1; 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setsockopt(delboy->socket, SOL_SOCKET, TCP_NODELAY, (const void *)&optVal, sizeof(optVal)); 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We now have a good socket connection with the debugging client, so we 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // send it the protocol version we are using and what the name of the grammar 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // is that we represent. 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf (message, "ANTLR %d\n", delboy->PROTOCOL_VERSION); 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sockSend (delboy->socket, message, (int)strlen(message)); 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf (message, "grammar \"%s\n", delboy->grammarFileName->chars); 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sockSend (delboy->socket, message, (int)strlen(message)); 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ack (delboy); 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->initialized = ANTLR3_TRUE; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_TRUE; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Send the supplied text and wait for an ack from the client 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertransmit(pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * ptr) 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sockSend(delboy->socket, ptr, (int)strlen(ptr)); 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ack(delboy); 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverack (pANTLR3_DEBUG_EVENT_LISTENER delboy) 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Local buffer to read the next character in to 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer; 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int rCount; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Ack terminates in a line feed, so we just wait for 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // one of those. Speed is not of the essence so we don't need 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to buffer the input or anything. 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver do 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rCount = recv(delboy->socket, &buffer, 1, 0); 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (rCount == 1 && buffer != '\n'); 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the socket ws closed on us, then we will get an error or 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // (with a graceful close), 0. We can assume the the debugger stopped for some reason 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // (such as Java crashing again). Therefore we just exit the program 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // completely if we don't get the terminating '\n' for the ack. 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (rCount != 1) 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_PRINTF("Exiting debugger as remote client closed the socket\n"); 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_PRINTF("Received char count was %d, and last char received was %02X\n", rCount, buffer); 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exit(0); 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Given a buffer string and a source string, serialize the 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// text, escaping any newlines and linefeeds. We have no need 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// for speed here, this is the debugger. 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 365324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverserializeText(pANTLR3_STRING buffer, pANTLR3_STRING text) 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 c; 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UCHAR character; 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // strings lead in with a " 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->append(buffer, "\t\""); 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (text == NULL) 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we replace linefeeds, newlines and the escape 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // leadin character '%' with their hex equivalents 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // prefixed by '%' 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c = 0; c < text->len; c++) 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (character = text->charAt(text, c)) 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->append(buffer, "%0A"); 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->append(buffer, "%0D"); 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\\': 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->append(buffer, "%25"); 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Other characters: The Song Remains the Same. 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->addc(buffer, character); 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Given a token, create a stringified version of it, in the supplied 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// buffer. We create a string for this in the debug 'object', if there 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// is not one there already, and then reuse it here if asked to do this 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// again. 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 417324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STRING 418324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverserializeToken(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t) 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Do we already have a serialization buffer? 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->tokenString == NULL) 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No, so create one, using the string factory that 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the grammar name used, which is guaranteed to exist. 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 64 bytes will do us here for starters. 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString = delboy->grammarFileName->factory->newSize(delboy->grammarFileName->factory, 64); 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Empty string 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->set(delboy->tokenString, (const char *)""); 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we serialize the elements of the token.Note that the debugger only 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // uses 32 bits. 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(t->getTokenIndex(t))); 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(t->getType(t))); 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(t->getChannel(t))); 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(t->getLine(t))); 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(t->getCharPositionInLine(t))); 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now send the text that the token represents. 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver serializeText(delboy->tokenString, t->getText(t)); 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally, as the debugger is a Java program it will expect to get UTF-8 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // encoded strings. We don't use UTF-8 internally to the C runtime, so we 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must force encode it. We have a method to do this in the string class, but 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // it returns malloc space that we must free afterwards. 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return delboy->tokenString->toUTF8(delboy->tokenString); 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Given a tree node, create a stringified version of it in the supplied 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// buffer. 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 463324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_STRING 464324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverserializeNode(pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE node) 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Do we already have a serialization buffer? 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->tokenString == NULL) 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No, so create one, using the string factory that 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the grammar name used, which is guaranteed to exist. 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 64 bytes will do us here for starters. 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString = delboy->grammarFileName->factory->newSize(delboy->grammarFileName->factory, 64); 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Empty string 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->set(delboy->tokenString, (const char *)""); 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Protect against bugs/errors etc 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (node == NULL) 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return delboy->tokenString; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we serialize the elements of the node.Note that the debugger only 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // uses 32 bits. 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Adaptor ID 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, delboy->adaptor->getUniqueID(delboy->adaptor, node)); 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Type of the current token (which may be imaginary) 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, delboy->adaptor->getType(delboy->adaptor, node)); 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // See if we have an actual token or just an imaginary 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = delboy->adaptor->getToken(delboy->adaptor, node); 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token != NULL) 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Real token 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(token->getLine(token))); 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, ' '); 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_INT32)(token->getCharPositionInLine(token))); 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Imaginary tokens have no location 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, -1); 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, -1); 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Start Index of the node 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, (ANTLR3_UINT32)(delboy->adaptor->getTokenStartIndex(delboy->adaptor, node))); 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now send the text that the node represents. 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver serializeText(delboy->tokenString, delboy->adaptor->getText(delboy->adaptor, node)); 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally, as the debugger is a Java program it will expect to get UTF-8 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // encoded strings. We don't use UTF-8 internally to the C runtime, so we 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must force encode it. We have a method to do this in the string class, but 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // there is no utf8 string implementation as of yet 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return delboy->tokenString->toUTF8(delboy->tokenString); 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//------------------------------------------------------------------------------------------------------------------ 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// EVENTS 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 548324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenterRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName) 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "enterRule\t%s\t%s\n", grammarFileName, ruleName); 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 559324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenterAlt (pANTLR3_DEBUG_EVENT_LISTENER delboy, int alt) 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "enterAlt\t%d\n", alt); 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 570324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexitRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, const char * grammarFileName, const char * ruleName) 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "exitRule\t%s\t%s\n", grammarFileName, ruleName); 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 581324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenterSubRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber) 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "enterSubRule\t%d\n", decisionNumber); 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 592324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexitSubRule (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber) 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "exitSubRule\t%d\n", decisionNumber); 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 603324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverenterDecision (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber) 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "enterDecision\t%d\n", decisionNumber); 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 615324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverexitDecision (pANTLR3_DEBUG_EVENT_LISTENER delboy, int decisionNumber) 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[512]; 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the message (speed is not of the essence) 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "exitDecision\t%d\n", decisionNumber); 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 626324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverconsumeToken (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t) 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING msg; 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the serialized token 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg = serializeToken(delboy, t); 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Insert the debug event indicator 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->insert8(msg, 0, "consumeToken\t"); 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->addc(msg, '\n'); 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)(msg->chars)); 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 646324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverconsumeHiddenToken (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_COMMON_TOKEN t) 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING msg; 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the serialized token 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg = serializeToken(delboy, t); 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Insert the debug event indicator 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->insert8(msg, 0, "consumeHiddenToken\t"); 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->addc(msg, '\n'); 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)(msg->chars)); 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Looking at the next token event. 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 668324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLT (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_COMMON_TOKEN t) 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING msg; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t != NULL) 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the serialized token 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg = serializeToken(delboy, t); 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Insert the index parameter 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->insert8(msg, 0, "\t"); 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->inserti(msg, 0, i); 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Insert the debug event indicator 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->insert8(msg, 0, "LT\t"); 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg->addc(msg, '\n'); 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)(msg->chars)); 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermark (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker) 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "mark\t%d\n", (ANTLR3_UINT32)(marker & 0xFFFFFFFF)); 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 708324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewindMark (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_MARKER marker) 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "rewind\t%d\n", (ANTLR3_UINT32)(marker & 0xFFFFFFFF)); 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 721324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewindLast (pANTLR3_DEBUG_EVENT_LISTENER delboy) 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)"rewind\n"); 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 727324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbeginBacktrack (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level) 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "beginBacktrack\t%d\n", (ANTLR3_UINT32)(level & 0xFFFFFFFF)); 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 739324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverendBacktrack (pANTLR3_DEBUG_EVENT_LISTENER delboy, int level, ANTLR3_BOOLEAN successful) 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "endBacktrack\t%d\t%d\n", level, successful); 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverlocation (pANTLR3_DEBUG_EVENT_LISTENER delboy, int line, int pos) 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "location\t%d\t%d\n", line, pos); 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 763324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrecognitionException (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_EXCEPTION e) 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[256]; 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "exception\t%s\t%d\t%d\t%d\n", (char *)(e->name), (ANTLR3_INT32)(e->index), e->line, e->charPositionInLine); 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Transmit the message and wait for ack 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 775324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbeginResync (pANTLR3_DEBUG_EVENT_LISTENER delboy) 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)"beginResync\n"); 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 781324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverendResync (pANTLR3_DEBUG_EVENT_LISTENER delboy) 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)"endResync\n"); 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 787324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversemanticPredicate (pANTLR3_DEBUG_EVENT_LISTENER delboy, ANTLR3_BOOLEAN result, const char * predicate) 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unsigned char * buffer; 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unsigned char * out; 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (predicate != NULL) 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer = (unsigned char *)ANTLR3_MALLOC(64 + 2*strlen(predicate)); 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (buffer != NULL) 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver out = buffer + sprintf((char *)buffer, "semanticPredicate\t%s\t", result == ANTLR3_TRUE ? "true" : "false"); 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (*predicate != '\0') 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch(*predicate) 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '%'; 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '0'; 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = 'A'; 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '%'; 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '0'; 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = 'D'; 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '%': 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '%'; 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '0'; 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = 'D'; 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = *predicate; 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver predicate++; 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '\n'; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *out++ = '\0'; 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Send it and wait for the ack 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)buffer); 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (push) 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (disable : 4100) 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercommence (pANTLR3_DEBUG_EVENT_LISTENER delboy) 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Nothing to see here 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (pop) 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverterminate (pANTLR3_DEBUG_EVENT_LISTENER delboy) 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Terminate sequence 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sockSend(delboy->socket, "terminate\n", 10); // Send out the command 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//---------------------------------------------------------------- 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Tree parsing events 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 872324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverconsumeNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t) 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING buffer; 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer = serializeNode (delboy, t); 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now prepend the command 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->insert8 (buffer, 0, "consumeNode\t"); 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->addc (buffer, '\n'); 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Send to the debugger and wait for the ack 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit (delboy, (const char *)(delboy->tokenString->toUTF8(delboy->tokenString)->chars)); 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 889324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLTT (pANTLR3_DEBUG_EVENT_LISTENER delboy, int i, pANTLR3_BASE_TREE t) 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING buffer; 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer = serializeNode (delboy, t); 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now prepend the command 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->insert8 (buffer, 0, "\t"); 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->inserti (buffer, 0, i); 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->insert8 (buffer, 0, "LN\t"); 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buffer->addc (buffer, '\n'); 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Send to the debugger and wait for the ack 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit (delboy, (const char *)(delboy->tokenString->toUTF8(delboy->tokenString)->chars)); 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 908324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernilNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t) 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "nilNode\t%d\n", delboy->adaptor->getUniqueID(delboy->adaptor, t)); 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 916324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t) 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Do we already have a serialization buffer? 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->tokenString == NULL) 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No, so create one, using the string factory that 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the grammar name used, which is guaranteed to exist. 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 64 bytes will do us here for starters. 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString = delboy->grammarFileName->factory->newSize(delboy->grammarFileName->factory, 64); 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Empty string 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->set8(delboy->tokenString, (const char *)"createNodeFromTokenElements "); 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we serialize the elements of the node.Note that the debugger only 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // uses 32 bits. 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Adaptor ID 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, delboy->adaptor->getUniqueID(delboy->adaptor, t)); 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Type of the current token (which may be imaginary) 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, delboy->adaptor->getType(delboy->adaptor, t)); 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The text that this node represents 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver serializeText(delboy->tokenString, delboy->adaptor->getText(delboy->adaptor, t)); 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\n'); 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally, as the debugger is a Java program it will expect to get UTF-8 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // encoded strings. We don't use UTF-8 internally to the C runtime, so we 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must force encode it. We have a method to do this in the string class, but 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // there is no utf8 string implementation as of yet 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)(delboy->tokenString->toUTF8(delboy->tokenString)->chars)); 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 959324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvererrorNode (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t) 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Do we already have a serialization buffer? 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delboy->tokenString == NULL) 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No, so create one, using the string factory that 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the grammar name used, which is guaranteed to exist. 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 64 bytes will do us here for starters. 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString = delboy->grammarFileName->factory->newSize(delboy->grammarFileName->factory, 64); 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Empty string 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->set8(delboy->tokenString, (const char *)"errorNode\t"); 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we serialize the elements of the node.Note that the debugger only 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // uses 32 bits. 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Adaptor ID 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, delboy->adaptor->getUniqueID(delboy->adaptor, t)); 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\t'); 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Type of the current token (which is an error) 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addi(delboy->tokenString, ANTLR3_TOKEN_INVALID); 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The text that this node represents 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver serializeText(delboy->tokenString, delboy->adaptor->getText(delboy->adaptor, t)); 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->tokenString->addc(delboy->tokenString, '\n'); 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally, as the debugger is a Java program it will expect to get UTF-8 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // encoded strings. We don't use UTF-8 internally to the C runtime, so we 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must force encode it. We have a method to do this in the string class, but 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // there is no utf8 string implementation as of yet 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, (const char *)(delboy->tokenString->toUTF8(delboy->tokenString)->chars)); 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateNodeTok (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE node, pANTLR3_COMMON_TOKEN token) 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "createNode\t%d\t%d\n", delboy->adaptor->getUniqueID(delboy->adaptor, node), (ANTLR3_UINT32)token->getTokenIndex(token)); 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbecomeRoot (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot) 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "becomeRoot\t%d\t%d\n", delboy->adaptor->getUniqueID(delboy->adaptor, newRoot), 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->adaptor->getUniqueID(delboy->adaptor, oldRoot) 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChild (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE root, pANTLR3_BASE_TREE child) 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "addChild\t%d\t%d\n", delboy->adaptor->getUniqueID(delboy->adaptor, root), 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delboy->adaptor->getUniqueID(delboy->adaptor, child) 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTokenBoundaries (pANTLR3_DEBUG_EVENT_LISTENER delboy, pANTLR3_BASE_TREE t, ANTLR3_MARKER tokenStartIndex, ANTLR3_MARKER tokenStopIndex) 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buffer[128]; 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buffer, "becomeRoot\t%d\t%d\t%d\n", delboy->adaptor->getUniqueID(delboy->adaptor, t), 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ANTLR3_UINT32)tokenStartIndex, 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ANTLR3_UINT32)tokenStopIndex 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver transmit(delboy, buffer); 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1048