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

📄 fincstring.c

📁 c++写的一个脚本解释器
💻 C
字号:
#include <finc/finapi/fincstring.h>#ifdef USING_STRING_APIvoid finc_string_init(FinC* finc){	finc_insert_sys_api(finc, "string_length", (ADT)finc_string_length, "int");	finc_insert_sys_api(finc, "string_compare", (ADT)finc_string_compare, "int");	finc_insert_sys_api(finc, "string_equal", (ADT)finc_string_equal, "bool");	finc_insert_sys_api(finc, "string_add", (ADT)finc_string_add, "string");	finc_insert_sys_api(finc, "string_copy", (ADT)finc_string_copy, "string");	finc_insert_sys_api(finc, "string_sub", (ADT)finc_string_sub, "string");	finc_insert_sys_api(finc, "string_find", (ADT)finc_string_find, "int");	finc_insert_sys_api(finc, "string_find_ref", (ADT)finc_string_find_ref, "int");	finc_insert_sys_api(finc, "string_replace", (ADT)finc_string_replace, "string");	finc_insert_sys_api(finc, "string_begin_with", (ADT)finc_string_begin_with, "bool");	finc_insert_sys_api(finc, "string_end_with", (ADT)finc_string_end_with, "bool");	finc_insert_sys_api(finc, "string_toupper", (ADT)finc_string_toupper, "void");	finc_insert_sys_api(finc, "string_tolower", (ADT)finc_string_tolower, "void");	finc_insert_sys_api(finc, "string_splite", (ADT)finc_string_splite, "string");	finc_insert_sys_api(finc, "string_join", (ADT)finc_string_join, "string");	finc_insert_sys_api(finc, "string_set_size", (ADT)finc_string_set_size, "void");}/*int string_length(string src)*/FinCData* finc_string_length(Vector* v){	FinCData* str;	FinCData* result;	FinCType* type;	str = (FinCData*)vector_at(v, 0);	if (!str)return NULL;	type = finc_type_new(FinCType_Int, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	finc_access(result->raw, 0, unsigned int) = strlen(finc_access(str->raw, 0, unsigned char*));	unref(str);	return result;}/*int string_compare(string str1, string str2)*/FinCData* finc_string_compare(Vector* v){	FinCData* src1, *src2;	FinCData* result;	FinCType* type;	unsigned char *sp1, *sp2;	src1 = (FinCData*)vector_at(v, 0);	if (!src1)return NULL;	sp1 = finc_access(src1->raw, 0, unsigned char*);	src2 = (FinCData*)vector_at(v, 1);	if (!src2)	{		unref(src1);		return NULL;	}	sp2 = finc_access(src2->raw, 0, unsigned char*);	type = finc_type_new(FinCType_Int, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	finc_access(result->raw, 0, unsigned int) = strcmp(sp1, sp2);	unref(src1);	unref(src2);	return result;}/*bool string_equal(string str1, string str2)*/FinCData* finc_string_equal(Vector* v){	FinCData* src1, *src2;	FinCData* result;	FinCType* type;	unsigned char *sp1, *sp2;	src1 = (FinCData*)vector_at(v, 0);	if (!src1)return NULL;	sp1 = finc_access(src1->raw, 0, unsigned char*);	src2 = (FinCData*)vector_at(v, 1);	if (!src2)	{		unref(src1);		return NULL;	}	sp2 = finc_access(src2->raw, 0, unsigned char*);	type = finc_type_new(FinCType_Bool, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	finc_access(result->raw, 0, unsigned int) = strcmp(sp1, sp2)==0? TRUE:FALSE;	unref(src1);	unref(src2);	return result;}/*string string_copy(string str)*/FinCData* finc_string_copy(Vector* v){	FinCData* src;	FinCData* result;	src = (FinCData*)vector_at(v, 0);	if (!src)return NULL;	result = finc_data_new_copy(src);	unref(src);	return result;}/*string string_add(string str1, string str2, string str3, ...)*/FinCData* finc_string_add(Vector* v){	FinCData* src;	FinCData* result;	char* org;	int i;	org = NULL;	for ( i=0; i<vector_get_size(v); i++)	{		src = (FinCData*)vector_at(v, i);		if (!org)		{			org = (char*)mem_new(strlen(finc_access(src->raw, 0, unsigned char*))+1);			strcpy(org, finc_access(src->raw, 0, unsigned char*));		}		else		{			org = (char*)mem_resize(org, strlen(org)+strlen(finc_access(src->raw, 0, unsigned char*))+1);			strcat(org, finc_access(src->raw, 0, unsigned char*));		}		unref(src);	}	result = finc_data_new_string(org);	mem_destroy(org);	return result;}FinCData* finc_string_sub(Vector* v){	FinCData* src;	FinCData* begin, *end;	int i_begin, i_end;	FinCData* result;	char *org, *p, *q, *temp;	src = vector_at(v, 0);	if (!src)return NULL;	p = finc_access(src->raw, 0, unsigned char*);	begin = vector_at(v, 1);	if (!begin)	{		unref(src);		return NULL;	}	i_begin = finc_access(begin->raw, 0, int);	end = vector_at(v, 2);	if (!end) i_end = strlen(p);	else i_end = finc_access(end->raw, 0, int);	if (i_begin>i_end)	{		unref(src);		unref(begin);		return NULL;	}	org = (char*)mem_new((i_end-i_begin+1)*sizeof(char));	q = org;	temp = p;	p = p + i_begin;	while ( p < temp+i_end )*q++ = *p++;	*q = '\0';	result = finc_data_new_string(org);	mem_destroy(org);	unref(src);	unref(begin);	unref(end);	return result;}/*int string_find(string str, string str1)int string_find(string str, char ch)*/FinCData* finc_string_find(Vector* v){	FinCData* str;	FinCData* dest;	FinCData* result;	FinCType* type;	int l_result;	char ch;	unsigned char *p, *q;	str = vector_at(v, 0);	if (!str)return NULL;	p = finc_access(str->raw, 0, unsigned char*);	dest = vector_at(v, 1);	if (!dest)	{		unref(str);		return NULL;	}	type = finc_type_new(FinCType_Int, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	l_result = 0;	if (dest->type->type & FinCType_String)	{		q = finc_access(dest->raw, 0, unsigned char*);		while (*p)		{			if (strncmp(p, q, strlen(q))==0)break;			l_result++;			p++;		}		if (!*p)l_result = -1;	}	else if ( dest->type->type & FinCType_Char )	{		ch = finc_access(dest->raw, 0, char);		while (*p)		{			if (*p++==ch)break;			l_result++;		}		if (!*p)l_result = -1;	}	finc_access(result->raw, 0, int) = l_result;	unref(str);	unref(dest);	return result;}/*int string_find_ref(string str, string str1)int string_find_ref(string str, char ch)*/FinCData* finc_string_find_ref(Vector* v){	FinCData* str;	FinCData* dest;	FinCData* result;	FinCType* type;	int l_result;	char ch;	unsigned char *p, *q;	str = vector_at(v, 0);	if (!str)return NULL;	p = finc_access(str->raw, 0, unsigned char*);	l_result = strlen(p);	p = p + l_result;	dest = vector_at(v, 1);	if (!dest)	{		unref(str);		return NULL;	}	type = finc_type_new(FinCType_Int, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	if (dest->type->type & FinCType_String)	{		q = finc_access(dest->raw, 0, unsigned char*);		while (p!=finc_access(str->raw, 0, unsigned char*))		{			if (strncmp(p, q, strlen(q))==0)break;			l_result--;			p--;		}	}	else if ( dest->type->type & FinCType_Char )	{		ch = finc_access(dest->raw, 0, char);		while (p!=finc_access(str->raw, 0, unsigned char*))		{			if (*p--==ch)break;			l_result--;		}	}	finc_access(result->raw, 0, int) = l_result;	unref(str);	unref(dest);	return result;}/*int string_replace(string str, string src, string dest)*/FinCData* finc_string_replace(Vector* v){	return NULL;}/*bool string_begin_with(string str, string str1)bool string_begin_with(string str, char ch)*/FinCData* finc_string_begin_with(Vector* v){	FinCData* str;	FinCData* dest;	FinCData* result;	FinCType* type;	int l_result;	char ch;	unsigned char *p, *q;	str = vector_at(v, 0);	if (!str)return NULL;	p = finc_access(str->raw, 0, unsigned char*);	dest = vector_at(v, 1);	if (!dest)	{		unref(str);		return NULL;	}	type = finc_type_new(FinCType_Bool, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	l_result = 0;	if (dest->type->type & FinCType_String)	{		q = finc_access(dest->raw, 0, unsigned char*);		if (strncmp(p, q, strlen(q))==0)l_result=1;	}	else if ( dest->type->type & FinCType_Char )	{		ch = finc_access(dest->raw, 0, char);		if (*p==ch) l_result=1;	}	finc_access(result->raw, 0, Bool) = l_result==1? TRUE:FALSE;	unref(str);	unref(dest);	return result;}/*bool string_end_with(string str, string str1)bool string_end_with(string str, char ch)*/FinCData* finc_string_end_with(Vector* v){	FinCData* str;	FinCData* dest;	FinCData* result;	FinCType* type;	int l_result;	char ch;	unsigned char *p, *q;	str = vector_at(v, 0);	if (!str)return NULL;	p = finc_access(str->raw, 0, unsigned char*);	l_result = strlen(p);	p = p + l_result;	dest = vector_at(v, 1);	if (!dest)	{		unref(str);		return NULL;	}	type = finc_type_new(FinCType_Bool, FinCArrayType_None, 0);	result = finc_data_new(type, NULL);	unref(type);	if (dest->type->type & FinCType_String)	{		q = finc_access(dest->raw, 0, unsigned char*);		p = p + strlen(p) - strlen(q);		if (strcmp(p, q)==0) l_result = 1;	}	else if ( dest->type->type & FinCType_Char )	{		ch = finc_access(dest->raw, 0, char);		if (*p==ch) l_result = 1;	}	finc_access(result->raw, 0, Bool) = l_result;	unref(str);	unref(dest);	return result;}/*void string_toupper(string str)*/FinCData* finc_string_toupper(Vector* v){	FinCData* str;	str = vector_at(v, 0);	if (!str)return NULL;//	toupper(finc_access(str, 0, unsigned char*));	unref(str);	return NULL;}/*void string_tolower(string str)*/FinCData* finc_string_tolower(Vector* v){	FinCData* str;	str = vector_at(v, 0);	if (!str)return NULL;//	tolower(finc_access(str, 0, unsigned char*));	unref(str);	return NULL;}/*string[] string_splite(string str, string str1)*/FinCData* finc_string_splite(Vector* v){	return NULL;}/*string string_join(string str[], string str1)*/FinCData* finc_string_join(Vector* v){	return NULL;}/*viod finc_string_set_size(Vector* v)*/FinCData* finc_string_set_size(Vector* v){	FinCData* str;	FinCData* size;	FinCData* char_array;	FinCType* type;	int length;	str = (FinCData*)vector_at(v, 0);	if (!str)return NULL;	size = (FinCData*)vector_at(v, 1);	if ( !str || !size )	{		unref(str);		return NULL;	}	length = finc_access(size->raw, 0, int);	if ( length <=0 )	{		unref(str);		unref(size);		return NULL;	}	type = finc_type_new(FinCType_Char, FinCArrayType_Fixed, length);	char_array = finc_data_new(type, NULL);	unref(type);	finc_access(str->raw, 0, ADT) = char_array->raw;	unref(str->pointer);	str->pointer = char_array;	unref(str);	unref(size);	return NULL;}#endif

⌨️ 快捷键说明

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