📄 shell.c
字号:
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 + -