XML/XPath: Difference between revisions
Content added Content deleted
No edit summary |
(add task to ARM64 assembly Raspberry Pi) |
||
Line 33: | Line 33: | ||
</section> |
</section> |
||
</inventory> |
</inventory> |
||
=={{header|AArch64 Assembly}}== |
|||
{{works with|as|Raspberry Pi 3B version Buster 64 bits}} |
|||
<lang AArch64 Assembly> |
|||
/* ARM assembly AARCH64 Raspberry PI 3B */ |
|||
/* program xpathXml64.s */ |
|||
/*******************************************/ |
|||
/* Constantes file */ |
|||
/*******************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeConstantesARM64.inc" |
|||
.equ NBMAXELEMENTS, 100 |
|||
/*******************************************/ |
|||
/* Structures */ |
|||
/********************************************/ |
|||
/* structure xmlNode*/ |
|||
.struct 0 |
|||
xmlNode_private: // application data |
|||
.struct xmlNode_private + 8 |
|||
xmlNode_type: // type number, must be second ! |
|||
.struct xmlNode_type + 8 |
|||
xmlNode_name: // the name of the node, or the entity |
|||
.struct xmlNode_name + 8 |
|||
xmlNode_children: // parent->childs link |
|||
.struct xmlNode_children + 8 |
|||
xmlNode_last: // last child link |
|||
.struct xmlNode_last + 8 |
|||
xmlNode_parent: // child->parent link |
|||
.struct xmlNode_parent + 8 |
|||
xmlNode_next: // next sibling link |
|||
.struct xmlNode_next + 8 |
|||
xmlNode_prev: // previous sibling link |
|||
.struct xmlNode_prev + 8 |
|||
xmlNode_doc: // the containing document |
|||
.struct xmlNode_doc + 8 |
|||
xmlNode_ns: // pointer to the associated namespace |
|||
.struct xmlNode_ns + 8 |
|||
xmlNode_content: // the content |
|||
.struct xmlNode_content + 8 |
|||
xmlNode_properties: // properties list |
|||
.struct xmlNode_properties + 8 |
|||
xmlNode_nsDef: // namespace definitions on this node |
|||
.struct xmlNode_nsDef + 8 |
|||
xmlNode_psvi: // for type/PSVI informations |
|||
.struct xmlNode_psvi + 8 |
|||
xmlNode_line: // line number |
|||
.struct xmlNode_line + 4 |
|||
xmlNode_extra: // extra data for XPath/XSLT |
|||
.struct xmlNode_extra + 4 |
|||
xmlNode_fin: |
|||
/********************************************/ |
|||
/* structure xmlNodeSet*/ |
|||
.struct 0 |
|||
xmlNodeSet_nodeNr: // number of nodes in the set |
|||
.struct xmlNodeSet_nodeNr + 4 |
|||
xmlNodeSet_nodeMax: // size of the array as allocated |
|||
.struct xmlNodeSet_nodeMax + 4 |
|||
xmlNodeSet_nodeTab: // array of nodes in no particular order |
|||
.struct xmlNodeSet_nodeTab + 8 |
|||
xmlNodeSet_fin: |
|||
/********************************************/ |
|||
/* structure xmlXPathObject*/ |
|||
.struct 0 |
|||
xmlPathObj_type: // |
|||
.struct xmlPathObj_type + 8 |
|||
xmlPathObj_nodesetval: // |
|||
.struct xmlPathObj_nodesetval + 8 |
|||
xmlPathObj_boolval: // |
|||
.struct xmlPathObj_boolval + 8 |
|||
xmlPathObj_floatval: // |
|||
.struct xmlPathObj_floatval + 8 |
|||
xmlPathObj_stringval: // |
|||
.struct xmlPathObj_stringval + 8 |
|||
xmlPathObj_user: // |
|||
.struct xmlPathObj_user + 8 |
|||
xmlPathObj_index: // |
|||
.struct xmlPathObj_index + 8 |
|||
xmlPathObj_usex2: // |
|||
.struct xmlPathObj_usex2 + 8 |
|||
xmlPathObj_index2: // |
|||
.struct xmlPathObj_index2 + 8 |
|||
/*********************************/ |
|||
/* Initialized data */ |
|||
/*********************************/ |
|||
.data |
|||
szMessEndpgm: .asciz "\nNormal end of program.\n" |
|||
szMessDisVal: .asciz "\nDisplay set values.\n" |
|||
szMessDisArea: .asciz "\nDisplay area values.\n" |
|||
szFileName: .asciz "testXml.xml" |
|||
szMessError: .asciz "Error detected !!!!. \n" |
|||
szLibName: .asciz "name" |
|||
szLibPrice: .asciz "//price" |
|||
szLibExtName: .asciz "//name" |
|||
szCarriageReturn: .asciz "\n" |
|||
/*********************************/ |
|||
/* UnInitialized data */ |
|||
/*********************************/ |
|||
.bss |
|||
.align 4 |
|||
tbExtract: .skip 8 * NBMAXELEMENTS // result extract area |
|||
/*********************************/ |
|||
/* code section */ |
|||
/*********************************/ |
|||
.text |
|||
.global main |
|||
main: // entry of program |
|||
ldr x0,qAdrszFileName |
|||
bl xmlParseFile // create doc |
|||
cbz x0,99f // error ? |
|||
mov x19,x0 // doc address |
|||
mov x0,x19 // doc |
|||
bl xmlDocGetRootElement // get root |
|||
bl xmlFirstElementChild // get first section |
|||
bl xmlFirstElementChild // get first item |
|||
bl xmlFirstElementChild // get first name |
|||
bl xmlNodeGetContent // extract content |
|||
bl affichageMess // for display |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
ldr x0,qAdrszMessDisVal |
|||
bl affichageMess |
|||
mov x0,x19 |
|||
ldr x1,qAdrszLibPrice // extract prices |
|||
bl extractValue |
|||
mov x0,x19 |
|||
ldr x1,qAdrszLibExtName // extract names |
|||
bl extractValue |
|||
ldr x0,qAdrszMessDisArea |
|||
bl affichageMess |
|||
mov x4,#0 // display string result area |
|||
ldr x5,qAdrtbExtract |
|||
1: |
|||
ldr x0,[x5,x4,lsl #3] |
|||
cbz x0,2f |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
add x4,x4,1 |
|||
b 1b |
|||
2: |
|||
mov x0,x19 |
|||
bl xmlFreeDoc |
|||
bl xmlCleanupParser |
|||
ldr x0,qAdrszMessEndpgm |
|||
bl affichageMess |
|||
b 100f |
|||
99: // error |
|||
ldr x0,qAdrszMessError |
|||
bl affichageMess |
|||
100: // standard end of the program |
|||
mov x0,0 // return code |
|||
mov x8,EXIT // request to exit program |
|||
svc 0 // perform the system call |
|||
qAdrszMessError: .quad szMessError |
|||
qAdrszMessEndpgm: .quad szMessEndpgm |
|||
qAdrszLibName: .quad szLibName |
|||
qAdrszLibPrice: .quad szLibPrice |
|||
qAdrszCarriageReturn: .quad szCarriageReturn |
|||
qAdrszFileName: .quad szFileName |
|||
qAdrszLibExtName: .quad szLibExtName |
|||
qAdrtbExtract: .quad tbExtract |
|||
qAdrszMessDisVal: .quad szMessDisVal |
|||
qAdrszMessDisArea: .quad szMessDisArea |
|||
/******************************************************************/ |
|||
/* extract value of set */ |
|||
/******************************************************************/ |
|||
/* x0 contains the doc address |
|||
/* x1 contains the address of the libel to extract */ |
|||
extractValue: |
|||
stp x19,lr,[sp,-16]! // save registers |
|||
stp x20,x21,[sp,-16]! // save registers |
|||
stp x22,x23,[sp,-16]! // save registers |
|||
mov x20,x1 // save address libel |
|||
mov x19,x0 // save doc |
|||
bl xmlXPathNewContext // create context |
|||
mov x23,x0 // save context |
|||
mov x1,x0 |
|||
mov x0,x20 |
|||
bl xmlXPathEvalExpression |
|||
mov x21,x0 |
|||
mov x0,x23 |
|||
bl xmlXPathFreeContext // free context |
|||
cmp x21,#0 |
|||
beq 100f |
|||
ldr x14,[x21,#xmlPathObj_nodesetval] // values set |
|||
ldr w23,[x14,#xmlNodeSet_nodeNr] // set size |
|||
mov x22,#0 // index |
|||
ldr x20,[x14,#xmlNodeSet_nodeTab] // area of nodes |
|||
ldr x21,qAdrtbExtract |
|||
1: // start loop |
|||
ldr x3,[x20,x22,lsl #3] // load node |
|||
mov x0,x19 |
|||
ldr x1,[x3,#xmlNode_children] // load string value |
|||
mov x2,#1 |
|||
bl xmlNodeListGetString |
|||
str x0,[x21,x22,lsl #3] // store string pointer in area |
|||
bl affichageMess // and display string result |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
add x22,x22,1 |
|||
cmp x22,x23 |
|||
blt 1b |
|||
100: |
|||
ldp x22,x23,[sp],16 // restaur 2 registers |
|||
ldp x20,x21,[sp],16 // restaur 2 registers |
|||
ldp x19,lr,[sp],16 // restaur 2 registers |
|||
ret // return to address lr x30 |
|||
/********************************************************/ |
|||
/* File Include fonctions */ |
|||
/********************************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly */ |
|||
.include "../includeARM64.inc" |
|||
</lang> |
|||
{{output}} |
|||
<pre> |
|||
Invisibility Cream |
|||
Display set values. |
|||
14.50 |
|||
23.99 |
|||
4.95 |
|||
3.56 |
|||
Invisibility Cream |
|||
Levitation Salve |
|||
Blork and Freen Instameal |
|||
Grob winglets |
|||
Display area values. |
|||
Invisibility Cream |
|||
Levitation Salve |
|||
Blork and Freen Instameal |
|||
Grob winglets |
|||
Normal end of program. |
|||
</pre> |
|||
=={{header|ARM Assembly}}== |
=={{header|ARM Assembly}}== |
||
{{works with|as|Raspberry Pi}} |
{{works with|as|Raspberry Pi}} |
||
Line 209: | Line 453: | ||
iAdrszMessDisArea: .int szMessDisArea |
iAdrszMessDisArea: .int szMessDisArea |
||
/******************************************************************/ |
/******************************************************************/ |
||
/* |
/* extract value of set */ |
||
/******************************************************************/ |
/******************************************************************/ |
||
/* r0 contains the doc address |
/* r0 contains the doc address |