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