#define ABM add_message(buf); #define CLRSCR add_message("\e[2J"); add_message(MESSAGE_FLUSH); if ((strcmp(buf,"h") == 0) || (strcmp(buf,"hilfe") == 0)) { CLRSCR; add_message("Sunblades LPC-Debuggers Ultrakurzhilfeseite\n"); add_message("-------------------------------------------------------------\n"); add_message(" h -> Hilfe\n"); add_message(" s -> Status\n"); add_message(" lv -> List Vars\n"); add_message(" lf -> List Functions\n"); add_message(" i -> Inspect Variable\n"); add_message(" b -> Breakpoint setzen\n"); add_message(" n -> Next Instruction\n"); add_message(" c -> Continue to Breakpoint\n"); add_message(" t -> Trace into fuction\n"); add_message(" rtfm -> Read the fine Manual\n"); add_message(MESSAGE_FLUSH); } else if (strcmp(buf,"rftm") == 0) { add_message("READ THE FUCKING MANUAL !\n"); } else if ((strcmp(buf,"s") == 0) || (strcmp(buf,"status") == 0)) { CLRSCR; add_message("Statusinformationen ueber das aktuelle Objekt\n"); add_message("-------------------------------------------------------------\n"); sprintf(buf," Name : %s\n",current_object->name); ABM; sprintf(buf,"Anz. der globalen Vars : %d\n",current_object->prog->num_variables); ABM; sprintf(buf," Anz. der Funktionen : %d\n",current_object->prog->num_functions); ABM; sprintf(buf," Anz. der Strings : %d\n",current_object->prog->num_strings); ABM; sprintf(buf," Anz. der Inherits : %d\n",current_object->prog->num_inherited); ABM; add_message("\n"); add_message("Statusinformationen ueber die aktuelle Funktion \n"); add_message("-------------------------------------------------------------\n"); add_message(" Name : "); add_message((char *) (*( (char **) (&csp->funstart[-5]) ))); add_message("\n"); sprintf(buf," Anz. der lokalen Vars : %d\n",(csp->num_local_variables - csp->funstart[0])); ABM; sprintf(buf," Anz. der Parameter : %d\n",(csp->funstart[0])); ABM; } else if ((strcmp(buf,"lv") == 0) || (strcmp(buf,"list vars") == 0)) { CLRSCR; add_message("Liste der Variablen des aktuellen Objektes\n"); add_message("-------------------------------------------------------------\n"); if (current_object) { add_message("Objektglobale Variablen : \n"); for (lauf1 = 0;lauf1 < current_object->prog->num_variables;lauf1++) { sprintf(buf,"%s%n",current_object->prog->variable_names[lauf1].name,&lauf2); add_message(buf); if (!((lauf1 % 2) != 0)) { // *** Da es meist viele Objektglobale Variablen gibt, diese zweispaltig darstellen. for (lauf3 = lauf2; lauf3 < (NUMLINES / 2); lauf3++) { add_message(" "); } } else { add_message("\n"); } } if ((lauf1 % 2) != 0) { add_message("\n"); } add_message("\n"); // add_message("Funktionslokale Variablen : \n"); tempfunktion = locate_function((char *) (*( (char **) (&csp->funstart[-5]) )),current_object->prog); if (tempfunktion->variable_names != 0) { add_message("Funktionslokale Variablen : \n"); lauf1 = -1; do { lauf1++; sprintf(buf,"%s%n",tempfunktion->variable_names[lauf1].name,&lauf2); add_message(buf); if (!((lauf1 % 2) != 0)) { // *** Da es meist viele Objektglobale Variablen gibt, diese zweispaltig darstellen. for (lauf3 = lauf2; lauf3 < (NUMLINES / 2); lauf3++) { add_message(" "); } } else { add_message("\n"); } } while (tempfunktion->variable_names[lauf1].flags != 0xff); } } } else if ((strcmp(buf,"lf") == 0) || (strcmp(buf,"list fun") == 0)) { CLRSCR; add_message("Liste der Funktionen des aktuellen Objektes\n"); add_message("-------------------------------------------------------------\n"); sprintf(buf,"Anzahl der Funktionen : %d\n",current_object->prog->num_functions); ABM; for (lauf1 = 0; lauf1 < current_object->prog->num_functions; lauf1++ ) { printflags(buf2,current_object->prog->funktionsdaten[lauf1].flags); sprintf(buf,"%s %s%n",buf2,current_object->prog->funktionsdaten[lauf1].name,&lauf2); add_message(buf); if (!((lauf1 % 2) != 0)) { // *** Da es meist viele Objektglobale Variablen gibt, diese zweispaltig darstellen. for (lauf3 = lauf2; lauf3 < (NUMLINES / 2); lauf3++) { add_message(" "); } } else { add_message("\n"); } } } else if ((sscanf(buf,"i %s",buf2) == 1) || (sscanf(buf,"inspect %s",buf2) == 1)) { CLRSCR; sprintf(buf,"Auswertung der Variablen %s : \n",buf2); ABM; add_message("-------------------------------------------------------------\n"); // *** Erst festestellen. ob die Variable lokal vorhanden ist. // *** Sollte dies der Fall sein, dann diese Deklaration der globalen vorziehen. tempsvalue = get_local_variable_pointer(buf2); if (tempsvalue != 0) { buf[0] = 0x00; get_variable_data_for_svalue(buf,tempsvalue); add_message(buf); } else { tempsvalue = get_global_variable_pointer(buf2); if (tempsvalue != 0) { buf[0] = 0x00; get_variable_data_for_svalue(buf,tempsvalue); add_message(buf); } else { sprintf(buf," Leider konnte die Variable %s nicht gefunden werden !\n",buf2); ABM; } } add_message("\n"); } else if ((strcmp(buf,"lb") == 0) || (strcmp(buf,"list break") == 0)) { // *** Da moechte jemand schaun, welche Breakpoints er schon definiert // *** hat. CLRSCR; add_message("Anzeige der aktuell definierten Breakpoints\n"); add_message("-------------------------------------------------------------\n"); if (first_breakpoint == 0) { add_message("Bis jetzt sind noch keine Breakpoints definiert worden.\n"); } else { temp_breakpoint = first_breakpoint; while (temp_breakpoint != 0) { add_message("Nr. %d : Datei %s, Zeile %d\n",temp_breakpoint->number,temp_breakpoint->in_file,temp_breakpoint->line); temp_breakpoint = temp_breakpoint->next; } } add_message("\n"); } else if ((sscanf(buf,"b %s %d",buf2,&lauf1) == 2) || (sscanf(buf,"break %s %d",buf2,&lauf1) == 2)) { num_breakpoints++; sprintf(buf,"Breakpoint Nr. %d wird in der Datei %s, Zeile %d hinzugefuegt.\n",num_breakpoints,buf2,lauf1); add_message(buf); add_message("\n"); if (first_breakpoint == 0) // *** Bisher keine Breakpoints definiert. { temp_breakpoint = malloc(sizeof( struct breakpoint )); first_breakpoint = temp_breakpoint; } else { // *** Den letzten definierten Breakpoint suchen und da anhaengen. temp_breakpoint = first_breakpoint; while (temp_breakpoint->next != 0) { temp_breakpoint = temp_breakpoint->next; } temp_breakpoint->next = malloc( sizeof(struct breakpoint )); temp_breakpoint = temp_breakpoint->next; } // *** Die Struktur, in der wir unseren neuen Breakpoint ablegen koennen, // *** ist nun in Temp-Breakpoint. temp_breakpoint->next = 0; // *** Ich trau dem Mallloc nicht so ganz ! temp_breakpoint->line = lauf1; temp_breakpoint->in_file = malloc(strlen(buf2)+1); strcpy(temp_breakpoint->in_file,buf2); temp_breakpoint->number = num_breakpoints; } else if ((strcmp(buf,"c") == 0) || (strcmp(buf,"continue") == 0)) { running_program = 1; debug_ok = 1; add_message("Programm wird ausgefuehrt, bis ein Breakpoint erreicht wird !\n"); add_message(MESSAGE_FLUSH); } else if ((strcmp(buf,"n") == 0) || (strcmp(buf,"next") == 0)) { /* Kein Match gefunden. Weitermachen. */ debug_ok = 1; } else if ((strcmp(buf,"d") == 0) || (strcmp(buf,"debughook") == 0)) { add_message("Debug !\n"); add_message(MESSAGE_FLUSH); } else if ((strcmp(buf,"t") == 0) || (strcmp(buf,"trace") == 0)) { debug_ok = 1; flags_for_next_line = flags_for_next_line | FLAG_TRACE_INTO_NEXT_FUNCTION; } else if ((strcmp(buf,"fe") == 0) || (strcmp(buf,"funktionsede") == 0)) { debug_ok = 1; last_displayed_function->flags = (last_displayed_function->flags & !(FLAG_SHOW_THIS_FUNCTION)); } { /* Keine sinnvolle Eingabe -> Banner ausgeben */ print_banner = 1; }