Esempio n. 1
0
//
//  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);
}
Esempio n. 2
0
*/  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);
}
Esempio n. 3
0
//
//  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);
}
Esempio n. 4
0
*/  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);
}