0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / LDOM / LDOM_CharReference.cxx
1 // Created on: 2002-02-08
2 // Created by: Alexander GRIGORIEV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <LDOM_CharReference.hxx>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20
21 //   Uncomment this line if you want that your XML files contain codes 0xc0-0xff
22 //   as defined in Latin-1 code set. Otherwise these codes are written
23 //   numerically as &#x..;
24 //#define LDOM_ALLOW_LATIN_1
25
26 namespace
27 {
28 const int NORMAL_C  = 0;
29 const int CHAR_REF  = -1;
30 const int ENTI_AMP  = 1;
31 const int ENTI_LT   = 2;
32 const int ENTI_GT   = 3;
33 const int ENTI_QUOT = 4;
34 //const int ENTI_APOS = 5;
35
36 struct entityRef
37 {
38   const char* name;
39   int         length;
40   entityRef (const char * aName, const int aLen) : name(aName), length(aLen) {}
41 };
42 }
43
44 //=======================================================================
45 //function : Decode
46 //purpose  : Convertes entity and character references on input
47 //           Always returns the same string (shortened after replacements)
48 //=======================================================================
49
50 char * LDOM_CharReference::Decode (char * theSrc, Standard_Integer& theLen)
51 {
52 #define IS_EQUAL(_ptr,_string) (!memcmp(_ptr, _string, sizeof(_string)-1))
53
54   char * aSrcPtr = theSrc, * aDstPtr = theSrc;
55   Standard_Integer anIncrCount = 0;
56   for(;;) {
57     char * aPtr = strchr (aSrcPtr, '&');
58     if (aPtr == NULL) {
59       //        End of the loop
60       aPtr = strchr (aSrcPtr, '\0');
61       if (anIncrCount == 0)
62         theLen = (Standard_Integer)(aPtr - theSrc);
63       else {
64         Standard_Integer aByteCount = (Standard_Integer)(aPtr - aSrcPtr);
65         memmove (aDstPtr, aSrcPtr, aByteCount + 1);
66         theLen = (Standard_Integer)(aDstPtr - theSrc) + aByteCount;
67       }
68       break;
69     }
70     Standard_Integer aByteCount = (Standard_Integer)(aPtr - aSrcPtr);
71     if (aByteCount > 0 && aDstPtr != aSrcPtr)
72       memmove (aDstPtr, aSrcPtr, aByteCount);
73     aSrcPtr = aPtr;
74     if (aSrcPtr[1] == '#') {
75       unsigned long aChar;
76       char *        aNewPtr;
77       aDstPtr = aSrcPtr - anIncrCount + 1;
78       if (aSrcPtr[2] == 'x')
79         aChar = strtoul (&aSrcPtr[3], &aNewPtr, 16);         // hex encoding
80       else
81         aChar = strtoul (&aSrcPtr[2], &aNewPtr, 10);         // decimal encoding
82       if (aNewPtr[0] != ';' || aChar == 0 || aChar > 255UL)
83         //      Error reading an XML string
84         return NULL;
85       aDstPtr[-1] = (char) aChar;
86       anIncrCount += (Standard_Integer)(aNewPtr - aSrcPtr);
87       aSrcPtr = &aNewPtr[1];
88     }
89     else if (IS_EQUAL(aSrcPtr+1, "amp;")) {
90       aDstPtr = aSrcPtr - anIncrCount + 1;
91       aDstPtr[-1] = '&';
92       anIncrCount += 4;
93       aSrcPtr += 5;
94     }
95     else if (IS_EQUAL(aSrcPtr+1, "lt;")) {
96       aDstPtr = aSrcPtr - anIncrCount + 1;
97       aDstPtr[-1] = '<';
98       anIncrCount += 3;
99       aSrcPtr += 4;
100     }
101     else if (IS_EQUAL(aSrcPtr+1, "gt;")) {
102       aDstPtr = aSrcPtr - anIncrCount + 1;
103       aDstPtr[-1] = '>';
104       anIncrCount += 3;
105       aSrcPtr += 4;
106     }
107     else if (IS_EQUAL(aSrcPtr+1, "quot;")) {
108       aDstPtr = aSrcPtr - anIncrCount + 1;
109       aDstPtr[-1] = '\"';
110       anIncrCount += 5;
111       aSrcPtr += 6;
112     }
113     else if (IS_EQUAL(aSrcPtr+1, "apos;")) {
114       aDstPtr = aSrcPtr - anIncrCount + 1;
115       aDstPtr[-1] = '\'';
116       anIncrCount += 5;
117       aSrcPtr += 6;
118     }
119     else {
120       aDstPtr = aSrcPtr - anIncrCount;
121       * aDstPtr++ = * aSrcPtr++;
122       continue;
123     }
124   }
125   return theSrc;
126 }
127
128 //=======================================================================
129 //function : Encode
130 //purpose  : This method takes the input string theSrc and returns:
131 //              - the pointer equal to theSrc if there are no replacements, or
132 //              - the pointer to a newly allocated string with replacements
133 //           The output parameter theLen is assigned to the length of
134 //           the returned string (whatever the case)
135 //=======================================================================
136
137 char * LDOM_CharReference::Encode (const char* theSrc, Standard_Integer& theLen,
138                                    const Standard_Boolean isAttribute)
139 {
140   // Initialising the constants
141   static const struct entityRef entity_ref[6] = {
142     entityRef(NULL,     0),
143     entityRef("&amp;",  5),
144     entityRef("&lt;",   4),
145     entityRef("&gt;",   4),
146     entityRef("&quot;", 6),
147     entityRef("&apos;", 6)
148   };
149
150   const char * endSrc, * ptrSrc = theSrc;
151   char       * aDest = (char *) theSrc;
152   Standard_Integer aCount = 0;
153   //    Analyse if there is a non-standard character in the string
154   for(;;) {
155     const unsigned int iSrc = (unsigned int ) *(const unsigned char* )ptrSrc;
156     if (iSrc == 0) {
157       endSrc = ptrSrc;
158       break;
159     }
160     if (myTab[iSrc] != NORMAL_C)
161       if (isAttribute || myTab[iSrc] != ENTI_QUOT)
162         aCount++;
163     ptrSrc++;
164   }
165   //    If there are such, copy the string with replacements
166   if (!aCount)
167     theLen = (Standard_Integer)(endSrc - theSrc);
168   else {
169     char * ptrDest = new char [(endSrc - theSrc) + aCount * 5 + 1];
170     aDest = ptrDest;
171     for (ptrSrc = theSrc; ptrSrc < endSrc; ptrSrc++) {
172       const unsigned int iSrc = (unsigned int ) *(const unsigned char* )ptrSrc;
173       const int aCode = myTab[iSrc];
174       if (aCode == NORMAL_C)                    // normal (regular) character
175         * ptrDest++ = * ptrSrc;
176       else if (aCode == CHAR_REF) {             // character reference
177         sprintf (ptrDest, "&#x%02x;", iSrc);
178         ptrDest += 6;
179       } else                                    // predefined entity reference
180         if (isAttribute == Standard_False && aCode == ENTI_QUOT)
181           * ptrDest++ = * ptrSrc;
182         else {
183           memcpy (ptrDest, entity_ref[aCode].name, entity_ref[aCode].length+1);
184           ptrDest += entity_ref[aCode].length;
185         }
186     }
187     theLen = (Standard_Integer)(ptrDest - aDest);
188     * ptrDest = '\0';
189   }
190   return aDest;
191 }
192
193 int LDOM_CharReference::myTab [256] = {
194   NORMAL_C,     // 000
195   CHAR_REF,     // 001
196   CHAR_REF,     // 002
197   CHAR_REF,     // 003
198   CHAR_REF,     // 004
199   CHAR_REF,     // 005
200   CHAR_REF,     // 006
201   CHAR_REF,     // 007
202   CHAR_REF,     // 008
203   NORMAL_C,     // 009  TAB
204   NORMAL_C,     // 00a  LF
205   CHAR_REF,     // 00b
206   CHAR_REF,     // 00c
207   NORMAL_C,     // 00d  CR
208   CHAR_REF,     // 00e
209   CHAR_REF,     // 00f
210   CHAR_REF,     // 010
211   CHAR_REF,     // 011
212   CHAR_REF,     // 012
213   CHAR_REF,     // 013
214   CHAR_REF,     // 014
215   CHAR_REF,     // 015
216   CHAR_REF,     // 016
217   CHAR_REF,     // 017
218   CHAR_REF,     // 018
219   CHAR_REF,     // 019
220   CHAR_REF,     // 01a
221   CHAR_REF,     // 01b
222   CHAR_REF,     // 01c
223   CHAR_REF,     // 01d
224   CHAR_REF,     // 01e
225   CHAR_REF,     // 01f
226   NORMAL_C,     // 020:  
227   NORMAL_C,     // 021: !
228   ENTI_QUOT,    // 022: "
229   NORMAL_C,     // 023: #
230   NORMAL_C,     // 024: $
231   NORMAL_C,     // 025: %
232   ENTI_AMP,     // 026: &
233 //  ENTI_APOS,    // 027: '   Here we do never use apostrophe as delimiter
234   NORMAL_C,     // 027: '
235   NORMAL_C,     // 028: (
236   NORMAL_C,     // 029: )
237   NORMAL_C,     // 02a: *
238   NORMAL_C,     // 02b: +
239   NORMAL_C,     // 02c: ,
240   NORMAL_C,     // 02d: -
241   NORMAL_C,     // 02e: .
242   NORMAL_C,     // 02f: /
243   NORMAL_C,     // 030: 0
244   NORMAL_C,     // 031: 1
245   NORMAL_C,     // 032: 2
246   NORMAL_C,     // 033: 3
247   NORMAL_C,     // 034: 4
248   NORMAL_C,     // 035: 5
249   NORMAL_C,     // 036: 6
250   NORMAL_C,     // 037: 7
251   NORMAL_C,     // 038: 8
252   NORMAL_C,     // 039: 9
253   NORMAL_C,     // 03a: :
254   NORMAL_C,     // 03b: ;
255   ENTI_LT,      // 03c: <
256   NORMAL_C,     // 03d: =
257   ENTI_GT,      // 03e: >
258   NORMAL_C,     // 03f: ?
259   NORMAL_C,     // 040: @
260   NORMAL_C,     // 041: A
261   NORMAL_C,     // 042: B
262   NORMAL_C,     // 043: C
263   NORMAL_C,     // 044: D
264   NORMAL_C,     // 045: E
265   NORMAL_C,     // 046: F
266   NORMAL_C,     // 047: G
267   NORMAL_C,     // 048: H
268   NORMAL_C,     // 049: I
269   NORMAL_C,     // 04a: J
270   NORMAL_C,     // 04b: K
271   NORMAL_C,     // 04c: L
272   NORMAL_C,     // 04d: M
273   NORMAL_C,     // 04e: N
274   NORMAL_C,     // 04f: O
275   NORMAL_C,     // 050: P
276   NORMAL_C,     // 051: Q
277   NORMAL_C,     // 052: R
278   NORMAL_C,     // 053: S
279   NORMAL_C,     // 054: T
280   NORMAL_C,     // 055: U
281   NORMAL_C,     // 056: V
282   NORMAL_C,     // 057: W
283   NORMAL_C,     // 058: X
284   NORMAL_C,     // 059: Y
285   NORMAL_C,     // 05a: Z
286   NORMAL_C,     // 05b: [
287   NORMAL_C,     /* 05c: \       */
288   NORMAL_C,     // 05d: ]
289   NORMAL_C,     // 05e: ^
290   NORMAL_C,     // 05f: _
291   NORMAL_C,     // 060: `
292   NORMAL_C,     // 061: a
293   NORMAL_C,     // 062: b
294   NORMAL_C,     // 063: c
295   NORMAL_C,     // 064: d
296   NORMAL_C,     // 065: e
297   NORMAL_C,     // 066: f
298   NORMAL_C,     // 067: g
299   NORMAL_C,     // 068: h
300   NORMAL_C,     // 069: i
301   NORMAL_C,     // 06a: j
302   NORMAL_C,     // 06b: k
303   NORMAL_C,     // 06c: l
304   NORMAL_C,     // 06d: m
305   NORMAL_C,     // 06e: n
306   NORMAL_C,     // 06f: o
307   NORMAL_C,     // 070: p
308   NORMAL_C,     // 071: q
309   NORMAL_C,     // 072: r
310   NORMAL_C,     // 073: s
311   NORMAL_C,     // 074: t
312   NORMAL_C,     // 075: u
313   NORMAL_C,     // 076: v
314   NORMAL_C,     // 077: w
315   NORMAL_C,     // 078: x
316   NORMAL_C,     // 079: y
317   NORMAL_C,     // 07a: z
318   NORMAL_C,     // 07b: {
319   NORMAL_C,     // 07c: |
320   NORMAL_C,     // 07d: }
321   NORMAL_C,     // 07e: ~
322   NORMAL_C,     // 07f: \7f
323   CHAR_REF,     // 080
324   CHAR_REF,     // 081
325   CHAR_REF,     // 082
326   CHAR_REF,     // 083
327   CHAR_REF,     // 084
328   CHAR_REF,     // 085
329   CHAR_REF,     // 086
330   CHAR_REF,     // 087
331   CHAR_REF,     // 088
332   CHAR_REF,     // 089
333   CHAR_REF,     // 08a
334   CHAR_REF,     // 08b
335   CHAR_REF,     // 08c
336   CHAR_REF,     // 08d
337   CHAR_REF,     // 08e
338   CHAR_REF,     // 08f
339   CHAR_REF,     // 090
340   CHAR_REF,     // 091
341   CHAR_REF,     // 092
342   CHAR_REF,     // 093
343   CHAR_REF,     // 094
344   CHAR_REF,     // 095
345   CHAR_REF,     // 096
346   CHAR_REF,     // 097
347   CHAR_REF,     // 098
348   CHAR_REF,     // 099
349   CHAR_REF,     // 09a
350   CHAR_REF,     // 09b
351   CHAR_REF,     // 09c
352   CHAR_REF,     // 09d
353   CHAR_REF,     // 09e
354   CHAR_REF,     // 09f
355   CHAR_REF,     // 0a0
356   CHAR_REF,     // 0a1
357   CHAR_REF,     // 0a2
358   CHAR_REF,     // 0a3
359   CHAR_REF,     // 0a4
360   CHAR_REF,     // 0a5
361   CHAR_REF,     // 0a6
362   CHAR_REF,     // 0a7
363   CHAR_REF,     // 0a8
364   CHAR_REF,     // 0a9
365   CHAR_REF,     // 0aa
366   CHAR_REF,     // 0ab
367   CHAR_REF,     // 0ac
368   CHAR_REF,     // 0ad
369   CHAR_REF,     // 0ae
370   CHAR_REF,     // 0af
371   CHAR_REF,     // 0b0
372   CHAR_REF,     // 0b1
373   CHAR_REF,     // 0b2
374   CHAR_REF,     // 0b3
375   CHAR_REF,     // 0b4
376   CHAR_REF,     // 0b5
377   CHAR_REF,     // 0b6
378   CHAR_REF,     // 0b7
379   CHAR_REF,     // 0b8
380   CHAR_REF,     // 0b9
381   CHAR_REF,     // 0ba
382   CHAR_REF,     // 0bb
383   CHAR_REF,     // 0bc
384   CHAR_REF,     // 0bd
385   CHAR_REF,     // 0be
386   CHAR_REF,     // 0bf
387 #ifdef LDOM_ALLOW_LATIN_1
388   NORMAL_C,     // 0c0
389   NORMAL_C,     // 0c1
390   NORMAL_C,     // 0c2
391   NORMAL_C,     // 0c3
392   NORMAL_C,     // 0c4
393   NORMAL_C,     // 0c5
394   NORMAL_C,     // 0c6
395   NORMAL_C,     // 0c7
396   NORMAL_C,     // 0c8
397   NORMAL_C,     // 0c9
398   NORMAL_C,     // 0ca
399   NORMAL_C,     // 0cb
400   NORMAL_C,     // 0cc
401   NORMAL_C,     // 0cd
402   NORMAL_C,     // 0ce
403   NORMAL_C,     // 0cf
404   NORMAL_C,     // 0d0
405   NORMAL_C,     // 0d1
406   NORMAL_C,     // 0d2
407   NORMAL_C,     // 0d3
408   NORMAL_C,     // 0d4
409   NORMAL_C,     // 0d5
410   NORMAL_C,     // 0d6
411 //  CHAR_REF,     // 0d7
412   NORMAL_C,     // 0d7
413   NORMAL_C,     // 0d8
414   NORMAL_C,     // 0d9
415   NORMAL_C,     // 0da
416   NORMAL_C,     // 0db
417   NORMAL_C,     // 0dc
418   NORMAL_C,     // 0dd
419   NORMAL_C,     // 0de
420   NORMAL_C,     // 0df
421   NORMAL_C,     // 0e0
422   NORMAL_C,     // 0e1
423   NORMAL_C,     // 0e2
424   NORMAL_C,     // 0e3
425   NORMAL_C,     // 0e4
426   NORMAL_C,     // 0e5
427   NORMAL_C,     // 0e6
428   NORMAL_C,     // 0e7
429   NORMAL_C,     // 0e8
430   NORMAL_C,     // 0e9
431   NORMAL_C,     // 0ea
432   NORMAL_C,     // 0eb
433   NORMAL_C,     // 0ec
434   NORMAL_C,     // 0ed
435   NORMAL_C,     // 0ee
436   NORMAL_C,     // 0ef
437   NORMAL_C,     // 0f0
438   NORMAL_C,     // 0f1
439   NORMAL_C,     // 0f2
440   NORMAL_C,     // 0f3
441   NORMAL_C,     // 0f4
442   NORMAL_C,     // 0f5
443   NORMAL_C,     // 0f6
444 //  CHAR_REF,     // 0f7
445   NORMAL_C,     // 0f7
446   NORMAL_C,     // 0f8
447   NORMAL_C,     // 0f9
448   NORMAL_C,     // 0fa
449   NORMAL_C,     // 0fb
450   NORMAL_C,     // 0fc
451   NORMAL_C,     // 0fd
452   NORMAL_C,     // 0fe
453   NORMAL_C      // 0ff
454 #else
455   CHAR_REF,     // 0c0
456   CHAR_REF,     // 0c1
457   CHAR_REF,     // 0c2
458   CHAR_REF,     // 0c3
459   CHAR_REF,     // 0c4
460   CHAR_REF,     // 0c5
461   CHAR_REF,     // 0c6
462   CHAR_REF,     // 0c7
463   CHAR_REF,     // 0c8
464   CHAR_REF,     // 0c9
465   CHAR_REF,     // 0ca
466   CHAR_REF,     // 0cb
467   CHAR_REF,     // 0cc
468   CHAR_REF,     // 0cd
469   CHAR_REF,     // 0ce
470   CHAR_REF,     // 0cf
471   CHAR_REF,     // 0d0
472   CHAR_REF,     // 0d1
473   CHAR_REF,     // 0d2
474   CHAR_REF,     // 0d3
475   CHAR_REF,     // 0d4
476   CHAR_REF,     // 0d5
477   CHAR_REF,     // 0d6
478   CHAR_REF,     // 0d7
479   CHAR_REF,     // 0d8
480   CHAR_REF,     // 0d9
481   CHAR_REF,     // 0da
482   CHAR_REF,     // 0db
483   CHAR_REF,     // 0dc
484   CHAR_REF,     // 0dd
485   CHAR_REF,     // 0de
486   CHAR_REF,     // 0df
487   CHAR_REF,     // 0e0
488   CHAR_REF,     // 0e1
489   CHAR_REF,     // 0e2
490   CHAR_REF,     // 0e3
491   CHAR_REF,     // 0e4
492   CHAR_REF,     // 0e5
493   CHAR_REF,     // 0e6
494   CHAR_REF,     // 0e7
495   CHAR_REF,     // 0e8
496   CHAR_REF,     // 0e9
497   CHAR_REF,     // 0ea
498   CHAR_REF,     // 0eb
499   CHAR_REF,     // 0ec
500   CHAR_REF,     // 0ed
501   CHAR_REF,     // 0ee
502   CHAR_REF,     // 0ef
503   CHAR_REF,     // 0f0
504   CHAR_REF,     // 0f1
505   CHAR_REF,     // 0f2
506   CHAR_REF,     // 0f3
507   CHAR_REF,     // 0f4
508   CHAR_REF,     // 0f5
509   CHAR_REF,     // 0f6
510   CHAR_REF,     // 0f7
511   CHAR_REF,     // 0f8
512   CHAR_REF,     // 0f9
513   CHAR_REF,     // 0fa
514   CHAR_REF,     // 0fb
515   CHAR_REF,     // 0fc
516   CHAR_REF,     // 0fd
517   CHAR_REF,     // 0fe
518   CHAR_REF      // 0ff
519 #endif  // LDOM_ALLOW_LATIN_1
520 };