Skip to main content



      Home
Home » Eclipse Projects » Eclipse Titan » External functions using universal charstrings(How to correctly cast universal charstrings into char *)
External functions using universal charstrings [message #1831036] Mon, 10 August 2020 08:42 Go to next message
Eclipse UserFriend
Hi Titan experts,

I am using external functions to process XML documents via the excelent libxml2.

I have now the problems that the MCC TF160 ATSs at ETSI will use universal charstrings instead of charstrings.

Previously I used following cast operators, which worked fine:

/*
   * Returns given node in XML document referred via an xpath expression using libxml2
   */
CHARSTRING fx__XML__GetElement(const CHARSTRING& p_XMLDoc,
				 const CHARSTRING& p_Xpath) {
    
    const char *v_XMLDoc = (const char *) static_cast<const unsigned  char*>(p_XMLDoc);
    xmlChar *xPath =  (xmlChar *) static_cast<const  char*>(p_Xpath);

  ....
      }


This does not work if I have now UNIVERSAL CHARSTRINGS instead of CHARSTRINGS.
Besides, CHARSTRINGS are NULL terminated, whereas UNIVERSAL CHARSTRINGS seem to be not NULL terminated, so I can not just cast the pointers.

Any idea how I can adapt the code above using UNIVERSAL CHARSTRINGs?


The complete (faulty !) code is in the attached file.

Thanks for any hint.
Olaf Bergengruen





Re: External functions using universal charstrings [message #1831044 is a reply to message #1831036] Mon, 10 August 2020 10:35 Go to previous messageGo to next message
Eclipse UserFriend
The unichar2oct used in the attached code is fine. It encodes the XML document using UTF8.

But in order to avoid memory leak and dangling pointer I suggest the following modification:

OCTETSRTING  v_XMLDOC_oct = unichar2oct(p_XMLDoc);
    const char *v_XMLDoc = (const char *) (const unsigned  char*)v_XMLDOC_oct;

[Updated on: Mon, 10 August 2020 10:36] by Moderator

Re: External functions using universal charstrings [message #1831046 is a reply to message #1831044] Mon, 10 August 2020 11:34 Go to previous messageGo to next message
Eclipse UserFriend
It works, Gabor!!

Two questions:
- Now v_XMLDoc seems to be 0 terminated, i.e. a normal C string. Is this by luck ( I am compiling with the -g option) or is this the result of unichar2oct?
- Do I need to free v_XMLDOC_oct, or it is automatically freed when exiting the function?

Regards and thanks for the quick reply,
Olaf
Re: External functions using universal charstrings [message #1831068 is a reply to message #1831046] Tue, 11 August 2020 02:13 Go to previous messageGo to next message
Eclipse UserFriend
It is just luck.
But you can specify the correct length of the UTF-8 string to the xmlReadMemory by calling v_XMLDOC_oct.lengthof()

As the result of unichar2oct is stored in a local variable, no free is needed.
Re: External functions using universal charstrings [message #1831069 is a reply to message #1831068] Tue, 11 August 2020 02:45 Go to previous message
Eclipse UserFriend
Thanks , Gabor again.

Since v_XMLDOC_oct is not NULL terminated, I had to do additional work, which resulted in following code, which may not be the best, but it works.

   OCTETSRTING  v_XMLDOC_oct = unichar2oct(p_XMLDoc);
    size_t v_XMLDoc_len = v_XMLDOC_oct;.lengthof();
    char *v_XMLDoc;
   
   // Prepare v_XMLDoc
    v_XMLDoc = (char *) calloc( v_XMLDoc_len + 1, 1); // Allocate memory and init to 0
    memcpy((char *) v_XMLDoc,  (const char *) (const unsigned  char*) tmp_oct1,  v_XMLDoc_len);
   
   // Do the work

  // Don't forget
  free(v_XMLDoc);



So, now it is done, at least for the moment.

Regards,
Olaf
Previous Topic:TTCN-3 compiler error on activate() function
Next Topic:J1939 Synchronizing Parallel Test Components of different type
Goto Forum:
  


Current Time: Sat Aug 30 15:50:44 EDT 2025

Powered by FUDForum. Page generated in 0.03978 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top