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

📄 pcmd.c

📁 一个通讯程序源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	{		strcpy(shm->Lrname,rname->pb);		if(proctrace)			pprintf("rname set to '%s'\n",rname->pb);	}	esdfree(rname);	return(erc);}	/* end of pcmd_rname *//*+-------------------------------------------------------------------------	pcmd_send(param)send [-n] <str>-n do not send trailing CR-v turn on proctrace for just this statement-p## pace characters ## msec apart--------------------------------------------------------------------------*/intpcmd_send(param)ESD *param;{int erc;char *cptr;ESD *buf;char switches[32];int send_cr;int tell_it;long pace_msec = 0L;	if(shm->Liofd < 0)		return(eNoLineAttached);	if((buf = esdalloc(256)) == (ESD *)0)		return(eNoMemory);	get_switches(param,switches,sizeof(switches));	send_cr = !strchr(switches,'n');	tell_it = !!strchr(switches,'v');	if(cptr = strchr(switches,'p'))		sscanf(cptr + 1,"%ld",&pace_msec);	if(erc = gstr(param,buf,1))	{		esdfree(buf);		return(erc);	}	if(proctrace || tell_it)	{		hex_dump(buf->pb,buf->cb,			(send_cr) ? "send with CR" : "send w/o CR",1);	}	if(pace_msec)		lputs_paced(pace_msec,buf->pb);	else		lputs(buf->pb);	if(send_cr)		lputc(CRET);	if(pace_msec)		Nap(pace_msec);	esdfree(buf);	return(erc);}	/* end of pcmd_send *//*+-------------------------------------------------------------------------	pcmd_set(param)--------------------------------------------------------------------------*/intpcmd_set(param)ESD *param;{int erc;int itmp;ulong varnum;uint varmax;char vartype;char varstr[16];int show_status;long *ivptr;ESD *svptr;char *cptr;char *make_char_graphic();	if(erc = skip_cmd_break(param))		return(erc);	do {		/* $ is optional */		if((erc = skip_cmd_char(param,'$')) && (erc != eSyntaxError))			return(erc);		/* get variable type */		if(get_cmd_char(param,&vartype))			return(eSyntaxError);		/* validate variable type */		vartype = to_lower(vartype);		switch(vartype)		{			case 'i':				varmax = IVQUAN;				break;			case 's':				varmax = SVQUAN;				break;			default:				return(eIllegalVarType);		}		if(!get_numeric_value(param,&varnum))			goto TEST_VARNUM;		else if(*(param->pb + param->index) == '[')		{			if(erc = get_subscript(param,&varnum))				return(erc);TEST_VARNUM:			if((int)varnum >= varmax)				return(eIllegalVarNumber);			switch(vartype)			{				case 'i':					ivptr = &iv[(int)varnum];					break;				default:					svptr = sv[(int)varnum];			}		}		else if(get_alphanum_zstr(param,varstr,sizeof(varstr)))			return(eInvalidVarName);		else		{			varnum = NAMED_VARIABLE_FLAG;			switch(vartype)			{				case 'i':					erc = find_mkvi(varstr,&ivptr,1);					break;				default:					erc = find_mkvs(varstr,&svptr,1);			}			if(erc)				return(erc);		}					show_status = 1;		if(!skip_cmd_char(param,'='))	/* assignment */		{			switch(vartype)			{				case 'i':					if(erc = gint(param,ivptr))						return(erc);					break;				default:					if(erc = gstr(param,svptr,1))						return(erc);					break;			}			if(!proctrace)				show_status = 0;		}		if(show_status)		{			switch(vartype)			{				case 'i':					if(varnum != NAMED_VARIABLE_FLAG)						pprintf("$i%02ld = %7ld (0x%08lx,0%03lo",varnum,							*ivptr,*ivptr,*ivptr);					else						pprintf("$i%s = %ld (0x%08lx,0%03lo",varstr,							*ivptr,*ivptr,*ivptr);					if((*ivptr >= 0) && (*ivptr <= 255))						pprintf(",'%s'",make_char_graphic((char)*ivptr,1));					pputs(")\n");					break;				default:					if(varnum != NAMED_VARIABLE_FLAG)						pprintf("$s%02ld = '",varnum);					else						pprintf("$s%s = '",varstr);					itmp = svptr->cb;					cptr = svptr->pb;					while(itmp--)						pputs(make_char_graphic(*cptr++,0));					pputs("'\n");					break;			}		}	} while(!skip_comma(param));	if(!end_of_cmd(param))		return(eSyntaxError);	return(0);}	/* end of pcmd_set *//*+-------------------------------------------------------------------------	pcmd_system(param)system [-l] 'cmd'-l makes comm line stdin/stdout-s keeps all fds the samereturns $i0 set to exit status of program or 0x100 if interrupted--------------------------------------------------------------------------*/intpcmd_system(param)ESD *param;{int erc;ESD *cmd;extern int last_child_wait_status;char switches[8];	if((cmd = esdalloc(256)) == (ESD *)0)		return(eNoMemory);	get_switches(param,switches,sizeof(switches));/* a hack */	*cmd->pb++ = (strchr(switches,'s')) ? '>' : 		((strchr(switches,'l')) ? '$' : '!');	cmd->maxcb--;	if(erc = gstr(param,cmd,1))	{		cmd->pb--;		/* be nice */		cmd->maxcb++;	/* or surely this will haunt us one day */		esdfree(cmd);		return(erc);	}/* rehack */	cmd->pb--;	cmd->cb++;	cmd->maxcb++;	if(proctrace)	{		pputs(cmd->pb + 1);		pputs("\n");	}	last_child_wait_status = 0xFF00;	shell(cmd->pb);	iv[0] = (last_child_wait_status & 0xFF)			? 0x100L : (long)last_child_wait_status >> 8;	if(proctrace)		pprintf("$i0 = %ld, (%s)\n",iv[0],			(iv[0] == 0x100L) ? "interrupted" : "program exit status");	esdfree(cmd);	return(0);}	/* end of pcmd_system *//*+-------------------------------------------------------------------------	get_big_endian_16(ptr)--------------------------------------------------------------------------*/ushortget_big_endian_16(ptr)register uchar *ptr;{register ushort uint16 = ((ushort)ptr[0] << 8) | ptr[1]; 	return(uint16); }	/* end of get_big_endian_16 */ /*+-------------------------------------------------------------------------	get_big_endian_32(ptr)--------------------------------------------------------------------------*/ulongget_big_endian_32(ptr)register uchar *ptr;{register ulong uint32 = ((ulong)*ptr++) << 24;	uint32 |= ((ulong)*ptr++) << 16;	uint32 |= ((ulong)*ptr++) <<  8;	uint32 |=  (ulong)*ptr++;	return(uint32); }	/* end of get_big_endian_32 *//*+-------------------------------------------------------------------------	pcmd_getf(param) - get friend memorygetf -x <int-var-spec> <offset>where: -x ==   -b byte   -w word (little-endian)   -W word (big-endian)   -l 32-bits (little-endian)   -L 32-bits (big-endian)--------------------------------------------------------------------------*/intpcmd_getf(param)ESD *param;{int erc;char switches[8];long *piv;long offset;int size;int big_endian;	if(erc = get_switches(param,switches,sizeof(switches)))		return(erc);	if((strlen(switches) != 2) || !strchr("bwWlL",switches[1]))	{		pputs("invalid switch\n");		return(eFATAL_ALREADY);	}	size = to_lower(switches[1]);	big_endian = isupper(switches[1]);/*	if(!get_svptr(param,&psv))		return(eNotImplemented);	else*/	if(!strncmp(param->pb + param->index,"$i",2))		param->index += 2;	if(erc = get_ivptr(param,&piv,1))		return(erc);	if(erc = gint(param,&offset))		return(erc);	if(proctrace)		pprintf("getf %s offset=0x%lx",switches,offset);	switch(size)	{		case 'b':			if(offset > ((long)sizeof(shm->friend_space) - 1))				goto OFFSET_TOO_LARGE;			*piv = *(((uchar *)shm->friend_space) + (int)offset) & 0xFF;			break;		case 'w':			if(offset > ((long)sizeof(shm->friend_space) - 2))				goto OFFSET_TOO_LARGE;			if(big_endian)				*piv = get_big_endian_16((uchar *)shm->friend_space +						(int)offset);			else				*piv = *(((ushort *)shm->friend_space) + (int)offset) & 0xFFFF;			break;		case 'l':			if(offset > ((long)sizeof(shm->friend_space) - 4))				goto OFFSET_TOO_LARGE;			if(big_endian)			{				*piv = get_big_endian_32((uchar *)shm->friend_space +						(int)offset);			}			else				*piv = *((long *)((char *)shm->friend_space + (int)offset));			break;	}	if(proctrace)		pprintf(" value=%ld (%08lx)\n",*piv,*piv);	return(0);OFFSET_TOO_LARGE:	if(proctrace)		pputs("\n");	pprintf("offset 0x%02lx too large for -%c (0x%02x bytes available)\n",		offset,switches[1],sizeof(shm->friend_space));	return(eFATAL_ALREADY);}	/* end of pcmd_getf *//*+-------------------------------------------------------------------------	pcmd_putf(param)--------------------------------------------------------------------------*//*ARGSUSED*/intpcmd_putf(param)ESD *param;{	return(eNotImplemented);}	/* end of pcmd_putf *//*+-------------------------------------------------------------------------	pcmd_xon(param)--------------------------------------------------------------------------*/intpcmd_xon(param)ESD *param;{int erc;char new_xonxoff[8];char *xon_status();	if(shm->Liofd < 0)		return(eNoLineAttached);	if(erc = get_alpha_zstr(param,new_xonxoff,sizeof(new_xonxoff)))		return(erc);	if(set_xon_xoff_by_arg(new_xonxoff))		return(eBadParameter);	if(proctrace)		pprintf("xon/xoff flow control set to %s\n",xon_status());	return(erc);}	/* end of pcmd_xon *//*+-------------------------------------------------------------------------	pcmd_rtscts(param)--------------------------------------------------------------------------*/intpcmd_rtscts(param)ESD *param;{int erc;char new_rtscts[8];	if(shm->Liofd < 0)		return(eNoLineAttached);	if(erc = get_alphanum_zstr(param,new_rtscts,sizeof(new_rtscts)))		return(erc);#if defined(HW_FLOW_CONTROL) /* see ecu.h */	lRTSCTS_control(yes_or_no(new_rtscts));	if(proctrace)		display_hw_flow_config();#else	if(proctrace)		pprintf("hardware flow control not available .... rtscts ignored\n");#endif /* RTSFLOW */	return(erc);}	/* end of pcmd_rtscts *//*+-------------------------------------------------------------------------	pcmd_setline(param) - _rc.ep setline commandThis command can be used to set the initial line in _rc.ep--------------------------------------------------------------------------*/intpcmd_setline(param)ESD *param;{int erc;ESD *tesd;	if(rc_ep_has_run)	{		pprintf("command legal only in _rc.ep\n");		return(eFATAL_ALREADY);	}	if(!(tesd = esdalloc(sizeof(shm->Lline))))		return(eNoMemory);	if(erc = gstr(param,tesd,0))		goto RETURN;	shm->Lline[0] = 0;	if(strncmp(tesd->pb,"/dev/",5))		strcat(shm->Lline,"/dev/");	strncat(shm->Lline,tesd->pb,sizeof(shm->Lline) - strlen(shm->Lline));	shm->Lline[sizeof(shm->Lline) - 1] = 0;	if(proctrace)		pprintf("line set to %s\n",shm->Lline);RETURN:	esdfree(tesd);	return(erc);}	/* end of pcmd_setline *//* vi: set tabstop=4 shiftwidth=4: *//* end of pcmd.c */

⌨️ 快捷键说明

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