*/ REBSER *List_Func_Types(REBVAL *func) /* ** Return a block of function arg types. ** Note: skips 0th entry. ** ***********************************************************************/ { REBSER *block; REBSER *words = VAL_FUNC_WORDS(func); REBCNT n; REBVAL *value; REBVAL *word; block = Make_Block(SERIES_TAIL(words)); word = BLK_SKIP(words, 1); for (n = 1; n < SERIES_TAIL(words); word++, n++) { value = Alloc_Tail_Blk(block); VAL_SET(value, VAL_TYPE(word)); VAL_WORD_SYM(value) = VAL_BIND_SYM(word); UNBIND(value); } return block; }
*/ REBSER *Typeset_To_Block(REBVAL *tset) /* ** Converts typeset value to a block of datatypes. ** No order is specified. ** ***********************************************************************/ { REBSER *block; REBVAL *value; REBINT n; REBINT size = 0; for (n = 0; n < REB_MAX; n++) { if (TYPE_CHECK(tset, n)) size++; } block = Make_Block(size); // Convert bits to types: for (n = 0; n < REB_MAX; n++) { if (TYPE_CHECK(tset, n)) { value = Alloc_Tail_Blk(block); Set_Datatype(value, n); } } return block; }
static void Mold_Block_Series(REB_MOLD *mold, REBSER *series, REBCNT index, const char *sep) { REBSER *out = mold->series; REBOOL line_flag = FALSE; // newline was part of block REBOOL had_lines = FALSE; REBVAL *value = BLK_SKIP(series, index); if (!sep) sep = "[]"; if (IS_END(value)) { Append_Unencoded(out, sep); return; } // Recursion check: (variation of: Find_Same_Block(MOLD_LOOP, value)) for (value = BLK_HEAD(MOLD_LOOP); NOT_END(value); value++) { if (VAL_SERIES(value) == series) { Emit(mold, "C...C", sep[0], sep[1]); return; } } value = Alloc_Tail_Blk(MOLD_LOOP); Set_Block(value, series); if (sep[1]) { Append_Byte(out, sep[0]); mold->indent++; } // else out->tail--; // why????? value = BLK_SKIP(series, index); while (NOT_END(value)) { if (VAL_GET_LINE(value)) { if (sep[1] || line_flag) New_Indented_Line(mold); had_lines = TRUE; } line_flag = TRUE; Mold_Value(mold, value, TRUE); value++; if (NOT_END(value)) Append_Byte(out, (sep[0] == '/') ? '/' : ' '); } if (sep[1]) { mold->indent--; if (VAL_GET_LINE(value) || had_lines) New_Indented_Line(mold); Append_Byte(out, sep[1]); } Remove_Last(MOLD_LOOP); }
*/ void Init_Typesets(void) /* ** Create typeset variables that are defined above. ** For example: NUMBER is both integer and decimal. ** Add the new variables to the system context. ** ***********************************************************************/ { REBVAL *value; REBINT n; Set_Root_Series(ROOT_TYPESETS, Make_Block(40), "typeset presets"); for (n = 0; Typesets[n]; n += 2) { value = Alloc_Tail_Blk(VAL_SERIES(ROOT_TYPESETS)); VAL_SET(value, REB_TYPESET); VAL_TYPESET(value) = Typesets[n+1]; if (Typesets[n] > 1) *Append_Frame(Lib_Context, 0, (REBCNT)(Typesets[n])) = *value; } }