Differences From Artifact [f8363d3aca715725]:
- File
jim.c
-
2011-11-28 03:13:40
- part of checkin
[fa6ea5bdaa]
on branch trunk
- Add support for [string totitle]
Signed-off-by: Steve Bennett <steveb@workware.net.au> (user: steveb@workware.net.au
-
2011-11-28 03:13:40
- part of checkin
[fa6ea5bdaa]
on branch trunk
- Add support for [string totitle]
To Artifact [0c721ce79f556258]:
- File
jim.c
-
2011-11-28 03:13:41
- part of checkin
[dea8bbd535]
on branch trunk
- Implement [string replace]
Signed-off-by: Steve Bennett <steveb@workware.net.au> (user: steveb@workware.net.au
-
2011-11-28 03:13:41
- part of checkin
[dea8bbd535]
on branch trunk
- Implement [string replace]
2526 2526 return Jim_NewStringObj(interp, str + first, rangeLen);
2527 2527 }
2528 2528 return Jim_NewStringObjUtf8(interp, str + utf8_index(str, first), rangeLen);
2529 2529 #else
2530 2530 return Jim_StringByteRangeObj(interp, strObjPtr, firstObjPtr, lastObjPtr);
2531 2531 #endif
2532 2532 }
2533 +
2534 +Jim_Obj *JimStringReplaceObj(Jim_Interp *interp,
2535 + Jim_Obj *strObjPtr, Jim_Obj *firstObjPtr, Jim_Obj *lastObjPtr, Jim_Obj *newStrObj)
2536 +{
2537 + int first, last;
2538 + const char *str;
2539 + int len, rangeLen;
2540 + Jim_Obj *objPtr;
2541 +
2542 + len = Jim_Utf8Length(interp, strObjPtr);
2543 +
2544 + if (JimStringGetRange(interp, firstObjPtr, lastObjPtr, len, &first, &last, &rangeLen) != JIM_OK) {
2545 + return NULL;
2546 + }
2547 +
2548 + if (last <= first) {
2549 + return strObjPtr;
2550 + }
2551 +
2552 + str = Jim_String(strObjPtr);
2553 +
2554 + /* Before part */
2555 + objPtr = Jim_NewStringObjUtf8(interp, str, first);
2556 +
2557 + /* Replacement */
2558 + if (newStrObj) {
2559 + Jim_AppendObj(interp, objPtr, newStrObj);
2560 + }
2561 +
2562 + /* After part */
2563 + Jim_AppendString(interp, objPtr, str + utf8_index(str, last + 1), len - last - 1);
2564 +
2565 + return objPtr;
2566 +}
2533 2567
2534 2568 static void JimStrCopyUpperLower(char *dest, const char *str, int uc)
2535 2569 {
2536 2570 while (*str) {
2537 2571 int c;
2538 2572 str += utf8_tounicode(str, &c);
2539 2573 dest += utf8_fromunicode(dest, uc ? utf8_upper(c) : utf8_lower(c));
................................................................................
12658 12692 /* [string] */
12659 12693 static int Jim_StringCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
12660 12694 {
12661 12695 int len;
12662 12696 int opt_case = 1;
12663 12697 int option;
12664 12698 static const char * const options[] = {
12665 - "bytelength", "length", "compare", "match", "equal", "is", "byterange", "range",
12699 + "bytelength", "length", "compare", "match", "equal", "is", "byterange", "range", "replace",
12666 12700 "map", "repeat", "reverse", "index", "first", "last",
12667 12701 "trim", "trimleft", "trimright", "tolower", "toupper", "totitle", NULL
12668 12702 };
12669 12703 enum
12670 12704 {
12671 - OPT_BYTELENGTH, OPT_LENGTH, OPT_COMPARE, OPT_MATCH, OPT_EQUAL, OPT_IS, OPT_BYTERANGE, OPT_RANGE,
12705 + OPT_BYTELENGTH, OPT_LENGTH, OPT_COMPARE, OPT_MATCH, OPT_EQUAL, OPT_IS, OPT_BYTERANGE, OPT_RANGE, OPT_REPLACE,
12672 12706 OPT_MAP, OPT_REPEAT, OPT_REVERSE, OPT_INDEX, OPT_FIRST, OPT_LAST,
12673 12707 OPT_TRIM, OPT_TRIMLEFT, OPT_TRIMRIGHT, OPT_TOLOWER, OPT_TOUPPER, OPT_TOTITLE
12674 12708 };
12675 12709 static const char * const nocase_options[] = {
12676 12710 "-nocase", NULL
12677 12711 };
12678 12712
................................................................................
12774 12808
12775 12809 if (objPtr == NULL) {
12776 12810 return JIM_ERR;
12777 12811 }
12778 12812 Jim_SetResult(interp, objPtr);
12779 12813 return JIM_OK;
12780 12814 }
12815 +
12816 + case OPT_REPLACE:{
12817 + Jim_Obj *objPtr;
12818 +
12819 + if (argc != 5 && argc != 6) {
12820 + Jim_WrongNumArgs(interp, 2, argv, "string first last ?newstring?");
12821 + return JIM_ERR;
12822 + }
12823 + objPtr = JimStringReplaceObj(interp, argv[2], argv[3], argv[4], argc == 6 ? argv[5] : NULL);
12824 + if (objPtr == NULL) {
12825 + return JIM_ERR;
12826 + }
12827 + Jim_SetResult(interp, objPtr);
12828 + return JIM_OK;
12829 + }
12830 +
12781 12831
12782 12832 case OPT_REPEAT:{
12783 12833 Jim_Obj *objPtr;
12784 12834 jim_wide count;
12785 12835
12786 12836 if (argc != 4) {
12787 12837 Jim_WrongNumArgs(interp, 2, argv, "string count");