do { \
_MASK_(_CTYPE_ *px = _PTR_(x )); \
_MASK_(_CTYPE_ *pvx = _PTR_(vx)); \
if (TYPEOF(vi) == INTSXP) { \
int *pvi = INTEGER(vi), i; \
k = 0; \
for (i = 1; i <= m; i += 1) { \
kend = *(++pp); \
while (k < kend) { \
pvi[work[pj[k]]] = m * pj[k] + i; \
_MASK_(pvx[work[pj[k]]] = px[k]); \
work[pj[k++]]++; \
} \
} \
} else { \
double *pvi = REAL(vi), i_, m_ = (double) m; \
k = 0; \
for (i_ = 1.0; i_ <= m_; i_ += 1.0) { \
kend = *(++pp); \
while (k < kend) { \
pvi[work[pj[k]]] = m_ * pj[k] + i_; \
_MASK_(pvx[work[pj[k]]] = px[k]); \
work[pj[k++]]++; \
} \
} \
} \
} while (0)