home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume8 / graph+ / part02 / evaltab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-03-01  |  2.9 KB  |  120 lines

  1. /*
  2.  * Copyright (C) 1986   Alan Kent
  3.  *
  4.  * Permission is granted to freely distribute part or
  5.  * all of this code as long as it is not for profit
  6.  * and this message is retained in the code.
  7.  *
  8.  * No resposibility is taken for any damage or incorect
  9.  * results this program generates.
  10.  * 
  11.  */
  12.  
  13.  
  14. #include <stdio.h>
  15. #include "graph.h"
  16. #include "y.tab.h"
  17.  
  18.  
  19. extern table_st *append_tables ();
  20. extern table_st *adjacent ();
  21. extern table_st *project ();
  22. extern table_st *select ();
  23. extern table_st *sort ();
  24. extern table_st *join ();
  25. extern table_st *tab_lookup ();
  26. extern table_st *group ();
  27. extern table_st *cumulate ();
  28. extern table_st *generate ();
  29. extern table_st *call_tab_fun ();
  30. extern table_st *new_table ();
  31. extern table_st *copy_of_table ();
  32. extern double eval ();
  33.  
  34.  
  35. table_st *
  36. eval_tab ( expr )
  37. tnode_st *expr;
  38. {
  39.     trow_st *trp;
  40.     tcol_st *tcp;
  41.     int num_rows , num_cols , tmp_cols;
  42.     table_st *newtab , *tp;
  43.     int row;
  44.  
  45.  
  46.     switch ( expr->operator ) {
  47.  
  48.     case TABLE :
  49.     num_rows = 0;
  50.     num_cols = 0;
  51.     for ( trp = expr->const_table; trp != NULL; trp = trp->next ) {
  52.         tmp_cols = 0;
  53.         for ( tcp = trp->cols; tcp != NULL; tcp = tcp->next ) {
  54.         tmp_cols++;
  55.         }
  56.         if ( num_rows == 0 )
  57.         num_cols = tmp_cols;
  58.         else
  59.         if ( num_cols != tmp_cols )
  60.             abort ( "constant table has rows with different number of columns" );
  61.         num_rows++;
  62.     }
  63.     newtab = new_table ( num_cols , num_rows );
  64.     row = 0;
  65.     for ( trp = expr->const_table; trp != NULL; trp = trp->next ) {
  66.         for ( tcp = trp->cols, tp = newtab; tcp != NULL; tcp = tcp->next, tp = tp->next ) {
  67.         tp->data[ row ] = eval ( NULL , 0 , tcp->expr );
  68.         }
  69.         row++;
  70.     }
  71.     return ( newtab );
  72.     break;
  73.  
  74.     case TAB_CONST :
  75.     return ( copy_of_table ( expr->table ) );
  76.     
  77.     case FTAB_IDENT :
  78.     return ( call_tab_fun ( expr->ident , expr->parm_list , NULL , 0 ) );
  79.  
  80.     case APPEND :
  81.     return ( append_tables ( eval_tab ( expr->left ) ,
  82.         eval_tab ( expr->right ) ) );
  83.     
  84.     case ADJACENT :
  85.     return ( adjacent ( eval_tab ( expr->left ) ,
  86.         eval_tab ( expr->right ) ) );
  87.     
  88.     case PROJECT :
  89.     return ( project ( eval_tab ( expr->left ) , expr->expr_list ) );
  90.  
  91.     case WHERE :
  92.     return ( select ( eval_tab ( expr->left ) , expr->expr ) );
  93.  
  94.     case SORT :
  95.     return ( sort ( eval_tab ( expr->left ) , (int)eval ( NULL , 0 , expr->expr ) ) );
  96.  
  97.     case JOIN :
  98.     return ( join ( eval_tab ( expr->left ) , eval_tab ( expr->right ) ,
  99.         (int)eval ( NULL , 0 , expr->expr->left ) ,
  100.         (int)eval ( NULL , 0 , expr->expr->right ) ) );
  101.  
  102.     case CUMULATE :
  103.     return ( cumulate ( eval_tab ( expr->left ) , (int)eval ( NULL , 0 , expr->expr ) ) );
  104.  
  105.     case GENERATE :
  106.     return ( generate ( expr->range , expr->interval ) );
  107.  
  108.     case TAB_IDENT :
  109.     return ( tab_lookup ( expr->ident ) );
  110.  
  111.     case GROUP :
  112.     return ( group ( eval_tab ( expr->left ) , expr->range , expr->interval , expr->ident ) );
  113.  
  114.     default :
  115.     abort ( "unknown operator in eval_tab: %d" , expr->operator );
  116.  
  117.     }
  118.     return ( NULL );
  119. }
  120.