Example #1
0
  ifStatementBodyType *
extractIfBody(statementType *ifStatement)
{
	ifStatementBodyType	*result;

	result = ifStatement->statementBody.ifUnion;
	if (ifStatement->labels != NULL)
		botch("extract if body with non-null labels\n", 0, 0, 0);
	else if (ifStatement->nextStatement != NULL)
		botch("extract if body with non-null next\n", 0, 0, 0);
	else
		qfree(ifStatement);
	return(result);
}
  statementType *
buildMifStatement(mifHeadType *head, mifContinuationType continuation, ifContinuationKindType continuationKind)
{
	mifStatementBodyType	*result;

	result = typeAlloc(mifStatementBodyType);

	result->mifCondition = head->headCondition;
	result->mifConsequence = head->headBody;
	if (continuationKind == NO_CONTINUATION)
		result->mifContinuation.mifContinuationBodyUnion = NULL;
	else if (continuationKind == ELSE_CONTINUATION) {
		result->mifContinuation.mifContinuationBodyUnion =
			typeAlloc(mifContinuationBodyType);
		result->mifContinuation.mifContinuationBodyUnion->
			mifCondition = NULL;
		result->mifContinuation.mifContinuationBodyUnion->
			mifConsequence = continuation.mifBlockUnion;
		result->mifContinuation.mifContinuationBodyUnion->
			mifContinuation.mifContinuationBodyUnion = NULL;
	} else if (continuationKind == ELSEIF_CONTINUATION)
		result->mifContinuation = continuation;
	else
		botch("bad mif continuation kind: %d\n", continuationKind);
	qfree(head);
	return(newStatement(MIF_STATEMENT, (statementBodyType) result));
}
Example #3
0
 int
acheck(int k, double d, double v, double dvdx, double dvdy)
{
	ExpectedAnswer *e = &expected[k];
	int nbad = 0;

	/* There should be no round-off error in this simple example, so we */
	/* use exact comparisons, rather than, say, relative differences. */

	if (v != d*e->v)
		nbad += botch(e, 0, v, d*e->v);
	if (dvdx != d*e->dvdx)
		nbad += botch(e, "x", dvdx, d*e->dvdx);
	if (dvdy != d*e->dvdy)
		nbad += botch(e, "y", dvdy, d*e->dvdy);
	return nbad;
	}
Example #4
0
  statementType *
convertDefineToMdefine(statementType *defineStatement)
{
	if (defineStatement->kindOfStatement != DEFINE_STATEMENT)
		botch("convertDefineToMdefine got statement kind: %d\n",
			defineStatement->kindOfStatement, 0, 0);
	defineStatement->kindOfStatement = MDEFINE_STATEMENT;
	return(defineStatement);
}
Example #5
0
  stringType *
extractString(operandType *textExpression)
{
	stringType	*result;

	if (textExpression->kindOfOperand != STRING_OPND)
		botch("extract string got handed an opnd kind: %d\n",
			textExpression->kindOfOperand, 0, 0);
	result = textExpression->theOperand.stringUnion;
	qfree(textExpression);
	return(result);
}
  statementType *
buildMdoStatement(blockType *body, mdoEndType *end)
{
	statementType	*result;

	if (end->mdoEndKind == UNTIL_END)
		result = buildMdoUntilStatement(body, end->mdoEndCondition);
	else if (end->mdoEndKind == WHILE_END)
		result = buildMdoWhileStatement(body, end->mdoEndCondition);
	else
		botch("bad mdo-end kind: %d\n", end->mdoEndCondition);
	qfree(end);
	return(result);
}
  conditionType
invertConditionCode(conditionType conditionCode)
{
#define cc (int)conditionCode

	if ((int)CARRY_COND<=cc && cc<=(int)ALWAYS_COND)
		return((conditionType)
			(cc - (int)CARRY_COND + (int)NOT_CARRY_COND));
	else if ((int)NOT_CARRY_COND<=cc && cc<=(int)NEVER_COND)
		return((conditionType)
			(cc + (int)CARRY_COND - (int)NOT_CARRY_COND));
	else
		botch("invertConditionCode given %d, not a condition code\n");
}
  void
freeOperand(operandType *operand)
{
	nullFree(operand);
	switch (operand->kindOfOperand) {

	case EXPRESSION_OPND:
	case IMMEDIATE_OPND:
	case INDIRECT_OPND:
	case POST_INDEXED_Y_OPND:
	case PRE_INDEXED_X_OPND:
	case X_INDEXED_OPND:
	case Y_INDEXED_OPND:
		freeExpression(operand->theOperand.expressionUnion);
		break;

	case A_REGISTER_OPND:
	case X_REGISTER_OPND:
	case Y_REGISTER_OPND:
		break;

	case X_SELECTED_OPND:
	case Y_SELECTED_OPND:
	case PRE_SELECTED_X_OPND:
		freeSelectionList(operand->theOperand.xSelectedUnion);
		break;

	case STRING_OPND:
		freeString(operand->theOperand.stringUnion);
		break;

	case BLOCK_OPND:
		freeBlock(operand->theOperand.blockUnion);
		break;

	default:
		botch("bad operand kind in freeOperand %d\n",
						operand->kindOfOperand);
		break;
	}
	freeOperand(operand->nextOperand);
	free(operand);
}
  operandType *
buildOperand(operandKindType kindOfOperand, anyOldThing *arg)
{
	operandType	*result;

	result = typeAlloc(operandType);
	result->kindOfOperand = kindOfOperand;
	result->nextOperand = NULL;
	switch (kindOfOperand) {

	case EXPRESSION_OPND:
		result->theOperand.expressionUnion =
			(expressionOperandBodyType *) arg;
		break;

	case IMMEDIATE_OPND:
		result->theOperand.immediateUnion = 
			(immediateOperandBodyType *) arg;
		break;

	case INDIRECT_OPND:
		result->theOperand.indirectUnion =
			(indirectOperandBodyType *) arg;
		break;

	case A_REGISTER_OPND:
		result->theOperand.aRegisterUnion =
			(aRegisterOperandBodyType *) NULL;
		break;

	case X_REGISTER_OPND:
		result->theOperand.xRegisterUnion =
			(xRegisterOperandBodyType *) NULL;
		break;

	case Y_REGISTER_OPND:
		result->theOperand.yRegisterUnion =
			(yRegisterOperandBodyType *) NULL;
		break;

	case POST_INDEXED_Y_OPND:
		result->theOperand.postIndexedYUnion =
			(postIndexedYOperandBodyType *) arg;
		break;

	case PRE_INDEXED_X_OPND:
		result->theOperand.preIndexedXUnion =
			(preIndexedXOperandBodyType *) arg;
		break;

	case X_INDEXED_OPND:
		result->theOperand.xIndexedUnion =
			(xIndexedOperandBodyType *) arg;
		break;

	case Y_INDEXED_OPND:
		result->theOperand.yIndexedUnion =
			(yIndexedOperandBodyType *) arg;
		break;

	case X_SELECTED_OPND:
		result->theOperand.xSelectedUnion =
			(xSelectedOperandBodyType *) arg;
		break;

	case Y_SELECTED_OPND:
		result->theOperand.ySelectedUnion =
			(ySelectedOperandBodyType *) arg;
		break;

	case PRE_SELECTED_X_OPND:
		result->theOperand.preSelectedUnion =
			(preSelectedOperandBodyType *) arg;
		break;

	case STRING_OPND:
		result->theOperand.stringUnion =
			(stringOperandBodyType *) arg;
		break;

	case BLOCK_OPND:
		result->theOperand.blockUnion = (blockOperandBodyType *) arg;
		break;

	default:
		botch("unknown operand kind: %d\n", kindOfOperand);
		break;
	}
	return(result);
}
  valueType *
evaluateOperand(operandType *operand)
{
	valueType		*result;
	bool			 saveExpansion;
	expressionType		*expression;

	nullEvaluate(operand);
	if (operand->kindOfOperand != EXPRESSION_OPND)
		newFixupAddressMode = operand->kindOfOperand;
	switch (operand->kindOfOperand) {

	case EXPRESSION_OPND:
	case IMMEDIATE_OPND:
	case INDIRECT_OPND:
	case POST_INDEXED_Y_OPND:
	case PRE_INDEXED_X_OPND:
	case X_INDEXED_OPND:
	case Y_INDEXED_OPND:
		result = evaluateExpression(operand->theOperand.expressionUnion,
			performingFixups ? NO_FIXUP : OPERAND_FIXUP);
		nullEvaluate(result);
		if (operand->kindOfOperand != EXPRESSION_OPND) {
			if (result->addressMode != EXPRESSION_OPND) {
				error(BAD_ADDRESS_MODE_ERROR);
				result->kindOfValue = FAIL;
			} else {
				result->addressMode = operand->kindOfOperand;
			}
		}
		break;

	case A_REGISTER_OPND:
	case X_REGISTER_OPND:
	case Y_REGISTER_OPND:
		result = newValue(UNDEFINED_VALUE, 0, operand->
			kindOfOperand);
		break;

	case X_SELECTED_OPND:
	case Y_SELECTED_OPND:
	case PRE_SELECTED_X_OPND:
		result = evaluateSelectionList(operand->theOperand.xSelectedUnion);
		if (result->addressMode != EXPRESSION_OPND) {
			error(BAD_ADDRESS_MODE_ERROR);
			result->kindOfValue = FAIL;
		} else {
			result->addressMode = operand->kindOfOperand;
		}
		break;

	case STRING_OPND:
		result = newValue(STRING_VALUE, operand->theOperand.stringUnion,
			STRING_OPND);
		break;

	case BLOCK_OPND:
		if (standaloneExpansionFlag)
			forceExpansion();
		sideEffectFlag = TRUE;
		assembleBlock(operand->theOperand.blockUnion);
		expansionOn();
		result = newValue(FAIL, 0, BLOCK_OPND);
		break;

	default:
		botch("bad operand kind in evaluateOperand %d\n",
						operand->kindOfOperand);
		break;
	}
	return(result);
}
  expressionTermType *  
buildExpressionTerm(expressionTermKindType kindOfExpressionTerm, anyOldThing *arg1, anyOldThing *arg2, anyOldThing *arg3)
{
	expressionType		*result;

	result = typeAlloc(expressionType);
	result->kindOfTerm = kindOfExpressionTerm;
	switch (kindOfExpressionTerm) {

	case IDENTIFIER_EXPR:
		result->expressionTerm.identifierUnion =
			(identifierTermType *) arg1;
		break;

	case ARRAY_EXPR:
		result->expressionTerm.arrayUnion =
			buildArrayTerm((expressionType *) arg1,
			(expressionType *) arg2);
		break;

	case FUNCTION_CALL_EXPR:
		result->expressionTerm.functionCallUnion =
			(functionCallTermType *) arg1;
		break;

	case NUMBER_EXPR:
		result->expressionTerm.numberUnion = (numberTermType) arg1;
		break;

	case STRING_EXPR:
		result->expressionTerm.stringUnion = (stringTermType *) arg1;
		break;

	case SUBEXPRESSION_EXPR:
		result->expressionTerm.subexpressionUnion =
			(subexpressionTermType *) arg1;
		break;

	case UNOP_EXPR:
		result->expressionTerm.unopUnion =
			buildUnopTerm((unopKindType) arg1,
				      (expressionType *) arg2);
		break;

	case ASSIGN_EXPR:
	case BINOP_EXPR:
		result->expressionTerm.binopUnion =
			buildBinopTerm((binopKindType) arg1,
				       (expressionType *) arg2,
				       (expressionType *) arg3);
		break;

	case PREOP_EXPR:
		result->expressionTerm.preOpUnion =
			buildPreOpTerm((preOpKindType) arg1,
				       (expressionType *) arg2);
		break;

	case POSTOP_EXPR:
		result->expressionTerm.postOpUnion =
			buildPostOpTerm((postOpKindType) arg1,
					(expressionType *) arg2);
		break;

	case HERE_EXPR:
		result->expressionTerm.hereUnion = (hereTermType *) NULL;
		break;

	case CONDITION_CODE_EXPR:
		result->expressionTerm.conditionCodeUnion =
			(conditionCodeTermType) arg1;
		break;

	default:
		botch("invalid expression term kind: %d\n",
			kindOfExpressionTerm);
		break;
	}
	return(result);
}
  bool
encodeStatement(statementType *statement)
{
	switch(statement->kindOfStatement) {

	case ALIGN_STATEMENT:
	case BLOCK_STATEMENT:
	case BYTE_STATEMENT:
	case CONSTRAIN_STATEMENT:
	case DBYTE_STATEMENT:
	case DEFINE_STATEMENT:
	case DO_UNTIL_STATEMENT:
	case DO_WHILE_STATEMENT:
	case EXTERN_STATEMENT:
	case FUNCTION_STATEMENT:
	case IF_STATEMENT:
	case INCLUDE_STATEMENT:
	case INSTRUCTION_STATEMENT:
	case LONG_STATEMENT:
	case MACRO_STATEMENT:
	case ORG_STATEMENT:
	case REL_STATEMENT:
	case START_STATEMENT:
	case STRING_STATEMENT:
	case STRUCT_STATEMENT:
	case TARGET_STATEMENT:
	case UNDEFINE_STATEMENT:
	case VARIABLE_STATEMENT:
	case WHILE_STATEMENT:
	case WORD_STATEMENT:
		error(ILLEGAL_STATEMENT_IN_OBJECT_FILE_FUNCTION_ERROR,
			statementKindString(statement->kindOfStatement));
		return(FALSE);

	case ASSERT_STATEMENT:
		return(encodeAssertStatement(statement->statementBody.assertUnion));

	case FRETURN_STATEMENT:
		return(encodeFreturnStatement(statement->statementBody.freturnUnion));

	case GROUP_STATEMENT:
		return(encodeBlock(statement->statementBody.groupUnion));

	case MDEFINE_STATEMENT:
		return(encodeMdefineStatement(statement->statementBody.defineUnion));

	case MDO_UNTIL_STATEMENT:
		return(encodeMdoUntilStatement(statement->statementBody.mdoUntilUnion));

	case MDO_WHILE_STATEMENT:
		return(encodeMdoWhileStatement(statement->statementBody.mdoWhileUnion));

	case MFOR_STATEMENT:
		return(encodeMforStatement(statement->statementBody.mforUnion));

	case MIF_STATEMENT:
		return(encodeMifStatement(statement->statementBody.mifUnion));

	case MSWITCH_STATEMENT:
		return(encodeMswitchStatement(statement->statementBody.mswitchUnion));

	case MVARIABLE_STATEMENT:
		return(encodeMvariableStatement(statement->statementBody.mvariableUnion));

	case MWHILE_STATEMENT:
		return(encodeMwhileStatement(statement->statementBody.mwhileUnion));

	case NULL_STATEMENT:
		return(TRUE);

	case PERFORM_STATEMENT:
		return(encodeExpression(statement->statementBody.expressionUnion));

	default:
		botch("encodeStatementBody doesn't know kind %d\n",
			statement->kindOfStatement);
		return(FALSE);
	}
}
  bool
encodeExpression(expressionType *expression)
{
	nullEncode(expression);
	switch (expression->kindOfTerm) {

	case ARRAY_EXPR:
		error(ARRAY_TERM_IN_OBJECT_EXPRESSION_ERROR);
		return(FALSE);
		break;

	case ASSIGN_EXPR:
		return(encodeAssignmentTerm(expression->expressionTerm.binopUnion));
		break;

	case BINOP_EXPR:
		return(encodeBinopTerm(expression->expressionTerm.binopUnion));
		break;

	case CONDITION_CODE_EXPR:
		return(encodeCondition(expression->expressionTerm.conditionTypeUnion));
		break;

	case FUNCTION_CALL_EXPR:
		return(encodeFunctionCall(expression->expressionTerm.functionCallUnion));
		break;

	case HERE_EXPR:
		return(encodeHere());
		break;

	case IDENTIFIER_EXPR:
		return(encodeIdentifier(expression->expressionTerm.identifierUnion));
		break;

	case NUMBER_EXPR:
		return(encodeNumber(expression->expressionTerm.numberUnion));
		break;

	case POSTOP_EXPR:
		return(encodePostopTerm(expression->expressionTerm.postOpUnion));
		break;

	case PREOP_EXPR:
		return(encodePreopTerm(expression->expressionTerm.preOpUnion));
		break;

	case SUBEXPRESSION_EXPR:
		encodeExpression(expression->expressionTerm.expressionUnion);
		break;

	case STRING_EXPR:
		return(encodeString(expression->expressionTerm.stringUnion));
		break;

	case UNOP_EXPR:
		return(encodeUnopTerm(expression->expressionTerm.unopUnion));
		break;

	case VALUE_EXPR:
		return(encodeValue(expression->expressionTerm.valueUnion));
		break;

	default:
		botch("encodeExpression: funny expression kind %d\n",
			expression->kindOfTerm);
		break;
	}
}