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