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

📄 blib_func.c

📁 smallbasic for linux
💻 C
📖 第 1 页 / 共 2 页
字号:
/**	SmallBasic LIBRARY - STANDARD FUNCTIONS**	2000-05-27, Nicholas Christopoulos**	This program is distributed under the terms of the GPL v2.0 or later*	Download the GNU Public License (GPL) from www.gnu.org*/#include "sys.h"#include "str.h"#include "kw.h"#include "panic.h"#include "var.h"#include "blib.h"#include "pproc.h"#include "device.h"#if defined(_UnixOS)#include <sys/sysinfo.h>#include <unistd.h>#endifvoid	cmd_pen(){	byte	code;		if	( prog_error )	return;	code = code_getnext();			if	( prog_error )	return;	if	( code == kwOFF )		dev_setpenmode(0);	else if ( code == kwON )			dev_setpenmode(1);	else		err_syntax();}////	f <- FUNC (f|i)//double	cmd_math1(byte funcCode, var_t *arg){	double	r = 0.0, x;	if	( prog_error )	return 0;	x = v_getval(arg);						switch ( funcCode )	{	case kwPEN:		r = dev_getpen(x);		break;	case kwCOS:		r = cos(x);		break;	case kwSIN:		r = sin(x);		break;	case kwTAN:		r = tan(x);		break;	case kwACOS:		r = acos(x);		break;	case kwASIN:		r = asin(x);		break;	case kwATAN:		r = atan(x);		break;	case kwCOSH:		r = cosh(x);		break;	case kwSINH:		r = sinh(x);		break;	case kwTANH:		r = tanh(x);		break;	case kwACOSH:		#if defined(_Win32)		r = log(x+sqrt(x*x-1));		#else		r = acosh(x);		#endif		break;	case kwASINH:		#if defined(_Win32)		r = log(x + sqrt(x * x + 1));		#else		r = asinh(x);		#endif		break;	case kwATANH:		#if defined(_Win32)		r = log((1+x)/(1-x))/2;		#else		r = atanh(x);		#endif		break;	case kwSQR:		r = sqrt(x);		break;	case kwABS:		r = (x > 0.0) ? x : -x;		break;	case kwEXP:		r = exp(x);		break;	case kwLOG:		r = log(x);		break;	case kwLOG10:		r = log10(x);		break;	case kwINT:		r = floor(x);		break;	case kwDEG:		r = x * 180.0 / PI;		break;	case kwRAD:		r = x * PI / 180.0;		break;	case kwCDBL:		r = x;		break;	case kwFIX:		r = ceil(x);		break;	case kwRND:		#if defined(_PalmOS)		r = ((double) SysRandom(0)) / ((double) sysRandomMax + 1.0);		#else		r = ((double) rand()) / (RAND_MAX+1.0);		#endif		break;		};	return r;}////	i <- FUNC (f|i)//long	cmd_imath1(byte funcCode, var_t *arg){	long	r = 0, x;	if	( prog_error )	return 0;	x = v_getint(arg);						switch ( funcCode )	{	case kwTIMER:		//		//	int <- TIMER	// seconds from 00:00		//		{		#if defined(_PalmOS)		DateTimeType cur_date;		x = TimGetSeconds();		TimSecondsToDateTime(x, &cur_date);		r = cur_date.hour * 3600L + cur_date.minute * 60L + cur_date.second;		#else		struct tm tms;		time_t	  now;		time(&now);		tms = *localtime(&now);		r = tms.tm_hour * 3600L + tms.tm_min * 60L + tms.tm_sec;		#endif		}		break;	case kwTICKS:		//		//	int <- TICKS	// clock()		//		#if defined(_PalmOS)		r = TimGetTicks();		#else		r = clock();		#endif		break;	case kwTICKSPERSEC:		//		//	int <- TICKSPERSEC		//		#if defined(_PalmOS)		r = SysTicksPerSecond();		#else		r = CLOCKS_PER_SEC;		#endif		break;	case kwCINT:		//		//	int <- CINT(float)		//		r = x;		break;	case kwEOF:		//		//	int <- EOF(file-handle)		//		r = dev_feof(x);		break;	case kwSEEK:		//		//	int <- SEEK(file-handle)		//		r = dev_ftell(x);		break;	case kwLOF:		//		//	int <- LOF(file-handle)		//		r = dev_flength(x);		break;	case kwSGN:		//		//	int <- SGN(n)		//		r = v_sign(arg);		break;	case kwFRE:		//		//	int	<- FRE(0)	// free memory		//	int <- FRE(-1)	// largest block of integers		//	int <- FRE(-2)	// free stack		//	int <- FRE(-3)	// largest free block		//	Linux:		//	int <- FRE(-10)	// total ram		//		{		#if defined(_PalmOS)		dword	dwfre, dwmax;		Ptr		sts, ste;		MemHeapFreeBytes(0, &dwfre, &dwmax);		if	( x == -1 )			r = (dwmax / (4 + sizeof(var_t))) - sizeof(var_t);		else if ( x == -2 )	{			SysGetStackInfo(&sts, &ste);			r = (((sts <= ste) ? ste - sts : sts - ste)) + 1;			// this is the total stack, I dont know 68000 assembly to get the SP			}		else if ( x == -3 )			r = dwmax;		else			r = dwfre;		#elif defined(_Win32)		r = 0x7ffffff;		// linux has limits ? 0x7ffffff = 128MB -1		#else//		struct rlimit lim;//		getrlimit(RLIMIT_MEMLOCK, &lim);//		r = lim.rlim_cur;		struct sysinfo	si;		sysinfo(&si);				switch ( x )	{		case 0:			r = si.freeram; /* / si.mem_unit */		// mem_unit used by Linux kernel 2.3.??+			break;		case -1:			r = si.freeram / 4;			break;		case -2:			r = si.freeram;			break;		case -3:			r = si.freeram;			break;		case -10:			r = si.totalram;			break;		default:			r = 0;			};		#endif		}		break;		};	return r;}////	i|f <- FUNC (str)//void	cmd_ns1(byte funcCode, var_t *arg, var_t *r){	if	( prog_error )	return;	if	( arg->type != V_STR )	{		v_tostr(arg);		if	( prog_error )	return;		}	switch ( funcCode )	{	case kwASC:		//		//	int <- ASC(s)		//		r->type = V_INT;		r->i = *((byte*) arg->ptr);		break;	case kwLEN:		//		//	int <- LEN(s)		//		r->type = V_INT;		r->i = strlen(arg->ptr);		break;	case kwVAL:		//		//	float <- VAL(s)		//		r->type = V_NUM;		r->n = numexpr_strtof(arg->ptr);		break;	case kwTEXTWIDTH:		//		//	int <- TXTW(s)		//		r->type = V_INT;		r->i = dev_textwidth(arg->ptr);		break;	case kwTEXTHEIGHT:		//		//	int <- TXTH(s)		//		r->type = V_INT;		r->i = dev_textheight(arg->ptr);		break;	case kwEXIST:		//		//	int <- EXIST(s)		//		r->type = V_INT;		r->i = dev_fexists(arg->ptr);		break;		};}////	str <- FUNC (any)//void	cmd_str1(byte funcCode, var_t *arg, var_t *r){	char	*p, *wp;	#if defined(_PalmOS)	char	*tb;	#endif	int		l, i;	switch ( funcCode )	{	case kwCHR:		//		//	str <- CHR$(n)		//		wp = r->ptr = tmp_alloc(2);		wp[0] = v_getint(arg);		wp[1] = '\0';		r->size = 2;		break;	case kwSTR:		//		//	str <- STR$(n)		//		r->ptr = tmp_alloc(64);		if	( arg->type == V_INT )			ltostr(arg->i, r->ptr);		else			ftostr(arg->n, r->ptr);		r->size = strlen(r->ptr)+1;		break;	case kwOCT:		//		//	str <- OCT$(n)		//		#if defined(_PalmOS)		// GAC - PalmOS does not support %lo in StrPrintF :(		tb = tmp_alloc(64);		p = tb;		l=0;		// Skip leading zeros		for(i=33; l==0 && i>0; i-=3) {			l = (v_getint(arg)>>i) & 0x7;			}		if(l==0) {			wp = r->ptr = tmp_alloc(2);			wp[0] = '0';			wp[1] = '\0';			}		else	{			// Add chars as needed			for(i+=3; i>=0; i-=3) {				*(p++) = ((v_getint(arg)>>i) & 0x7) + '0';				}			*p = '\0';			r->ptr = tmp_alloc(strlen(tb) + 1);			strcpy(r->ptr, tb);			}		tmp_free(tb);		#else		r->ptr = tmp_alloc(64);		sprintf(r->ptr, "%lo", (unsigned long) v_getint(arg));		#endif		r->size = strlen(r->ptr)+1;		break;	case kwHEX:		//		//	str <- HEX$(n)		//		#if defined(_PalmOS)		tb = tmp_alloc(64);		StrPrintF(tb, "%lX", (unsigned long) v_getint(arg));		p = tb;		while ( *p == '0' )		p ++;		if	( *p == '\0' )	{			wp = r->ptr = tmp_alloc(2);			wp[0] = '0';			wp[1] = '\0';			}		else	{			r->ptr = tmp_alloc(strlen(p) + 1);			strcpy(r->ptr, p);			}		tmp_free(tb);		#else		r->ptr = tmp_alloc(64);		sprintf(r->ptr, "%lX", (unsigned long) v_getint(arg));		#endif		r->size = strlen(r->ptr)+1;		break;	case	kwLCASE:		//		//	str <- LCASE$(s)		//		v_tostr(arg);		if	( prog_error )	return;		r->ptr = tmp_alloc(strlen(arg->ptr)+1);		strcpy(r->ptr, arg->ptr);		p = r->ptr;		while ( *p )	{			*p = to_lower(*p);			p ++;			}		r->size = arg->size;		break;	case	kwUCASE:		//		//	str <- UCASE$(s)		//		v_tostr(arg);		if	( prog_error )	return;		r->ptr = tmp_alloc(strlen(arg->ptr)+1);		strcpy(r->ptr, arg->ptr);		p = r->ptr;		while ( *p )	{			*p = to_upper(*p);			p ++;			}		r->size = arg->size;		break;	case	kwLTRIM:		//		//	str <- LTRIM$(s)		//		v_tostr(arg);		if	( prog_error )	return;		p = arg->ptr;		while ( *p == ' ' || *p == '\t' )	p ++;		r->ptr = tmp_alloc(strlen(p)+1);		strcpy(r->ptr, p);		r->size = strlen(r->ptr)+1;		break;	case	kwRTRIM:		//		//	str <- RTRIM$(s)		//		v_tostr(arg);		if	( prog_error )	return;		p = arg->ptr;		if	( *p != '\0' )	{	// ndc: 20/2/2001			while ( *p )	p ++;			p--;			while ( p >= (char *) arg->ptr && (*p == ' ' || *p == '\t') )	p --;			p++;			*p = '\0';			}		r->ptr = tmp_alloc(strlen(arg->ptr)+1);		strcpy(r->ptr, arg->ptr);		r->size = strlen(r->ptr)+1;		break;	case	kwCAT:		// we can add color codes		r->ptr = tmp_alloc(8);		strcpy(r->ptr, "");		l = v_getint(arg);		switch ( l )	{		case	0:	// reset			strcpy(r->ptr, "\033[0m");			break;		case	1:	// bold on			strcpy(r->ptr, "\033[1m");			break;		case	2:	// underline on			strcpy(r->ptr, "\033[4m");			break;		case	3:	// reverse on			strcpy(r->ptr, "\033[7m");			break;		case	80:	// select system font		case	81:	case 82: case 83:		case	84:	case 85: case 86:		case	87:	case 88: case 89:			#if defined(_PalmOS)			StrPrintF(r->ptr, "\033[8%dm", l-80);			#else			sprintf(r->ptr, "\033[8%dm", l-80);			#endif			break;		case	90:	// select custom font		case	91:	case 92: case 93:		case	94:	case 95: case 96:		case	97:	case 98: case 99:			if	( os_charset == enc_utf8 )				#if defined(_PalmOS)				StrPrintF(r->ptr, "\033[9%dm", l-90);			#else				sprintf(r->ptr, "\033[9%dm", l-90);			#endif			break;			}		r->size = strlen(r->ptr)+1;		break;	case	kwTAB:		l = v_igetval(arg);		dev_setxy(l * 8, dev_gety());		#if defined(_PalmOS)		r->ptr = tmp_alloc(4);		strcpy(r->ptr, " ");		#else		if	( os_graphics == 0 )	{			r->ptr = tmp_alloc(l+1);			memset(r->ptr, ' ', l);			r->ptr[l] = '\0';			}		else	{			r->ptr = tmp_alloc(4);			strcpy(r->ptr, " ");			}		#endif		r->size = l+1;		break;	case	kwSPACE:		//		//	str <- SPACE$(n)		//		l = v_getint(arg);		wp = r->ptr = tmp_alloc(l+1);		for ( i = 0; i < l; i ++ )			wp[i] = ' ';		wp[l] = '\0';		r->size = strlen(r->ptr)+1;		break;		};}////	str <- FUNC (void)//void	cmd_str0(byte funcCode, var_t *r){	word	ch;	char	tmp[3];	#if defined(_PalmOS)	ULong	dts;	DateTimeType cur_date;	#else	struct tm 	tms;	time_t	  	now;	#endif	if	( prog_error )	return;	switch ( funcCode )	{

⌨️ 快捷键说明

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