blib_func.c

来自「smallbasic for linux」· C语言 代码 · 共 1,181 行 · 第 1/2 页

C
1,181
字号
	case kwINKEY:		//		// str <- INKEY$		//		if	( dev_kbhit() )	{			ch = dev_getch();	// MultiByte - dev_getchr() must return the extended code (2 bytes char)			if	( (ch & 0xFF00) == 0xFF00 )	{	// extra code - hardware keys				tmp[0] = '\033';				tmp[1] = ch & 0xFF;				tmp[2] = '\0';				}			else	{				switch ( os_charset )	{				case	enc_sjis:				// Japan					if	( IsJISFont(ch) )	{						tmp[0] = ch >> 8;						tmp[1] = ch & 0xFF;						tmp[2] = '\0';						}					else	{						tmp[0] = ch;						tmp[1] = '\0';						}					break;				case	enc_big5:				// China					if	( IsBig5Font(ch) )	{						tmp[0] = ch >> 8;						tmp[1] = ch & 0xFF;						tmp[2] = '\0';						}					else	{						tmp[0] = ch;						tmp[1] = '\0';						}					break;				case	enc_gmb:				// Generic multibyte					if	( IsGMBFont(ch) )	{						tmp[0] = ch >> 8;						tmp[1] = ch & 0xFF;						tmp[2] = '\0';						}					else	{						tmp[0] = ch;						tmp[1] = '\0';						}					break;				case	enc_unicode: 			// Unicode					tmp[0] = ch >> 8;					tmp[1] = ch & 0xFF;					tmp[2] = '\0';					break;				default:						// Europe 8bit					tmp[0] = ch;					tmp[1] = '\0';					};				}			v_createstr(r, tmp);			}		else			v_createstr(r, "");		break;	case kwDATE:		//		//	str <- DATE$		//		#if defined(_PalmOS)		dts = TimGetSeconds();		TimSecondsToDateTime(dts, &cur_date);		r->type = V_STR;		r->ptr = tmp_alloc(32);		r->size = 32;		StrPrintF(r->ptr, "%02d/%02d/%04d", cur_date.day, cur_date.month, cur_date.year);		#else		time(&now);		tms = *localtime(&now);		r->type = V_STR;		r->ptr = tmp_alloc(32);		r->size = 32;		sprintf(r->ptr, "%02d/%02d/%04d", tms.tm_mday, tms.tm_mon+1, tms.tm_year+1900);		#endif		break;	case kwTIME:		//		//	str <- TIME$		//		#if defined(_PalmOS)		dts = TimGetSeconds();		TimSecondsToDateTime(dts, &cur_date);		r->type = V_STR;		r->ptr = tmp_alloc(32);		r->size = 32;		StrPrintF(r->ptr, "%02d:%02d:%02d", cur_date.hour, cur_date.minute, cur_date.second);		#else		time(&now);		tms = *localtime(&now);		r->type = V_STR;		r->ptr = tmp_alloc(32);		r->size = 32;		sprintf(r->ptr, "%02d:%02d:%02d", tms.tm_hour, tms.tm_min, tms.tm_sec);		#endif		break;		}}////	str <- FUNC (...)//void	cmd_strN(byte funcCode, var_t *r){	var_t	arg1, arg2, arg3;	int		i, count, lsrc, len, start;	char	tmp[2], *tmp_p;	v_init(&arg1);	v_init(&arg2);	v_init(&arg3);	if	( prog_error )	return;	switch ( funcCode )	{	case kwSTRING:		//		// str <- STRING$ ( int, int | str )		//		count = par_getint();		if	( !prog_error )	{			par_getcomma();			if	( !prog_error )	{				par_getvar(&arg2);				if	( !prog_error )	{					if	( arg2.type == V_STR )	{						len = strlen(arg2.ptr);						tmp_p = arg2.ptr;						}					else	{						tmp[0] = v_getint(&arg2);						tmp[1] = '\0';						tmp_p = tmp;						len = 1;						}					if	( len == 0 || count == 0 )	{						rt_raise("STRING$(): argument error");						r->type = V_INT;	// dont try to free						}					else	{						r->ptr = tmp_alloc(count*len+1);					   *((char *)(r->ptr)) = '\0';						for ( i = 0; i < count; i ++ )								strcat(r->ptr, tmp_p);						r->size = strlen(r->ptr)+1;						}					}				}			}		break;	case kwLEFT:		//		// str <- LEFT$ ( str, int )		//		par_getstr(&arg1);		if	( !prog_error )	{			par_getcomma();			if	( !prog_error )	{				count = par_getint();				if	( !prog_error )	{					len = strlen(arg1.ptr);					if	( count > len )						count = len;					r->ptr = tmp_alloc(count+1);					memcpy(r->ptr, arg1.ptr, count);					r->ptr[count] = '\0';					r->size = strlen(r->ptr)+1;					}				}			}		break;	case kwRIGHT:		//		//	str <- RIGHT$ ( str, int )		//		par_getstr(&arg1);		if	( !prog_error )	{			par_getcomma();			if	( !prog_error )	{				count = par_getint();				if	( !prog_error )	{					len = strlen(arg1.ptr);					if	( count > len )						count = len;					r->ptr = tmp_alloc(count+1);					memcpy(r->ptr, arg1.ptr+(len-count), count+1);					r->size = strlen(r->ptr)+1;					}				}			}		break;	case kwMID:		//		//	str <- MID$ ( str, start [, len] )		//		par_getstr(&arg1);		if	( !prog_error )	{			par_getcomma();			if	( !prog_error )	{				start = par_getint();		// start				if	( !prog_error )	{					// len					if	( code_peek() == kwTYPE_SEP )	{						par_getcomma();						if ( !prog_error )							len = par_getint();		// len						}					else						len = -1;					if	( !prog_error )	{						lsrc = strlen(arg1.ptr);						if	( start <= 0 || start > strlen(arg1.ptr) )							rt_raise("MID$(): 'START' OUT OF RANGE");						else	{							start --;							if	( len == -1 || len + start >= lsrc )								len = lsrc - start;							r->ptr = tmp_alloc(len+1);							memcpy(r->ptr, arg1.ptr+start, len);							r->ptr[len] = '\0';							r->size = len+1;							}						} 					} //				} 			}		break;		}	v_free(&arg1);	v_free(&arg2);	v_free(&arg3);}////	int <- FUNC (...)//void	cmd_intN(byte funcCode, var_t *r){	var_t	arg1, arg2;	int		l;	char	*p;	var_t	*var_p;	r->type = V_INT;	if	( prog_error )	return;	switch ( funcCode )	{	case kwINSTR:		//		//	int <- INSTR ( [start,] str1, str2 )		//		eval(&arg1);		if	( prog_error )	return;		if	( arg1.type != V_STR )	{			v_getint(&arg1);				par_getcomma();		if ( prog_error )	return;			eval(&arg1);			if	( arg1.type != V_STR )		{				err_typemismatch();				return;				}			}		par_getcomma();		if ( prog_error )	return;		eval(&arg2);		if	( prog_error )	return;		if	( arg2.type != V_STR )	{			err_typemismatch();			return;			}		///		l = strlen(arg2.ptr);		p = arg1.ptr;		r->i = 0;		while ( *p )	{			if	( StrNCaselessCompare(p, arg2.ptr, l) == 0 )	{				r->i = (p - (char*) arg1.ptr) + 1;				break;				}			p ++;			}		tmp_free(arg1.ptr);		tmp_free(arg2.ptr);		break;	case kwLBOUND:		//		//	int <- LBOUND(array [, dim])		//		if	( code_peek() == kwTYPE_VAR )	{			code_skipnext();			var_p = tvar[code_getnext16()];			if	( var_p->type == V_ARRAY )	{				l = 1;				if	( code_peek() == kwTYPE_SEP )	{					par_getcomma();					if	( !prog_error )	{						eval(&arg1);						if	( !prog_error )								l = v_getint(&arg1);						v_free(&arg1);						}					}				if	( !prog_error )	{					l --;					if	( l >= 0 && l < var_p->maxdim )						r->i = var_p->lbound[l];					else						rt_raise("LBOUND: Array of %d dimensions (%d)", var_p->maxdim, l);					}				}			else				rt_raise("LBOUND: Variable is not an array");			}		else			err_typemismatch();		break;	case kwUBOUND:		//		//	int <- UBOUND(array [, dim])		//		if	( code_peek() == kwTYPE_VAR )	{			code_skipnext();			var_p = tvar[code_getnext16()];			if	( var_p->type == V_ARRAY )	{				l = 1;				if	( code_peek() == kwTYPE_SEP )	{					par_getcomma();					if	( !prog_error )	{						eval(&arg1);						if	( !prog_error )								l = v_getint(&arg1);						v_free(&arg1);						}					}				if	( !prog_error )	{					l --;					if	( l >= 0 && l < var_p->maxdim )						r->i = var_p->ubound[l];					else	 						rt_raise("UBOUND: Array of %d dimensions", var_p->maxdim);					}				}			else				rt_raise("UBOUND: Variable is not an array");			}		else			err_typemismatch();		break;		}}////	fp <- FUNC (...)//void	cmd_numN(byte funcCode, var_t *r){	double	x, y, m;	int		pw;	r->type = V_NUM;	if	( prog_error )	return;	switch ( funcCode )	{	case kwATAN2:		// fp <- ATAN2(x,y)		x = par_getnum();		if	( !prog_error )	{			par_getcomma();			if	( !prog_error ) {				y = par_getnum();				r->n = atan2(x,y);				}			}		break;	case kwPOW:		// fp <- POW(x,y)		x = par_getnum();		if	( !prog_error )	{			par_getcomma();			if	( !prog_error ) {				y = par_getnum();				r->n = pow(x,y);				}			}		break;	case kwROUND:		// fp <- ROUND(x [,decs])		x = par_getnum();		if	( !prog_error )	{			if	( code_peek() == kwTYPE_SEP )	{				par_getcomma();				if	( !prog_error )					pw = par_getint();				}			else 				pw = 0;			if	( !prog_error )	{				// round				m = pow(10.0, pw);				m = floor(m);				r->n = floor((x * m) + .5) / m;				}			}		break;		}}////	any <- FUNC (...)//void	cmd_genfunc(byte funcCode, var_t *r){	byte	code, ready, first;	int		count, handle, i, len, ch;	var_t	*basevar_p, *elem_p;	var_t	arg;	char	tmp[3];	if	( prog_error )	return;	switch ( funcCode )	{	// STR <- INPUT$(len [, file])	case	kwINPUTSEP:		v_init(r);		count = par_getint();		if	( prog_error )	return;		if	( code_peek() == kwTYPE_SEP )	{			par_getcomma();			if	( prog_error )	return;			handle = par_getint();			if	( prog_error )	return;			}		else			handle = -1;		if	( handle == -1 )	{			// keyboard			r->type = V_STR;			r->ptr = tmp_alloc((count<<1)+1);			r->ptr[0] = '\0';			len = 0;			for ( i = 0; i < count; i ++ )	{				if	( dev_kbhit() )	{					ch = dev_getch();	// MultiByte - dev_getchr() must return the extended code (2 bytes char)					if	( (ch & 0xFF00) == 0xFF00 )	{	// extra code - hardware keys						tmp[0] = '\033';						tmp[1] = ch & 0xFF;						tmp[2] = '\0';						len += 2;						}					else if ( ch & 0xFF00 )	{		// multibyte languages						tmp[0] = ch >> 8;						tmp[1] = ch & 0xFF;						tmp[2] = '\0';						len += 2;						}					else	{						// simple 8-bit character						tmp[0] = ch;						tmp[1] = '\0';						len ++;						}					}				strcat(r->ptr, tmp);				}			r->size = len+1;			r->ptr[len] = '\0';			}		else	{			// file			r->type = V_STR;			r->ptr = tmp_alloc(count+1);			r->size = count+1;			dev_fread(handle, r->ptr, count);			r->ptr[count] = '\0';			}		break;	// ? <- MAX(...)	case	kwMAX:	case	kwMIN:		v_init(r);		ready = 0;		first = 1;		do	{			code = code_peek();			switch ( code )	{			case	kwTYPE_SEP:	// separator 				code_skipnext16();				break;			case	kwTYPE_LEVEL_END:	// ) -- end of parameters				ready = 1;				break;			case	kwTYPE_VAR:		// variable				if	( code_isnullarray() )	{	// this parameter is an array i.e. MAX(v())					code_skipnext();					basevar_p = tvar[code_getnext16()];	// array var_t pointer					count = basevar_p->size;				// the number of the elements					for ( i = 0; i < count; i ++ )	{							elem_p = v_getelemptr(basevar_p, i);						if	( !prog_error )	{							if	( first )	{	// the first element								v_set(r, elem_p);								first = 0;								}							else	{								if	( funcCode == kwMAX )	{									if	( v_compare(r, elem_p) < 0 )										v_set(r, elem_p);									}								else if	( funcCode == kwMIN )	{									if	( v_compare(r, elem_p) > 0 )										v_set(r, elem_p);									}								}							}						else							return;						}					break;					}			default:				// default --- expression				eval(&arg);				if	( !prog_error )	{					if	( first )	{		// the first element i.e. MAX(1) = 1						v_set(r, &arg);						first = 0;						}					else	{						if	( funcCode == kwMAX )	{							if	( v_compare(r, &arg) < 0 )								v_set(r, &arg);							}						else if	( funcCode == kwMIN )	{							if	( v_compare(r, &arg) > 0 )								v_set(r, &arg);							}						}					}				else					return;				v_free(&arg);				}			//			} while ( !ready );		break;		};}

⌨️ 快捷键说明

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