|  | /* | 
|  | * File display.c - display handling for Wine internal debugger. | 
|  | * | 
|  | * Copyright (C) 1997, Eric Youngdale. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <limits.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  | #include "debugger.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #define MAX_DISPLAY 25 | 
|  |  | 
|  | struct display | 
|  | { | 
|  | struct expr *	exp; | 
|  | int		count; | 
|  | char		format; | 
|  | }; | 
|  |  | 
|  | static struct display displaypoints[MAX_DISPLAY]; | 
|  |  | 
|  | int | 
|  | DEBUG_AddDisplay(struct expr * exp, int count, char format) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | /* | 
|  | * First find a slot where we can store this display. | 
|  | */ | 
|  | for(i=0; i < MAX_DISPLAY; i++ ) | 
|  | { | 
|  | if( displaypoints[i].exp == NULL ) | 
|  | { | 
|  | displaypoints[i].exp = DEBUG_CloneExpr(exp); | 
|  | displaypoints[i].count  = count; | 
|  | displaypoints[i].format = format; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | int | 
|  | DEBUG_InfoDisplay(void) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | /* | 
|  | * First find a slot where we can store this display. | 
|  | */ | 
|  | for(i=0; i < MAX_DISPLAY; i++ ) | 
|  | { | 
|  | if( displaypoints[i].exp != NULL ) | 
|  | { | 
|  | DEBUG_Printf(DBG_CHN_MESG, "%d : ", i+1); | 
|  | DEBUG_DisplayExpr(displaypoints[i].exp); | 
|  | DEBUG_Printf(DBG_CHN_MESG, "\n"); | 
|  | } | 
|  | } | 
|  |  | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | int | 
|  | DEBUG_DoDisplay(void) | 
|  | { | 
|  | DBG_VALUE	value; | 
|  | int		i; | 
|  |  | 
|  | /* | 
|  | * First find a slot where we can store this display. | 
|  | */ | 
|  | for(i=0; i < MAX_DISPLAY; i++ ) | 
|  | { | 
|  | if( displaypoints[i].exp != NULL ) | 
|  | { | 
|  | value = DEBUG_EvalExpr(displaypoints[i].exp); | 
|  | if( value.type == NULL ) | 
|  | { | 
|  | DEBUG_Printf(DBG_CHN_MESG, "Unable to evaluate expression "); | 
|  | DEBUG_DisplayExpr(displaypoints[i].exp); | 
|  | DEBUG_Printf(DBG_CHN_MESG, "\nDisabling...\n"); | 
|  | DEBUG_DelDisplay(i); | 
|  | } | 
|  | else | 
|  | { | 
|  | DEBUG_Printf(DBG_CHN_MESG, "%d  : ", i + 1); | 
|  | DEBUG_DisplayExpr(displaypoints[i].exp); | 
|  | DEBUG_Printf(DBG_CHN_MESG, " = "); | 
|  | if( displaypoints[i].format == 'i' ) | 
|  | { | 
|  | DEBUG_ExamineMemory( &value, | 
|  | displaypoints[i].count, | 
|  | displaypoints[i].format); | 
|  | } | 
|  | else | 
|  | { | 
|  | DEBUG_Print( &value, | 
|  | displaypoints[i].count, | 
|  | displaypoints[i].format, 0); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | int | 
|  | DEBUG_DelDisplay(int displaynum) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | if( displaynum >= MAX_DISPLAY || displaynum == 0 || displaynum < -1 ) | 
|  | { | 
|  | DEBUG_Printf(DBG_CHN_MESG, "Invalid display number\n"); | 
|  | return TRUE; | 
|  | } | 
|  | if( displaynum == -1 ) | 
|  | { | 
|  | for(i=0; i < MAX_DISPLAY; i++ ) | 
|  | { | 
|  | if( displaypoints[i].exp != NULL ) | 
|  | { | 
|  | DEBUG_FreeExpr(displaypoints[i].exp); | 
|  | displaypoints[i].exp = NULL; | 
|  | } | 
|  | } | 
|  | } | 
|  | else if( displaypoints[displaynum - 1].exp != NULL ) | 
|  | { | 
|  | DEBUG_FreeExpr(displaypoints[displaynum - 1].exp); | 
|  | displaypoints[displaynum - 1].exp = NULL; | 
|  | } | 
|  | return TRUE; | 
|  | } |