فهرست منبع

Add error handling, CDATA support & control over descent

Carl Husberg 3 سال پیش
والد
کامیت
346d04e7f0
3فایلهای تغییر یافته به همراه38 افزوده شده و 8 حذف شده
  1. 4 1
      xml.mod/common.bmx
  2. 15 2
      xml.mod/glue.c
  3. 19 5
      xml.mod/xml.bmx

+ 4 - 1
xml.mod/common.bmx

@@ -49,7 +49,7 @@ Extern
 	Function bmx_mxmlGetLastChild:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetLastChild:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetNextSibling:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetNextSibling:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetPrevSibling:Byte Ptr(handle:Byte Ptr)
 	Function bmx_mxmlGetPrevSibling:Byte Ptr(handle:Byte Ptr)
-	Function bmx_mxmlFindElement:Byte Ptr(handle:Byte Ptr, element:String, attr:String, value:String)
+	Function bmx_mxmlFindElement:Byte Ptr(handle:Byte Ptr, element:String, attr:String, value:String, descend:Int)
 
 
 	Function bmx_mxmlSaveStdout:Int(handle:Byte Ptr, format:Int)
 	Function bmx_mxmlSaveStdout:Int(handle:Byte Ptr, format:Int)
 	Function bmx_mxmlSaveString:String(handle:Byte Ptr, format:Int)
 	Function bmx_mxmlSaveString:String(handle:Byte Ptr, format:Int)
@@ -57,6 +57,9 @@ Extern
 	
 	
 	Function bmx_mxmlSetWrapMargin(column:Int)
 	Function bmx_mxmlSetWrapMargin(column:Int)
 	Function bmx_mxmlGetContent:String(handle:Byte Ptr)
 	Function bmx_mxmlGetContent:String(handle:Byte Ptr)
+	Function bmx_mxmlGetCDATA:String(handle:Byte Ptr)
+	
+	Function bmx_mxmlSetErrorCallback(callback(message:Byte Ptr))
 End Extern
 End Extern
 
 
 Rem
 Rem

+ 15 - 2
xml.mod/glue.c

@@ -375,14 +375,23 @@ void bmx_mxmlSetWrapMargin(int column) {
 
 
 BBString * bmx_mxmlGetContent(mxml_node_t * node) {
 BBString * bmx_mxmlGetContent(mxml_node_t * node) {
 	const char * txt = mxmlGetOpaque(node);
 	const char * txt = mxmlGetOpaque(node);
+	
+	if (!txt || strlen(txt) == 0) {
+		return &bbEmptyString;
+	}
+	return bbStringFromUTF8String(txt);
+}
 
 
+BBString * bmx_mxmlGetCDATA(mxml_node_t * node) {
+	const char * txt = mxmlGetCDATA(node);
+	
 	if (!txt || strlen(txt) == 0) {
 	if (!txt || strlen(txt) == 0) {
 		return &bbEmptyString;
 		return &bbEmptyString;
 	}
 	}
 	return bbStringFromUTF8String(txt);
 	return bbStringFromUTF8String(txt);
 }
 }
 
 
-mxml_node_t * bmx_mxmlFindElement(mxml_node_t * node, BBString * element, BBString * attr, BBString * value) {
+mxml_node_t * bmx_mxmlFindElement(mxml_node_t * node, BBString * element, BBString * attr, BBString * value, int descend) {
 	char * e = 0;
 	char * e = 0;
 	char * a = 0;
 	char * a = 0;
 	char * v = 0;
 	char * v = 0;
@@ -397,7 +406,7 @@ mxml_node_t * bmx_mxmlFindElement(mxml_node_t * node, BBString * element, BBStri
 		v = bbStringToUTF8String(value);
 		v = bbStringToUTF8String(value);
 	}
 	}
 	
 	
-	mxml_node_t * result = mxmlFindElement(node, node, e, a, v, MXML_DESCEND);
+	mxml_node_t * result = mxmlFindElement(node, node, e, a, v, descend);
 	
 	
 	bbMemFree(v);
 	bbMemFree(v);
 	bbMemFree(a);
 	bbMemFree(a);
@@ -405,3 +414,7 @@ mxml_node_t * bmx_mxmlFindElement(mxml_node_t * node, BBString * element, BBStri
 	
 	
 	return result;
 	return result;
 }
 }
+
+void bmx_mxmlSetErrorCallback(mxml_error_cb_t cb){
+	mxmlSetErrorCallback(cb);
+}

+ 19 - 5
xml.mod/xml.bmx

@@ -31,6 +31,13 @@ Import "common.bmx"
 ' disable wrapping
 ' disable wrapping
 bmx_mxmlSetWrapMargin(0)
 bmx_mxmlSetWrapMargin(0)
 
 
+Rem
+bbdoc: Sets the callback for handing errors, errors will print if not set.
+End Rem
+Function XMLSetErrorCallback(callback(message:Byte Ptr))
+	bmx_mxmlSetErrorCallback(callback)
+EndFunction
+
 Rem
 Rem
 bbdoc: 
 bbdoc: 
 End Rem
 End Rem
@@ -254,10 +261,17 @@ Type TxmlNode Extends TxmlBase
 		Local sb:TStringBuilder = New TStringBuilder()
 		Local sb:TStringBuilder = New TStringBuilder()
 		
 		
 		Local n:Byte Ptr = bmx_mxmlWalkNext(nodePtr, nodePtr, MXML_DESCEND)
 		Local n:Byte Ptr = bmx_mxmlWalkNext(nodePtr, nodePtr, MXML_DESCEND)
+		
 		While n
 		While n
-			If bmx_mxmlGetType(n) = MXML_OPAQUE Then
-				sb.Append(bmx_mxmlGetContent(n))
-			End If
+			Select bmx_mxmlGetType(n)
+				Case MXML_ELEMENT
+					sb.Append(bmx_mxmlGetCDATA(n))
+					
+				Case MXML_OPAQUE
+					sb.Append(bmx_mxmlGetContent(n))
+					
+			EndSelect
+			
 			n = bmx_mxmlWalkNext(n, nodePtr, MXML_DESCEND)
 			n = bmx_mxmlWalkNext(n, nodePtr, MXML_DESCEND)
 		Wend
 		Wend
 		
 		
@@ -268,8 +282,8 @@ Type TxmlNode Extends TxmlBase
 	bbdoc: Finds an element of the given @element name, attribute or attribute/value.
 	bbdoc: Finds an element of the given @element name, attribute or attribute/value.
 	returns: A node or Null if no match was found.
 	returns: A node or Null if no match was found.
 	End Rem
 	End Rem
-	Method findElement:TxmlNode(element:String = "", attr:String = "", value:String = "")
-		Return TxmlNode._create(bmx_mxmlFindElement(nodePtr, element, attr, value))
+	Method findElement:TxmlNode(element:String = "", attr:String = "", value:String = "", descend:Int=MXML_DESCEND)
+		Return TxmlNode._create(bmx_mxmlFindElement(nodePtr, element, attr, value, descend))
 	End Method
 	End Method
 
 
 	Rem
 	Rem