Jim Tcl
Diff
Not logged in

Differences From Artifact [f8363d3aca715725]:

To Artifact [0c721ce79f556258]:


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");