home *** CD-ROM | disk | FTP | other *** search
/ ftp.sunet.sepub/pictures / 2014.11.ftp.sunet.se-pictures.tar / ftp.sunet.se / pub / pictures / ACiD-artpacks / programs / unix / editors / gimp-plugins-unstable-0_99_23_tar.gz / gimp-plugins-unstable-0_99_23_tar / gimp-plugins-unstable-0.99.23 / mathmap / exprtree.c < prev    next >
C/C++ Source or Header  |  1998-02-19  |  4KB  |  198 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include "exprtree.h"
  5. #include "builtins.h"
  6.  
  7. extern double currentX,
  8.     currentY,
  9.     currentR,
  10.     currentA;
  11. extern int imageWidth,
  12.     imageHeight;
  13. extern int usesRA;
  14. extern int intersamplingEnabled;
  15.  
  16. exprtree*
  17. make_number (double num)
  18. {
  19.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  20.  
  21.     tree->type = EXPR_NUMBER;
  22.     tree->val.number = num;
  23.  
  24.     tree->next = 0;
  25.  
  26.     return tree;
  27. }
  28.  
  29. exprtree*
  30. make_var (char *name)
  31. {
  32.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  33.  
  34.     if (strcmp(name, "x") == 0)
  35.     tree->type = EXPR_VAR_X;
  36.     else if (strcmp(name, "y") == 0)
  37.     tree->type = EXPR_VAR_Y;
  38.     else if (strcmp(name, "t") == 0)
  39.     tree->type = EXPR_VAR_T;
  40.     else if (strcmp(name, "r") == 0)
  41.     {
  42.     tree->type = EXPR_VAR_R;
  43.     usesRA = 1;
  44.     }
  45.     else if (strcmp(name, "a") == 0)
  46.     {
  47.     tree->type = EXPR_VAR_A;
  48.     usesRA = 1;
  49.     }
  50.     else if (strcmp(name, "W") == 0)
  51.     tree->type = EXPR_VAR_W;
  52.     else if (strcmp(name, "H") == 0)
  53.     tree->type = EXPR_VAR_H;
  54.     else if (strcmp(name, "R") == 0)
  55.     tree->type = EXPR_VAR_BIG_R;
  56.     else if (strcmp(name, "X") == 0)
  57.     tree->type = EXPR_VAR_BIG_X;
  58.     else if (strcmp(name, "Y") == 0)
  59.     tree->type = EXPR_VAR_BIG_Y;
  60.     else
  61.     {
  62.     tree->type = EXPR_VARIABLE;
  63.     tree->val.var = register_variable(name);
  64.     }
  65.  
  66.     tree->next = 0;
  67.  
  68.     return tree;
  69. }
  70.  
  71. exprtree*
  72. make_operator (int type, exprtree *left, exprtree *right)
  73. {
  74.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  75.  
  76.     tree->type = type;
  77.     tree->val.operator.left = left;
  78.     tree->val.operator.right = right;
  79.  
  80.     tree->next = 0;
  81.  
  82.     return tree;
  83. }
  84.  
  85. exprtree*
  86. make_function (builtin *theBuiltin, exprtree *args)
  87. {
  88.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  89.  
  90.     tree->type = EXPR_FUNC;
  91.     tree->val.func.routine = theBuiltin->function;
  92.     tree->val.func.numArgs = theBuiltin->numParams;
  93.     tree->val.func.args = args;
  94.  
  95.     tree->next = 0;
  96.  
  97.     return tree;
  98. }
  99.  
  100. exprtree*
  101. make_sequence (exprtree *left, exprtree *right)
  102. {
  103.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  104.  
  105.     tree->type = EXPR_SEQUENCE;
  106.     tree->val.operator.left = left;
  107.     tree->val.operator.right = right;
  108.  
  109.     tree->next = 0;
  110.  
  111.     return tree;
  112. }
  113.  
  114. exprtree*
  115. make_assignment (char *name, exprtree *value)
  116. {
  117.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  118.     variable *var = register_variable(name);
  119.  
  120.     tree->type = EXPR_ASSIGNMENT;
  121.     tree->val.assignment.var = var;
  122.     tree->val.assignment.value = value;
  123.  
  124.     tree->next = 0;
  125.  
  126.     return tree;
  127. }
  128.  
  129. exprtree*
  130. make_if_then (exprtree *condition, exprtree *consequence)
  131. {
  132.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  133.  
  134.     tree->type = EXPR_IF_THEN;
  135.     tree->val.ifExpr.condition = condition;
  136.     tree->val.ifExpr.consequence = consequence;
  137.  
  138.     tree->next = 0;
  139.  
  140.     return tree;
  141. }
  142.  
  143. exprtree*
  144. make_if_then_else (exprtree *condition, exprtree *consequence, exprtree *alternative)
  145. {
  146.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  147.  
  148.     tree->type = EXPR_IF_THEN_ELSE;
  149.     tree->val.ifExpr.condition = condition;
  150.     tree->val.ifExpr.consequence = consequence;
  151.     tree->val.ifExpr.alternative = alternative;
  152.  
  153.     tree->next = 0;
  154.  
  155.     return tree;
  156. }
  157.  
  158. exprtree*
  159. make_while (exprtree *invariant, exprtree *body)
  160. {
  161.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  162.  
  163.     tree->type = EXPR_WHILE;
  164.     tree->val.whileExpr.invariant = invariant;
  165.     tree->val.whileExpr.body = body;
  166.  
  167.     tree->next = 0;
  168.  
  169.     return tree;
  170. }
  171.  
  172. exprtree*
  173. make_do_while (exprtree *body, exprtree *invariant)
  174. {
  175.     exprtree *tree = (exprtree*)malloc(sizeof(exprtree));
  176.  
  177.     tree->type = EXPR_DO_WHILE;
  178.     tree->val.whileExpr.invariant = invariant;
  179.     tree->val.whileExpr.body = body;
  180.  
  181.     tree->next = 0;
  182.  
  183.     return tree;
  184. }
  185.  
  186. exprtree*
  187. arglist_append (exprtree *list1, exprtree *list2)
  188. {
  189.     exprtree *tree = list1;
  190.  
  191.     while (tree->next != 0)
  192.     tree = tree->next;
  193.  
  194.     tree->next = list2;
  195.  
  196.     return list1;
  197. }
  198.