len = *grouping++; if (*grouping == '\0')  --grouping; else if (*grouping == CHAR_MAX
if (*grouping == CHAR_MAX
group_number (CHAR_T *w, CHAR_T *rear_ptr, const char *grouping,#ifdef COMPILE_WPRINTF	      wchar_t thousands_sep#else	      const char *thousands_sep#endif	      ){  int len;  CHAR_T *src, *s;#ifndef COMPILE_WPRINTF  int tlen = strlen (thousands_sep);#endif  /* We treat all negative values like CHAR_MAX.  */  if (*grouping == CHAR_MAX || *grouping <= 0)    /* No grouping should be done.  */    return w;  len = *grouping;  /* Copy existing string so that nothing gets overwritten.  */  src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T));  s = (CHAR_T *) __mempcpy (src, w,			    (rear_ptr - w) * sizeof (CHAR_T));  w = rear_ptr;  /* Process all characters in the string.  */  while (s > src)    {      *--w = *--s;      if (--len == 0 && s > src)	{	  /* A new group begins.  */#ifdef COMPILE_WPRINTF	  *--w = thousands_sep;#else	  int cnt = tlen;	  do	    *--w = thousands_sep[--cnt];	  while (cnt > 0);#endif	  len = *grouping++;	  if (*grouping == '\0')	    /* The previous grouping repeats ad infinitum.  */	    --grouping;	  else if (*grouping == CHAR_MAX#if CHAR_MIN < 0		   || *grouping < 0#endif		   )	    {	      /* No further grouping to be done.		 Copy the rest of the number.  */	      do		*--w = *--s;	      while (s > src);	      break;	    }	}    }  return w;}