// // Detab_Bytes: C // // Detab a string and return a new series. // REBSER *Detab_Bytes(REBYTE *bp, REBCNT index, REBCNT len, REBINT tabsize) { REBCNT cnt = 0; REBCNT n; REBYTE *dp; REBYTE c; // Estimate new length based on tab expansion: for (n = index; n < len; n++) if (bp[n] == TAB) cnt++; dp = Reset_Buffer(BYTE_BUF, len + (cnt * (tabsize-1))); n = 0; while (index < len) { c = bp[index++]; if (c == '\t') { *dp++ = ' '; n++; for (; n % tabsize != 0; n++) *dp++ = ' '; continue; } if (c == '\n') n = 0; else n++; *dp++ = c; } return Copy_Buffer(BYTE_BUF, 0, dp); }
*/ REBSER *Entab_Unicode(REBUNI *bp, REBCNT index, REBCNT len, REBINT tabsize) /* ** Entab a string and return a new series. ** ***********************************************************************/ { REBINT n = 0; REBUNI *dp; REBUNI c; dp = (REBUNI *)Reset_Buffer(BUF_MOLD, len); for (; index < len; index++) { c = bp[index]; // Count leading spaces, insert TAB for each tabsize: if (c == ' ') { if (++n >= tabsize) { *dp++ = '\t'; n = 0; } continue; } // Hitting a leading TAB resets space counter: if (c == '\t') { *dp++ = (REBYTE)c; n = 0; } else { // Incomplete tab space, pad with spaces: for (; n > 0; n--) *dp++ = ' '; // Copy chars thru end-of-line (or end of buffer): while (index < len) { if ((*dp++ = bp[index++]) == '\n') break; } } } return Copy_Buffer(BUF_MOLD, dp); }
// // Entab_Bytes: C // // Entab a string and return a new series. // REBSER *Entab_Bytes(REBYTE *bp, REBCNT index, REBCNT len, REBINT tabsize) { REBINT n = 0; REBYTE *dp; REBYTE c; dp = Reset_Buffer(BYTE_BUF, len); for (; index < len; index++) { c = bp[index]; // Count leading spaces, insert TAB for each tabsize: if (c == ' ') { if (++n >= tabsize) { *dp++ = '\t'; n = 0; } continue; } // Hitting a leading TAB resets space counter: if (c == '\t') { *dp++ = (REBYTE)c; n = 0; } else { // Incomplete tab space, pad with spaces: for (; n > 0; n--) *dp++ = ' '; // Copy chars thru end-of-line (or end of buffer): while (index < len) { if ((*dp++ = bp[index++]) == '\n') break; } } } return Copy_Buffer(BYTE_BUF, 0, dp); }
*/ REBSER *Detab_Unicode(REBUNI *bp, REBCNT index, REBCNT len, REBINT tabsize) /* ** Detab a unicode string and return a new series. ** ***********************************************************************/ { REBCNT cnt = 0; REBCNT n; REBUNI *dp; REBUNI c; // Estimate new length based on tab expansion: for (n = index; n < len; n++) if (bp[n] == TAB) cnt++; dp = (REBUNI *)Reset_Buffer(BUF_MOLD, len + (cnt * (tabsize-1))); n = 0; while (index < len) { c = bp[index++]; if (c == '\t') { *dp++ = ' '; n++; for (; n % tabsize != 0; n++) *dp++ = ' '; continue; } if (c == '\n') n = 0; else n++; *dp++ = c; } return Copy_Buffer(BUF_MOLD, dp); }