0031671: Coding Rules - eliminate warnings issued by clang 11
[occt.git] / src / LDOM / LDOM_CharReference.cxx
CommitLineData
b311480e 1// Created on: 2002-02-08
2// Created by: Alexander GRIGORIEV
973c2be1 3// Copyright (c) 2002-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 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
973c2be1 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.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 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
99ee8f1a 26namespace
27{
7fd59977 28const int NORMAL_C = 0;
29const int CHAR_REF = -1;
30const int ENTI_AMP = 1;
31const int ENTI_LT = 2;
32const int ENTI_GT = 3;
33const int ENTI_QUOT = 4;
f24125b9 34//const int ENTI_APOS = 5;
7fd59977 35
99ee8f1a 36struct entityRef
37{
38 const char* name;
39 int length;
7fd59977 40 entityRef (const char * aName, const int aLen) : name(aName), length(aLen) {}
41};
99ee8f1a 42}
7fd59977 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
50char * 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;
302f96fb 56 for(;;) {
7fd59977 57 char * aPtr = strchr (aSrcPtr, '&');
58 if (aPtr == NULL) {
59 // End of the loop
60 aPtr = strchr (aSrcPtr, '\0');
61 if (anIncrCount == 0)
7dc9e047 62 theLen = (Standard_Integer)(aPtr - theSrc);
7fd59977 63 else {
7dc9e047 64 Standard_Integer aByteCount = (Standard_Integer)(aPtr - aSrcPtr);
7fd59977 65 memmove (aDstPtr, aSrcPtr, aByteCount + 1);
7dc9e047 66 theLen = (Standard_Integer)(aDstPtr - theSrc) + aByteCount;
7fd59977 67 }
68 break;
69 }
7dc9e047 70 Standard_Integer aByteCount = (Standard_Integer)(aPtr - aSrcPtr);
7fd59977 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;
7dc9e047 86 anIncrCount += (Standard_Integer)(aNewPtr - aSrcPtr);
7fd59977 87 aSrcPtr = &aNewPtr[1];
88 }
89 else if (IS_EQUAL(aSrcPtr+1, "amp;")) {
90 aDstPtr = aSrcPtr - anIncrCount + 1;
80cd454f 91 aDstPtr[-1] = '&';
7fd59977 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
137char * 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
302f96fb 154 for(;;) {
a738b534 155 const unsigned int iSrc = (unsigned int ) *(const unsigned char* )ptrSrc;
7fd59977 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)
7dc9e047 167 theLen = (Standard_Integer)(endSrc - theSrc);
7fd59977 168 else {
169 char * ptrDest = new char [(endSrc - theSrc) + aCount * 5 + 1];
170 aDest = ptrDest;
171 for (ptrSrc = theSrc; ptrSrc < endSrc; ptrSrc++) {
a738b534 172 const unsigned int iSrc = (unsigned int ) *(const unsigned char* )ptrSrc;
7fd59977 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 }
7dc9e047 187 theLen = (Standard_Integer)(ptrDest - aDest);
7fd59977 188 * ptrDest = '\0';
189 }
190 return aDest;
191}
192
193int 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: [
012d92b6 287 NORMAL_C, /* 05c: \ */
7fd59977 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};