STOID Mold_File(REBVAL *value, REB_MOLD *mold) { REBUNI *dp; REBCNT n; REBUNI c; REBCNT len = VAL_LEN(value); REBSER *ser = VAL_SERIES(value); // Compute extra space needed for hex encoded characters: for (n = VAL_INDEX(value); n < VAL_TAIL(value); n++) { c = GET_ANY_CHAR(ser, n); if (IS_FILE_ESC(c)) len += 2; } len++; // room for % at start dp = Prep_Uni_Series(mold, len); *dp++ = '%'; for (n = VAL_INDEX(value); n < VAL_TAIL(value); n++) { c = GET_ANY_CHAR(ser, n); if (IS_FILE_ESC(c)) dp = Form_Hex_Esc_Uni(dp, c); // c => %xx else *dp++ = c; } *dp = 0; }
STOID Mold_Issue(REBVAL *value, REB_MOLD *mold) { REBUNI *dp; REBCNT n; REBUNI c; REBSER *ser = VAL_SERIES(value); dp = Prep_Uni_Series(mold, VAL_LEN(value)+1); // '#' extra *dp++ = '#'; for (n = VAL_INDEX(value); n < VAL_TAIL(value); n++) { c = GET_ANY_CHAR(ser, n); if (IS_LEX_DELIMIT(c)) c = '?'; *dp++ = c; } *dp = 0; }
static void Mold_Url(const REBVAL *value, REB_MOLD *mold) { REBUNI *dp; REBCNT n; REBUNI c; REBCNT len = VAL_LEN(value); REBSER *ser = VAL_SERIES(value); // Compute extra space needed for hex encoded characters: for (n = VAL_INDEX(value); n < VAL_TAIL(value); n++) { c = GET_ANY_CHAR(ser, n); if (IS_URL_ESC(c)) len += 2; } dp = Prep_Uni_Series(mold, len); for (n = VAL_INDEX(value); n < VAL_TAIL(value); n++) { c = GET_ANY_CHAR(ser, n); if (IS_URL_ESC(c)) dp = Form_Hex_Esc_Uni(dp, c); // c => %xx else *dp++ = c; } *dp = 0; }
STOID Mold_String_Series(REBVAL *value, REB_MOLD *mold) { REBCNT len = VAL_LEN(value); REBSER *ser = VAL_SERIES(value); REBCNT idx = VAL_INDEX(value); REB_STRF sf = {0}; REBYTE *bp; REBUNI *up; REBUNI *dp; REBOOL uni = !BYTE_SIZE(ser); REBCNT n; REBUNI c; // Empty string: if (idx >= VAL_TAIL(value)) { Append_Bytes(mold->series, "\"\""); //Trap0(RE_PAST_END); return; } Sniff_String(ser, idx, &sf); if (!GET_MOPT(mold, MOPT_ANSI_ONLY)) sf.paren = 0; // Source can be 8 or 16 bits: if (uni) up = UNI_HEAD(ser); else bp = STR_HEAD(ser); // If it is a short quoted string, emit it as "string": if (len <= MAX_QUOTED_STR && sf.quote == 0 && sf.newline < 3) { dp = Prep_Uni_Series(mold, len + sf.newline + sf.escape + sf.paren + sf.chr1e + 2); *dp++ = '"'; for (n = idx; n < VAL_TAIL(value); n++) { c = uni ? up[n] : (REBUNI)(bp[n]); dp = Emit_Uni_Char(dp, c, (REBOOL)GET_MOPT(mold, MOPT_ANSI_ONLY)); // parened } *dp++ = '"'; *dp = 0; return; } // It is a braced string, emit it as {string}: if (!sf.malign) sf.brace_in = sf.brace_out = 0; dp = Prep_Uni_Series(mold, len + sf.brace_in + sf.brace_out + sf.escape + sf.paren + sf.chr1e + 2); *dp++ = '{'; for (n = idx; n < VAL_TAIL(value); n++) { c = uni ? up[n] : (REBUNI)(bp[n]); switch (c) { case '{': case '}': if (sf.malign) { *dp++ = '^'; *dp++ = c; break; } case '\n': case '"': *dp++ = c; break; default: dp = Emit_Uni_Char(dp, c, (REBOOL)GET_MOPT(mold, MOPT_ANSI_ONLY)); // parened } } *dp++ = '}'; *dp = 0; }