*/ REBINT PD_File(REBPVS *pvs) /* ***********************************************************************/ { REBSER *ser; REB_MOLD mo = {0}; REBCNT n; REBUNI c; REBSER *arg; if (pvs->setval) return PE_BAD_SET; ser = Copy_Series_Value(pvs->value); n = SERIES_TAIL(ser); if (n > 0) c = GET_ANY_CHAR(ser, n-1); if (n == 0 || c != '/') Append_Byte(ser, '/'); if (ANY_STR(pvs->select)) arg = VAL_SERIES(pvs->select); else { Reset_Mold(&mo); Mold_Value(&mo, pvs->select, 0); arg = mo.series; } c = GET_ANY_CHAR(arg, 0); n = (c == '/' || c == '\\') ? 1 : 0; Append_String(ser, arg, n, arg->tail-n); Set_Series(VAL_TYPE(pvs->value), pvs->store, ser); return PE_USE; }
*/ static void Write_File_Port(REBREQ *file, REBVAL *data, REBCNT len, REBCNT args) /* ***********************************************************************/ { REBSER *ser; if (IS_BLOCK(data)) { // Form the values of the block // !! Could be made more efficient if we broke the FORM // into 32K chunks for writing. REB_MOLD mo; CLEARS(&mo); Reset_Mold(&mo); if (args & AM_WRITE_LINES) { mo.opts = 1 << MOPT_LINES; } Mold_Value(&mo, data, 0); Set_String(data, mo.series); // fall into next section len = SERIES_TAIL(mo.series); } // Auto convert string to UTF-8 if (IS_STRING(data)) { ser = Encode_UTF8_Value(data, len, ENCF_OS_CRLF); file->common.data = ser? BIN_HEAD(ser) : VAL_BIN_DATA(data); // No encoding may be needed len = SERIES_TAIL(ser); } else { file->common.data = VAL_BIN_DATA(data); } file->length = len; OS_DO_DEVICE(file, RDC_WRITE); }
*/ REBSER *Form_Reduce(REBSER *block, REBCNT index) /* ** Reduce a block and then form each value into a string. Return the ** string or NULL if an unwind triggered while reducing. ** ***********************************************************************/ { REBINT start = DSP + 1; REBINT n; REB_MOLD mo = {0}; while (index < BLK_LEN(block)) { index = Do_Next(block, index, 0); if (THROWN(DS_TOP)) { *DS_VALUE(start) = *DS_TOP; DSP = start; return NULL; } } Reset_Mold(&mo); for (n = start; n <= DSP; n++) Mold_Value(&mo, &DS_Base[n], 0); DSP = start; return Copy_String(mo.series, 0, -1); }
*/ REBSER *Form_Tight_Block(REBVAL *blk) /* ***********************************************************************/ { REB_MOLD mo = {0}; REBVAL *val; Reset_Mold(&mo); for (val = VAL_BLK_DATA(blk); NOT_END(val); val++) Mold_Value(&mo, val, 0); return Copy_String(mo.series, 0, -1); }
*/ REBSER *Copy_Mold_Value(REBVAL *value, REBCNT opts) /* ** Form a value based on the mold opts provided. ** ***********************************************************************/ { REB_MOLD mo = {0}; mo.opts = opts; Reset_Mold(&mo); Mold_Value(&mo, value, TRUE); return Copy_String(mo.series, 0, -1); }
*/ REBSER *Mold_Print_Value(REBVAL *value, REBCNT limit, REBFLG mold) /* ** Basis function for print. Can do a form or a mold based ** on the mold flag setting. Can limit string output to a ** specified size to prevent long console garbage output. ** ***********************************************************************/ { REB_MOLD mo = {0}; Reset_Mold(&mo); Mold_Value(&mo, value, mold); if (limit != 0 && STR_LEN(mo.series) > limit) { SERIES_TAIL(mo.series) = limit; Append_Bytes(mo.series, "..."); // adds a null at the tail } return mo.series; }
*/ REBSER *Form_Reduce(REBSER *block, REBCNT index) /* ***********************************************************************/ { REBINT start = DSP + 1; REBINT n; REB_MOLD mo = {0}; while (index < BLK_LEN(block)) { index = Do_Next(block, index, 0); } Reset_Mold(&mo); for (n = start; n <= DSP; n++) Mold_Value(&mo, &DS_Base[n], 0); DSP = start; return Copy_String(mo.series, 0, -1); }
*/ REBSER *Block_To_String_List(REBVAL *blk) /* ** Convert block of values to a string that holds ** a series of null terminated strings, followed ** by a final terminating string. ** ***********************************************************************/ { REB_MOLD mo = {0}; REBVAL *value; Reset_Mold(&mo); for (value = VAL_BLK_DATA(blk); NOT_END(value); value++) { Mold_Value(&mo, value, 0); Append_Byte(mo.series, 0); } Append_Byte(mo.series, 0); return Copy_Series(mo.series); // Unicode }