String.st
changeset 20107 53dd0fe694cf
parent 20072 b31532aea435
child 20109 27a6eda44c02
equal deleted inserted replaced
20106:f2f009eeee26 20107:53dd0fe694cf
   539 
   539 
   540     ^ self == String
   540     ^ self == String
   541 
   541 
   542     "Modified: 23.4.1996 / 16:00:38 / cg"
   542     "Modified: 23.4.1996 / 16:00:38 / cg"
   543 ! !
   543 ! !
       
   544 
       
   545 
   544 
   546 
   545 
   547 
   546 
   548 
   547 
   549 
   548 
   550 
  2760      */
  2762      */
  2761     if (__qIsStringLike(self)) {
  2763     if (__qIsStringLike(self)) {
  2762         char *cp1 = (char *) __stringVal(self);
  2764         char *cp1 = (char *) __stringVal(self);
  2763         int l1 = __stringSize(self);
  2765         int l1 = __stringSize(self);
  2764         int l2;
  2766         int l2;
  2765         char *cp2;
  2767         char *cp2 = 0;
  2766         int sz;
  2768         int sz;
  2767         OBJ newString;
  2769         OBJ newString;
  2768         char character;
  2770         char character;
  2769 
  2771 
  2770         if (__isCharacter(aStringOrCharacter)) {
  2772         if (__isCharacter(aStringOrCharacter)) {
  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;