"I am a person who works hard and plays hard."

Yuan Wei
Second Year Graduate Student Department of Computer Science
University of Virginia Charlottesville, VA 22903
Email: yw3f@cs.virginia.edu


Source Code Analysis

Main Page   Compound List   File List   Compound Members   File Members  

eval.h File Reference

#include <stdio.h>
#include "host.h"
#include "misc.h"
#include "machine.h"

Include dependency graph for eval.h:

Include dependency graph

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Compounds

Defines

Enumerations

Functions

Variables


Define Documentation

#define EVAL_INTEGRAL TYPE       ((TYPE) == et_int || (TYPE) == et_uint || (TYPE) == et_addr)
 

Definition at line 156 of file eval.h.

Referenced by dlite_break(), dlite_cont(), dlite_dbreak(), dlite_delete(), dlite_dis(), dlite_display(), and dlite_dump().


Enumeration Type Documentation

enum eval_err_t
 

Enumeration values:
ERR_NOERR 
ERR_UPAREN 
ERR_NOTERM 
ERR_DIV0 
ERR_BADCONST 
ERR_BADEXPR 
ERR_UNDEFVAR 
ERR_EXTRA 
ERR_NUM 

Definition at line 117 of file eval.h.

00117                 {
00118   ERR_NOERR,                    /* no error */
00119   ERR_UPAREN,                   /* unmatched parenthesis */
00120   ERR_NOTERM,                   /* expression term is missing */
00121   ERR_DIV0,                     /* divide by zero */
00122   ERR_BADCONST,                 /* badly formed constant */
00123   ERR_BADEXPR,                  /* badly formed constant */
00124   ERR_UNDEFVAR,                 /* variable is undefined */
00125   ERR_EXTRA,                    /* extra characters at end of expression */
00126   ERR_NUM
00127 };

enum eval_token_t
 

Enumeration values:
tok_ident 
tok_const 
tok_plus 
tok_minus 
tok_mult 
tok_div 
tok_oparen 
tok_cparen 
tok_eof 
tok_whitespace 
tok_invalid 

Definition at line 92 of file eval.h.

Referenced by expr(), factor(), get_next_token(), and term().

00092                   {
00093   tok_ident,            /* user-valued identifiers */
00094   tok_const,            /* numeric literals */
00095   tok_plus,             /* `+' */
00096   tok_minus,            /* `-' */
00097   tok_mult,             /* `*' */
00098   tok_div,              /* `/' */
00099   tok_oparen,           /* `(' */
00100   tok_cparen,           /* `)' */
00101   tok_eof,              /* end of file */
00102   tok_whitespace,       /* ` ', `\t', `\n' */
00103   tok_invalid           /* unrecognized token */
00104 };

enum eval_type_t
 

Enumeration values:
et_int 
et_uint 
et_addr 
et_float 
et_double 
et_symbol 
et_NUM 

Definition at line 136 of file eval.h.

Referenced by f_add(), f_div(), f_mult(), f_sub(), and result_type().

00136                  {
00137   et_int,                       /* signed integer result */
00138   et_uint,                      /* unsigned integer result */
00139   et_addr,                      /* address value */
00140 #ifdef HOST_HAS_QWORD
00141   et_qword,                     /* unsigned qword length integer result */
00142   et_sqword,                    /* signed qword length integer result */
00143 #endif /* HOST_HAS_QWORD */
00144   et_float,                     /* single-precision floating point value */
00145   et_double,                    /* double-precision floating point value */
00146   et_symbol,                    /* non-numeric result (!allowed in exprs)*/
00147   et_NUM
00148 };


Function Documentation

md_addr_t eval_as_addr struct eval_value_t    val
 

Definition at line 437 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, panic(), eval_value_t::type, and eval_value_t::value.

Referenced by dlite_break(), dlite_cont(), dlite_dbreak(), dlite_dis(), dlite_display(), dlite_dump(), f_add(), f_div(), f_mult(), f_sub(), md_reg_obj(), and simoo_reg_obj().

00438 {
00439   switch (val.type)
00440     {
00441     case et_double:
00442       return (md_addr_t)val.value.as_double;
00443     case et_float:
00444       return (md_addr_t)val.value.as_float;
00445 #ifdef HOST_HAS_QWORD
00446     case et_qword:
00447       return (md_addr_t)val.value.as_qword;
00448     case et_sqword:
00449       return (md_addr_t)val.value.as_sqword;
00450 #endif /* HOST_HAS_QWORD */
00451     case et_addr:
00452       return val.value.as_addr;
00453     case et_uint:
00454       return (md_addr_t)val.value.as_uint;
00455     case et_int:
00456       return (md_addr_t)val.value.as_int;
00457     case et_symbol:
00458       panic("symbol used in expression");
00459     default:
00460       panic("illegal arithmetic expression conversion");
00461     }
00462 }

double eval_as_double struct eval_value_t    val
 

Definition at line 305 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, panic(), eval_value_t::type, and eval_value_t::value.

Referenced by f_add(), f_div(), f_mult(), f_sub(), md_reg_obj(), and print_val().

00306 {
00307   switch (val.type)
00308     {
00309     case et_double:
00310       return val.value.as_double;
00311     case et_float:
00312       return (double)val.value.as_float;
00313 #ifdef HOST_HAS_QWORD
00314     case et_qword:
00315 #ifdef _MSC_VER /* FIXME: MSC does not implement qword_t to dbl conversion */
00316       return (double)(sqword_t)val.value.as_qword;
00317 #else /* !_MSC_VER */
00318       return (double)val.value.as_qword;
00319 #endif /* _MSC_VER */
00320     case et_sqword:
00321       return (double)val.value.as_sqword;
00322 #endif /* HOST_HAS_QWORD */
00323     case et_addr:
00324 #if defined(_MSC_VER) && defined(TARGET_ALPHA)
00325       /* FIXME: MSC does not implement qword_t to double conversion */
00326       return (double)(sqword_t)val.value.as_addr;
00327 #else
00328       return (double)val.value.as_addr;
00329 #endif
00330     case et_uint:
00331       return (double)val.value.as_uint;
00332     case et_int:
00333       return (double)val.value.as_int;
00334     case et_symbol:
00335       panic("symbol used in expression");
00336     default:
00337       panic("illegal arithmetic expression conversion");
00338     }
00339 }

float eval_as_float struct eval_value_t    val
 

Definition at line 343 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, panic(), eval_value_t::type, and eval_value_t::value.

Referenced by f_add(), f_div(), f_mult(), f_sub(), md_reg_obj(), and print_val().

00344 {
00345   switch (val.type)
00346     {
00347     case et_double:
00348       return (float)val.value.as_double;
00349     case et_float:
00350       return val.value.as_float;
00351 #ifdef HOST_HAS_QWORD
00352     case et_qword:
00353 #ifdef _MSC_VER /* FIXME: MSC does not implement qword_t to dbl conversion */
00354       return (float)(sqword_t)val.value.as_qword;
00355 #else /* !_MSC_VER */
00356       return (float)val.value.as_qword;
00357 #endif /* _MSC_VER */
00358     case et_sqword:
00359       return (float)val.value.as_sqword;
00360 #endif /* HOST_HAS_QWORD */
00361     case et_addr:
00362 #if defined(_MSC_VER) && defined(TARGET_ALPHA)
00363       /* FIXME: MSC does not implement qword_t to double conversion */
00364       return (float)(sqword_t)val.value.as_addr;
00365 #else
00366       return (float)val.value.as_addr;
00367 #endif
00368     case et_uint:
00369       return (float)val.value.as_uint;
00370     case et_int:
00371       return (float)val.value.as_int;
00372     case et_symbol:
00373       panic("symbol used in expression");
00374     default:
00375       panic("illegal arithmetic expression conversion");
00376     }
00377 }

int eval_as_int struct eval_value_t    val
 

Definition at line 495 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, panic(), eval_value_t::type, and eval_value_t::value.

Referenced by f_add(), f_div(), f_mult(), and f_sub().

00496 {
00497   switch (val.type)
00498     {
00499     case et_double:
00500       return (int)val.value.as_double;
00501     case et_float:
00502       return (int)val.value.as_float;
00503 #ifdef HOST_HAS_QWORD
00504     case et_qword:
00505       return (int)val.value.as_qword;
00506     case et_sqword:
00507       return (int)val.value.as_sqword;
00508 #endif /* HOST_HAS_QWORD */
00509     case et_addr:
00510       return (int)val.value.as_addr;
00511     case et_uint:
00512       return (int)val.value.as_uint;
00513     case et_int:
00514       return val.value.as_int;
00515     case et_symbol:
00516       panic("symbol used in expression");
00517     default:
00518       panic("illegal arithmetic expression conversion");
00519     }
00520 }

unsigned int eval_as_uint struct eval_value_t    val
 

Definition at line 466 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, panic(), eval_value_t::type, and eval_value_t::value.

Referenced by dlite_delete(), dlite_dis(), dlite_dump(), f_add(), f_div(), f_mult(), f_sub(), md_reg_obj(), print_val(), and simoo_reg_obj().

00467 {
00468   switch (val.type)
00469     {
00470     case et_double:
00471       return (unsigned int)val.value.as_double;
00472     case et_float:
00473       return (unsigned int)val.value.as_float;
00474 #ifdef HOST_HAS_QWORD
00475     case et_qword:
00476       return (unsigned int)val.value.as_qword;
00477     case et_sqword:
00478       return (unsigned int)val.value.as_sqword;
00479 #endif /* HOST_HAS_QWORD */
00480     case et_addr:
00481       return (unsigned int)val.value.as_addr;
00482     case et_uint:
00483       return val.value.as_uint;
00484     case et_int:
00485       return (unsigned int)val.value.as_int;
00486     case et_symbol:
00487       panic("symbol used in expression");
00488     default:
00489       panic("illegal arithmetic expression conversion");
00490     }
00491 }

void eval_delete struct eval_state_t   es
 

Definition at line 1117 of file eval.c.

Referenced by ident_evaluator(), stat_delete(), stat_eval_ident(), and stat_print_stat().

01118 {
01119   free(es);
01120 }

struct eval_value_t eval_expr struct eval_state_t   es,
char *    p,
char **    endp
 

Definition at line 1125 of file eval.c.

References ERR_NOERR, eval_error, expr(), and tok_invalid.

Referenced by dlite_exec(), ident_evaluator(), stat_eval_ident(), and stat_print_stat().

01128 {
01129   struct eval_value_t val;
01130 
01131   /* initialize the evaluator state */
01132   eval_error = ERR_NOERR;
01133   es->p = p;
01134   *es->tok_buf = '\0';
01135   es->peek_tok = tok_invalid;
01136 
01137   /* evaluate the expression */
01138   val = expr(es);
01139 
01140   /* return a pointer to the first character not used in the expression */
01141   if (endp)
01142     {
01143       if (es->peek_tok != tok_invalid)
01144         {
01145           /* did not consume peek'ed token, so return last p */
01146           *endp = es->lastp;
01147         }
01148       else
01149         *endp = es->p;
01150     }
01151 
01152   return val;
01153 }

struct eval_state_t* eval_new eval_ident_t    f_eval_ident,
void *    user_ptr
 

Definition at line 1100 of file eval.c.

References eval_state_t::f_eval_ident, fatal(), and eval_state_t::user_ptr.

Referenced by dlite_init(), ident_evaluator(), stat_eval_ident(), stat_new(), and stat_print_stat().

01102 {
01103   struct eval_state_t *es;
01104 
01105   es = calloc(1, sizeof(struct eval_state_t));
01106   if (!es)
01107     fatal("out of virtual memory");
01108 
01109   es->f_eval_ident = f_eval_ident;
01110   es->user_ptr = user_ptr;
01111 
01112   return es;
01113 }

void eval_print FILE *    stream,
struct eval_value_t    val
 

Definition at line 1157 of file eval.c.

References et_addr, et_double, et_float, et_int, et_symbol, et_uint, myfprintf(), panic(), eval_value_t::type, and eval_value_t::value.

01159 {
01160   switch (val.type)
01161     {
01162     case et_double:
01163       fprintf(stream, "%f [double]", val.value.as_double);
01164       break;
01165     case et_float:
01166       fprintf(stream, "%f [float]", (double)val.value.as_float);
01167       break;
01168 #ifdef HOST_HAS_QWORD
01169     case et_qword:
01170       myfprintf(stream, "%lu [qword_t]", val.value.as_qword);
01171       break;
01172     case et_sqword:
01173       myfprintf(stream, "%ld [sqword_t]", val.value.as_sqword);
01174       break;
01175 #endif /* HOST_HAS_QWORD */
01176     case et_addr:
01177       myfprintf(stream, "0x%p [md_addr_t]", val.value.as_addr);
01178       break;
01179     case et_uint:
01180       fprintf(stream, "%u [uint]", val.value.as_uint);
01181       break;
01182     case et_int:
01183       fprintf(stream, "%d [int]", val.value.as_int);
01184       break;
01185     case et_symbol:
01186       fprintf(stream, "\"%s\" [symbol]", val.value.as_symbol);
01187       break;
01188     default:
01189       panic("bogus expression type");
01190     }
01191 }


Variable Documentation

char* eval_err_str[ERR_NUM]
 

Definition at line 133 of file eval.h.

enum eval_err_t eval_error
 

Definition at line 130 of file eval.h.

Referenced by constant(), eval_expr(), f_add(), f_div(), f_eq_zero(), f_mult(), f_neg(), f_sub(), factor(), and term().

struct eval_value_t(* eval_ident_t)(struct eval_state_t *es)
 

Definition at line 89 of file eval.h.

char* eval_type_str[et_NUM]
 

Definition at line 161 of file eval.h.



UVa CS Department of Computer Science
School of Engineering, University of Virginia
151 Engineer's Way, P.O. Box 400740
Charlottesville, Virginia 22904-4740

(434) 982-2200  Fax: (434) 982-2214