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

📄 proc.c

📁 一个通讯程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*+-------------------------------------------------------------------------	proc.c - procedure command and control	wht@n4hgf.Mt-Park.GA.US  Defined functions:	_cmd_gosub_common(param,type)	_get_goto_label(param)	do_proc(argc,argv)	dump_proc(pcb)	execute_esd(tesd)	execute_goto(pcb,goto_type)	execute_labelled_esd(tesd)	execute_proc(pcb,use_goto_label)	find_labelled_lcb(label,first,last)	find_proc_cmd(cmd_list,cmd)	find_procedure(name)	free_lcb_chain(lcb)	pcmd_do(param)	pcmd_gosub(param)	pcmd_gosubb(param)	pcmd_goto(param)	pcmd_gotob(param)	pcmd_return(param)	pcmd_upon(param)	proc_dcdloss_handler(pcb)	show_error_position(pcb)	trace_proc_cmd(pcb)--------------------------------------------------------------------------*//*+:EDITS:*//*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 *//*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA *//*:11-16-1991-15:39-wht@n4hgf2-add pcmd_upon stub *//*:11-16-1991-14:53-wht@n4hgf2-add proc_dcdloss_handler *//*:11-16-1991-14:01-wht@n4hgf-calloc pcb instead of malloc *//*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 *//*:07-01-1991-01:53-wht@n4hgf-fix return with value *//*:05-01-1991-04:18-wht@n4hgf-new find_procedure failed on home subdir match *//*:04-30-1991-03:19-root@n4hgf-add search for .ep in ecu lib ep subdir *//*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */#include "ecu.h"#include "ecuerror.h"#include "ecukey.h"#include "esd.h"#include "var.h"#include "proc.h"#define NEED_P_CMD#include "ecucmd.h"PCB *pcb_stack[PROC_STACK_MAX];int proc_level = 0;int proctrace = 0;char goto_label[64];/*+-------------------------------------------------------------------------	_get_goto_label(param)--------------------------------------------------------------------------*/int_get_goto_label(param)ESD *param;{	register erc;	register ESD *label_esd;	goto_label[0] = 0;	if(erc = get_alphanum_zstr(param,goto_label,sizeof(goto_label)))	{		if((label_esd = esdalloc(64)) == (ESD *)0)			return(eNoMemory);		if(!(erc = gstr(param,label_esd,0)))			strcpy(goto_label,label_esd->pb);		esdfree(label_esd);	}	return(erc);}	/* end of _get_goto_label *//*+-------------------------------------------------------------------------	pcmd_goto(param)--------------------------------------------------------------------------*/intpcmd_goto(param)ESD *param;{	if(!proc_level)		return(eNotExecutingProc);	if(_get_goto_label(param))		return(eInvalidLabel);	return(eProcAttn_GOTO);}	/* end of pcmd_goto *//*+-------------------------------------------------------------------------	pcmd_gotob(param)--------------------------------------------------------------------------*/intpcmd_gotob(param)ESD *param;{	if(!proc_level)		return(eNotExecutingProc);	if(_get_goto_label(param))		return(eInvalidLabel);	return(eProcAttn_GOTOB);}	/* end of pcmd_gotob *//*+-------------------------------------------------------------------------	_cmd_gosub_common(param,type)--------------------------------------------------------------------------*/int_cmd_gosub_common(param,type)ESD *param;int type;{	int erc;	LCB *current_save;	int index_save;	if(_get_goto_label(param))		return(eInvalidLabel);	current_save = pcb_stack[proc_level - 1]->current;	index_save = current_save->text->index;	if(!(erc = execute_proc(pcb_stack[proc_level - 1],type)))	{		pcb_stack[proc_level - 1]->current = current_save;		current_save->text->index = index_save;	}	return(erc);}	/* end of _cmd_gosub_common *//*+-------------------------------------------------------------------------	pcmd_gosub(param)--------------------------------------------------------------------------*/intpcmd_gosub(param)ESD *param;{	if(!proc_level)		return(eNotExecutingProc);	return(_cmd_gosub_common(param,eProcAttn_GOTO));}	/* end of pcmd_gosub *//*+-------------------------------------------------------------------------	pcmd_return(param)--------------------------------------------------------------------------*/intpcmd_upon(param)ESD *param;{	pprintf("'upon' not implimented\n");	param->index = param->cb;	return(0);}	/* end of pcmd_return *//*+-------------------------------------------------------------------------	pcmd_gosubb(param)--------------------------------------------------------------------------*/intpcmd_gosubb(param)ESD *param;{	if(!proc_level)		return(eNotExecutingProc);	return(_cmd_gosub_common(param,eProcAttn_GOTO));}	/* end of pcmd_gosubb *//*+-------------------------------------------------------------------------	pcmd_return(param)--------------------------------------------------------------------------*/intpcmd_return(param)ESD *param;{	long value = 0;	if(!gint(param,&value))	{		if((value < 0) || (value > 255))			value = 255;		if(proctrace)			pprintf("return value %ld\n",value);		if(value)			value += e_USER;		return((int)value);	}	return(eProcAttn_RETURN);}	/* end of pcmd_return *//*+-------------------------------------------------------------------------	find_labelled_lcb(label,first,last)search for match between label--------------------------------------------------------------------------*/LCB *find_labelled_lcb(label,first,last)char *label;register LCB *first;LCB *last;{	register llen = strlen(label);	ESD *text;	while(first)	{		text = first->text;		if((text->cb >= llen) && (!strncmp(text->pb,label,llen))			&& (!text->pb[llen] || isspace(text->pb[llen])))			return(first);		if(first == last)			return((LCB *)0);		first = first->next;	}	pputs("find_labelled_lab logic error\n");	return((LCB *)0);}	/* end of find_labelled_lcb *//*+-------------------------------------------------------------------------	execute_goto(pcb,goto_type)--------------------------------------------------------------------------*/execute_goto(pcb,goto_type)PCB *pcb;int goto_type;{	LCB *next = (LCB *)0;	/* next lcb to execute */	switch(goto_type)	{		case eProcAttn_GOTO:			if(!(next = find_labelled_lcb(goto_label,pcb->current,pcb->last)))				next = find_labelled_lcb(goto_label,pcb->first,pcb->current);			break;		case eProcAttn_GOTOB:			if(!(next = find_labelled_lcb(goto_label,pcb->first,pcb->current)))				next = find_labelled_lcb(goto_label,pcb->current,pcb->last);			break;	}	if(next)	{		pcb->current = next;		return(0);	}	pprintf("goto/gosub label not found: %s\n",goto_label);	return(eFATAL_ALREADY);}	/* end of execute_goto *//*+-------------------------------------------------------------------------	show_error_position(pcb)cursor MUST be at left margin when this is called--------------------------------------------------------------------------*/voidshow_error_position(pcb)PCB *pcb;{	ESD *tesd = pcb->current->text;	register itmp = tesd->old_index;	char tag[64];	sprintf(tag,"%s %u> ",pcb->argv[0],pcb->current->lineno);	pputs(tag);	pputs(tesd->pb);	pputs("\n");	itmp = strlen(tag) + tesd->old_index;	while(itmp--)		pputc(' ');	pputs("^\n");}	/* end of show_error_position *//*+-------------------------------------------------------------------------	find_proc_cmd(cmd_list,cmd)--------------------------------------------------------------------------*/P_CMD *find_proc_cmd(cmd_list,cmd)register P_CMD *cmd_list;register char *cmd;{	while(cmd_list->token != -1)	{		if(!strcmp(cmd_list->cmd,cmd))			break;		cmd_list++;	}	return((cmd_list->token == -1) ? (P_CMD *)0 : cmd_list);}	/* end of find_proc_cmd *//*+-------------------------------------------------------------------------	execute_esd(tesd)--------------------------------------------------------------------------*/intexecute_esd(tesd)ESD *tesd;{	int erc;	P_CMD *pcmd;	static P_CMD *set_pcmd = (P_CMD *)0;	/* quick access to 'set' */	char cmd[32];	extern int proc_interrupt;	/* if interrupt, exit */	if(sigint | proc_interrupt)		return(eCONINT);	/* if blank, skip it */	if(skip_cmd_break(tesd))		return(0);	/* if comment, skip it */	if(!skip_cmd_char(tesd,'#'))		return(0);	if(*(tesd->pb + tesd->index) == '{')	{		pputs("invalid '{'\n");		return(eFATAL_ALREADY);	}	while(1)	{		/* get command -- allow leading '$' to assume 'set' command */		if(*(tesd->pb + tesd->index) == '$')		{			/* find 'set' in the list -- save for rapid access later */			if(set_pcmd)				pcmd = set_pcmd;			else if((pcmd = find_proc_cmd(icmd_cmds,"set")) == (P_CMD *)0)				return(eInternalLogicError);			else				set_pcmd = pcmd;		}		else		{			if(get_alphanum_zstr(tesd,cmd,sizeof(cmd)))				return(eIllegalCommand);			/* find it in the list */			if((pcmd = find_proc_cmd(icmd_cmds,cmd)) == (P_CMD *)0)				return(eIllegalCommand);		}		/* check to see if this command available for procedure */		if(!pcmd->proc)			return(eInteractiveCmd);		/* execute the command */		if(erc = (*pcmd->proc)(tesd))			return(erc);		/* look for comment */		if(!skip_cmd_char(tesd,'#'))			break;		/* look for multiple commands on line */		if(skip_cmd_char(tesd,';'))			break;		/* if blank after ';', skip it */		if(skip_cmd_break(tesd))			break;	}	return(0);		}	/* end of execute_esd *//*+-------------------------------------------------------------------------	execute_labelled_esd(tesd)--------------------------------------------------------------------------*/execute_labelled_esd(tesd)ESD *tesd;{	register index = 0;	register cb = tesd->cb;	register char *pb = tesd->pb;/* reset indices */	tesd->index = index;	tesd->old_index = index;/* if comment, skip it */	if(!skip_cmd_char(tesd,'#'))		return(0);/* skip over any label */	while(!isspace(*(pb + index)) && (index < cb))		index++;	tesd->index = index;	tesd->old_index = index;	return(execute_esd(tesd));}	/* end of execute_labelled_esd *//*+-------------------------------------------------------------------------	dump_proc(pcb)--------------------------------------------------------------------------*/#if 0voiddump_proc(pcb)PCB *pcb;{	int itmp;	LCB *lcb;	pprintf("------ pcb @ 0x%08lx -----------------\n",pcb);	pprintf("argc=%d first=0x%08lx last=0x%08lx\n",pcb->argc,		pcb->first,pcb->last);	for(itmp = 0; itmp < pcb->argc; itmp++)	{		pprintf("argv(%d) @ 0x%lx: '%s'\n",itmp,pcb->argv[itmp],			pcb->argv[itmp]);	}	pputs("\n");	lcb = pcb->first;	while(lcb)	{		pprintf("lcb @ 0x%08lx   lineno=%u\n",lcb,lcb->lineno);		pputs("\n");		lcb = lcb->next;	}	pflush();}	/* end of dump_proc */#endif/*+-------------------------------------------------------------------------	trace_proc_cmd(pcb) - if asked, show command--------------------------------------------------------------------------*/voidtrace_proc_cmd(pcb)

⌨️ 快捷键说明

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