home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 500 / 470 / rccl023 < prev    next >
Text File  |  1987-03-02  |  3KB  |  109 lines

  1. /*
  2.  * RCCL Version 1.0           Author :  Vincent Hayward
  3.  *                                      School of Electrical Engineering
  4.  *                                      Purdue University
  5.  *      Dir     : src
  6.  *      File    : optim.c
  7.  *      Remarks : Strongly connected with makeposition but can be
  8.  *                used indpendently.
  9.  *      Usage   : part of the library
  10.  */
  11.  
  12. #include "../h/rccl.h"
  13. #include "../h/manip.h"
  14.  
  15. #define ISCONS(t)       ((t)->trsf->fn == const)
  16. #define ISHOLD(t)       ((t)->trsf->fn == hold)
  17. #define ISVARB(t)       ((t)->trsf->fn == varb)
  18. #define ISFUND(t)       (!(ISCONS(t) || ISHOLD(t) || ISVARB(t)))
  19.  
  20. /*
  21.  * collapses any possible pair of transforms in an equation
  22.  */
  23.  
  24.  
  25.  
  26. optimize(p) /*::*/
  27. register PST_PTR p;
  28. {
  29.     register TERM_PTR t, t1, t2;
  30.     TRSF_PTR first;
  31.     char *gensym();
  32.  
  33.     if (prints_out) {
  34.         fprintf(fpi, "optim, initial equation :\tT6 = ");
  35.         for (t = p->t6ptr->prev; t != p->t6ptr; t = t->prev) {
  36.             fprintf(fpi,
  37.                 t->rhs ? " %s%s" : " -%s%s", t->trsf->name,
  38.     ISCONS(t) ? "" : ISHOLD(t) ? "(h)" : ISVARB(t) ? "(v)" : "(s)");
  39.         }
  40.         fprintf(fpi, "\n");
  41.     }
  42.  
  43.     for (t = p->t6ptr->prev; t != p->t6ptr; t = t->prev) {
  44.         if (ISCONS(t) &&
  45.             ISCONS(t->prev) &&
  46.             t->prev != p->t6ptr &&
  47.             t->prev != p->tlptr) { /* found a pair */
  48.             if ((first = newtrans(gensym(), const)) == NULL) {
  49.                 giveup("mem. alloc error", YES);
  50.             }
  51.             t1 = t->next;
  52.             for (t2 = t; t2->prev != p->t6ptr &&
  53.                      t2->prev != p->tlptr &&
  54.                      ISCONS(t2->prev);
  55.                         t2 = t2->prev) {
  56.             }
  57.             t2 = t2->prev;
  58.             solved_n(first, t1, t2);
  59.             t->oldt = t->altr = t->trsf = first;
  60.             t->rhs = YES;
  61.             while (t->prev != t2) {
  62.                 t->prev = t->prev->prev;
  63.                 t->prev->next = t;
  64.             }
  65.             p->pos = p->tlptr->next;
  66.         }
  67.     }
  68.     if (prints_out) {
  69.         fprintf(fpi, "optim, final equation   :\tT6 = ");
  70.         for (t = p->t6ptr->prev; t != p->t6ptr; t = t->prev) {
  71.             fprintf(fpi,
  72.                 t->rhs ? " %s%s" : " -%s%s", t->trsf->name,
  73.     ISCONS(t) ? "" : ISHOLD(t) ? "(k)" : ISVARB(t) ? "(v)" : "(s)");
  74.         }
  75.         fprintf(fpi, "\n");
  76.     }
  77. }
  78.  
  79.  
  80. /*
  81.  * generates temp names
  82.  */
  83.  
  84. char *gensym()   /*::*/
  85. {
  86.     char *strsave(), *sprintf(), *strcpy(), *strcat();
  87.     static int n = 0;
  88.     static char root[] = "_TEMP", str[10], name[15];
  89.  
  90.     n++;
  91.  (void) sprintf(str, "%d", n);
  92.     return(strsave(strcat(strcpy(name,root), str)));
  93. }
  94.  
  95.  
  96.  
  97. char *strsave(s) /*::*/
  98. char *s;
  99. {
  100.     char *p, *malloc(), *strcpy();
  101.  
  102.     if ((p = malloc((unsigned)strlen(s) + 1)) == NULL) {
  103.         giveup("mem. alloc error", YES);
  104.     }
  105.  (void) strcpy(p, s);
  106.     return(p);
  107. }
  108.  
  109.