• Welcome to Theos PowerBasic Museum 2017.

Intelligent WRAP$ and UnWrap$ for XML

Started by Theo Gottwald, September 08, 2013, 08:39:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Theo Gottwald

I was not perfectly happy with the current implementation of the PB Commands WRAP$ and UnWrap$
therefore here is my version:



   %XML_BEGIN_TAG = 60        ' <
   $XML_BEGIN_TAG =CHR$(60)

   %XML_END_TAG = 62          ' >
   $XML_END_TAG =CHR$(62)

  ' White-Space characters: #x20 | #x9 | #xD | #xA
  $XML_WSP=CHR$(&H20,&H9,&HD,&HA)     

'##############################################################################
'##############################################################################
'                                   
MACRO G_REG()
REGISTER R01 AS LONG,R02 AS LONG
END MACRO   
'##############################################################################
'##############################################################################
'
MACRO G_S01()
LOCAL S01 AS STRING
END MACRO   
'##############################################################################
'##############################################################################
'
MACRO G_T01()
LOCAL T01 AS LONG
END MACRO

MACRO G_T02()
LOCAL T01,T02 AS LONG
END MACRO   
'##############################################################################
'##############################################################################
'
' 0/1 ob das Zeichen (ASC-Wert) ein XML-Whitespace ist oder nicht
FUNCTION XML_Is_SP_ASC(BYVAL U01 AS LONG) AS LONG
G_REG
G_S01
S01=CHR$(U01)
IF  INSTR($XML_WSP,S01) THEN R01=1 ELSE R01=0
enx:
FUNCTION=R01
END FUNCTION   

'##############################################################################
'##############################################################################
'
FUNCTION xml_Wrap(BYREF U01 AS STRING) AS STRING
  G_REG
  G_S01
  S01=xml_UnWrap(U01)
  S01=WRAP$(S01,"<",">")
  enx:
  FUNCTION=S01
  END FUNCTION
'##############################################################################
'##############################################################################
'
FUNCTION xml_UnWrap(BYREF U01 AS STRING) AS STRING
  G_REG
  G_T02
  G_S01
  T01=LEN(U01)
  IF zero(T01) THEN S01="":GOTO enx
  T02=INSTR(U01,"<")
  IF zero(T02) THEN GOTO Lab_A01
  IF T02=1 THEN GOTO Lab_A02
  ' Eine "<" ist da aber nicht an Pos.1
  FOR R01=1 TO T02
      R02=ASC(U01,R01)
      IF XML_Is_SP_ASC(R02) THEN
         ITERATE FOR
      ELSEIF R02=%XML_BEGIN_TAG THEN
         U01=MID$(U01,R01+1)
         GOTO Lab_A02
      ELSE
          EXIT FOR
      END IF
  NEXT
  U01=MID$(S01,R01+1)
  '-------------------
  Lab_A02:
  U01=LTRIM$(U01,"<")
  '-------------------
  Lab_A01:
  T01=LEN(U01)
  IF zero(T01) THEN S01="":GOTO enx
  R02=INSTR(-1,U01,">")
  IF R02=0 THEN GOTO enz
  IF R02=T01 THEN GOTO Lab_over
  T02=R02
  '-------------------
  R02=ASC(U01,-1)
  IF zero(XML_Is_SP_ASC(R02)) THEN GOTO Lab_over
     FOR R01=T01 TO T02 STEP -1
        R02=ASC(U01,R01)
        IF XML_Is_SP_ASC(R02) THEN
           ITERATE FOR
        ELSEIF R02=%XML_END_TAG THEN
           U01=MID$(U01,1,R01-1)
           GOTO Lab_over
        ELSE
           EXIT FOR
        END IF
     NEXT
  U01=MID$(U01,1,R01-1)
  Lab_over:
  S01=RTRIM$(U01,">")
  enx:
  FUNCTION=S01
  EXIT FUNCTION
  enz:
  S01=U01
  GOTO enx
  END FUNCTION
'##############################################################################
'##############################################################################


These handle multiple brackets like "  <<<tag >> better.
Also tags with Spaces around will be trimmed first.
Spaces inside the tag are preserved.

Petr Schreiber

Hi Theo,

I can't compile it via PB/Win 10.04, because compiler does not know what "zero" is (first used around line 64).
Could you give me a hint?


Thanks,
Petr
AMD Sempron 3400+ | 1GB RAM @ 533MHz | GeForce 6200 / GeForce 9500GT | 32bit Windows XP SP3

psch.thinbasic.com

Theo Gottwald

Sorry, Peter.

MACRO zero(P1) = (P1=0&)

:-)

Example: If zero(X) then