home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * help_eval.c
- * Copyright © 1992 Niklas Röjemo
- */
-
- #include "global.h"
- #include "help_eval.h"
- #include "eval.h"
- #include "error.h"
- #include "symbol.h"
-
- static void fixValueTag(Value *value)
- {
- LateInfo **c;
- /* Remove symbols with factor == 0 */
- for(c = &value->ValueLate.late; *c;) {
- if(!(*c)->factor)
- *c = (*c)->next;
- else {
- c = &((*c)->next);
- }
- } /* Decide type of value */
- if(value->ValueLate.late) {
- value->Tag = ValueLateLabel;
- } else
- value->Tag = ValueInt;
- }
-
- void help_evalNegLate(Value *value)
- {
- LateInfo *l;
- if(value->Tag & ValueLateLabel)
- for(l = value->ValueLate.late; l; l = l->next)
- l->factor = -l->factor;
- }
-
- void help_evalSubLate(Value *lvalue, Value *rvalue)
- {
- LateInfo *l,*r,*rnext;
- if(rvalue->Tag == ValueInt) /* No late info in rvalue */
- return;
- if(lvalue->Tag == ValueInt) { /* No late info in lvalue */
- lvalue->Tag = rvalue->Tag; /* Just move rvalue late info to lvalue */
- lvalue->ValueLate.late = rvalue->ValueLate.late;
- /* But remember to change sign */
- help_evalNegLate(lvalue);
- return;
- }
- /* Both lvalue and rvalue have late info */
- for(r = rvalue->ValueLate.late; r; r = rnext) {
- rnext = r->next;
- for(l = lvalue->ValueLate.late; l; l = l->next) {
- if(l->symbol == r->symbol) {
- l->factor -= r->factor;
- break;
- }
- } /* New symbol for lvalue, so move from rvalue late info */
- /* And remember to change sign */
- if(!l) { /* Didn't find it */
- l = lvalue->ValueLate.late;
- (lvalue->ValueLate.late = r)->next = l;
- r->factor = -r->factor;
- }
- }
- fixValueTag(lvalue);
- }
-
- void help_evalAddLate(Value *lvalue, Value *rvalue)
- {
- LateInfo *l,*r,*rnext;
- if(rvalue->Tag == ValueInt) /* Nothing late info in rvalue */
- return;
- if(lvalue->Tag == ValueInt) { /* Nothing late info in lvalue */
- lvalue->Tag = rvalue->Tag; /* Just move rvalue late to lvalue */
- lvalue->ValueLate.late = rvalue->ValueLate.late;
- return;
- }
- /* Both lvalue and rvalue have late info */
- for(r = rvalue->ValueLate.late; r; r = rnext) {
- rnext = r->next;
- for(l = lvalue->ValueLate.late; l; l = l->next) {
- if(l->symbol == r->symbol) {
- l->factor += r->factor;
- break;
- }
- } /* New symbol for lvalue, so move from rvalue late info */
- if(!l) { /* Didn't find it */
- l = lvalue->ValueLate.late;
- (lvalue->ValueLate.late = r)->next = l;
- }
- }
- fixValueTag(lvalue);
- }
-