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

📄 gint.c

📁 一个通讯程序源码
💻 C
字号:
/*+-------------------------------------------------------------------------    gint.c - ecu get integer parameter functions	wht@n4hgf.Mt-Park.GA.US  Defined functions:	gcol_range(param,col1,col2)	gint(param,int_returned)	gint_base(param,value)	gint_constant(param,value)	gintop(param,intop)--------------------------------------------------------------------------*//*+:EDITS:*//*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 *//*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA *//*:07-25-1991-12:58-wht@n4hgf-ECU release 3.10 *//*:01-31-1991-16:50-wht@n4hgf-reinstate octal with 0o prefix *//*:01-09-1991-22:31-wht@n4hgf-ISC port *//*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */#include "ecu.h"#include "ecuerror.h"#include "esd.h"#include "var.h"#define OP_ADD      1#define OP_SUB      2#define OP_MUL      3#define OP_DIV      4#define OP_XOR      5#define OP_MOD      6#define OP_OR       7#define OP_AND      8#define BASE_DEC	1#define BASE_OCT	2#define BASE_HEX  	3/*+-------------------------------------------------------------------------    gint_constant(param,int_returned) - evaluate integer constant--------------------------------------------------------------------------*/intgint_constant(param,value)ESD *param;long *value;{register itmp;int base = BASE_DEC;int erc;long new_value;	if(erc = skip_cmd_break(param))		return(erc);	esd_null_terminate(param);/* get integer from string */	if((!strncmp(param->pb + param->index,"0x",2)) ||		(!strncmp(param->pb + param->index,"0X",2)))	{		base = BASE_HEX;		param->index += 2;	}	else if((!strncmp(param->pb + param->index,"0o",2)) ||		(!strncmp(param->pb + param->index,"0O",2)))	{		base = BASE_OCT;		param->index += 2;	}	param->old_index = param->index;	switch(base)	{		case BASE_HEX:			sscanf(param->pb + param->index,"%lx",&new_value);			itmp = param->index + strspn(param->pb + param->index,				"0123456789ABCDEFabcdef");			erc = eInvalidHexNumber;			break;		case BASE_DEC:			sscanf(param->pb + param->index,"%ld",&new_value);			itmp = param->index + strspn(param->pb + param->index,"0123456789");			erc = eInvalidDecNumber;			break;		case BASE_OCT:			sscanf(param->pb + param->index,"%lo",&new_value);			itmp = param->index + strspn(param->pb + param->index,"01234567");			erc = eInvalidOctNumber;			break;		default:			return(eInternalLogicError);	}	param->index = itmp;	if(isalnum(*(param->pb + itmp)))		param->old_index = itmp;	if(param->old_index != param->index)	{		*value = new_value;		return(0);	}	return(erc);}   /* end of gint_constant *//*+-------------------------------------------------------------------------    gint_base(param,value) - evaluate integer constant, variable or function--------------------------------------------------------------------------*/intgint_base(param,value)ESD *param;long *value;{register erc;long *varptr;	if(erc = skip_cmd_break(param))		return(erc);	switch(param->pb[param->index])		/* look at first character */	{		case '$':		/* '$i...' variable reference? */			if(param->index >= param->cb-2)				return(eSyntaxError);			param->old_index = ++param->index;			if(to_lower(param->pb[param->index++]) != 'i')				return(eIllegalVarType);			if(erc = get_ivptr(param,&varptr,0))				return(erc);			*value = *varptr;				return(0);		case '%':		/* '%...' function reference? */			param->index++;			if(erc = feval_int(param,value))				return(erc);			return(0);		default:			break;	}   /* end of switch statement *//* we did not catch any special cases with the switch statement mustbe numeric integer */	return(gint_constant(param,value));}   /* end of gint_base() *//*+-------------------------------------------------------------------------    gintop(param,intop) - evaluate integer operator--------------------------------------------------------------------------*/intgintop(param,intop)ESD *param;int *intop;{	register erc;	if(erc = skip_cmd_break(param))		return(erc);	switch(param->pb[param->index])	{		case '+':			param->index++;			*intop = OP_ADD;			break;		case '-':			param->index++;			*intop = OP_SUB;			break;		case '*':			param->index++;			*intop = OP_MUL;			break;		case '/':			param->index++;			*intop = OP_DIV;			break;		case '|':			if(*(param->pb + param->index + 1) == '|')				return(eInvalidIntOp);			param->index++;			*intop = OP_OR;			break;		case '@':			param->index++;			*intop = OP_MOD;			break;		case '^':			param->index++;			*intop = OP_XOR;			break;		case '&':			if(*(param->pb + param->index + 1) == '&')				return(eInvalidIntOp);			param->index++;			*intop = OP_AND;			break;		default:			return(eInvalidIntOp);	}   /* end of switch statement */	return(0);}   /* end of gintop() *//*+-------------------------------------------------------------------------    gint(param,int_returned) - evaluate integer expression--------------------------------------------------------------------------*/intgint(param,int_returned)ESD *param;long *int_returned;{register erc;long int1;long int_accum = 0;int intop;int unary_minus = 0;	if(erc = skip_cmd_break(param))		return(erc);	if(param->pb[param->index] == '-')		unary_minus++,param->index++;	if(erc = gint_base(param,&int1))		return(erc);	int_accum = (unary_minus) ? -int1 : int1;	while((erc = gintop(param,&intop)) == 0)	{		if(erc = gint_base(param,&int1))			return(erc);		switch(intop)		{			case OP_ADD:				int_accum += int1;				break;			case OP_SUB:				int_accum -= int1;				break;			case OP_MUL:				int_accum *= int1;				break;			case OP_DIV:				int_accum /= int1;				break;			case OP_MOD:				int_accum %= int1;				break;			case OP_XOR:				int_accum ^= (unsigned)int1;				break;			case OP_AND:				int_accum &= (unsigned)int1;				break;			case OP_OR:				int_accum |= (unsigned)int1;				break;			default:				return(eInvalidIntOp);		}	}	param->index = param->old_index;	*int_returned = int_accum;	return(0);}   /* end of gint() *//*+-------------------------------------------------------------------------    col_range(param,col1,col2) - get a column range:$i0[-$i1]argument may be integer constant, function or variable, but not expression--------------------------------------------------------------------------*/intgcol_range(param,col1,col2)ESD *param;ulong *col1;ulong *col2;{	register erc;	if(skip_cmd_char(param,':') == 0)	{		if(erc = gint_base(param,col1))			return(erc);		if(skip_cmd_char(param,'-') == 0)     /* if hyphen found, range */		{			if(erc = gint_base(param,col2))				return(erc);		}		else			*col2 = *col1;		/* otherwise, first and last columns same */		if(*col1 > *col2)		{			pputs("Invalid column range: column 1 greater than column 2\n");			return(eFATAL_ALREADY);		}	}	else		erc = eBadParameter;	return(erc);}   /* end of gcol_range() *//* vi: set tabstop=4 shiftwidth=4: *//* end of gint.c */

⌨️ 快捷键说明

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