コード例 #1
0
ファイル: out.c プロジェクト: Deseaus/GF
void
gu_out_end_span(GuOut* out, size_t sz)
{
	ptrdiff_t new_curr = (ptrdiff_t) sz + out->buf_curr;
	gu_require(new_curr <= 0);
	out->buf_curr = new_curr;
}
コード例 #2
0
ファイル: out.c プロジェクト: McMbuvi/GF
GuOut
gu_init_out(GuOutStream* stream)
{
	gu_require(stream != NULL);
	GuOut out = {
		.buf_end = NULL,
		.buf_curr = 0,
		.stream = stream,
		.fini.fn = NULL
	};
	return out;
}

static bool
gu_out_is_buffering(GuOut* out)
{
	return !!out->buf_end;
}


static void
gu_out_end_buf(GuOut* out, GuExn* err)
{
	if (!gu_out_is_buffering(out)) {
		return;
	}
	GuOutStream* stream = out->stream;
	size_t curr_len = ((ptrdiff_t)out->buf_size) + out->buf_curr;
	stream->end_buf(stream, curr_len, err);
	out->buf_end = NULL;
	out->buf_size = out->buf_curr = 0;
}

static bool
gu_out_begin_buf(GuOut* out, size_t req, GuExn* err)
{
	GuOutStream* stream = out->stream;
	if (gu_out_is_buffering(out)) {
		if (out->buf_curr < 0) {
			return true;
		} else {
			gu_out_end_buf(out, err);
			if (!gu_ok(err)) {
				return false;
			}
		}
	}
	if (stream->begin_buf) {
		size_t sz = 0;
		uint8_t* buf = stream->begin_buf(stream, req, &sz, err);
		gu_assert(sz <= PTRDIFF_MAX);
		if (buf) {
			out->buf_end = &buf[sz];
			out->buf_curr = -(ptrdiff_t) sz;
			out->buf_size = sz;
			return true;
		}
	}
	return false;
}
コード例 #3
0
ファイル: choice.c プロジェクト: McMbuvi/GF
void
gu_choice_reset(GuChoice* ch, GuChoiceMark mark)
{
	gu_assert(ch->path_idx <= gu_buf_length(ch->path));
	gu_debug("%p@%d: reset %d", ch, ch->path_idx, mark.path_idx);
	gu_require(mark.path_idx <= ch->path_idx );
	ch->path_idx = mark.path_idx;
}
コード例 #4
0
ファイル: ucs.c プロジェクト: creswick/GF
GuUCS
gu_char_ucs(char c)
{
	gu_require(gu_char_is_valid(c));
	GuUCS u = (GuUCS) c;
	gu_ensure(u < 0x80);
	return u;
}
コード例 #5
0
ファイル: out.c プロジェクト: Deseaus/GF
GuOut*
gu_new_out(GuOutStream* stream, GuPool* pool)
{
	gu_require(stream != NULL);

	GuOut* out = gu_new(GuOut, pool);
	out->buf_end = NULL,
	out->buf_curr = 0,
	out->stream = stream,
	out->fini.fn = gu_out_fini;
	gu_pool_finally(pool, &out->fini);
	return out;
}
コード例 #6
0
ファイル: ucs.c プロジェクト: McMbuvi/GF
GuUCS
gu_char_ucs(char c)
{
	gu_require(gu_char_is_valid(c));
#ifdef CHAR_ASCII
	GuUCS u = (GuUCS) c;
#else
	extern const uint8_t gu_ucs_ascii_reverse_[CHAR_MAX];
	GuUCS u = gu_ucs_ascii_reverse_[(unsigned char) c];
#endif
	gu_ensure(u < 0x80);
	return u;
}
コード例 #7
0
ファイル: exn.c プロジェクト: Deseaus/GF
GuExnData*
gu_exn_raise_debug_(GuExn* err, const char* type, 
		            const char* filename, const char* func, int lineno)
{
	gu_require(type);

	GuExnState old_state = err->state;
	err->state = GU_EXN_RAISED;
	if (old_state == GU_EXN_OK) {
		err->caught = type;
		if (err->data.pool) {
			return &err->data;
		}
	}

	// Exceptian had already been raised, possibly blocked, or no
	// exception value is required.
	return NULL;
}
コード例 #8
0
ファイル: seq.c プロジェクト: McMbuvi/GF
GuBuf*
gu_seq_buf(GuSeq seq)
{
	gu_require(gu_tagged_tag(seq.w_) == 0);
	return gu_word_ptr(seq.w_);
}