| 249 | | if( !strncmp( psz_value, "<", 4 ) ) |
|---|
| 250 | | { |
|---|
| 251 | | *p_pos = '<'; |
|---|
| 252 | | psz_value += 4; |
|---|
| 253 | | } |
|---|
| 254 | | else if( !strncmp( psz_value, ">", 4 ) ) |
|---|
| 255 | | { |
|---|
| 256 | | *p_pos = '>'; |
|---|
| 257 | | psz_value += 4; |
|---|
| 258 | | } |
|---|
| 259 | | else if( !strncmp( psz_value, "&", 5 ) ) |
|---|
| 260 | | { |
|---|
| 261 | | *p_pos = '&'; |
|---|
| 262 | | psz_value += 5; |
|---|
| 263 | | } |
|---|
| 264 | | else if( !strncmp( psz_value, """, 6 ) ) |
|---|
| 265 | | { |
|---|
| 266 | | *p_pos = '\"'; |
|---|
| 267 | | psz_value += 6; |
|---|
| 268 | | } |
|---|
| 269 | | else if( !strncmp( psz_value, "'", 6 ) ) |
|---|
| 270 | | { |
|---|
| 271 | | *p_pos = '\''; |
|---|
| 272 | | psz_value += 6; |
|---|
| | 249 | if( *psz_value == '&' ) |
|---|
| | 250 | { |
|---|
| | 251 | #define TRY_CHAR( src, len, dst ) \ |
|---|
| | 252 | if( !strncmp( psz_value, src, len ) ) \ |
|---|
| | 253 | { \ |
|---|
| | 254 | *p_pos = dst; \ |
|---|
| | 255 | psz_value += len; \ |
|---|
| | 256 | } |
|---|
| | 257 | #define TRY_LONGCHAR( src, len, dst ) \ |
|---|
| | 258 | if( !strncmp( psz_value, src, len ) ) \ |
|---|
| | 259 | { \ |
|---|
| | 260 | strncpy( p_pos, dst, strlen( dst ) ); \ |
|---|
| | 261 | p_pos += strlen( dst ) - 1; \ |
|---|
| | 262 | psz_value += len; \ |
|---|
| | 263 | } |
|---|
| | 264 | TRY_CHAR( "<", 4, '<' ) |
|---|
| | 265 | else TRY_CHAR( ">", 4, '>' ) |
|---|
| | 266 | else TRY_CHAR( "&", 5, '&' ) |
|---|
| | 267 | else TRY_CHAR( """, 6, '"' ) |
|---|
| | 268 | else TRY_CHAR( "'", 6, '\'' ) |
|---|
| | 269 | else if( psz_value[1] == '#' ) |
|---|
| | 270 | { |
|---|
| | 271 | char *psz_end; |
|---|
| | 272 | int i = strtol( psz_value+2, &psz_end, 10 ); |
|---|
| | 273 | if( *psz_end == ';' ) |
|---|
| | 274 | { |
|---|
| | 275 | if( i >= 32 && i <= 126 ) |
|---|
| | 276 | { |
|---|
| | 277 | *p_pos = (char)i; |
|---|
| | 278 | psz_value = psz_end+1; |
|---|
| | 279 | } |
|---|
| | 280 | else |
|---|
| | 281 | { |
|---|
| | 282 | /* Unhandled code, FIXME */ |
|---|
| | 283 | *p_pos = *psz_value; |
|---|
| | 284 | psz_value++; |
|---|
| | 285 | } |
|---|
| | 286 | } |
|---|
| | 287 | else |
|---|
| | 288 | { |
|---|
| | 289 | /* Invalid entity number */ |
|---|
| | 290 | *p_pos = *psz_value; |
|---|
| | 291 | psz_value++; |
|---|
| | 292 | } |
|---|
| | 293 | } |
|---|
| | 294 | else TRY_LONGCHAR( "À", 8, "À" ) |
|---|
| | 295 | else TRY_LONGCHAR( "Á", 8, "Á" ) |
|---|
| | 296 | else TRY_LONGCHAR( "Â", 7, "Â" ) |
|---|
| | 297 | else TRY_LONGCHAR( "Ã", 8, "Ã" ) |
|---|
| | 298 | else TRY_LONGCHAR( "Ä", 6, "Ä" ) |
|---|
| | 299 | else TRY_LONGCHAR( "Å", 7, "Å" ) |
|---|
| | 300 | else TRY_LONGCHAR( "Æ", 7, "Æ" ) |
|---|
| | 301 | else TRY_LONGCHAR( "Ç", 8, "Ç" ) |
|---|
| | 302 | else TRY_LONGCHAR( "È", 8, "È" ) |
|---|
| | 303 | else TRY_LONGCHAR( "É", 8, "É" ) |
|---|
| | 304 | else TRY_LONGCHAR( "Ê", 7, "Ê" ) |
|---|
| | 305 | else TRY_LONGCHAR( "Ë", 6, "Ë" ) |
|---|
| | 306 | else TRY_LONGCHAR( "Ì", 8, "Ì" ) |
|---|
| | 307 | else TRY_LONGCHAR( "Í", 8, "Í" ) |
|---|
| | 308 | else TRY_LONGCHAR( "Î", 7, "Î" ) |
|---|
| | 309 | else TRY_LONGCHAR( "Ï", 6, "Ï" ) |
|---|
| | 310 | else TRY_LONGCHAR( "Ð", 5, "Ð" ) |
|---|
| | 311 | else TRY_LONGCHAR( "Ñ", 8, "Ñ" ) |
|---|
| | 312 | else TRY_LONGCHAR( "Ò", 8, "Ò" ) |
|---|
| | 313 | else TRY_LONGCHAR( "Ó", 8, "Ó" ) |
|---|
| | 314 | else TRY_LONGCHAR( "Ô", 7, "Ô" ) |
|---|
| | 315 | else TRY_LONGCHAR( "Õ", 8, "Õ" ) |
|---|
| | 316 | else TRY_LONGCHAR( "Ö", 6, "Ö" ) |
|---|
| | 317 | else TRY_LONGCHAR( "Ø", 8, "Ø" ) |
|---|
| | 318 | else TRY_LONGCHAR( "Ù", 8, "Ù" ) |
|---|
| | 319 | else TRY_LONGCHAR( "Ú", 8, "Ú" ) |
|---|
| | 320 | else TRY_LONGCHAR( "Û", 7, "Û" ) |
|---|
| | 321 | else TRY_LONGCHAR( "Ü", 6, "Ü" ) |
|---|
| | 322 | else TRY_LONGCHAR( "Ý", 8, "Ý" ) |
|---|
| | 323 | else TRY_LONGCHAR( "Þ", 7, "Þ" ) |
|---|
| | 324 | else TRY_LONGCHAR( "ß", 7, "ß" ) |
|---|
| | 325 | else TRY_LONGCHAR( "à", 8, "à" ) |
|---|
| | 326 | else TRY_LONGCHAR( "á", 8, "á" ) |
|---|
| | 327 | else TRY_LONGCHAR( "â", 7, "â" ) |
|---|
| | 328 | else TRY_LONGCHAR( "ã", 8, "ã" ) |
|---|
| | 329 | else TRY_LONGCHAR( "ä", 6, "ä" ) |
|---|
| | 330 | else TRY_LONGCHAR( "å", 7, "å" ) |
|---|
| | 331 | else TRY_LONGCHAR( "æ", 7, "æ" ) |
|---|
| | 332 | else TRY_LONGCHAR( "ç", 8, "ç" ) |
|---|
| | 333 | else TRY_LONGCHAR( "è", 8, "è" ) |
|---|
| | 334 | else TRY_LONGCHAR( "é", 8, "é" ) |
|---|
| | 335 | else TRY_LONGCHAR( "ê", 7, "ê" ) |
|---|
| | 336 | else TRY_LONGCHAR( "ë", 6, "ë" ) |
|---|
| | 337 | else TRY_LONGCHAR( "ì", 8, "ì" ) |
|---|
| | 338 | else TRY_LONGCHAR( "í", 8, "í" ) |
|---|
| | 339 | else TRY_LONGCHAR( "î", 7, "î" ) |
|---|
| | 340 | else TRY_LONGCHAR( "ï", 6, "ï" ) |
|---|
| | 341 | else TRY_LONGCHAR( "ð", 5, "ð" ) |
|---|
| | 342 | else TRY_LONGCHAR( "ñ", 8, "ñ" ) |
|---|
| | 343 | else TRY_LONGCHAR( "ò", 8, "ò" ) |
|---|
| | 344 | else TRY_LONGCHAR( "ó", 8, "ó" ) |
|---|
| | 345 | else TRY_LONGCHAR( "ô", 7, "ô" ) |
|---|
| | 346 | else TRY_LONGCHAR( "õ", 8, "õ" ) |
|---|
| | 347 | else TRY_LONGCHAR( "ö", 6, "ö" ) |
|---|
| | 348 | else TRY_LONGCHAR( "ø", 8, "ø" ) |
|---|
| | 349 | else TRY_LONGCHAR( "ù", 8, "ù" ) |
|---|
| | 350 | else TRY_LONGCHAR( "ú", 8, "ú" ) |
|---|
| | 351 | else TRY_LONGCHAR( "û", 7, "û" ) |
|---|
| | 352 | else TRY_LONGCHAR( "ü", 6, "ü" ) |
|---|
| | 353 | else TRY_LONGCHAR( "ý", 8, "ý" ) |
|---|
| | 354 | else TRY_LONGCHAR( "þ", 7, "þ" ) |
|---|
| | 355 | else TRY_LONGCHAR( "ÿ", 6, "ÿ" ) |
|---|
| | 356 | else TRY_LONGCHAR( "¡", 7, "¡" ) |
|---|
| | 357 | else TRY_LONGCHAR( "¤", 8, "¤" ) |
|---|
| | 358 | else TRY_LONGCHAR( "¢", 6, "¢" ) |
|---|
| | 359 | else TRY_LONGCHAR( "£", 7, "£" ) |
|---|
| | 360 | else TRY_LONGCHAR( "¥", 5, "¥" ) |
|---|
| | 361 | else TRY_LONGCHAR( "¦", 8, "¦" ) |
|---|
| | 362 | else TRY_LONGCHAR( "§", 6, "§" ) |
|---|
| | 363 | else TRY_LONGCHAR( "¨", 5, "¨" ) |
|---|
| | 364 | else TRY_LONGCHAR( "©", 6, "©" ) |
|---|
| | 365 | else TRY_LONGCHAR( "ª", 6, "ª" ) |
|---|
| | 366 | else TRY_LONGCHAR( "«", 7, "«" ) |
|---|
| | 367 | else TRY_LONGCHAR( "¬", 5, "¬" ) |
|---|
| | 368 | else TRY_LONGCHAR( "­", 5, "" ) |
|---|
| | 369 | else TRY_LONGCHAR( "®", 5, "®" ) |
|---|
| | 370 | else TRY_LONGCHAR( "™", 7, "™" ) |
|---|
| | 371 | else TRY_LONGCHAR( "¯", 6, "¯" ) |
|---|
| | 372 | else TRY_LONGCHAR( "°", 5, "°" ) |
|---|
| | 373 | else TRY_LONGCHAR( "±", 8, "±" ) |
|---|
| | 374 | else TRY_LONGCHAR( "²", 6, "²" ) |
|---|
| | 375 | else TRY_LONGCHAR( "³", 6, "³" ) |
|---|
| | 376 | else TRY_LONGCHAR( "´", 7, "´" ) |
|---|
| | 377 | else TRY_LONGCHAR( "µ", 7, "µ" ) |
|---|
| | 378 | else TRY_LONGCHAR( "¶", 6, "¶" ) |
|---|
| | 379 | else TRY_LONGCHAR( "·", 8, "·" ) |
|---|
| | 380 | else TRY_LONGCHAR( "¸", 7, "¸" ) |
|---|
| | 381 | else TRY_LONGCHAR( "¹", 6, "¹" ) |
|---|
| | 382 | else TRY_LONGCHAR( "º", 6, "º" ) |
|---|
| | 383 | else TRY_LONGCHAR( "»", 7, "»" ) |
|---|
| | 384 | else TRY_LONGCHAR( "¼", 8, "¼" ) |
|---|
| | 385 | else TRY_LONGCHAR( "½", 8, "½" ) |
|---|
| | 386 | else TRY_LONGCHAR( "¾", 8, "¾" ) |
|---|
| | 387 | else TRY_LONGCHAR( "¿", 8, "¿" ) |
|---|
| | 388 | else TRY_LONGCHAR( "×", 7, "×" ) |
|---|
| | 389 | else TRY_LONGCHAR( "÷", 8, "÷" ) |
|---|
| | 390 | else TRY_LONGCHAR( "Œ", 7, "Œ" ) |
|---|
| | 391 | else TRY_LONGCHAR( "œ", 7, "œ" ) |
|---|
| | 392 | else TRY_LONGCHAR( "Š", 8, "Š" ) |
|---|
| | 393 | else TRY_LONGCHAR( "š", 8, "š" ) |
|---|
| | 394 | else TRY_LONGCHAR( "Ÿ", 6, "Ÿ" ) |
|---|
| | 395 | else TRY_LONGCHAR( "ˆ", 6, "ˆ" ) |
|---|
| | 396 | else TRY_LONGCHAR( "˜", 7, "˜" ) |
|---|
| | 397 | else TRY_LONGCHAR( "–", 7, "–" ) |
|---|
| | 398 | else TRY_LONGCHAR( "—", 7, "—" ) |
|---|
| | 399 | else TRY_LONGCHAR( "‘", 7, "‘" ) |
|---|
| | 400 | else TRY_LONGCHAR( "’", 7, "’" ) |
|---|
| | 401 | else TRY_LONGCHAR( "‚", 7, "‚" ) |
|---|
| | 402 | else TRY_LONGCHAR( "“", 7, "“" ) |
|---|
| | 403 | else TRY_LONGCHAR( "”", 7, "”" ) |
|---|
| | 404 | else TRY_LONGCHAR( "„", 7, "„" ) |
|---|
| | 405 | else TRY_LONGCHAR( "†", 8, "†" ) |
|---|
| | 406 | else TRY_LONGCHAR( "‡", 8, "‡" ) |
|---|
| | 407 | else TRY_LONGCHAR( "…", 8, "…" ) |
|---|
| | 408 | else TRY_LONGCHAR( "‰", 8, "‰" ) |
|---|
| | 409 | else TRY_LONGCHAR( "‹", 8, "‹" ) |
|---|
| | 410 | else TRY_LONGCHAR( "›", 8, "›" ) |
|---|
| | 411 | else TRY_LONGCHAR( "€", 6, "€" ) |
|---|
| | 412 | else |
|---|
| | 413 | { |
|---|
| | 414 | *p_pos = *psz_value; |
|---|
| | 415 | psz_value++; |
|---|
| | 416 | } |
|---|