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

📄 gstr.c

📁 一个通讯程序源码
💻 C
字号:
/*+-------------------------------------------------------------------------    gstr.c - ecu get string parameter functions	wht@n4hgf.Mt-Park.GA.US  Defined functions:	gstr(param,result,realloc_ok)--------------------------------------------------------------------------*//*+: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 *//*:05-02-1991-03:54-wht@n4hgf-new realloc algorithm *//*: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"extern int proctrace;/*+-------------------------------------------------------------------------    gstr(param,result,realloc_ok) - get a string Examples: set $s0='test ... '+%date+' '+%time+%chr(0x0D)+%chr(0x0A) hexdump $s00000  74 65 73 74 20 2E 2E 2E 20 30 36 2D 30 39 2D 31 | test ... 06-09-1 |0010  39 38 39 20 31 37 3A 31 35 0D 0A                | 989 17:15..      | set $s0='12345678':1-6+'abc' set s0$S00 = '234567abc'if realloc_ok and string too small, realloc result string as necessary--------------------------------------------------------------------------*/intgstr(param,result,realloc_ok)ESD *param;ESD *result;int realloc_ok;{register char param_char;register char *pb;ESD *tesd;ESD *svptr;int cb = 0;int segment_index;int next_is_literal = 0;	/* last char was not a backslash */ulong itmp1;ulong itmp2;ulong itmp3;ulong itmp4;int erc;int param_index_save;int result_remaining;int in_quoted_string = 0;   /* not currently in quoted string */int end_of_parameter = 0;	if(erc = skip_cmd_break(param))		return(erc);	segment_index = 0;				result_remaining = result->maxcb;	/* number we can put into result */	param_index_save = param->index;	if((tesd = esdalloc(ESD_MAXSIZE)) == (ESD *)0)		return(eNoMemory);	pb = tesd->pb;CONCATENATE:	while((param->index < param->cb) && !end_of_parameter)	{		param_char = param->pb[param->index];		if(in_quoted_string)		{			++param->index;			if(next_is_literal)			{				next_is_literal = 0;				switch(param_char)				{					case 'b' : param_char = 0x08; break;					case 'n' : param_char = 0x0A; break;					case 'r' : param_char = 0x0D; break;					case 't' : param_char = 0x09; break;					case '\'': param_char = '\''; break;				}				if((result_remaining-- == 0) &&					(!realloc_ok && (cb == ESD_MAXSIZE)))				{					erc = eBufferTooSmall;					goto RETURN;				}				*(pb + cb++) = param_char;			}			else if(param_char == '\\')				next_is_literal = 1;			else if(param_char == '\'')				in_quoted_string = 0;			else			{				if((result_remaining-- == 0) &&					(!realloc_ok && (cb == ESD_MAXSIZE)))				{					erc = eBufferTooSmall;					goto RETURN;				}				*(pb + cb++) = param_char;			}		}		else /* not in quoted string */		{			param->old_index = param->index;			switch(param_char)			{			case '\'':      /* apostrophe denotes literal text */				++param->index;				in_quoted_string = 1;				break;			case '%':				++param->index;				tesd->cb = cb;				if(erc = feval_str(param,tesd))					goto RETURN;				cb = tesd->cb;				result_remaining = (result->maxcb - cb);				break;			case '$':           /* '$Snn' variable reference? */				/* must be at least two more character */				if(param->index >= param->cb-2)				{					erc = eSyntaxError;					goto RETURN;				}				param->old_index = ++param->index;				if(to_lower(param->pb[param->index++]) != 's' )				{					erc = eIllegalVarType;					goto RETURN;				}				if(erc = get_svptr(param,&svptr,0))					goto RETURN;				if((!realloc_ok && (svptr->cb > (result->maxcb - cb))) ||					(svptr->cb > (ESD_MAXSIZE - cb)))				{					erc = eBufferTooSmall;					goto RETURN;				}				else if(svptr->cb)				{					memcpy(&pb[cb],svptr->pb,svptr->cb);					cb += svptr->cb;					result_remaining -= svptr->cb;				}				break;			case ':':/* * itmp1 holds col 1 (0-n) of substring operation * itmp2 holds col 2 (0-n) of operation adjusted to reflect *       end of string segment * itmp3 holds length of string segment * itmp4 holds length of substring segment output by substring operation*/				if(erc = gcol_range(param,&itmp1,&itmp2))					goto RETURN;				if((itmp3 = cb - segment_index)				    &&					(itmp4 = ((itmp2<itmp3)?itmp2:itmp3) - itmp1 + 1))				{					if(itmp1)						memcpy(&pb[segment_index],							&pb[segment_index+(int)itmp1],(int)itmp4);					cb -= ((int)itmp3 - (int)itmp4);				}				break;			case '+':				segment_index = cb;				++param->index;				goto CONCATENATE;			case ';':			case '#':				end_of_parameter = 1;				break;			default:				erc = 0;				if((param->index < param->cb) &&					isalnum(*(param->pb + param->index)))					erc = eSyntaxError;				else if(param_index_save == param->index)					erc = eBadParameter;				end_of_parameter = 1;				break;			}   /* end of switch (param_char) */		}       /* end of else not in quoted string */	}           /* end of while(index<cb) */RETURN:	if(result_remaining < 0)	{		if(!realloc_ok)			erc = eBufferTooSmall;		else		{			int new_size = (cb + 128) & (~127);	/* speed + anti-fragment */			if(new_size > ESD_MAXSIZE)				new_size = ESD_MAXSIZE;			if(new_size < cb)				erc = eBufferTooSmall;			else				erc = esdrealloc(result,new_size);		}		if(erc)			return(erc);	}	if(cb)		memcpy(result->pb,pb,cb);	result->cb = cb;	esd_null_terminate(result);	esdfree(tesd);	return(erc);}   /* end of gqstr *//* vi: set tabstop=4 shiftwidth=4: *//* end of qstr.c */

⌨️ 快捷键说明

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