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

📄 feval.c

📁 一个通讯程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		*value = (long)fasi_line_errors();		break;	case FIridet:		*value = (long)fasi_rings_detected();		break;	case FIbrdet:		*value = (long)fasi_breaks_detected();		break;#else	case FIfasi:		*value = 0;		break;#endif	case FInice:		*value = (long)nice(0) + 20;		erc = 0;		break;	case FIuid:		*value = (long)getuid();		erc = 0;		break;	case FIgid:		*value = (long)getgid();		erc = 0;		break;	default:		erc = eInvalidFunction;	}   /* end of keyword lookup erc switch statement */RETURN:	if(tesd1)		esdfree(tesd1);	if(tesd2)		esdfree(tesd2);	return(erc);}   /* end of feval_int() *//*+------------------------------------------------------------------    strfunc_left(param,&scratch_esd,&result_esd)-------------------------------------------------------------------*/intstrfunc_left(param,scratch_esd,result_esd)ESD *param;ESD *scratch_esd;ESD *result_esd;{register erc;int itmp;long ltmp;	if(erc = skip_paren(param,1))		return(erc);	if(erc = gstr(param,scratch_esd,1))		return(erc);	if(erc = skip_comma(param))		return(erc);	if(erc = gint(param,&ltmp))		return(erc);	itmp = (int)ltmp;	if(itmp < 0)		return(eBadParameter);	if(erc = skip_paren(param,0))		return(erc);	/* take min of param and .cb */	itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb;	if(itmp > (result_esd->maxcb - result_esd->cb) )		return(eBufferTooSmall);	memcpy(&result_esd->pb[result_esd->cb],	    scratch_esd->pb,itmp);	result_esd->cb += itmp;	return(erc);}   /* end of strfunc_left() *//*+-------------------------------------------------------------------------    erc = strfunc_right(param,&scratch_esd,&result_esd)--------------------------------------------------------------------------*/intstrfunc_right(param,scratch_esd,result_esd)ESD *param;ESD *scratch_esd;ESD *result_esd;{register erc;int itmp;long ltmp;	if(erc = skip_paren(param,1))		return(erc);	if(erc = gstr(param,scratch_esd,1))		return(erc);	if(erc = skip_comma(param))		return(erc);	if(erc = gint(param,&ltmp))		return(erc);	itmp = (int)ltmp;	if(itmp < 0)		return(eBadParameter);	if(erc = skip_paren(param,0))		return(erc);/* take min of param and .cb */	itmp = (itmp < scratch_esd->cb) ? itmp : scratch_esd->cb;	if(itmp > (result_esd->maxcb - result_esd->cb) )		return(eBufferTooSmall);	memcpy(&result_esd->pb[result_esd->cb],	    &scratch_esd->pb[scratch_esd->cb - itmp],itmp);	result_esd->cb += itmp;	return(0);}   /* end of strfunc_right() *//*+-------------------------------------------------------------------------    erc = feval_str(param,&esd_to_be_plugged);    results are APPENDED to 'result_esd'--------------------------------------------------------------------------*/feval_str(param,result_esd)ESD *param;ESD *result_esd;{register erc;register itmp;int int1,int2;char s64[64];char *cptr;long ltmp;long ltmp2;long ltmp3;ESD *tesd1;ESD *tesd2 = (ESD *)0;char *get_ttyname();char *getenv();char *cuserid();char *get_elapsed_time();char *mode_map();	if(!(tesd1 = esdalloc(128)))		return(eNoMemory);	if(erc = get_alphanum_zstr(param,s64,sizeof(s64)-1))	{		esdfree(tesd1);		return(eInvalidFunction);	}	erc = 0;	itmp=keyword_lookup(feval_str_tbl,s64);	switch(itmp)	{/* LEFT($S0,$I0)   return leftmost $I0 characters of $S0 */	case FSleft:		erc = strfunc_left(param,tesd1,result_esd);		break;/* RIGHT($S0,$I0)   return rightmost $I0 characters of $S0 */	case FSright:		erc = strfunc_right(param,tesd1,result_esd);		break;/* MID($S0,$I0,$I1)   return middle $I1 chars of $S0 starting at $I0 */	case FSmid:		if(erc = skip_paren(param,1))			break;		if(erc = gstr(param,tesd1,1))			break;		if(erc = skip_comma(param))			break;		if(erc = gint(param,&ltmp))			break;		int1 = (int)ltmp;		if(int1 < 0)		{			erc = eBadParameter;			break;		}		if(erc = skip_cmd_break(param))			break;		if(param->pb[param->index] == ')') /* if we find a ')' instead of ... */		{                                  /* 2nd int param, default to max */			++param->index;			int2 = 256;		}		else		{			if(erc = skip_comma(param))				break;			if(erc = gint(param,&ltmp))				break;			int2 = (int)ltmp;			if(int2 < 0)			{				erc = eBadParameter;				break;			}			if(erc = skip_paren(param,0))				break;		}		if(int1 >= tesd1->cb) /* if initial index past end of string */			break;		itmp = tesd1->cb - int1;		itmp = (int2 < itmp) ? int2 : itmp;		cptr = tesd1->pb + int1;		goto CPTR_ITMP_COMMON;/* ARGV($I0) */	case FSargv:		if(!proc_level)		{			pputs("not executing procedure\n");			erc = eFATAL_ALREADY;			break;		}		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(erc = skip_paren(param,0))			break;		itmp = (long)pcb_stack[proc_level - 1]->argc; /* arg count */		if((int)ltmp > itmp - 1)		{			if(proctrace)			{				pprintf("WARNING: %%argc=%d, %%argv(%ld) null\n",					itmp,ltmp);			}			break;		}		cptr = (pcb_stack[proc_level - 1])->argv[(int)ltmp];		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSdir:		cptr = curr_dir;		itmp = strlen(curr_dir);		goto CPTR_ITMP_COMMON;	case FSetime:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(erc = skip_paren(param,0))			break;		cptr = get_elapsed_time(ltmp);		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSerrstr:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(erc = skip_paren(param,0))			break;		cptr = errno_text((int)ltmp);		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSenvvar:		if(erc = skip_paren(param,1))			break;		if(erc = gstr(param,tesd1,1))			break;		if(erc = skip_paren(param,0))			break;		if(!(cptr = getenv(tesd1->pb)))			break;		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSlogname:		if(!(cptr = cuserid((char *)0)))			break;		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSfmodestr:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(erc = skip_paren(param,0))			break;		cptr = mode_map((ushort)ltmp,(char *)0);		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FStty:		cptr = get_ttyname();		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	case FSuname:	{		struct utsname utsn;#ifdef M_SYSV /* SCO */		FILE *fp = fopen("/etc/systemid","r");		if(fp)		{			s64[0] = 0;			fgets(s64,sizeof(s64),fp);			fclose(fp);			if(itmp = strlen(s64))			{				if(*(cptr = s64 + itmp - 1) == '\n')					*cptr = 0,itmp--;				strip_trail_break(s64);				cptr = s64;				itmp = strlen(cptr);				goto CPTR_ITMP_COMMON;			}		}#endif		if(uname(&utsn) == -1)		{			pperror("uname");			erc = eFATAL_ALREADY;			break;		}		cptr = utsn.sysname;		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;	} /* end of case FSuname */	case FSrname:		if(!shm->Lconnected)			break;		cptr = shm->Lrname;		itmp = strlen(shm->Lrname);		goto CPTR_ITMP_COMMON;	case FSrdesc:		if(!shm->Lconnected)			break;		cptr = shm->Ldescr;		itmp = strlen(shm->Ldescr);		goto CPTR_ITMP_COMMON;	case FSrtel:		if(!shm->Lconnected)			break;		cptr = shm->Ltelno;		itmp = strlen(shm->Ltelno);		goto CPTR_ITMP_COMMON;	case FSline:		cptr = shm->Lline;		itmp = strlen(shm->Lline);		goto CPTR_ITMP_COMMON;	case FSmonth:	case FSmonthz:	    cptr = &month_name_list[(get_month(itmp == FSmonthz) - 1) * 3];		itmp = 3;		goto CPTR_ITMP_COMMON;	case FSday:	case FSdayz:		cptr = &day_of_week_list[get_day(itmp == FSdayz) * 3];		itmp = 3;		goto CPTR_ITMP_COMMON;	case FSscreen:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))		/* y */			break;		if(ltmp > 42)		{			erc = eBadParameter;			break;		}		if(erc = skip_comma(param))			break;		if(erc = gint(param,&ltmp2))	/* x */			break;		if(ltmp2 > 79)		{			erc = eBadParameter;			break;		}		if(erc = skip_comma(param))			break;		if(erc = gint(param,&ltmp3))	/* len */			break;		if(erc = skip_paren(param,0))			break;		int1 = ((int)ltmp * 80) + (int)ltmp2;	/* screen position */		itmp = (int)ltmp3;						/* length */		int2 = sizeof(shm->screen) - int1;		/* size from y,x to end */		if(itmp > int2)			itmp = int2;		cptr = ((char *)shm->screen) + int1;		goto CPTR_ITMP_COMMON;	case FSbasename:		if(!(tesd2 = esdalloc(32)))			return(eNoMemory);		if(erc = skip_paren(param,1))			break;		if(erc = gstr(param,tesd1,1))			break;		if(erc = skip_comma(param))			break;		if(erc = gstr(param,tesd2,1))			break;		if(erc = skip_paren(param,0))			break;		cptr = tesd1->pb;		itmp = tesd1->cb;		if((tesd1->cb >= tesd2->cb) &&			!strcmp(cptr + tesd1->cb - tesd2->cb,tesd2->pb))		{			itmp -= tesd2->cb;		}		goto CPTR_ITMP_COMMON;	case FSdirpart:		if(erc = skip_paren(param,1))			break;		if(erc = gstr(param,tesd1,1))			break;		if(erc = skip_paren(param,0))			break;		if(cptr = strrchr(tesd1->pb,'/'))			itmp = cptr - tesd1->pb;		else			itmp = tesd1->cb;		cptr = tesd1->pb;		goto CPTR_ITMP_COMMON;	case FSfilepart:		if(erc = skip_paren(param,1))			break;		if(erc = gstr(param,tesd1,1))			break;		if(erc = skip_paren(param,0))			break;		if(cptr = strrchr(tesd1->pb,'/'))			itmp = strlen(++cptr);		else		{			cptr = tesd1->pb;			itmp = tesd1->cb;		}		goto CPTR_ITMP_COMMON;#if defined(FASI)	case FSmsrtext:		cptr = msr_text(fasi_msr());		itmp = strlen(cptr);		goto CPTR_ITMP_COMMON;#endifCPTR_ITMP_COMMON:		if( itmp > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		memcpy(&result_esd->pb[result_esd->cb],cptr,itmp);		result_esd->cb += itmp;		break;	case FSedate:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(erc = skip_paren(param,0))			break;		if(19 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		epoch_secs_to_str(ltmp,3,&result_esd->pb[result_esd->cb]);		result_esd->cb += 19;		break;	case FStime:		if(5 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(0,&result_esd->pb[result_esd->cb]);		result_esd->cb += 5;		break;	case FStimes:		if(8 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(1,&result_esd->pb[result_esd->cb]);		result_esd->cb += 8;		break;	case FStimez:		if(5 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(6,&result_esd->pb[result_esd->cb]);		result_esd->cb += 5;		break;	case FStimezs:		if(8 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(7,&result_esd->pb[result_esd->cb]);		result_esd->cb += 8;		break;	case FSdate:		if(10 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(5,&result_esd->pb[result_esd->cb]);		result_esd->cb += 10;		break;	case FSdatez:		if(10 > (result_esd->maxcb - result_esd->cb))		{			erc = eBufferTooSmall;			break;		}		get_tod(8,&result_esd->pb[result_esd->cb]);		result_esd->cb += 10;		break;	case FScgets:		erc = ttygets_esd(result_esd,TG_CRLF,1);		break;	case FScgetc:		if(result_esd->cb == result_esd->maxcb)		{			erc = eBufferTooSmall;			break;		}		result_esd->pb[result_esd->cb] = ttygetc(0);		result_esd->cb++;		break;	case FSchr:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		if(!ltmp)		{			pputs("cannot use %chr(0)\n");			return(eFATAL_ALREADY);		}		if(erc = skip_paren(param,0))			break;		if(result_esd->cb == result_esd->maxcb )		{			erc = eBufferTooSmall;			break;		}		result_esd->pb[result_esd->cb] = (char)ltmp;		result_esd->cb++;		break;	case FSitos:		if(erc = skip_paren(param,1))			break;		if(erc = gint(param,&ltmp))			break;		s64[0] = 0;		if(!skip_comma(param))		{			if(erc = get_numeric_zstr(param,s64 + 1,sizeof(s64) - 4))				strcpy(s64 + 1,"1");			if(((itmp = atoi(s64 + 1)) < 0) ||				(itmp > (result_esd->maxcb - result_esd->cb)))			{				erc = eBufferTooSmall;				break;			}			s64[0] = '%';			if(ulindex(param->pb + param->index,"x") == 0)			{				param->index++;				strcat(s64,"lx");			}			else if(ulindex(param->pb + param->index,"o") == 0)			{				param->index++;				strcat(s64,"lo");			}			else if(ulindex(param->pb + param->index,"d") == 0)			{				param->index++;				strcat(s64,"ld");			}			else if(erc)				break;			else				strcat(s64,"ld");		}		if(erc = skip_paren(param,0))			break;		sprintf(tesd1->pb,s64[0] ? s64 : "%ld",ltmp);		tesd1->cb = strlen(tesd1->pb);		if(result_esd->maxcb - result_esd->cb < tesd1->cb)		{			erc = eBufferTooSmall;			break;		}		strcpy(&result_esd->pb[result_esd->cb],tesd1->pb);		result_esd->cb += tesd1->cb;		break;	default:		erc = eInvalidFunction;		break;	}   /* end of keyword lookup erc switch statement */	esd_null_terminate(result_esd);	esdfree(tesd1);	if(tesd2)		esdfree(tesd2);	return(erc);}   /* end of feval_str() *//* vi: set tabstop=4 shiftwidth=4: *//* end of feval.c */

⌨️ 快捷键说明

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