Prevent error message if LD_LIBRARY_PATH is not being used.
[wine/wine-kai.git] / debugger / expr.c
blob2144a44b98ba797bb01c347b88132abafd8f93cb
1 /*
2 * File expr.c - expression handling for Wine internal debugger.
4 * Copyright (C) 1997, Eric Youngdale.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "config.h"
22 #include <stdlib.h>
23 #include <string.h>
24 #include "winbase.h"
25 #include "wine/winbase16.h"
26 #include "debugger.h"
27 #include "expr.h"
29 #include <stdarg.h>
31 struct expr
33 unsigned int perm;
34 unsigned int type:31;
35 union
37 struct
39 int value;
40 } constant;
42 struct
44 const char * str;
45 } string;
47 struct
49 unsigned int value;
50 } u_const;
52 struct
54 const char * name;
55 } symbol;
57 struct
59 const char * name;
60 } intvar;
62 struct
64 int unop_type;
65 struct expr * exp1;
66 int result;
67 } unop;
69 struct
71 int binop_type;
72 int result;
73 struct expr * exp1;
74 struct expr * exp2;
75 } binop;
77 struct
79 struct datatype * cast;
80 struct expr * expr;
81 } cast;
83 struct
85 struct expr * exp1;
86 const char * element_name;
87 int result;
88 } structure;
90 struct
92 struct expr * base;
93 struct expr * index;
94 } array;
96 struct
98 const char * funcname;
99 int nargs;
100 int result;
101 struct expr * arg[5];
102 } call;
104 } un;
107 #define EXPR_TYPE_CONST 0
108 #define EXPR_TYPE_US_CONST 1
109 #define EXPR_TYPE_SYMBOL 2
110 #define EXPR_TYPE_INTVAR 3
111 #define EXPR_TYPE_BINOP 4
112 #define EXPR_TYPE_UNOP 5
113 #define EXPR_TYPE_STRUCT 6
114 #define EXPR_TYPE_PSTRUCT 7
115 #define EXPR_TYPE_ARRAY 8
116 #define EXPR_TYPE_CALL 9
117 #define EXPR_TYPE_STRING 10
118 #define EXPR_TYPE_CAST 11
120 static char expr_list[4096];
121 static unsigned int next_expr_free = 0;
124 * This is how we turn an expression address into the actual value.
125 * This works well in the 32 bit domain - not sure at all about the
126 * 16 bit world.
128 #define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
130 static
131 struct expr *
132 DEBUG_GetFreeExpr(void)
134 struct expr * rtn;
136 rtn = (struct expr *) &expr_list[next_expr_free];
138 next_expr_free += sizeof(struct expr);
139 assert(next_expr_free < sizeof(expr_list));
141 return rtn;
144 void
145 DEBUG_FreeExprMem(void)
147 next_expr_free = 0;
150 struct expr *
151 DEBUG_TypeCastExpr(struct datatype * dt, struct expr * exp)
153 struct expr * ex;
155 ex = DEBUG_GetFreeExpr();
157 ex->type = EXPR_TYPE_CAST;
158 ex->un.cast.cast = dt;
159 ex->un.cast.expr = exp;
160 return ex;
163 struct expr *
164 DEBUG_IntVarExpr(const char* name)
166 struct expr * ex;
168 ex = DEBUG_GetFreeExpr();
170 ex->type = EXPR_TYPE_INTVAR;
171 ex->un.intvar.name = name;
172 return ex;
175 struct expr *
176 DEBUG_SymbolExpr(const char * name)
178 struct expr * ex;
180 ex = DEBUG_GetFreeExpr();
182 ex->type = EXPR_TYPE_SYMBOL;
183 ex->un.symbol.name = name;
184 return ex;
187 struct expr *
188 DEBUG_ConstExpr(int value)
190 struct expr * ex;
192 ex = DEBUG_GetFreeExpr();
194 ex->type = EXPR_TYPE_CONST;
195 ex->un.constant.value = value;
196 return ex;
199 struct expr *
200 DEBUG_StringExpr(const char * str)
202 struct expr * ex;
203 char * pnt;
204 ex = DEBUG_GetFreeExpr();
206 ex->type = EXPR_TYPE_STRING;
207 ex->un.string.str = str+1;
208 pnt = strrchr(ex->un.string.str, '"');
209 if( pnt != NULL )
211 *pnt = '\0';
213 return ex;
216 struct expr *
217 DEBUG_USConstExpr(unsigned int value)
219 struct expr * ex;
221 ex = DEBUG_GetFreeExpr();
223 ex->type = EXPR_TYPE_CONST;
224 ex->un.u_const.value = value;
225 return ex;
228 struct expr *
229 DEBUG_BinopExpr(int operator_type, struct expr * exp1, struct expr * exp2)
231 struct expr * ex;
233 ex = DEBUG_GetFreeExpr();
235 ex->type = EXPR_TYPE_BINOP;
236 ex->un.binop.binop_type = operator_type;
237 ex->un.binop.exp1 = exp1;
238 ex->un.binop.exp2 = exp2;
239 return ex;
242 struct expr *
243 DEBUG_UnopExpr(int operator_type, struct expr * exp1)
245 struct expr * ex;
247 ex = DEBUG_GetFreeExpr();
249 ex->type = EXPR_TYPE_UNOP;
250 ex->un.unop.unop_type = operator_type;
251 ex->un.unop.exp1 = exp1;
252 return ex;
255 struct expr *
256 DEBUG_StructExpr(struct expr * exp, const char * element)
258 struct expr * ex;
260 ex = DEBUG_GetFreeExpr();
262 ex->type = EXPR_TYPE_STRUCT;
263 ex->un.structure.exp1 = exp;
264 ex->un.structure.element_name = element;
265 return ex;
268 struct expr *
269 DEBUG_StructPExpr(struct expr * exp, const char * element)
271 struct expr * ex;
273 ex = DEBUG_GetFreeExpr();
275 ex->type = EXPR_TYPE_PSTRUCT;
276 ex->un.structure.exp1 = exp;
277 ex->un.structure.element_name = element;
278 return ex;
281 struct expr *
282 DEBUG_CallExpr(const char * funcname, int nargs, ...)
284 struct expr * ex;
285 va_list ap;
286 int i;
288 ex = DEBUG_GetFreeExpr();
290 ex->type = EXPR_TYPE_CALL;
291 ex->un.call.funcname = funcname;
292 ex->un.call.nargs = nargs;
294 va_start(ap, nargs);
295 for(i=0; i < nargs; i++)
297 ex->un.call.arg[i] = va_arg(ap, struct expr *);
299 va_end(ap);
300 return ex;
303 DBG_VALUE DEBUG_EvalExpr(struct expr * exp)
305 DBG_VALUE rtn;
306 int i;
307 DBG_VALUE exp1;
308 DBG_VALUE exp2;
309 unsigned int cexp[5];
310 int scale1;
311 int scale2;
312 int scale3;
313 struct datatype * type1;
314 struct datatype * type2;
316 rtn.type = NULL;
317 rtn.cookie = DV_INVALID;
318 rtn.addr.off = 0;
319 rtn.addr.seg = 0;
321 switch(exp->type)
323 case EXPR_TYPE_CAST:
324 rtn = DEBUG_EvalExpr(exp->un.cast.expr);
325 rtn.type = exp->un.cast.cast;
326 if (DEBUG_GetType(rtn.type) == DT_POINTER)
327 rtn.cookie = DV_TARGET;
328 break;
329 case EXPR_TYPE_STRING:
330 rtn.type = DEBUG_GetBasicType(DT_BASIC_STRING);
331 rtn.cookie = DV_HOST;
332 rtn.addr.off = (unsigned int) &exp->un.string.str;
333 rtn.addr.seg = 0;
334 break;
335 case EXPR_TYPE_CONST:
336 rtn.type = DEBUG_GetBasicType(DT_BASIC_CONST_INT);
337 rtn.cookie = DV_HOST;
338 rtn.addr.off = (unsigned int) &exp->un.constant.value;
339 rtn.addr.seg = 0;
340 break;
341 case EXPR_TYPE_US_CONST:
342 rtn.type = DEBUG_GetBasicType(DT_BASIC_USHORTINT);
343 rtn.cookie = DV_HOST;
344 rtn.addr.off = (unsigned int) &exp->un.u_const.value;
345 rtn.addr.seg = 0;
346 break;
347 case EXPR_TYPE_SYMBOL:
348 if( !DEBUG_GetSymbolValue(exp->un.symbol.name, -1, &rtn, FALSE) )
350 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.symbol.name);
351 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
353 break;
354 case EXPR_TYPE_PSTRUCT:
355 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
356 if( exp1.type == NULL )
358 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
360 rtn.cookie = DV_TARGET;
361 rtn.addr.off = DEBUG_TypeDerefPointer(&exp1, &rtn.type);
362 if( rtn.type == NULL )
364 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
366 if (!DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
367 &exp->un.structure.result))
369 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.structure.element_name);
370 RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
373 break;
374 case EXPR_TYPE_STRUCT:
375 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
376 if( exp1.type == NULL )
378 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
380 rtn = exp1;
381 if (!DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
382 &exp->un.structure.result))
384 DEBUG_Printf(DBG_CHN_MESG, "%s\n", exp->un.structure.element_name);
385 RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
387 break;
388 case EXPR_TYPE_CALL:
390 * First, evaluate all of the arguments. If any of them are not
391 * evaluable, then bail.
393 for(i=0; i < exp->un.call.nargs; i++)
395 exp1 = DEBUG_EvalExpr(exp->un.call.arg[i]);
396 if( exp1.type == NULL )
398 return rtn;
400 cexp[i] = DEBUG_GetExprValue(&exp1, NULL);
404 * Now look up the address of the function itself.
406 if( !DEBUG_GetSymbolValue(exp->un.call.funcname, -1, &rtn, FALSE ) )
408 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
411 #if 0
412 /* FIXME: NEWDBG NIY */
413 /* Anyway, I wonder how this could work depending on the calling order of
414 * the function (cdecl vs pascal for example)
416 int (*fptr)();
418 fptr = (int (*)()) rtn.addr.off;
419 switch(exp->un.call.nargs)
421 case 0:
422 exp->un.call.result = (*fptr)();
423 break;
424 case 1:
425 exp->un.call.result = (*fptr)(cexp[0]);
426 break;
427 case 2:
428 exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
429 break;
430 case 3:
431 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
432 break;
433 case 4:
434 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
435 break;
436 case 5:
437 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
438 break;
440 #else
441 DEBUG_Printf(DBG_CHN_MESG, "Function call no longer implemented\n");
442 /* would need to set up a call to this function, and then restore the current
443 * context afterwards...
445 exp->un.call.result = 0;
446 #endif
447 rtn.type = DEBUG_GetBasicType(DT_BASIC_INT);
448 rtn.cookie = DV_HOST;
449 rtn.addr.off = (unsigned int) &exp->un.call.result;
451 break;
452 case EXPR_TYPE_INTVAR:
455 DBG_INTVAR* div = DEBUG_GetIntVar(exp->un.intvar.name);
457 if (!div) RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
458 rtn.cookie = DV_HOST;
459 rtn.type = div->type;
460 rtn.addr.off = (unsigned int)div->pval;
461 /* EPP FIXME rtn.addr.seg = ?? */
463 break;
464 case EXPR_TYPE_BINOP:
465 exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
466 exp2 = DEBUG_EvalExpr(exp->un.binop.exp2);
467 rtn.cookie = DV_HOST;
468 if( exp1.type == NULL || exp2.type == NULL )
470 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
472 if( exp1.type == DEBUG_GetBasicType(DT_BASIC_CONST_INT) &&
473 exp2.type == DEBUG_GetBasicType(DT_BASIC_CONST_INT) )
475 rtn.type = exp1.type;
477 else
479 rtn.type = DEBUG_GetBasicType(DT_BASIC_INT);
481 rtn.addr.seg = 0;
482 rtn.addr.off = (unsigned int) &exp->un.binop.result;
483 switch(exp->un.binop.binop_type)
485 case EXP_OP_ADD:
486 type1 = DEBUG_GetPointerType(exp1.type);
487 type2 = DEBUG_GetPointerType(exp2.type);
488 scale1 = 1;
489 scale2 = 1;
490 if( type1 != NULL && type2 != NULL )
492 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
494 else if( type1 != NULL )
496 scale2 = DEBUG_GetObjectSize(type1);
497 rtn.type = exp1.type;
499 else if( type2 != NULL )
501 scale1 = DEBUG_GetObjectSize(type2);
502 rtn.type = exp2.type;
504 exp->un.binop.result = (VAL(exp1) * scale1 + scale2 * VAL(exp2));
505 break;
506 case EXP_OP_SUB:
507 type1 = DEBUG_GetPointerType(exp1.type);
508 type2 = DEBUG_GetPointerType(exp2.type);
509 scale1 = 1;
510 scale2 = 1;
511 scale3 = 1;
512 if( type1 != NULL && type2 != NULL )
514 if( type1 != type2 )
516 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
518 scale3 = DEBUG_GetObjectSize(type1);
520 else if( type1 != NULL )
522 scale2 = DEBUG_GetObjectSize(type1);
523 rtn.type = exp1.type;
526 else if( type2 != NULL )
528 scale1 = DEBUG_GetObjectSize(type2);
529 rtn.type = exp2.type;
531 exp->un.binop.result = (VAL(exp1) - VAL(exp2)) / scale3;
532 break;
533 case EXP_OP_SEG:
534 rtn.cookie = DV_TARGET;
535 rtn.type = NULL;
536 rtn.addr.seg = VAL(exp1);
537 rtn.addr.off = VAL(exp2);
538 break;
539 case EXP_OP_LOR:
540 exp->un.binop.result = (VAL(exp1) || VAL(exp2));
541 break;
542 case EXP_OP_LAND:
543 exp->un.binop.result = (VAL(exp1) && VAL(exp2));
544 break;
545 case EXP_OP_OR:
546 exp->un.binop.result = (VAL(exp1) | VAL(exp2));
547 break;
548 case EXP_OP_AND:
549 exp->un.binop.result = (VAL(exp1) & VAL(exp2));
550 break;
551 case EXP_OP_XOR:
552 exp->un.binop.result = (VAL(exp1) ^ VAL(exp2));
553 break;
554 case EXP_OP_EQ:
555 exp->un.binop.result = (VAL(exp1) == VAL(exp2));
556 break;
557 case EXP_OP_GT:
558 exp->un.binop.result = (VAL(exp1) > VAL(exp2));
559 break;
560 case EXP_OP_LT:
561 exp->un.binop.result = (VAL(exp1) < VAL(exp2));
562 break;
563 case EXP_OP_GE:
564 exp->un.binop.result = (VAL(exp1) >= VAL(exp2));
565 break;
566 case EXP_OP_LE:
567 exp->un.binop.result = (VAL(exp1) <= VAL(exp2));
568 break;
569 case EXP_OP_NE:
570 exp->un.binop.result = (VAL(exp1) != VAL(exp2));
571 break;
572 case EXP_OP_SHL:
573 exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
574 break;
575 case EXP_OP_SHR:
576 exp->un.binop.result = ((unsigned) VAL(exp1) >> VAL(exp2));
577 break;
578 case EXP_OP_MUL:
579 exp->un.binop.result = (VAL(exp1) * VAL(exp2));
580 break;
581 case EXP_OP_DIV:
582 if( VAL(exp2) == 0 )
584 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
586 exp->un.binop.result = (VAL(exp1) / VAL(exp2));
587 break;
588 case EXP_OP_REM:
589 if( VAL(exp2) == 0 )
591 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
593 exp->un.binop.result = (VAL(exp1) % VAL(exp2));
594 break;
595 case EXP_OP_ARR:
596 DEBUG_ArrayIndex(&exp1, &rtn, VAL(exp2));
597 break;
598 default:
599 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
600 break;
602 break;
603 case EXPR_TYPE_UNOP:
604 exp1 = DEBUG_EvalExpr(exp->un.unop.exp1);
605 rtn.cookie = DV_HOST;
606 if( exp1.type == NULL )
608 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
610 rtn.addr.seg = 0;
611 rtn.addr.off = (unsigned int) &exp->un.unop.result;
612 if( exp1.type == DEBUG_GetBasicType(DT_BASIC_CONST_INT) )
614 rtn.type = exp1.type;
616 else
618 rtn.type = DEBUG_GetBasicType(DT_BASIC_INT);
620 switch(exp->un.unop.unop_type)
622 case EXP_OP_NEG:
623 exp->un.unop.result = -VAL(exp1);
624 break;
625 case EXP_OP_NOT:
626 exp->un.unop.result = !VAL(exp1);
627 break;
628 case EXP_OP_LNOT:
629 exp->un.unop.result = ~VAL(exp1);
630 break;
631 case EXP_OP_DEREF:
632 /* FIXME: this is currently buggy.
633 * there is no way to tell were the deref:ed value is...
634 * for example:
635 * x is a pointer to struct s, x being on the stack
636 * => exp1 is target, result is target
637 * x is a pointer to struct s, x being optimized into a reg
638 * => exp1 is host, result is target
639 * x is a pointer to internal variable x
640 * => exp1 is host, result is host
641 * so we force DV_TARGET, because dereferencing pointers to
642 * internal variables is very unlikely. a correct fix would be
643 * rather large.
645 rtn.cookie = DV_TARGET;
646 rtn.addr.off = (unsigned int) DEBUG_TypeDerefPointer(&exp1, &rtn.type);
647 if (!rtn.type)
649 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
651 break;
652 case EXP_OP_FORCE_DEREF:
653 rtn.cookie = exp1.cookie;
654 rtn.addr.seg = exp1.addr.seg;
655 if (exp1.cookie == DV_TARGET)
656 DEBUG_READ_MEM((void*)exp1.addr.off, &rtn.addr.off, sizeof(rtn.addr.off));
657 else
658 memcpy(&rtn.addr.off, (void*)exp1.addr.off, sizeof(rtn.addr.off));
659 break;
660 case EXP_OP_ADDR:
661 /* FIXME: even for a 16 bit entity ? */
662 rtn.type = DEBUG_FindOrMakePointerType(exp1.type);
663 exp->un.unop.result = exp1.addr.off;
664 break;
665 default:
666 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
668 break;
669 default:
670 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression (%d).\n", exp->type);
671 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
672 break;
675 assert(rtn.cookie == DV_TARGET || rtn.cookie == DV_HOST);
677 return rtn;
682 DEBUG_DisplayExpr(const struct expr * exp)
684 int i;
686 switch(exp->type)
688 case EXPR_TYPE_CAST:
689 DEBUG_Printf(DBG_CHN_MESG, "((");
690 DEBUG_PrintTypeCast(exp->un.cast.cast);
691 DEBUG_Printf(DBG_CHN_MESG, ")");
692 DEBUG_DisplayExpr(exp->un.cast.expr);
693 DEBUG_Printf(DBG_CHN_MESG, ")");
694 break;
695 case EXPR_TYPE_INTVAR:
696 DEBUG_Printf(DBG_CHN_MESG, "$%s", exp->un.intvar.name);
697 break;
698 case EXPR_TYPE_US_CONST:
699 DEBUG_Printf(DBG_CHN_MESG, "%ud", exp->un.u_const.value);
700 break;
701 case EXPR_TYPE_CONST:
702 DEBUG_Printf(DBG_CHN_MESG, "%d", exp->un.u_const.value);
703 break;
704 case EXPR_TYPE_STRING:
705 DEBUG_Printf(DBG_CHN_MESG, "\"%s\"", exp->un.string.str);
706 break;
707 case EXPR_TYPE_SYMBOL:
708 DEBUG_Printf(DBG_CHN_MESG, "%s" , exp->un.symbol.name);
709 break;
710 case EXPR_TYPE_PSTRUCT:
711 DEBUG_DisplayExpr(exp->un.structure.exp1);
712 DEBUG_Printf(DBG_CHN_MESG, "->%s", exp->un.structure.element_name);
713 break;
714 case EXPR_TYPE_STRUCT:
715 DEBUG_DisplayExpr(exp->un.structure.exp1);
716 DEBUG_Printf(DBG_CHN_MESG, ".%s", exp->un.structure.element_name);
717 break;
718 case EXPR_TYPE_CALL:
719 DEBUG_Printf(DBG_CHN_MESG, "%s(",exp->un.call.funcname);
720 for(i=0; i < exp->un.call.nargs; i++)
722 DEBUG_DisplayExpr(exp->un.call.arg[i]);
723 if( i != exp->un.call.nargs - 1 )
725 DEBUG_Printf(DBG_CHN_MESG, ", ");
728 DEBUG_Printf(DBG_CHN_MESG, ")");
729 break;
730 case EXPR_TYPE_BINOP:
731 DEBUG_Printf(DBG_CHN_MESG, "( ");
732 DEBUG_DisplayExpr(exp->un.binop.exp1);
733 switch(exp->un.binop.binop_type)
735 case EXP_OP_ADD:
736 DEBUG_Printf(DBG_CHN_MESG, " + ");
737 break;
738 case EXP_OP_SUB:
739 DEBUG_Printf(DBG_CHN_MESG, " - ");
740 break;
741 case EXP_OP_SEG:
742 DEBUG_Printf(DBG_CHN_MESG, ":");
743 break;
744 case EXP_OP_LOR:
745 DEBUG_Printf(DBG_CHN_MESG, " || ");
746 break;
747 case EXP_OP_LAND:
748 DEBUG_Printf(DBG_CHN_MESG, " && ");
749 break;
750 case EXP_OP_OR:
751 DEBUG_Printf(DBG_CHN_MESG, " | ");
752 break;
753 case EXP_OP_AND:
754 DEBUG_Printf(DBG_CHN_MESG, " & ");
755 break;
756 case EXP_OP_XOR:
757 DEBUG_Printf(DBG_CHN_MESG, " ^ ");
758 break;
759 case EXP_OP_EQ:
760 DEBUG_Printf(DBG_CHN_MESG, " == ");
761 break;
762 case EXP_OP_GT:
763 DEBUG_Printf(DBG_CHN_MESG, " > ");
764 break;
765 case EXP_OP_LT:
766 DEBUG_Printf(DBG_CHN_MESG, " < ");
767 break;
768 case EXP_OP_GE:
769 DEBUG_Printf(DBG_CHN_MESG, " >= ");
770 break;
771 case EXP_OP_LE:
772 DEBUG_Printf(DBG_CHN_MESG, " <= ");
773 break;
774 case EXP_OP_NE:
775 DEBUG_Printf(DBG_CHN_MESG, " != ");
776 break;
777 case EXP_OP_SHL:
778 DEBUG_Printf(DBG_CHN_MESG, " << ");
779 break;
780 case EXP_OP_SHR:
781 DEBUG_Printf(DBG_CHN_MESG, " >> ");
782 break;
783 case EXP_OP_MUL:
784 DEBUG_Printf(DBG_CHN_MESG, " * ");
785 break;
786 case EXP_OP_DIV:
787 DEBUG_Printf(DBG_CHN_MESG, " / ");
788 break;
789 case EXP_OP_REM:
790 DEBUG_Printf(DBG_CHN_MESG, " %% ");
791 break;
792 case EXP_OP_ARR:
793 DEBUG_Printf(DBG_CHN_MESG, "[");
794 break;
795 default:
796 break;
798 DEBUG_DisplayExpr(exp->un.binop.exp2);
799 if( exp->un.binop.binop_type == EXP_OP_ARR )
801 DEBUG_Printf(DBG_CHN_MESG, "]");
803 DEBUG_Printf(DBG_CHN_MESG, " )");
804 break;
805 case EXPR_TYPE_UNOP:
806 switch(exp->un.unop.unop_type)
808 case EXP_OP_NEG:
809 DEBUG_Printf(DBG_CHN_MESG, "-");
810 break;
811 case EXP_OP_NOT:
812 DEBUG_Printf(DBG_CHN_MESG, "!");
813 break;
814 case EXP_OP_LNOT:
815 DEBUG_Printf(DBG_CHN_MESG, "~");
816 break;
817 case EXP_OP_DEREF:
818 DEBUG_Printf(DBG_CHN_MESG, "*");
819 break;
820 case EXP_OP_ADDR:
821 DEBUG_Printf(DBG_CHN_MESG, "&");
822 break;
824 DEBUG_DisplayExpr(exp->un.unop.exp1);
825 break;
826 default:
827 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
828 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
829 break;
832 return TRUE;
835 struct expr *
836 DEBUG_CloneExpr(const struct expr * exp)
838 int i;
839 struct expr * rtn;
841 rtn = (struct expr *) DBG_alloc(sizeof(struct expr));
844 * First copy the contents of the expression itself.
846 *rtn = *exp;
849 switch(exp->type)
851 case EXPR_TYPE_CAST:
852 rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
853 break;
854 case EXPR_TYPE_INTVAR:
855 rtn->un.intvar.name = DBG_strdup(exp->un.intvar.name);
856 break;
857 case EXPR_TYPE_US_CONST:
858 case EXPR_TYPE_CONST:
859 break;
860 case EXPR_TYPE_STRING:
861 rtn->un.string.str = DBG_strdup(exp->un.string.str);
862 break;
863 case EXPR_TYPE_SYMBOL:
864 rtn->un.symbol.name = DBG_strdup(exp->un.symbol.name);
865 break;
866 case EXPR_TYPE_PSTRUCT:
867 case EXPR_TYPE_STRUCT:
868 rtn->un.structure.exp1 = DEBUG_CloneExpr(exp->un.structure.exp1);
869 rtn->un.structure.element_name = DBG_strdup(exp->un.structure.element_name);
870 break;
871 case EXPR_TYPE_CALL:
872 for(i=0; i < exp->un.call.nargs; i++)
874 rtn->un.call.arg[i] = DEBUG_CloneExpr(exp->un.call.arg[i]);
876 rtn->un.call.funcname = DBG_strdup(exp->un.call.funcname);
877 break;
878 case EXPR_TYPE_BINOP:
879 rtn->un.binop.exp1 = DEBUG_CloneExpr(exp->un.binop.exp1);
880 rtn->un.binop.exp2 = DEBUG_CloneExpr(exp->un.binop.exp2);
881 break;
882 case EXPR_TYPE_UNOP:
883 rtn->un.unop.exp1 = DEBUG_CloneExpr(exp->un.unop.exp1);
884 break;
885 default:
886 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
887 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
888 break;
891 return rtn;
896 * Recursively go through an expression tree and free all memory associated
897 * with it.
900 DEBUG_FreeExpr(struct expr * exp)
902 int i;
904 switch(exp->type)
906 case EXPR_TYPE_CAST:
907 DEBUG_FreeExpr(exp->un.cast.expr);
908 break;
909 case EXPR_TYPE_INTVAR:
910 DBG_free((char *) exp->un.intvar.name);
911 break;
912 case EXPR_TYPE_US_CONST:
913 case EXPR_TYPE_CONST:
914 break;
915 case EXPR_TYPE_STRING:
916 DBG_free((char *) exp->un.string.str);
917 break;
918 case EXPR_TYPE_SYMBOL:
919 DBG_free((char *) exp->un.symbol.name);
920 break;
921 case EXPR_TYPE_PSTRUCT:
922 case EXPR_TYPE_STRUCT:
923 DEBUG_FreeExpr(exp->un.structure.exp1);
924 DBG_free((char *) exp->un.structure.element_name);
925 break;
926 case EXPR_TYPE_CALL:
927 for(i=0; i < exp->un.call.nargs; i++)
929 DEBUG_FreeExpr(exp->un.call.arg[i]);
931 DBG_free((char *) exp->un.call.funcname);
932 break;
933 case EXPR_TYPE_BINOP:
934 DEBUG_FreeExpr(exp->un.binop.exp1);
935 DEBUG_FreeExpr(exp->un.binop.exp2);
936 break;
937 case EXPR_TYPE_UNOP:
938 DEBUG_FreeExpr(exp->un.unop.exp1);
939 break;
940 default:
941 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
942 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
943 break;
946 DBG_free(exp);
947 return TRUE;