More work on events and parsing.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 31 May 2014 00:42:30 +0100
changeset 3 29ea333a1811
parent 2 a96eb336dbd3
child 4 62366cc0fd95
More work on events and parsing.
GDBMICommand.st
GDBMICommandResult.st
GDBMICommandResultEvent.st
GDBMICommandStatus.st
GDBMIDriver.st
GDBMIEvent.st
GDBMIEventSet.st
GDBMIParser.st
GDBObject.st
GDBTuple.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/GDBMIParserTests.st
tests/Make.proto
tests/abbrev.stc
tests/bc.mak
tests/jv_libgdbs_tests.st
tests/tests.rc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMICommand.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,9 @@
+"{ Package: 'jv:libgdbs' }"
+
+Object subclass:#GDBMICommand
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-MI'
+!
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMICommandResult.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'jv:libgdbs' }"
+
+Object subclass:#GDBMICommandResult
+	instanceVariableNames:'status value'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-MI'
+!
+
+
+!GDBMICommandResult methodsFor:'accessing'!
+
+status
+    ^ status
+!
+
+status:something
+    status := something.
+!
+
+value
+    ^ value
+!
+
+value:something
+    value := something.
+! !
+
+!GDBMICommandResult class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMICommandResultEvent.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,25 @@
+"{ Package: 'jv:libgdbs' }"
+
+GDBMIEvent subclass:#GDBMICommandResultEvent
+	instanceVariableNames:'result'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-MI-Events'
+!
+
+!GDBMICommandResultEvent methodsFor:'accessing'!
+
+result
+    ^ result
+!
+
+result:something
+    result := something.
+! !
+
+!GDBMICommandResultEvent methodsFor:'testing'!
+
+isCommandResultEvent
+    ^ true
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMICommandStatus.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,28 @@
+"{ Package: 'jv:libgdbs' }"
+
+SharedPool subclass:#GDBMICommandStatus
+	instanceVariableNames:''
+	classVariableNames:'CommandStatusDone CommandStatusRunning CommandStatusConnected
+		CommandStatusError CommandStatusExit'
+	poolDictionaries:''
+	category:'GDB-Core-MI'
+!
+
+!GDBMICommandStatus class methodsFor:'initialization'!
+
+initialize
+    "Invoked at system start or when the class is dynamically loaded."
+
+    "/ please change as required (and remove this comment)
+
+    CommandStatusDone := #done.
+    CommandStatusRunning := #running.
+    CommandStatusConnected := #commected.
+    CommandStatusError := #error.
+    CommandStatusExit := #exit.
+
+    "Modified: / 31-05-2014 / 00:05:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+
+GDBMICommandStatus initialize!
--- a/GDBMIDriver.st	Wed May 28 09:42:40 2014 +0100
+++ b/GDBMIDriver.st	Sat May 31 00:42:30 2014 +0100
@@ -6,7 +6,7 @@
 		eventNotifier eventDispatcher'
 	classVariableNames:''
 	poolDictionaries:''
-	category:'GDB-Private-MI'
+	category:'GDB-Private'
 !
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMIEvent.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,25 @@
+"{ Package: 'jv:libgdbs' }"
+
+Announcement subclass:#GDBMIEvent
+	instanceVariableNames:'token'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-MI-Events'
+!
+
+!GDBMIEvent methodsFor:'accessing'!
+
+token
+    ^ token
+!
+
+token:something
+    token := something.
+! !
+
+!GDBMIEvent methodsFor:'testing'!
+
+isCommandResultEvent
+    ^ false
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBMIEventSet.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,9 @@
+"{ Package: 'jv:libgdbs' }"
+
+OrderedCollection subclass:#GDBMIEventSet
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core-MI-Events'
+!
+
--- a/GDBMIParser.st	Wed May 28 09:42:40 2014 +0100
+++ b/GDBMIParser.st	Sat May 31 00:42:30 2014 +0100
@@ -1,10 +1,12 @@
+"{ Encoding: utf8 }"
+
 "{ Package: 'jv:libgdbs' }"
 
 Object subclass:#GDBMIParser
-	instanceVariableNames:'source lookahead'
+	instanceVariableNames:'source lookahead token'
 	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Private-MI'
+	poolDictionaries:'GDBMICommandStatus'
+	category:'GDB-Private'
 !
 
 !GDBMIParser class methodsFor:'instance creation'!
@@ -146,11 +148,282 @@
     "Created: / 28-05-2014 / 00:02:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+parseNl
+    | c |
+
+    c := self peek.
+    (c == Character return or:[ c == Character cr ]) ifTrue:[ 
+        self next
+    ].
+
+    "Created: / 30-05-2014 / 09:52:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:38:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseOutOfBandRecord
+    "
+    out-of-band-record → async-record | stream-record
+    "
+
+    ('*+=' includes: self peek) ifTrue:[ 
+        self parseAsyncRecord.
+    ].
+
+    ('~@&' includes: self peek) ifTrue:[ 
+        self parseStreamRecord.
+    ].
+
+    self error: 'Invalid out-of-bound record'
+
+    "Created: / 30-05-2014 / 09:52:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseOutput
+    "
+    output → ( out-of-band-record )* [ result-record ] '(gdb)' nl
+    "
+
+    | events |
+
+    events := GDBMIEventSet new.
+    [ 
+        self peek isDigit ifTrue:[ self parseToken ].
+        self peek ~~ $^
+    ] whileTrue:[ 
+        events add: self parseOutOfBandRecord.
+    ].
+    events add: self parseResultRecord.
+    self expect: '(gdb)'.
+    self parseNl.
+    ^ events
+
+    "Created: / 30-05-2014 / 09:52:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:39:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseResultClass
+    "
+    result-class → 'done' | 'running' | 'connected' | 'error' | 'exit'
+    "
+    | c1 c2 |
+
+    c1 := self peek.
+    c1 == $d ifTrue:[ 
+        self expect: 'done'.
+        ^ CommandStatusDone.
+    ].
+    c1 == $r ifTrue:[ 
+        self expect: 'running'.
+        ^ CommandStatusRunning.
+    ].
+    c1 == $c ifTrue:[ 
+        self expect: 'connected'.
+        ^ CommandStatusConnected.
+    ].
+    c1 == $e ifTrue:[ 
+        self next.
+        c2 := self peek.
+        c2 == $x ifTrue:[ 
+            self expect: 'xit'.
+            ^ CommandStatusExit.
+        ].
+        c2 == $r ifTrue:[ 
+            self expect: 'rror'.
+            ^ CommandStatusError.
+        ].
+    ].
+    ^ self error:'Unsupported result class'
+
+    "Created: / 31-05-2014 / 00:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseResultRecord
+    "
+    result-record → '^' result-class ( ',' result )* nl
+    "
+
+    | result |
+
+    self expect: $^.
+    result := GDBMICommandResult new.
+    result status: self parseResultClass.
+    self peek == $, ifTrue:[ 
+        self next.
+        result value: self parseResult.
+    ].
+    self parseNl.
+    ^ GDBMICommandResultEvent new result: result.
+
+    "Created: / 30-05-2014 / 09:52:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:34:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 parseToken
 
     "Created: / 28-05-2014 / 00:14:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBMIParser methodsFor:'parsing-async events'!
+
+parseAsyncClass
+    "raise an error: this method should be implemented (TODO)"
+
+    self peek == $s ifTrue:[ 
+        self expect: 'stopped'.
+        ^ self
+    ].
+    self error:'Unsupported async class'
+
+    "Created: / 30-05-2014 / 10:15:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseAsyncOutput
+    "
+    async-output → async-class ( ',' result )* nl
+    "
+
+    self parseAsyncClass.
+    [ self peek == $, ] whileTrue:[ 
+        self next.
+        self parseResult
+    ].
+    self parseNl.
+
+    "Created: / 30-05-2014 / 10:13:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseAsyncRecord
+    "
+    async-record → exec-async-output | status-async-output | notify-async-output
+    "
+    self peek == $* ifTrue:[ 
+        ^ self parseExecAsyncOutput.
+    ].
+    self peek == $+ ifTrue:[ 
+        ^ self parseStatusAsyncOutput.
+    ].
+    self peek == $= ifTrue:[ 
+        ^ self parseNotifyAsyncOutput.
+    ].
+
+    ^ self error: 'Invalid async-record'
+
+    "Created: / 30-05-2014 / 09:57:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseExecAsyncOutput
+    "
+    exec-async-output → '*' async-output
+    "
+
+    self expect: $*.
+    ^ self parseAsyncOutput.
+
+    "Created: / 30-05-2014 / 10:10:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseNotifyAsyncOutput
+    "
+    status-notify-output → '=' async-output
+    "
+
+    self expect: $*.
+    ^ self parseAsyncOutput.
+
+    "Created: / 30-05-2014 / 10:10:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseStatusAsyncOutput
+    "
+    status-async-output → '+' async-output
+    "
+
+    self expect: $*.
+    ^ self parseAsyncOutput.
+
+    "Created: / 30-05-2014 / 10:10:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMIParser methodsFor:'parsing-misc'!
+
+parseResult
+    "
+    result → variable = value
+    "
+
+    | name value |
+
+    name := self parseVariable.
+    self expect: $=.
+    value := self parseValue.
+    ^ name -> value
+
+    "Created: / 30-05-2014 / 10:15:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:39:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseString
+    ^ String streamContents:[:s|
+        [ self peek isLetter or:['-' includes: self peek ] ]  whileTrue:[
+            s nextPut: self next.
+        ]
+    ].
+
+    "Created: / 30-05-2014 / 10:32:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:33:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseVariable
+    "
+    variable → string
+    "
+    ^ self parseString
+
+    "Created: / 30-05-2014 / 10:31:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBMIParser methodsFor:'parsing-stream output'!
+
+parseConsoleStreamOutput
+    self expect: $~.
+    ^ self parseCString
+
+    "Created: / 30-05-2014 / 10:28:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseLogStreamOutput
+    self expect: $&.
+    ^ self parseCString
+
+    "Created: / 30-05-2014 / 10:28:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseStreamRecord
+    "
+    stream-record → console-stream-output | target-stream-output | log-stream-output
+    "
+
+    self peek == $~ ifTrue:[ 
+        ^ self parseConsoleStreamOutput
+    ].
+    self peek == $@ ifTrue:[ 
+        ^ self parseTargetStreamOutput
+    ].
+    self peek == $& ifTrue:[ 
+        ^ self parseLogStreamOutput
+    ].
+    self error:'Invalid stream record'
+
+    "Created: / 30-05-2014 / 09:57:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseTargetStreamOutput
+    self expect: $@.
+    ^ self parseCString
+
+    "Created: / 30-05-2014 / 10:28:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBMIParser methodsFor:'parsing-utils'!
 
 expect: aStringOrChar
@@ -189,6 +462,91 @@
     "Created: / 19-11-2012 / 20:06:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBMIParser methodsFor:'parsing-values'!
+
+parseConst
+    "
+    const → c-string
+    "
+
+    ^ self parseCString.
+
+    "Created: / 30-05-2014 / 10:36:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseList
+    "
+    list → '[]' | '[' value ( ',' value )* ']' | '[' result ( ',' result )* ']'
+    "
+
+    self expect: $[.
+    ^ self peek == $] ifTrue:[ 
+        self next.
+         #()
+    ] ifFalse:[ 
+        Array streamContents:[ :s|
+            s nextPut: self parseValue.
+            [ self peek == $, ] whileTrue:[
+                self next.
+                s nextPut: self parseValue.
+            ].
+            self expect: $].
+        ].
+    ].
+
+    "Created: / 30-05-2014 / 10:36:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseTuple
+    "raise an error: this method should be implemented (TODO)"
+
+    | object |
+
+    object := GDBTuple new.
+    self expect: ${.
+    self peek == $} ifTrue:[ 
+        self next.
+    ] ifFalse:[ 
+        | name value |
+
+        name := self parseVariable.
+        self expect: $=.
+        value := self parseValue.
+        object propertyAt: name put: value.  
+        [ self peek == $, ] whileTrue:[
+            self next.
+            name := self parseVariable.
+            self expect: $=.
+            value := self parseValue.
+            object propertyAt: name put: value.  
+        ].
+        self expect: $}.
+    ].
+    ^ object
+
+    "Created: / 30-05-2014 / 10:36:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 31-05-2014 / 00:35:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseValue
+    "
+    value → const | tuple | list
+    "
+
+    self peek == $" ifTrue:[ 
+        ^ self parseConst
+    ].
+    self peek == ${ ifTrue:[ 
+        ^ self parseTuple.
+    ].
+    self peek == $[ ifTrue:[
+        ^ self parseList
+    ].
+    self error:'Invalid value'
+
+    "Created: / 30-05-2014 / 10:31:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBMIParser methodsFor:'streaming'!
 
 atEnd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBObject.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,25 @@
+"{ Package: 'jv:libgdbs' }"
+
+Object subclass:#GDBObject
+	instanceVariableNames:'properties'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core'
+!
+
+!GDBObject methodsFor:'accessing-properties'!
+
+propertyAt: name
+    properties isNil ifTrue:[ Object keyNotFoundError: name ].
+    ^ properties at: name ifAbsent:[ Object keyNotFoundError: name ].
+
+    "Created: / 31-05-2014 / 00:00:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+propertyAt: name put: value
+    properties isNil ifTrue:[ properties := Dictionary new ].
+    properties at: name put: value
+
+    "Created: / 31-05-2014 / 00:01:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBTuple.st	Sat May 31 00:42:30 2014 +0100
@@ -0,0 +1,9 @@
+"{ Package: 'jv:libgdbs' }"
+
+GDBObject subclass:#GDBTuple
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core'
+!
+
--- a/Make.proto	Wed May 28 09:42:40 2014 +0100
+++ b/Make.proto	Sat May 31 00:42:30 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/announcements -I$(INCLUDE_TOP)/stx/libbasic
 
 
 # if you need any additional defines for embedded C code,
@@ -102,6 +102,7 @@
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
 	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 
 
 
@@ -123,9 +124,17 @@
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)GDB.$(O) GDB.$(H): GDB.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLauncher.$(O) GDBLauncher.$(H): GDBLauncher.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommand.$(O) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandResult.$(O) GDBMICommandResult.$(H): GDBMICommandResult.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandStatus.$(O) GDBMICommandStatus.$(H): GDBMICommandStatus.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBMIDriver.$(O) GDBMIDriver.$(H): GDBMIDriver.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIEvent.$(O) GDBMIEvent.$(H): GDBMIEvent.st $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIEventSet.$(O) GDBMIEventSet.$(H): GDBMIEventSet.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/OrderedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandResultEvent.$(O) GDBMICommandResultEvent.$(H): GDBMICommandResultEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBMIEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)/jv/libgdbs/GDBMICommandStatus.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBTuple.$(O) GDBTuple.$(H): GDBTuple.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/Make.spec	Wed May 28 09:42:40 2014 +0100
+++ b/Make.spec	Sat May 31 00:42:30 2014 +0100
@@ -52,9 +52,17 @@
 COMMON_CLASSES= \
 	GDB \
 	GDBLauncher \
+	GDBMICommand \
+	GDBMICommandResult \
+	GDBMICommandStatus \
 	GDBMIDriver \
+	GDBMIEvent \
+	GDBMIEventSet \
+	GDBObject \
+	jv_libgdbs \
+	GDBMICommandResultEvent \
 	GDBMIParser \
-	jv_libgdbs \
+	GDBTuple \
 
 
 
@@ -62,9 +70,17 @@
 COMMON_OBJS= \
     $(OUTDIR_SLASH)GDB.$(O) \
     $(OUTDIR_SLASH)GDBLauncher.$(O) \
+    $(OUTDIR_SLASH)GDBMICommand.$(O) \
+    $(OUTDIR_SLASH)GDBMICommandResult.$(O) \
+    $(OUTDIR_SLASH)GDBMICommandStatus.$(O) \
     $(OUTDIR_SLASH)GDBMIDriver.$(O) \
+    $(OUTDIR_SLASH)GDBMIEvent.$(O) \
+    $(OUTDIR_SLASH)GDBMIEventSet.$(O) \
+    $(OUTDIR_SLASH)GDBObject.$(O) \
+    $(OUTDIR_SLASH)jv_libgdbs.$(O) \
+    $(OUTDIR_SLASH)GDBMICommandResultEvent.$(O) \
     $(OUTDIR_SLASH)GDBMIParser.$(O) \
-    $(OUTDIR_SLASH)jv_libgdbs.$(O) \
+    $(OUTDIR_SLASH)GDBTuple.$(O) \
 
 
 
--- a/abbrev.stc	Wed May 28 09:42:40 2014 +0100
+++ b/abbrev.stc	Sat May 31 00:42:30 2014 +0100
@@ -3,6 +3,14 @@
 # it provides information about a classes filename, category and especially namespace.
 GDB GDB jv:libgdbs 'GDB-Core' 0
 GDBLauncher GDBLauncher jv:libgdbs 'GDB-Private' 0
-GDBMIDriver GDBMIDriver jv:libgdbs 'GDB-Private-MI' 0
-GDBMIParser GDBMIParser jv:libgdbs 'GDB-Private-MI' 0
+GDBMICommand GDBMICommand jv:libgdbs 'GDB-Core-MI' 0
+GDBMICommandResult GDBMICommandResult jv:libgdbs 'GDB-Core-MI' 0
+GDBMICommandStatus GDBMICommandStatus jv:libgdbs 'GDB-Core-MI' 0
+GDBMIDriver GDBMIDriver jv:libgdbs 'GDB-Private' 0
+GDBMIEvent GDBMIEvent jv:libgdbs 'GDB-Core-MI-Events' 0
+GDBMIEventSet GDBMIEventSet jv:libgdbs 'GDB-Core-MI-Events' 0
+GDBObject GDBObject jv:libgdbs 'GDB-Core' 0
 jv_libgdbs jv_libgdbs jv:libgdbs '* Projects & Packages *' 3
+GDBMICommandResultEvent GDBMICommandResultEvent jv:libgdbs 'GDB-Core-MI-Events' 0
+GDBMIParser GDBMIParser jv:libgdbs 'GDB-Private' 0
+GDBTuple GDBTuple jv:libgdbs 'GDB-Core' 0
--- a/bc.mak	Wed May 28 09:42:40 2014 +0100
+++ b/bc.mak	Sat May 31 00:42:30 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\announcements -I$(INCLUDE_TOP)\stx\libbasic
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -51,6 +51,7 @@
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
 	pushd ..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
@@ -69,9 +70,17 @@
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)GDB.$(O) GDB.$(H): GDB.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLauncher.$(O) GDBLauncher.$(H): GDBLauncher.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommand.$(O) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandResult.$(O) GDBMICommandResult.$(H): GDBMICommandResult.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandStatus.$(O) GDBMICommandStatus.$(H): GDBMICommandStatus.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SharedPool.$(H) $(STCHDR)
 $(OUTDIR)GDBMIDriver.$(O) GDBMIDriver.$(H): GDBMIDriver.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIEvent.$(O) GDBMIEvent.$(H): GDBMIEvent.st $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIEventSet.$(O) GDBMIEventSet.$(H): GDBMIEventSet.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\OrderedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)GDBObject.$(O) GDBObject.$(H): GDBObject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)GDBMICommandResultEvent.$(O) GDBMICommandResultEvent.$(H): GDBMICommandResultEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBMIEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIParser.$(O) GDBMIParser.$(H): GDBMIParser.st $(INCLUDE_TOP)\jv\libgdbs\GDBMICommandStatus.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBTuple.$(O) GDBTuple.$(H): GDBTuple.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/jv_libgdbs.st	Wed May 28 09:42:40 2014 +0100
+++ b/jv_libgdbs.st	Sat May 31 00:42:30 2014 +0100
@@ -28,7 +28,8 @@
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:libbasic'    "LibraryDefinition - superclass of jv_libgdbs "
+        #'stx:goodies/announcements'    "Announcement - superclass of GDBMICommandResultEvent "
+        #'stx:libbasic'    "Collection - superclass of GDBMIEventSet "
     )
 !
 
@@ -65,9 +66,17 @@
         "<className> or (<className> attributes...) in load order"
         GDB
         GDBLauncher
+        GDBMICommand
+        GDBMICommandResult
+        GDBMICommandStatus
         GDBMIDriver
+        GDBMIEvent
+        GDBMIEventSet
+        GDBObject
+        #'jv_libgdbs'
+        GDBMICommandResultEvent
         GDBMIParser
-        #'jv_libgdbs'
+        GDBTuple
     )
 !
 
--- a/libInit.cc	Wed May 28 09:42:40 2014 +0100
+++ b/libInit.cc	Sat May 31 00:42:30 2014 +0100
@@ -29,9 +29,17 @@
 __BEGIN_PACKAGE2__("libjv_libgdbs", _libjv_libgdbs_Init, "jv:libgdbs");
 _GDB_Init(pass,__pRT__,snd);
 _GDBLauncher_Init(pass,__pRT__,snd);
+_GDBMICommand_Init(pass,__pRT__,snd);
+_GDBMICommandResult_Init(pass,__pRT__,snd);
+_GDBMICommandStatus_Init(pass,__pRT__,snd);
 _GDBMIDriver_Init(pass,__pRT__,snd);
+_GDBMIEvent_Init(pass,__pRT__,snd);
+_GDBMIEventSet_Init(pass,__pRT__,snd);
+_GDBObject_Init(pass,__pRT__,snd);
+_jv_137libgdbs_Init(pass,__pRT__,snd);
+_GDBMICommandResultEvent_Init(pass,__pRT__,snd);
 _GDBMIParser_Init(pass,__pRT__,snd);
-_jv_137libgdbs_Init(pass,__pRT__,snd);
+_GDBTuple_Init(pass,__pRT__,snd);
 
 
 __END_PACKAGE__();
--- a/libgdbs.rc	Wed May 28 09:42:40 2014 +0100
+++ b/libgdbs.rc	Sat May 31 00:42:30 2014 +0100
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,3,0
+  PRODUCTVERSION  6,2,4,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:libgdbs\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
-      VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Wed, 28 May 2014 08:41:15 GMT\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Fri, 30 May 2014 23:41:48 GMT\0"
     END
 
   END
--- a/tests/GDBMIParserTests.st	Wed May 28 09:42:40 2014 +0100
+++ b/tests/GDBMIParserTests.st	Sat May 31 00:42:30 2014 +0100
@@ -3,8 +3,8 @@
 TestCase subclass:#GDBMIParserTests
 	instanceVariableNames:''
 	classVariableNames:''
-	poolDictionaries:''
-	category:'GDB-Private-MI-Tests'
+	poolDictionaries:'GDBMICommandStatus'
+	category:'GDB-Private-Tests'
 !
 
 !GDBMIParserTests methodsFor:'tests - C strings'!
@@ -21,3 +21,24 @@
     "Created: / 28-05-2014 / 00:05:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBMIParserTests methodsFor:'tests - examples'!
+
+test_simple_example_01
+
+    | parser events |
+
+    parser := GDBMIParser on:
+'^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x08048564",func="main",file="myprog.c",fullname="/home/nickrob/myprog.c",line="68",thread-groups=["i1"],times="0"}
+(gdb)
+'.
+    events := parser parseOutput.
+
+    self assert: events size == 1.
+    self assert: events first isCommandResultEvent.
+    self assert: events first result status == CommandStatusDone.
+    self assert: events first result value key = 'bkpt'.
+    self assert: (events first result value value propertyAt: 'addr') = '0x08048564'
+
+    "Created: / 30-05-2014 / 23:53:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/tests/Make.proto	Wed May 28 09:42:40 2014 +0100
+++ b/tests/Make.proto	Sat May 31 00:42:30 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)/jv/libgdbs -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic
 
 
 # if you need any additional defines for embedded C code,
@@ -102,8 +102,10 @@
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
 	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/goodies/announcements && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../ && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd $(TOP)/goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 
@@ -125,7 +127,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
-$(OUTDIR)GDBMIParserTests.$(O) GDBMIParserTests.$(H): GDBMIParserTests.st $(INCLUDE_TOP)/stx/goodies/sunit/TestAsserter.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestCase.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIParserTests.$(O) GDBMIParserTests.$(H): GDBMIParserTests.st $(INCLUDE_TOP)/jv/libgdbs/GDBMICommandStatus.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestAsserter.$(H) $(INCLUDE_TOP)/stx/goodies/sunit/TestCase.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs_tests.$(O) jv_libgdbs_tests.$(H): jv_libgdbs_tests.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/tests/abbrev.stc	Wed May 28 09:42:40 2014 +0100
+++ b/tests/abbrev.stc	Sat May 31 00:42:30 2014 +0100
@@ -1,5 +1,5 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
-GDBMIParserTests GDBMIParserTests jv:libgdbs/tests 'GDB-Private-MI-Tests' 1
+GDBMIParserTests GDBMIParserTests jv:libgdbs/tests 'GDB-Private-Tests' 1
 jv_libgdbs_tests jv_libgdbs_tests jv:libgdbs/tests '* Projects & Packages *' 3
--- a/tests/bc.mak	Wed May 28 09:42:40 2014 +0100
+++ b/tests/bc.mak	Sat May 31 00:42:30 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic
+LOCALINCLUDES= -I$(INCLUDE_TOP)\jv\libgdbs -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -51,8 +51,10 @@
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
 	pushd ..\..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\..\..\stx\goodies\announcements & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd .. & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\..\..\stx\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
@@ -71,7 +73,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
-$(OUTDIR)GDBMIParserTests.$(O) GDBMIParserTests.$(H): GDBMIParserTests.st $(INCLUDE_TOP)\stx\goodies\sunit\TestAsserter.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestCase.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBMIParserTests.$(O) GDBMIParserTests.$(H): GDBMIParserTests.st $(INCLUDE_TOP)\jv\libgdbs\GDBMICommandStatus.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestAsserter.$(H) $(INCLUDE_TOP)\stx\goodies\sunit\TestCase.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)jv_libgdbs_tests.$(O) jv_libgdbs_tests.$(H): jv_libgdbs_tests.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/tests/jv_libgdbs_tests.st	Wed May 28 09:42:40 2014 +0100
+++ b/tests/jv_libgdbs_tests.st	Sat May 31 00:42:30 2014 +0100
@@ -28,6 +28,7 @@
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
+        #'jv:libgdbs'    "GDBMICommandStatus - shared pool used by GDBMIParserTests "
         #'stx:goodies/sunit'    "TestAsserter - superclass of GDBMIParserTests "
         #'stx:libbasic'    "LibraryDefinition - superclass of jv_libgdbs_tests "
     )
@@ -41,7 +42,6 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'jv:libgdbs'    "GDBMIParser - referenced by GDBMIParserTests>>test_c_string_01 "
     )
 !
 
--- a/tests/tests.rc	Wed May 28 09:42:40 2014 +0100
+++ b/tests/tests.rc	Sat May 31 00:42:30 2014 +0100
@@ -4,7 +4,7 @@
 //
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION     6,2,32767,32767
-  PRODUCTVERSION  6,2,3,0
+  PRODUCTVERSION  6,2,4,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
   FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
@@ -24,8 +24,8 @@
       VALUE "InternalName", "jv:libgdbs/tests\0"
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
-      VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Wed, 28 May 2014 08:41:17 GMT\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Fri, 30 May 2014 23:41:51 GMT\0"
     END
 
   END