OLD | NEW |
1 #define IN_LIBEXSLT | 1 #define IN_LIBEXSLT |
2 #include "libexslt/libexslt.h" | 2 #include "libexslt/libexslt.h" |
3 | 3 |
4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) | 4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) |
5 #include <win32config.h> | 5 #include <win32config.h> |
6 #else | 6 #else |
7 #include "config.h" | 7 #include "config.h" |
8 #endif | 8 #endif |
9 | 9 |
10 #include <libxml/tree.h> | 10 #include <libxml/tree.h> |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 | 344 |
345 /** | 345 /** |
346 * exsltStrPaddingFunction: | 346 * exsltStrPaddingFunction: |
347 * @ctxt: an XPath parser context | 347 * @ctxt: an XPath parser context |
348 * @nargs: the number of arguments | 348 * @nargs: the number of arguments |
349 * | 349 * |
350 * Creates a padding string of a certain length. | 350 * Creates a padding string of a certain length. |
351 */ | 351 */ |
352 static void | 352 static void |
353 exsltStrPaddingFunction (xmlXPathParserContextPtr ctxt, int nargs) { | 353 exsltStrPaddingFunction (xmlXPathParserContextPtr ctxt, int nargs) { |
354 int number, str_len = 0; | 354 int number, str_len = 0, str_size = 0; |
355 xmlChar *str = NULL, *ret = NULL, *tmp; | 355 xmlChar *str = NULL, *ret = NULL; |
356 | 356 |
357 if ((nargs < 1) || (nargs > 2)) { | 357 if ((nargs < 1) || (nargs > 2)) { |
358 xmlXPathSetArityError(ctxt); | 358 xmlXPathSetArityError(ctxt); |
359 return; | 359 return; |
360 } | 360 } |
361 | 361 |
362 if (nargs == 2) { | 362 if (nargs == 2) { |
363 str = xmlXPathPopString(ctxt); | 363 str = xmlXPathPopString(ctxt); |
364 str_len = xmlUTF8Strlen(str); | 364 str_len = xmlUTF8Strlen(str); |
| 365 str_size = xmlStrlen(str); |
365 } | 366 } |
366 if (str_len == 0) { | 367 if (str_len == 0) { |
367 if (str != NULL) xmlFree(str); | 368 if (str != NULL) xmlFree(str); |
368 str = xmlStrdup((const xmlChar *) " "); | 369 str = xmlStrdup((const xmlChar *) " "); |
369 str_len = 1; | 370 str_len = 1; |
| 371 str_size = 1; |
370 } | 372 } |
371 | 373 |
372 number = (int) xmlXPathPopNumber(ctxt); | 374 number = (int) xmlXPathPopNumber(ctxt); |
373 | 375 |
374 if (number <= 0) { | 376 if (number <= 0) { |
375 xmlXPathReturnEmptyString(ctxt); | 377 xmlXPathReturnEmptyString(ctxt); |
376 xmlFree(str); | 378 xmlFree(str); |
377 return; | 379 return; |
378 } | 380 } |
379 | 381 |
380 while (number >= str_len) { | 382 while (number >= str_len) { |
381 » ret = xmlStrncat(ret, str, str_len); | 383 » ret = xmlStrncat(ret, str, str_size); |
382 number -= str_len; | 384 number -= str_len; |
383 } | 385 } |
384 tmp = xmlUTF8Strndup (str, number); | 386 if (number > 0) { |
385 ret = xmlStrcat(ret, tmp); | 387 » str_size = xmlUTF8Strsize(str, number); |
386 if (tmp != NULL) | 388 » ret = xmlStrncat(ret, str, str_size); |
387 » xmlFree (tmp); | 389 } |
388 | 390 |
389 xmlXPathReturnString(ctxt, ret); | 391 xmlXPathReturnString(ctxt, ret); |
390 | 392 |
391 if (str != NULL) | 393 if (str != NULL) |
392 xmlFree(str); | 394 xmlFree(str); |
393 } | 395 } |
394 | 396 |
395 /** | 397 /** |
396 * exsltStrAlignFunction: | 398 * exsltStrAlignFunction: |
397 * @ctxt: an XPath parser context | 399 * @ctxt: an XPath parser context |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 int right_start; | 440 int right_start; |
439 | 441 |
440 ret = xmlUTF8Strndup (padding, left); | 442 ret = xmlUTF8Strndup (padding, left); |
441 ret = xmlStrcat (ret, str); | 443 ret = xmlStrcat (ret, str); |
442 | 444 |
443 right_start = xmlUTF8Strsize (padding, left + str_l); | 445 right_start = xmlUTF8Strsize (padding, left + str_l); |
444 ret = xmlStrcat (ret, padding + right_start); | 446 ret = xmlStrcat (ret, padding + right_start); |
445 } else { | 447 } else { |
446 int str_s; | 448 int str_s; |
447 | 449 |
448 » str_s = xmlStrlen (str); | 450 » str_s = xmlUTF8Strsize(padding, str_l); |
449 ret = xmlStrdup (str); | 451 ret = xmlStrdup (str); |
450 ret = xmlStrcat (ret, padding + str_s); | 452 ret = xmlStrcat (ret, padding + str_s); |
451 } | 453 } |
452 } | 454 } |
453 | 455 |
454 xmlXPathReturnString (ctxt, ret); | 456 xmlXPathReturnString (ctxt, ret); |
455 | 457 |
456 xmlFree(str); | 458 xmlFree(str); |
457 xmlFree(padding); | 459 xmlFree(padding); |
458 xmlFree(alignment); | 460 xmlFree(alignment); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 (const xmlChar *) "padding", | 833 (const xmlChar *) "padding", |
832 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, | 834 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, |
833 exsltStrPaddingFunction) | 835 exsltStrPaddingFunction) |
834 && !xmlXPathRegisterFuncNS(ctxt, | 836 && !xmlXPathRegisterFuncNS(ctxt, |
835 (const xmlChar *) "align", | 837 (const xmlChar *) "align", |
836 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, | 838 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, |
837 exsltStrAlignFunction) | 839 exsltStrAlignFunction) |
838 && !xmlXPathRegisterFuncNS(ctxt, | 840 && !xmlXPathRegisterFuncNS(ctxt, |
839 (const xmlChar *) "concat", | 841 (const xmlChar *) "concat", |
840 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, | 842 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, |
841 exsltStrConcatFunction) | 843 exsltStrConcatFunction)) { |
842 && !xmlXPathRegisterFuncNS(ctxt, | |
843 (const xmlChar *) "replace", | |
844 (const xmlChar *) EXSLT_STRINGS_NAMESPACE, | |
845 exsltStrReplaceFunction)) { | |
846 return 0; | 844 return 0; |
847 } | 845 } |
848 return -1; | 846 return -1; |
849 } | 847 } |
OLD | NEW |