⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bc.c

📁 smallbasic for linux
💻 C
字号:
/**	bc module. Bytecode manipulation routines**	History:*		2001/02/23 - ndc - created*/#include "bc.h"/**	Create a bytecode segment*/void	bc_create(bc_t *bc){	bc->mem_h = mem_alloc(BC_ALLOC_INCR);	bc->ptr   = mem_lock(bc->mem_h);	bc->size  = BC_ALLOC_INCR;	bc->count = 0;	bc->cp = 0;}/**	Destroy a bytecode segment*/void	bc_destroy(bc_t *bc){	mem_unlock(bc->mem_h);	mem_free(bc->mem_h);	bc->ptr = NULL;	bc->size = 0;	bc->count = 0;	bc->cp = 0;}/**	Resize a bytecode segment*/void	bc_resize(bc_t *bc, dword new_size){	mem_unlock(bc->mem_h);	bc->mem_h = mem_realloc(bc->mem_h, new_size);	bc->size = new_size;	bc->ptr = mem_lock(bc->mem_h);}/**	add one command */void	bc_add1(bc_t *bc, byte code){	if	( bc->count >= (bc->size - 2) )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	bc->ptr[bc->count] = code;	bc->count ++;}/**	add one command & one byte*/void	bc_add2c(bc_t *bc, byte code, byte v){	if	( bc->count >= bc->size - 3 )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	bc->ptr[bc->count] = code;	bc->count ++;	bc->ptr[bc->count] = v;	bc->count ++;}/**	add one word*/void	bc_add1i(bc_t *bc, word p1){	if	( bc->count >= bc->size - 4 )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	memcpy(bc->ptr+bc->count, &p1, 2);	bc->count += 2;}/**	add one command and one word*/void	bc_add2i(bc_t *bc, byte code, word p1){	if	( bc->count >= bc->size - 4 )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	bc->ptr[bc->count] = code;	bc->count ++;	memcpy(bc->ptr+bc->count, &p1, 2);	bc->count += 2;}/**	add one command and one long int*/void	bc_add2l(bc_t *bc, byte code, long p1){	if	( bc->count >= bc->size - 8 )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	bc->ptr[bc->count] = code;	bc->count ++;	memcpy(bc->ptr+bc->count, &p1, 4);	bc->count += 4;}/**	add one command and one double*/void	bc_add2d(bc_t *bc, byte code, double p1){	if	( bc->count >= bc->size - 16 )		bc_resize(bc, bc->size + BC_ALLOC_INCR);	bc->ptr[bc->count] = code;	bc->count ++;	memcpy(bc->ptr+bc->count, &p1, 8);	bc->count += 8;}/**	add one command and one string (see: bc_store_string)*/void	bc_add2s(bc_t *bc, byte code, const char *p1){	word	l;	l = strlen(p1);	if	( l > BC_MAX_STORE_SIZE )		sc_raise("STRING TOO BIG");	else	{		bc_add2i(bc, code, l);		if	( bc->count >= bc->size - l )			bc_resize(bc, bc->size + BC_ALLOC_INCR);		memcpy(bc->ptr+bc->count, p1, l);		bc->count += l;		}}/**	adds a string.*	returns a pointer of src to the next "element"*/char*	bc_store_string(bc_t *bc, char *src){	char	*p = src, *np;	int		l;	p ++;	// == '\"'	while ( *p )	{		if	( *p == '\"' )	{			l = p - src;			np = tmp_alloc(l+1);			strncpy(np, src+1, l);			np[l-1] = '\0';			bc_add2s(bc, kwTYPE_STR, np);			tmp_free(np);			p ++;			return p;			}		p ++;		}	return p;}/**	adds an EOC mark at the current position*/void	bc_eoc(bc_t *bc){//	if	( bc->count )	{//		if	( bc->ptr[bc->count-1] != kwTYPE_EOC )			bc_add1(bc, kwTYPE_EOC);//		}}/**	appends the src to dst*/void	bc_append(bc_t *dst, bc_t *src){	bc_resize(dst, dst->count + src->count + 4);	memcpy(dst->ptr + dst->count, src->ptr, src->count);	dst->count += src->count;}/**	appends n bytes from src to dst*/void	bc_add_n(bc_t *dst, byte *src, word n){	if	( dst->count >= dst->size - n )		bc_resize(dst, dst->size + n);	memcpy(dst->ptr+dst->count, src, n);	dst->count += n;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -