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

📄 strtbl.cpp

📁 虚拟机设计与实现——C/C++
💻 CPP
字号:
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+                                                                   +
+ strtbl.cpp - the string table ( init, add elements, print )       +
+                                                                   +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Macros                                                            +                                                                   +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#define STR_TBL_INIT  2*1024	/*initial size of string table*/
#define STR_TBL_INC	  1024		/*amount increment when expand*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ declaration                                                       +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

class StringTable
{
	U8 nStr;	/*current capacity*/
	
	public:
	U1 *text;
	U8 iStr;	/*next free space*/

	StringTable();
	~StringTable();
	void addStrTbl(char *str);
	void printStrTbl();
};

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ definitions                                                       +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

StringTable::StringTable()
{
	text = (U1*)malloc(STR_TBL_INIT);
	if(text==NULL)
	{
		ERROR0("StringTable::StringTable(): out of memory\n");
		FATAL_ERROR();
	}
	iStr = 0;
	nStr = STR_TBL_INIT;
	return;

}/*end constructor*/

/*-----------------------------------------------------------------*/

StringTable::~StringTable()
{
	free(text);
	return;

}/*end destructor*/

/*-----------------------------------------------------------------*/

/*
add string to strTbl ( re-size if necessary )
*/

void StringTable::addStrTbl(char *str)
{
	U8 len;
	U8 i;
	U8 final_index;
	U1 *ptr;

	len = strlen(str);	/*note: null not included*/
	len++;				/*count null*/
	final_index = iStr + len - 1;

	/* capacity n will have indices 0,...,n-1 */

	if(final_index >= nStr)
	{
		ptr = (U1*)malloc((size_t)(nStr+STR_TBL_INC));
		if(ptr==NULL)
		{
			ERROR0("StringTable::addStrTbl(): no more memory\n");
			FATAL_ERROR();
		}
		else
		{
			for(i=0;i<nStr;i++){ ptr[i] = text[i]; }
			free(text);
			text = ptr;
			nStr = nStr+STR_TBL_INC;
		}
	}
	
	for(i=0;i<=len;i++)
	{ 
		text[iStr+i] = str[i];
	}
	iStr = final_index+1; /* next EMPTY space */
	return;

}/*end addStrTbl*/

/*-----------------------------------------------------------------*/

void StringTable::printStrTbl()
{
	U8 i;
	U8 nstr;

	printf("\nSTRING TABLE-----------------------\n");
	printf("capacity nStr ="); pU8(nStr); printf("\n");
	printf("next free index iStr ="); pU8(iStr); printf("\n\n");
	nstr = 1;
	
	for(i=0;i<iStr;i++)
	{
		if(i==0){printf("0)");}

		/*either print char or handle null char*/

		if(text[i]!='\0')
		{ 
			putchar(text[i]); 
		}
		else if(i<(iStr-1))
		{ 
			printf("(null)\n%lu)",nstr); nstr++; 
		}
		else if(i==(iStr-1))
		{ 
			printf("(null)\n");
		}
	}
	return;

}/*printStrTbl*/

⌨️ 快捷键说明

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