2774 character = __intVal(__characterVal(aStringOrCharacter)); |
2776 character = __intVal(__characterVal(aStringOrCharacter)); |
2775 l2 = 1; |
2777 l2 = 1; |
2776 cp2 = &character; |
2778 cp2 = &character; |
2777 } else if (__isStringLike(aStringOrCharacter)) { |
2779 } else if (__isStringLike(aStringOrCharacter)) { |
2778 l2 = __stringSize(aStringOrCharacter); |
2780 l2 = __stringSize(aStringOrCharacter); |
2779 cp2 = (char *) __stringVal(aStringOrCharacter); |
|
2780 } else |
2781 } else |
2781 goto out; |
2782 goto out; |
2782 |
2783 |
2783 sz = OHDR_SIZE + l1 + l2 + 1; |
2784 sz = OHDR_SIZE + l1 + l2 + 1; |
2784 __qNew(newString, sz); /* OBJECT ALLOCATION */ |
2785 __qNew(newString, sz); /* OBJECT ALLOCATION */ |
|
2786 |
|
2787 cp1 = (char *) __stringVal(self); |
|
2788 if (cp2 == 0) |
|
2789 cp2 = (char *) __stringVal(aStringOrCharacter); |
|
2790 |
2785 if (newString != nil) { |
2791 if (newString != nil) { |
2786 REGISTER unsigned char *dstp; |
2792 REGISTER unsigned char *dstp; |
2787 |
2793 |
2788 __InstPtr(newString)->o_class = String; |
2794 __InstPtr(newString)->o_class = String; |
2789 __qSTORE(newString, String); |
2795 __qSTORE(newString, String); |
2790 dstp = __stringVal(newString); |
2796 dstp = __stringVal(newString); |
2791 |
2797 |
2792 # ifdef bcopy4 |
2798 # if defined(bcopy4) |
2793 /* knowing that allocation is 4-byte aligned and |
2799 /* knowing that allocation is 4-byte aligned and |
2794 * size rounded up to next 4-byte, the first copy |
2800 * size rounded up to next 4-byte, the first copy |
2795 * can be done word-wise. |
2801 * can be done word-wise. |
2796 * that speeds up size-10-string , size-10-string |
2802 * that speeds up size-10-string , size-10-string |
2797 * by 10% on a P5/200. |
2803 * by 10% on a P5/200. |
2801 |
2807 |
2802 if (l1 & 3) nw++; |
2808 if (l1 & 3) nw++; |
2803 bcopy4(cp1, dstp, nw); |
2809 bcopy4(cp1, dstp, nw); |
2804 dstp += l1; |
2810 dstp += l1; |
2805 } |
2811 } |
2806 # else |
2812 # elif defined(FAST_MEMCPY) |
2807 # ifdef FAST_MEMCPY |
|
2808 memcpy(dstp, cp1, l1); |
2813 memcpy(dstp, cp1, l1); |
2809 dstp += l1; |
2814 dstp += l1; |
2810 # else |
2815 # else |
2811 while (l1 >= 4) { |
2816 while (l1 >= 4) { |
2812 *(int *)dstp = *(int *)cp1; |
2817 *(int *)dstp = *(int *)cp1; |
2813 dstp += 4; cp1 += 4; |
2818 dstp += 4; cp1 += 4; |
2814 l1 -= 4; |
2819 l1 -= 4; |
2815 } |
2820 } |
2816 while (l1--) *dstp++ = *cp1++; |
2821 while (l1--) *dstp++ = *cp1++; |
2817 # endif |
|
2818 # endif |
2822 # endif |
2819 |
2823 |
2820 # ifdef bcopy4 |
2824 # ifdef bcopy4 |
2821 if (((INT)dstp & 3) == 0) { |
2825 if (((INT)dstp & 3) == 0) { |
2822 int nw = l2 >> 2; |
2826 int nw = l2 >> 2; |