C:\Users\brock\Documents\CSCI 255\NetBeans\RL Assign\RLexec.c |
#include "RLexec.h"
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>
static int SanityCheck(struct RLAssignmentNode *p ) ;
RLVariableTable interpretRL(struct RLAssignmentNode *program) {
RLVariableTable t ;
if (!SanityCheck(program)) return (RLVariableTable) NULL ;
t = RLVTcreate() ;
while (program != (struct RLAssignmentNode *)NULL) {
double arg1D, arg2D, result ;
struct RLVariableNode *argV ;
char *argS ;
if (program->value.op1Type == oprndVar) {
argS = program->value.arg1.VarName ;
argV = RLVTlookup(t, argS) ;
if (argV == NULL)
arg1D = 0.0 ;
else
arg1D = argV->value ;
} else
arg1D = program->value.arg1.ConstValue ;
if (program->value.op2Type == oprndVar) {
argS = program->value.arg2.VarName ;
argV = RLVTlookup(t, argS) ;
if (argV == NULL)
arg2D = 0.0 ;
else
arg2D = argV->value ;
} else
arg2D = program->value.arg2.ConstValue ;
if (program->value.operator == optorSer)
result = arg1D + arg2D ;
else if (arg1D == 0.0 || arg2D == 0.0)
result = 0.0 ;
else
result = 1/(1/arg1D + 1/arg2D) ;
argV = RLVTinsert(t, program) ;
argV->value = result ;
program = program->next ;
}
return t ;
}
void listByNameRL(RLVariableTable t, FILE *f) {
int i ;
struct RLVariableNode *dummyNode, *printNode ;
if (t == NULL) return ;
fputc('\n', f) ;
}
static int cmpVarValue(const void * V1, const void * V2) ;
void listByValueRL(RLVariableTable t, FILE *f) {
struct RLVariableNode **sortedMess, *dummyNode, *presNode ;
int i, psm ;
if (t == NULL) return ;
sortedMess = (struct RLVariableNode **)
calloc(t->numberItems, sizeof *sortedMess) ;
psm = 0 ;
qsort((void *)sortedMess,
t->numberItems,
sizeof(struct RLVariableNode *),
&cmpVarValue) ;
for (psm=0; psm<t->numberItems; ++psm) {
fprintf(f, "%" RLVARF ": %" RLCONSTF "\n" ,
sortedMess[psm]->variable->value.Target,
sortedMess[psm]->value) ;
}
free(sortedMess) ;
}
static int cmpVarValue(const void * V1, const void * V2) {
struct RLVariableNode *Var1 = *(struct RLVariableNode **)V1 ;
struct RLVariableNode *Var2 = *(struct RLVariableNode **)V2 ;
}
static int SanityCheck(struct RLAssignmentNode *p ) {
struct RLAssignment *a = &p->value ;
return (isalpha(a->Target[0])
&& (a->operator == optorSer || a->operator == optorPar)
&& (a->op1Type == oprndVar || a->op1Type == oprndConst)
&& (a->op2Type == oprndVar || a->op2Type == oprndConst)
&& (isalpha(a->arg1.VarName[0]) || a->arg1.ConstValue >= 0.0)
&& (isalpha(a->arg2.VarName[0]) || a->arg2.ConstValue >= 0.0)) ;
}