*/ void Reset_Mold(REB_MOLD *mold) /* ***********************************************************************/ { REBSER *buf = BUF_MOLD; REBINT len; if (!buf) Panic(RP_NO_BUFFER); if (SERIES_REST(buf) > MAX_COMMON) Shrink_Series(buf, MIN_COMMON); BLK_RESET(MOLD_LOOP); RESET_SERIES(buf); mold->series = buf; // This is not needed every time, but w/o a functional way to set the option, // it must be done like this and each time. if (GET_MOPT(mold, MOPT_MOLD_ALL)) len = MAX_DIGITS; else { // !!! It may be necessary to mold out values before the options // block is loaded, and this 'Get_System_Int' is a bottleneck which // crashes that in early debugging. BOOT_ERRORS is sufficient. if (PG_Boot_Phase >= BOOT_ERRORS) len = Get_System_Int(SYS_OPTIONS, OPTIONS_DECIMAL_DIGITS, MAX_DIGITS); else len = MAX_DIGITS; if (len > MAX_DIGITS) len = MAX_DIGITS; else if (len < 0) len = 0; } mold->digits = len; }
*/ void Reset_Mold(REB_MOLD *mold) /* ***********************************************************************/ { REBSER *buf = BUF_MOLD; REBINT len; if (!buf) Crash(RP_NO_BUFFER); if (SERIES_REST(buf) > MAX_COMMON) Shrink_Series(buf, MIN_COMMON); BLK_RESET(MOLD_LOOP); RESET_SERIES(buf); mold->series = buf; // This is not needed every time, but w/o a functional way to set the option, // it must be done like this and each time. if (GET_MOPT(mold, MOPT_MOLD_ALL)) len = MAX_DIGITS; else { len = Get_System_Int(SYS_OPTIONS, OPTIONS_DECIMAL_DIGITS, MAX_DIGITS); if (len > MAX_DIGITS) len = MAX_DIGITS; else if (len < 0) len = 0; } mold->digits = len; }
*/ REBSER *Split_Lines(REBVAL *val) /* ** Given a string series, split lines on CR-LF. ** Series can be bytes or Unicode. ** ***********************************************************************/ { REBSER *ser = BUF_EMIT; // GC protected (because it is emit buffer) REBSER *str = VAL_SERIES(val); REBCNT len = VAL_LEN(val); REBCNT idx = VAL_INDEX(val); REBCNT start = idx; REBSER *out; REBUNI c; BLK_RESET(ser); while (idx < len) { c = GET_ANY_CHAR(str, idx); if (c == LF || c == CR) { out = Copy_String(str, start, idx - start); val = Alloc_Tail_Array(ser); Val_Init_String(val, out); VAL_SET_OPT(val, OPT_VALUE_LINE); idx++; if (c == CR && GET_ANY_CHAR(str, idx) == LF) idx++; start = idx; } else idx++; } // Possible remainder (no terminator) if (idx > start) { out = Copy_String(str, start, idx - start); val = Alloc_Tail_Array(ser); Val_Init_String(val, out); VAL_SET_OPT(val, OPT_VALUE_LINE); } return Copy_Array_Shallow(ser); }