home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / help_eval < prev    next >
Encoding:
Text File  |  1992-07-20  |  2.5 KB  |  95 lines

  1.  
  2. /*
  3.  * help_eval.c
  4.  * Copyright © 1992 Niklas Röjemo
  5.  */
  6.  
  7. #include "global.h"
  8. #include "help_eval.h"
  9. #include "eval.h"
  10. #include "error.h"
  11. #include "symbol.h"
  12.  
  13. static void fixValueTag(Value *value)
  14. {
  15.   LateInfo **c;
  16.       /* Remove symbols with factor == 0  */
  17.   for(c = &value->ValueLate.late; *c;) {
  18.     if(!(*c)->factor)
  19.       *c = (*c)->next;
  20.     else {
  21.       c = &((*c)->next);
  22.     }
  23.   } /* Decide type of value */
  24.   if(value->ValueLate.late) {
  25.     value->Tag = ValueLateLabel;
  26.   } else
  27.     value->Tag = ValueInt;
  28. }
  29.  
  30. void help_evalNegLate(Value *value)
  31. {
  32.   LateInfo *l;
  33.   if(value->Tag & ValueLateLabel)
  34.     for(l = value->ValueLate.late; l; l = l->next)
  35.       l->factor = -l->factor;
  36. }
  37.  
  38. void help_evalSubLate(Value *lvalue, Value *rvalue)
  39. {
  40.   LateInfo *l,*r,*rnext;
  41.   if(rvalue->Tag == ValueInt)  /* No late info in rvalue */
  42.     return;
  43.   if(lvalue->Tag == ValueInt) {  /* No late info in lvalue */
  44.     lvalue->Tag = rvalue->Tag;   /* Just move rvalue late info to lvalue */
  45.     lvalue->ValueLate.late = rvalue->ValueLate.late;
  46.                     /* But remember to change sign */
  47.     help_evalNegLate(lvalue);
  48.     return;
  49.   }
  50.         /* Both lvalue and rvalue have late info */
  51.   for(r = rvalue->ValueLate.late; r; r = rnext) {
  52.     rnext = r->next;
  53.     for(l = lvalue->ValueLate.late; l; l = l->next) {
  54.       if(l->symbol == r->symbol) {
  55.         l->factor -= r->factor;
  56.         break;
  57.       }
  58.     }        /* New symbol for lvalue, so move from rvalue late info */
  59.              /* And remember to change sign */
  60.     if(!l) { /* Didn't find it */
  61.        l = lvalue->ValueLate.late;
  62.        (lvalue->ValueLate.late = r)->next = l;
  63.        r->factor = -r->factor;
  64.      }
  65.   }
  66.   fixValueTag(lvalue);
  67. }
  68.  
  69. void help_evalAddLate(Value *lvalue, Value *rvalue)
  70. {
  71.   LateInfo *l,*r,*rnext;
  72.   if(rvalue->Tag == ValueInt)  /* Nothing late info in rvalue */
  73.     return;
  74.   if(lvalue->Tag == ValueInt) {  /* Nothing late info in lvalue */
  75.     lvalue->Tag = rvalue->Tag;   /* Just move rvalue late to lvalue */
  76.     lvalue->ValueLate.late = rvalue->ValueLate.late;
  77.     return;
  78.   }
  79.         /* Both lvalue and rvalue have late info */
  80.   for(r = rvalue->ValueLate.late; r; r = rnext) {
  81.     rnext = r->next;
  82.     for(l = lvalue->ValueLate.late; l; l = l->next) {
  83.       if(l->symbol == r->symbol) {
  84.         l->factor += r->factor;
  85.         break;
  86.       }
  87.     }        /* New symbol for lvalue, so move from rvalue late info */
  88.     if(!l) { /* Didn't find it */
  89.        l = lvalue->ValueLate.late;
  90.        (lvalue->ValueLate.late = r)->next = l;
  91.     }
  92.   }
  93.   fixValueTag(lvalue);
  94. }
  95.