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

📄 shell.c

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 C
📖 第 1 页 / 共 4 页
字号:
    int *partB;    {    union 	{	struct	    {	    int a;	    int b;	    } part;	double d;	} val;    val.d = d;    *partA = val.part.a;    *partB = val.part.b;    }#endif	/* (CPU!=PPC403) *//********************************************************************************* funcCall - call a function*/LOCAL VALUE funcCall (pV, pArgList)    VALUE *pV;    VALUE *pArgList;    {    static int funcStatus;	/* status from function calls */    int a [MAX_FUNC_ARGS];    VALUE value;    FAST int i;    FAST int argNum;    int oldInFd	 = ioGlobalStdGet (STD_IN);    int oldOutFd = ioGlobalStdGet (STD_OUT);    FUNCPTR pFunc = (pV->side == LHS) ? (FUNCPTR) (int)getLv (pV)				      : (FUNCPTR) pV->value.rv;#if CPU==ARM7TDMI_T    pFunc = (FUNCPTR)((UINT32)pFunc | 1);	/* make it a Thumb call */#endif    /* get any specified args off stack, or pre-set all args to 0 */    for (argNum = pArgList->value.rv, i = 0; i < MAX_FUNC_ARGS; argNum++, i++)	{	a [i] = (argNum < nArgs) ? argStack[argNum] : 0;	}    /* set standard in/out to redirection fds */    if (redirInFd >= 0)	ioGlobalStdSet (STD_IN, redirInFd);    if (redirOutFd >= 0)	ioGlobalStdSet (STD_OUT, redirOutFd);    /* call function and save resulting status */    errnoSet (funcStatus);    value.side = RHS;    value.type = pV->type;    switch (pV->type)	{	case T_BYTE:	case T_WORD:	case T_INT:	    {	    /* NOTE: THE FOLLOWING ARRAY REFERENCES MUST AGREE WITH THE	     *       MAX_FUNC_ARGS COUNT DEFINED ABOVE IN THIS FILE!	     */	    int rv = (* pFunc) (a[0], a[1], a[2], a[3], a[4], a[5], a[6],				a[7], a[8], a[9], a[10], a[11]);	    switch (pV->type)		{		case T_BYTE:		    value.value.byte = (char) rv;		    break;		case T_WORD:		    value.value.word = (short) rv;		    break;		case T_INT:		    value.value.rv = rv;		    break;		default:		    break;		}	    break;	    }#if	(CPU!=PPC403)	case T_FLOAT:	    value.value.fp = (* (float (*)())pFunc) (a[0], a[1], a[2], a[3],			a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);	    break;	case T_DOUBLE:	    value.value.dp = (* (double (*)())pFunc) (a[0], a[1], a[2], a[3],			a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);	    break;#endif	/* (CPU!=PPC403) */	default:	    printf ("funcCall: bad function type.\n");	    SET_ERROR;	}    funcStatus = errnoGet ();    /* restore original in/out fds */    if (redirInFd >= 0)	ioGlobalStdSet (STD_IN, oldInFd);    if (redirOutFd >= 0)	ioGlobalStdSet (STD_OUT, oldOutFd);    /* arg stack back to previous level */    nArgs = pArgList->value.rv;    return (value);    }/********************************************************************************* checkLv - check that a value can be used as left value*/LOCAL BOOL checkLv (pValue)    VALUE *pValue;    {    if (pValue->side != LHS)	{	printf ("invalid application of 'address of' operator.\n");	SET_ERROR;	return (FALSE);	}    return (TRUE);    }/********************************************************************************* checkRv - check that a value can be used as right value*/LOCAL BOOL checkRv (pValue)    VALUE *pValue;    {    if (pValue->side == LHS)	return (checkLv (pValue));    return (TRUE);    }/********************************************************************************* getRv - get a value's right value */LOCAL VALUE *getRv (pValue, pRv)    FAST VALUE *pValue;    FAST VALUE *pRv;			/* where to put value */    {    if (pValue->side == RHS)	*pRv = *pValue;    else	{	pRv->side = RHS;	pRv->type = pValue->type;	switch (pValue->type)	    {	    case T_BYTE:		pRv->value.byte = *(char *)pValue->value.lv;		break;	    case T_WORD:		pRv->value.word = *(short *)pValue->value.lv;		break;	    case T_INT:		pRv->value.rv = *pValue->value.lv;		break;#if	(CPU!=PPC403)	    case T_FLOAT:		pRv->value.fp = *(float *)pValue->value.lv;		break;	    case T_DOUBLE:		pRv->value.dp = *(double *)pValue->value.lv;		break;#endif	/* (CPU!=PPC403) */	    default:		printf ("getRv: invalid rhs.");		SET_ERROR;	    }	}    return (pRv);    }/********************************************************************************* getLv - get a value's left value (address)*/LOCAL int *getLv (pValue)    VALUE *pValue;    {    return (checkLv (pValue) ? pValue->value.lv : 0);    }/********************************************************************************* setLv - set a lv*/LOCAL void setLv (pVal1, pVal2)    FAST VALUE *pVal1;    FAST VALUE *pVal2;    {    if (pVal2->side == LHS)	{	printf ("setLv: invalid lhs.\n");	SET_ERROR;	}    if ((int)pVal2->type != (int)T_INT)	{	printf ("setLv: type conflict.\n");	SET_ERROR;	}    pVal1->side     = LHS;    pVal1->type     = pVal2->type;    pVal1->value.lv = (int *)pVal2->value.rv;    }/********************************************************************************* setRv - set the rv*/LOCAL void setRv (pVal1, pVal2)    FAST VALUE *pVal1;    FAST VALUE *pVal2;    {    pVal1->side = RHS;    pVal1->type = pVal2->type;    switch (pVal2->type)	{	case T_BYTE:	    pVal1->value.byte = (pVal2->side == LHS) ?			    *(char *)pVal2->value.lv : pVal2->value.byte;	case T_WORD:	    pVal1->value.word = (pVal2->side == LHS) ?			    *(short *)pVal2->value.lv : pVal2->value.word;	case T_INT:	    pVal1->value.rv = (pVal2->side == LHS) ?			    *pVal2->value.lv : pVal2->value.rv;	    break;#if	(CPU!=PPC403)	case T_FLOAT:	    pVal1->value.fp = (pVal2->side == LHS) ?			    *(float *)pVal2->value.lv : pVal2->value.fp;	    break;	case T_DOUBLE:	    pVal1->value.dp = (pVal2->side == LHS) ?			    *(double *)pVal2->value.lv : pVal2->value.dp;	    break;#endif	/* (CPU!=PPC403) */	default:	    printf ("setRv: bad type.\n");	    SET_ERROR;	}    }/********************************************************************************* printLv - print left-hand side value** "ssss + xxx = xxxx"*/LOCAL void printLv (pValue)    VALUE *pValue;    {    FAST int *lv = getLv (pValue);    printSym ((int) lv, "", " = ");    printf ("0x%x", (UINT) lv);    }/********************************************************************************* printRv - print right-hand side value** The format for integers is:** "nnnn = xxxx = 'c' = ssss + nnn"*                           ^ only if nn < LIMIT for some ssss*                 ^ only if value is printable*/LOCAL void printRv (pValue)    VALUE *pValue;    {    VALUE val;    int rv;    (void)getRv (pValue, &val);    switch (pValue->type)	{	case T_BYTE:	    rv = val.value.byte;	    goto caseT_INT;	case T_WORD:	    rv = val.value.word;	    goto caseT_INT;	case T_INT:	    rv = val.value.rv;	    /* drop through */	caseT_INT:	    printf ("%d = 0x%x", rv, rv);	    if (isascii (rv) && isprint (rv))		printf (" = '%c'", rv);	    printSym (rv, " = ", "");	    break;#if	(CPU!=PPC403)	case T_FLOAT:	    printf ("%g", val.value.fp);	    break;	case T_DOUBLE:	    printf ("%g", val.value.dp);	    break;#endif	/* (CPU!=PPC403) */	default:	    printf ("printRv: bad type.\n");	    SET_ERROR;	}    }/********************************************************************************* printValue - print out value*/LOCAL void printValue (pValue)    FAST VALUE *pValue;    {    if (pValue->side == LHS)	{	if (checkLv (pValue) && checkRv (pValue))	    {	    printLv (pValue);	    printf (": value = ");	    printRv (pValue);	    printf ("\n");	    }	else	    {	    printf ("invalid lhs.\n");	    SET_ERROR;	    }	}    else if (checkRv (pValue))	{	printf ("value = ");	printRv (pValue);	printf ("\n");	}    else	{	printf ("invalid rhs.\n");	SET_ERROR;	}    }/* TYPE SUPPORT */LOCAL VALUE evalUnknown ();LOCAL VALUE evalByte ();LOCAL VALUE evalWord ();LOCAL VALUE evalInt ();LOCAL VALUE evalFloat ();LOCAL VALUE evalDouble ();typedef struct		/* EVAL_TYPE */    {    VALUE (*eval) ();    } EVAL_TYPE;LOCAL EVAL_TYPE evalType [] =    {    /*	eval		type		*/    /*	---------------	--------------	*/      { evalUnknown,	/* T_UNKNOWN*/	},      { evalByte,	/* T_BYTE   */	},      { evalWord,	/* T_WORD   */	},      { evalInt,	/* T_INT    */	},#if	(CPU!=PPC403)      { evalFloat,	/* T_FLOAT  */	},      { evalDouble,	/* T_DOUBLE */	},#endif	/* (CPU!=PPC403) */    };/********************************************************************************* evalExp - evaluate expression*/LOCAL VALUE evalExp (pValue1, op, pValue2)    VALUE *pValue1;    int op;    VALUE *pValue2;    {    VALUE *p1 = pValue1;    VALUE *p2 = pValue2;    if (pValue2 == NULLVAL) /* unary expresions must set pValue2 to something */	p2 = pValue2 = pValue1;    /* make sure values have the same type */    if ((int)p1->type > (int)p2->type)	typeConvert (p2, p1->type, p1->side);    else	typeConvert (p1, p2->type, p2->side);    return ((evalType[(int)pValue1->type].eval) (pValue1, op, pValue2));    }/********************************************************************************* evalUnknown - evaluate for unknown result** ARGSUSED*/LOCAL VALUE evalUnknown (pValue1, op, pValue2)    VALUE *pValue1;    int op;    VALUE *pValue2;    {    printf ("evalUnknown: bad evaluation.\n");    SET_ERROR;    return (*pValue1);	/* have to return something */    }/********************************************************************************* evalByte - evaluate for byte result*/LOCAL VALUE evalByte (pValue1, op, pValue2)    VALUE *pValue1;    int op;    VALUE *pValue2;    {    VALUE *p1 = pValue1;    VALUE *p2 = pValue2;    VALUE result;    /* evaluate as integers and then convert back */    typeConvert (p1, T_INT, RHS);    typeConvert (p2, T_INT, RHS);    result = evalInt (p1, op, p2);    typeConvert (&result, T_BYTE, RHS);    return (result);    }/********************************************************************************* evalWord - evaluate for word result*/LOCAL VALUE evalWord (pValue1, op, pValue2)    VALUE *pValue1;    int op;    VALUE *pValue2;    {    VALUE *p1 = pValue1;    VALUE *p2 = pValue2;    VALUE result;    /* evaluate as integers and then convert back */    typeConvert (p1, T_INT, RHS);    typeConvert (p2, T_INT, RHS);    result = evalInt (p1, op, p2);    typeConvert (&result, T_WORD, RHS);    return (result);    }/********************************************************************************* evalInt - evaluate for integer result*/LOCAL VALUE evalInt (pValue1, op, pValue2)    VALUE *pValue1;    int op;    VALUE *pValue2;    {#define	OP_INT(op)	rv = e1 op e2; break#define	OP_INT_U(op)	rv = op e1; break    FAST int e1 = pValue1->value.rv;    FAST int e2 = pValue2->value.rv;    FAST int rv;    VALUE result;    switch (op)	{	case ADDA:	case '+':	    OP_INT(+);	case SUBA:	case '-':	    OP_INT(-);	case MULA:	case '*':	    OP_INT(*);	case DIVA:	case '/':	    OP_INT(/);	case '!':	    OP_INT_U(!);	case '~':	    OP_INT_U(~);	case MODA:	case '%':	    OP_INT(%);	case ANDA:	case '&':	    OP_INT(&);	case XORA:	case '^':	    OP_INT(^);	case ORA:	case '|':	    OP_INT(|);	case '<':	    OP_INT(<);	case '>':	    OP_INT(>);	case OR:	    OP_INT(||);	case AND:	    OP_INT(&&);	case EQ:	    OP_INT(==);	case NE:	    OP_INT(!=);	case GE:	    OP_INT(>=);	case LE:	    OP_INT(<=);	case INCR:	    OP_INT_U(++);	case DECR:	    OP_INT_U(--);	case SHLA:	case ROT_LEFT:	    OP_INT(<<);	case SHRA:	case ROT_RIGHT:	    OP_INT(>>);	case UMINUS:	    OP_INT_U(-);	default:	    rv = 0;	    printf ("operands have incompatible types.\n");	    SET_ERROR;	}

⌨️ 快捷键说明

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