;
; ------------------------------------------------------------
;
;   PureBasic - Xml
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

EnableExplicit


ProcedureC StartElementHandler(*UserData, *Name, *Args)
  Protected *Depth.INTEGER = *UserData
  Protected *Arg.INTEGER = *Args
  Protected Indent$ = Space(6 * *Depth\i), AttName$, AttValue$
  
  Debug Indent$ + "Start: " + PeekS(*Name)
  
  ; Attribute values are an array of pointers with alternating name and value entries
  ; Terminated by null pointer
  While *arg\i <> 0
    AttName$ = PeekS(*arg\i)
    *arg + SizeOf(Integer)
    AttValue$ = PeekS(*arg\i)
    *arg + SizeOf(Integer)
    Debug Indent$ + "             " + AttName$ + "=" + AttValue$
  Wend
  
  *Depth\i + 1
EndProcedure

ProcedureC EndElementHandler(*UserData, *Name)
  Protected *Depth.INTEGER = *UserData
  *Depth\i - 1
  Debug Space(6 * *Depth\i) + "End: " + PeekS(*Name)
EndProcedure



If ReadFile(0, #PB_Compiler_Home + "examples/sources/Data/ui.xml")
  
  ; initialize parser
  Define Parser = pb_XML_ParserCreate_(0)
  Define Depth  = 0
  pb_XML_SetUserData_(Parser, @Depth)
  pb_XML_SetStartElementHandler_(Parser, @StartElementHandler())
  pb_XML_SetEndElementHandler_(Parser, @EndElementHandler())
  
  ; block size for streaming. this is very small as an example. Use something larger like 1Mb here for real files!
  Define BufferSize = 20, BytesRead
  Define *Buffer = AllocateMemory(BufferSize)
  
  While Not Eof(0)
    Define BytesRead = ReadData(0, *Buffer, BufferSize)
    If BytesRead > 0
      If pb_XML_Parse_(Parser, *Buffer, BytesRead, #False) = #XML_STATUS_ERROR
        ; parser error (message is in ascii)
        Debug "Parser Error (Line " + Str(pb_XML_GetCurrentLineNumber_(Parser)) + "): " + PeekS(pb_XML_ErrorString_(pb_XML_GetErrorCode_(Parser)), -1, #PB_Ascii)
        Break
      EndIf
    EndIf
  Wend
  
  ; important: finish the parsing process
  pb_XML_Parse_(Parser, *Buffer, 0, #True)
  pb_XML_ParserFree_(Parser)
  
  FreeMemory(*Buffer)
  
  CloseFile(0)
Else
  Debug "Cannot open file"
EndIf