Revision: 714 http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=714&view=rev Author: dmaphy Date: 2009-06-12 22:12:12 +0000 (Fri, 12 Jun 2009)
Log Message: ----------- add the project files of geanygdb to the new plugin tree
Added Paths: ----------- trunk/geany-plugins/geanygdb/doc/ trunk/geany-plugins/geanygdb/doc/geany.css trunk/geany-plugins/geanygdb/po/ trunk/geany-plugins/geanygdb/po/.gitignore trunk/geany-plugins/geanygdb/po/ChangeLog trunk/geany-plugins/geanygdb/po/LINGUAS trunk/geany-plugins/geanygdb/po/POTFILES.in trunk/geany-plugins/geanygdb/po/POTFILES.skip trunk/geany-plugins/geanygdb/po/de.po trunk/geany-plugins/geanygdb/po/ru.po trunk/geany-plugins/geanygdb/src/ trunk/geany-plugins/geanygdb/src/Makefile.am trunk/geany-plugins/geanygdb/src/gdb-io-break.c trunk/geany-plugins/geanygdb/src/gdb-io-envir.c trunk/geany-plugins/geanygdb/src/gdb-io-frame.c trunk/geany-plugins/geanygdb/src/gdb-io-priv.h trunk/geany-plugins/geanygdb/src/gdb-io-read.c trunk/geany-plugins/geanygdb/src/gdb-io-run.c trunk/geany-plugins/geanygdb/src/gdb-io-stack.c trunk/geany-plugins/geanygdb/src/gdb-io.h trunk/geany-plugins/geanygdb/src/gdb-lex.c trunk/geany-plugins/geanygdb/src/gdb-lex.h trunk/geany-plugins/geanygdb/src/gdb-ui-break.c trunk/geany-plugins/geanygdb/src/gdb-ui-envir.c trunk/geany-plugins/geanygdb/src/gdb-ui-frame.c trunk/geany-plugins/geanygdb/src/gdb-ui-locn.c trunk/geany-plugins/geanygdb/src/gdb-ui-main.c trunk/geany-plugins/geanygdb/src/gdb-ui.h trunk/geany-plugins/geanygdb/src/geanydebug.c trunk/geany-plugins/geanygdb/src/ttyhelper.c trunk/geany-plugins/geanygdb/tests/ trunk/geany-plugins/geanygdb/tests/Makefile.am trunk/geany-plugins/geanygdb/tests/unittests.c
Added: trunk/geany-plugins/geanygdb/doc/geany.css =================================================================== --- trunk/geany-plugins/geanygdb/doc/geany.css (rev 0) +++ trunk/geany-plugins/geanygdb/doc/geany.css 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,114 @@ +/* +:Author: Enrico Troeger +:Contact: enrico(dot)troeger(at)uvena(dot)de +:Copyright: This stylesheet has been placed in the public domain. + +Stylesheet for Geany's documentation based on a version of John Gabriele. +*/ + +@media screen { + + body { + background-color: #f2f2f2; + color: #404040; + margin-left: 0.4em; + width: 60em; + font-size: 90%; + } + + a { + color: #990000; + } + + a:visited { + color: #7E558E; + } + + a:hover { + text-decoration: none; + } + + h1 { + border-top: 1px dotted; + margin-top: 2em; + } + + h1, h2, h3 { + font-family: sans-serif; + color: #5D0606; + } + + h1.title { + text-align: left } + + h2 { + margin-top: 30px; + } + + h2.subtitle { + text-align: left } + + h3 { + padding-left: 3px; + } + + blockquote, pre { + border: 1px solid; + padding: 0.4em; + } + + blockquote { + font-family: sans-serif; + background-color: #DBEDD5; + border: 1px dotted; + border-left: 4px solid; + border-color: #9FD98C; + } + + pre { + background-color: #ECDFCE; + border: 1px dotted; + border-left: 4px solid; + border-color: #D9BE9A; + } + + tt, pre, code { + color: #6D4212; + } + + table { + border: 1px solid #D9BE9A; + } + + th { + background-color: #ECDFCE; + border: 1px dotted #D9BE9A; + } + + td { + border: 1px dotted #D9BE9A; + } + + .docinfo-name { + color: #5D0606; + } + + p.admonition-title { + color: #990000; + font-weight: bold; + } + + div.note { + margin: 1em 3em; + padding: 0em; + } + + dt { + font-style: italic; + } + +} + +@media print { + +}
Added: trunk/geany-plugins/geanygdb/po/.gitignore =================================================================== --- trunk/geany-plugins/geanygdb/po/.gitignore (rev 0) +++ trunk/geany-plugins/geanygdb/po/.gitignore 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,7 @@ +Makefile +Makefile.in +Makefile.in.in +POTFILES +*.gmo +*.pot +stamp-it
Added: trunk/geany-plugins/geanygdb/po/ChangeLog =================================================================== --- trunk/geany-plugins/geanygdb/po/ChangeLog (rev 0) +++ trunk/geany-plugins/geanygdb/po/ChangeLog 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,14 @@ +2009-05-30 Frank Lanitz <frank(at)frank(dot)uvena(dot)de> + +* ru.po, LINGUAS: + Added Russian translation. Thanks to John Wehin. + + +2008-11-07 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * de.po: Update German translation, not yet complete. + + +2008-11-02 Frank Lanitz <frank(at)frank(dot)uvena(dot)de> + + * de.po, LINGUAS: Added German translation
Added: trunk/geany-plugins/geanygdb/po/LINGUAS =================================================================== --- trunk/geany-plugins/geanygdb/po/LINGUAS (rev 0) +++ trunk/geany-plugins/geanygdb/po/LINGUAS 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,2 @@ +# set of available languages (in alphabetic order) +de
Added: trunk/geany-plugins/geanygdb/po/POTFILES.in =================================================================== --- trunk/geany-plugins/geanygdb/po/POTFILES.in (rev 0) +++ trunk/geany-plugins/geanygdb/po/POTFILES.in 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,19 @@ +# List of source files containing translatable strings. + +src/gdb-io-break.c +src/gdb-io-envir.c +src/gdb-io-frame.c +src/gdb-io-priv.h +src/gdb-io-read.c +src/gdb-io-run.c +src/gdb-io-stack.c +src/gdb-io.h +src/gdb-lex.c +src/gdb-lex.h +src/gdb-ui-break.c +src/gdb-ui-envir.c +src/gdb-ui-frame.c +src/gdb-ui-locn.c +src/gdb-ui-main.c +src/gdb-ui.h +src/geanydebug.c
Added: trunk/geany-plugins/geanygdb/po/POTFILES.skip =================================================================== --- trunk/geany-plugins/geanygdb/po/POTFILES.skip (rev 0) +++ trunk/geany-plugins/geanygdb/po/POTFILES.skip 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1 @@ +# List of source files containing translatable strings but should be ignored.
Added: trunk/geany-plugins/geanygdb/po/de.po =================================================================== --- trunk/geany-plugins/geanygdb/po/de.po (rev 0) +++ trunk/geany-plugins/geanygdb/po/de.po 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,682 @@ +# German translations for geanydebug package. +# Copyright (C) 2008 THE geanydebug's COPYRIGHT HOLDER +# This file is distributed under the same license as the geanydebug package. +# Enrico Tröger enrico.troeger@uvena.de 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: geanydebug 0.0.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-07 20:20+0100\n" +"PO-Revision-Date: 2008-11-07 19:32+0100\n" +"Last-Translator: Enrico Tröger enrico@xfce.org\n" +"Language-Team: geany-i18n geany-i18n@uvena.de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/gdb-io-break.c:142 +#, c-format +msgid "Added breakpoint #%s in %s() at %s:%s\n" +msgstr "Haltepunkt #%s in %s() bei %s:%s hinzugefügt\n" + +#: ../src/gdb-io-break.c:147 +#, c-format +msgid "Added breakpoint #%s at %s:%s\n" +msgstr "Haltepunkt #%s bei %s:%s hinzugefügt\n" + +#: ../src/gdb-io-break.c:159 +#, c-format +msgid "Added write watchpoint #%s for %s\n" +msgstr "" + +#: ../src/gdb-io-break.c:168 +#, c-format +msgid "Added read/write watchpoint #%s for %s\n" +msgstr "" + +#: ../src/gdb-io-break.c:179 +#, c-format +msgid "Added read watchpoint #%s for %s\n" +msgstr "" + +#: ../src/gdb-io-break.c:226 +msgid "Watch/breakpoint deleted.\n" +msgstr "" + +#: ../src/gdb-io-break.c:250 +msgid "Failed to toggle breakpoint -\n" +msgstr "" + +#: ../src/gdb-io-break.c:268 +msgid "Watch/breakpoint toggled.\n" +msgstr "" + +#: ../src/gdb-io-break.c:282 +msgid "Watch/breakpoint modified.\n" +msgstr "" + +#: ../src/gdb-io-envir.c:123 +msgid "Failed to retrieve source search path setting from GDB." +msgstr "" + +#: ../src/gdb-io-envir.c:144 +msgid "Failed to retrieve executable search path setting from GDB." +msgstr "" + +#: ../src/gdb-io-envir.c:166 +msgid "Failed to retrieve working directory setting from GDB." +msgstr "" + +#: ../src/gdb-io-frame.c:488 +msgid "Field list too long, not all items can be displayed.\n" +msgstr "" + +#: ../src/gdb-io-read.c:232 +msgid "Error starting target process!\n" +msgstr "" + +#: ../src/gdb-io-read.c:277 +msgid "" +"This executable does not appear to contain the required debugging " +"information." +msgstr "" + +#: ../src/gdb-io-read.c:539 +#, c-format +msgid "Program received signal %s (%s) at %s in function %s() at %s:%s" +msgstr "" + +#: ../src/gdb-io-read.c:590 +#, c-format +msgid "Watchpoint #%s out of scope" +msgstr "" + +#: ../src/gdb-io-read.c:599 +#, c-format +msgid "Program exited on signal %s (%s).\n" +msgstr "" + +#: ../src/gdb-io-read.c:601 +msgid "Unknown signal" +msgstr "Unbekanntes Signal" + +#: ../src/gdb-io-read.c:618 +#, c-format +msgid "Program exited with code %d [%s]\n" +msgstr "" + +#: ../src/gdb-io-read.c:619 +msgid "(unknown)" +msgstr "(unbekannt)" + +#: ../src/gdb-io-read.c:625 +msgid "Program exited normally.\n" +msgstr "" + +#: ../src/gdb-io-run.c:251 +msgid "tty temporary directory not specified!\n" +msgstr "" + +#: ../src/gdb-io-run.c:256 +msgid "tty temporary directory not found!\n" +msgstr "" + +#: ../src/gdb-io-run.c:275 +msgid "tty helper program not specified!\n" +msgstr "" + +#: ../src/gdb-io-run.c:282 +msgid "tty helper program not found!\n" +msgstr "" + +#: ../src/gdb-io-run.c:335 +#, c-format +msgid "Attaching to terminal %s\n" +msgstr "" + +#: ../src/gdb-io-run.c:350 +msgid "Timeout waiting for TTY name.\n" +msgstr "" + +#: ../src/gdb-io-run.c:399 +#, c-format +msgid "GDB exited (pid=%d)\n" +msgstr "" + +#: ../src/gdb-io-run.c:460 +#, c-format +msgid "Target process exited. (pid=%d; %s%s)\n" +msgstr "" + +#: ../src/gdb-io-run.c:462 +msgid "code=" +msgstr "" + +#: ../src/gdb-io-run.c:462 +msgid "reason:" +msgstr "Grund:" + +#: ../src/gdb-io-run.c:528 ../src/gdb-io-run.c:593 +#, c-format +msgid "Directory %s not found!\n" +msgstr "Verzeichnis »%s« nicht gefunden!\n" + +#: ../src/gdb-io-run.c:533 +msgid "Shutting down target program.\n" +msgstr "" + +#: ../src/gdb-io-run.c:540 +msgid "Killing target program.\n" +msgstr "Töte Zielprogramm.\n" + +#: ../src/gdb-io-run.c:548 +msgid "Timeout waiting for target process.\n" +msgstr "" + +#: ../src/gdb-io-run.c:551 +msgid "Using a bigger hammer!\n" +msgstr "" + +#: ../src/gdb-io-run.c:565 +msgid "Waiting for target process to exit.\n" +msgstr "" + +#: ../src/gdb-io-run.c:601 +#, c-format +msgid "Killing GDB (pid=%d)\n" +msgstr "" + +#: ../src/gdb-io-run.c:615 +msgid "Timeout trying to kill GDB.\n" +msgstr "" + +#: ../src/gdb-io-run.c:625 +msgid "Shutting down GDB\n" +msgstr "" + +#: ../src/gdb-io-run.c:638 +msgid "Waiting for GDB to exit.\n" +msgstr "" + +#: ../src/gdb-io-run.c:646 +msgid "Timeout waiting for GDB to exit.\n" +msgstr "" + +#: ../src/gdb-io-run.c:709 +#, c-format +msgid "Starting gdb (pid=%d)\n" +msgstr "" + +#: ../src/gdb-io-run.c:769 +#, c-format +msgid "Started target process. (pid=%d)\n" +msgstr "" + +#: ../src/gdb-io-stack.c:178 +#, c-format +msgid "" +"Stack too deep to display!\n" +"(Showing only %d frame)" +msgid_plural "" +"Stack too deep to display!\n" +"(Showing only %d frames)" +msgstr[0] "" +msgstr[1] "" + +#: ../src/gdb-ui-break.c:103 +msgid "Delete selected watchpoint?" +msgstr "" + +#: ../src/gdb-ui-break.c:103 +msgid "Delete selected breakpoint?" +msgstr "Ausgewählten Haltepunkt löschen?" + +#: ../src/gdb-ui-break.c:131 +msgid "Edit watchpoint" +msgstr "" + +#: ../src/gdb-ui-break.c:131 +msgid "Edit breakpoint" +msgstr "Haltepunkt bearbeiten" + +#: ../src/gdb-ui-break.c:141 +msgid "Enabled" +msgstr "Aktiviert" + +#: ../src/gdb-ui-break.c:147 +msgid " Break after " +msgstr "" + +#: ../src/gdb-ui-break.c:154 +msgid " times. " +msgstr " mal " + +#: ../src/gdb-ui-break.c:159 +msgid " Break when " +msgstr "" + +#: ../src/gdb-ui-break.c:166 +msgid " is true. " +msgstr "" + +#: ../src/gdb-ui-break.c:231 +msgid "Add watchpoint" +msgstr "" + +#: ../src/gdb-ui-break.c:231 +msgid "Add breakpoint" +msgstr "Haltepunkt hinzufügen" + +#: ../src/gdb-ui-break.c:332 +msgid "watchpoint" +msgstr "" + +#: ../src/gdb-ui-break.c:332 ../src/gdb-ui-break.c:386 +msgid "breakpoint" +msgstr "" + +#: ../src/gdb-ui-break.c:482 +msgid "Watchpoints" +msgstr "" + +#: ../src/gdb-ui-break.c:482 +msgid "Breakpoints" +msgstr "Haltepunkte" + +#: ../src/gdb-ui-envir.c:83 +msgid "Environment settings" +msgstr "" + +#: ../src/gdb-ui-envir.c:105 +msgid "" +"\n" +" Command-line arguments passed to target program:" +msgstr "" +"\n" +"Kommandozeilenargumente für das Zielprogramm:" + +#: ../src/gdb-ui-envir.c:106 +msgid "" +"\n" +" Search path for source files:" +msgstr "" +"\n" +"Suchpfad für Quelldateien:" + +#: ../src/gdb-ui-envir.c:107 +msgid "" +"\n" +" Working directory for target program:" +msgstr "" +"\n" +"Arbeitesverzeichnis für das Zielprogramm:" + +#: ../src/gdb-ui-envir.c:108 +msgid "" +"\n" +" Search path for executables:" +msgstr "" +"\n" +"Suchpfad für ausführbare Dateien:" + +#: ../src/gdb-ui-envir.c:151 +msgid "Select Font" +msgstr "Schriftart auswählen" + +#: ../src/gdb-ui-envir.c:173 +msgid "Preferences" +msgstr "Einstellungen" + +#: ../src/gdb-ui-envir.c:189 +msgid "Keep debug window on top." +msgstr "Debugfenster im Vordergrund halten" + +#: ../src/gdb-ui-envir.c:191 +msgid "Show tooltips." +msgstr "Kurzhilfen anzeigen" + +#: ../src/gdb-ui-envir.c:192 +msgid "Show icons." +msgstr "Symbole anzeigen" + +#: ../src/gdb-ui-envir.c:197 +msgid "Font for source code listings:" +msgstr "Schriftart für die Quellcode-Anzeige" + +#: ../src/gdb-ui-envir.c:209 +msgid "Terminal program:" +msgstr "Textkonsolen-Programm:" + +#: ../src/gdb-ui-frame.c:127 +msgid "_Examine" +msgstr "_Prüfen" + +#: ../src/gdb-ui-frame.c:277 +msgid "Object info" +msgstr "Objektinformationen" + +#: ../src/gdb-ui-frame.c:284 +msgid "Elements" +msgstr "Elemente" + +#: ../src/gdb-ui-frame.c:284 +msgid "Fields" +msgstr "Felder" + +#: ../src/gdb-ui-frame.c:292 +msgid "Return to previous dialog." +msgstr "Zum vorherigen Dialog zurückkehren" + +#: ../src/gdb-ui-frame.c:297 ../src/gdb-ui-frame.c:371 +msgid "Display additional information about the selected item." +msgstr "Zusätzliche Information zum ausgewählten Eintrag anzeigen" + +#: ../src/gdb-ui-frame.c:344 +msgid "Frame info" +msgstr "" + +#: ../src/gdb-ui-frame.c:347 +#, c-format +msgid "" +"\n" +"Frame #%s in %s() at %s:%s\n" +msgstr "" + +#: ../src/gdb-ui-frame.c:357 +msgid "Function arguments" +msgstr "Funktionsargumente" + +#: ../src/gdb-ui-frame.c:361 +msgid "Local variables" +msgstr "Lokale Variablen" + +#: ../src/gdb-ui-frame.c:366 +msgid "Return to stack list dialog." +msgstr "" + +#: ../src/gdb-ui-frame.c:577 +msgid "Stack trace" +msgstr "" + +#: ../src/gdb-ui-frame.c:594 +msgid "Display additional information about the selected frame." +msgstr "" + +#: ../src/gdb-ui-locn.c:53 +msgid "Clea_r" +msgstr "_Leeren" + +#: ../src/gdb-ui-locn.c:68 +msgid "Filename: " +msgstr "Dateiname: " + +#: ../src/gdb-ui-locn.c:81 +msgid "Variable to watch:" +msgstr "" + +#: ../src/gdb-ui-locn.c:82 +msgid "Line number or function name: " +msgstr "Zeilennummer oder Funktionsname: " + +#: ../src/gdb-ui-locn.c:123 +msgid "Access trigger:" +msgstr "" + +#: ../src/gdb-ui-main.c:123 +msgid "(no program)" +msgstr "(kein Programm)" + +#: ../src/gdb-ui-main.c:137 +msgid "loaded" +msgstr "geladen" + +#: ../src/gdb-ui-main.c:142 +msgid "starting" +msgstr "startet" + +#: ../src/gdb-ui-main.c:149 +msgid "running" +msgstr "läuft" + +#: ../src/gdb-ui-main.c:168 +msgid "stopped" +msgstr "unterbrochen" + +#: ../src/gdb-ui-main.c:182 +msgid "terminated" +msgstr "abgebrochen" + +#: ../src/gdb-ui-main.c:219 +msgid "paused" +msgstr "pausiert" + +#: ../src/gdb-ui-main.c:228 +msgid "Program received signal:" +msgstr "Programm empfind signal:" + +#: ../src/gdb-ui-main.c:297 +msgid "Error:" +msgstr "Fehler:" + +#: ../src/gdb-ui-main.c:449 +msgid "Select executable to debug" +msgstr "Zielprogrammdatei auswählen" + +#: ../src/gdb-ui-main.c:472 +msgid "Debugging of object files is not supported." +msgstr "Das Debuggen von Objektdateien wird nicht unterstützt." + +#: ../src/gdb-ui-main.c:522 +msgid "You don't have permission to execute this file." +msgstr "Sie haben keine Berechtigung diese Datei auszuführen." + +#: ../src/gdb-ui-main.c:528 +msgid "Debugging of shared libraries is not supported." +msgstr "Das Debuggen von Bibliotheken wird nicht unterstützt." + +#: ../src/gdb-ui-main.c:533 +msgid "Debugging of core files id not supported." +msgstr "Das Debuggen von Core-Dateien wird nicht unterstützt." + +#: ../src/gdb-ui-main.c:538 +msgid "Target file must be ELF 32-bit x86 executable." +msgstr "Die Zieldatei muss im ELF 32-bit x86 Format sein." + +#: ../src/gdb-ui-main.c:544 +msgid "You don't have permission to read this file." +msgstr "Sie haben keine Berechtigung diese Datei lesen." + +#: ../src/gdb-ui-main.c:661 +msgid "Run to location" +msgstr "" + +#: ../src/gdb-ui-main.c:771 +msgid "no program" +msgstr "Kein Programm" + +#: ../src/gdb-ui-main.c:779 +msgid "_Load" +msgstr "_Laden" + +#: ../src/gdb-ui-main.c:779 +msgid "Load target program into debugger." +msgstr "" + +#: ../src/gdb-ui-main.c:781 +msgid "_Unload" +msgstr "_Entladen" + +#: ../src/gdb-ui-main.c:782 +msgid "Kill the target program AND the debugger." +msgstr "Das Programm UND den Debugger beenden (töten)." + +#: ../src/gdb-ui-main.c:784 +msgid "_Run" +msgstr "_Ausführen" + +#: ../src/gdb-ui-main.c:785 +msgid "Execute target program in debugger." +msgstr "Zieprogramm im Debugger ausführen." + +#: ../src/gdb-ui-main.c:787 +msgid "_Kill" +msgstr "_Töten" + +#: ../src/gdb-ui-main.c:788 +msgid "Kill the target program with SIGKILL." +msgstr "" + +#: ../src/gdb-ui-main.c:790 +msgid "_Pause" +msgstr "_Anhalten" + +#: ../src/gdb-ui-main.c:791 +msgid "Pause the target program with SIGINT." +msgstr "" + +#: ../src/gdb-ui-main.c:793 +msgid "_Continue" +msgstr "_Fortfahren" + +#: ../src/gdb-ui-main.c:794 +msgid "Continue executing target program." +msgstr "" + +#: ../src/gdb-ui-main.c:796 +msgid "_Step" +msgstr "" + +#: ../src/gdb-ui-main.c:797 +msgid "Step to the next line or function call." +msgstr "" + +#: ../src/gdb-ui-main.c:799 +msgid "Step _in" +msgstr "" + +#: ../src/gdb-ui-main.c:800 +msgid "Execute the next machine instruction or function call." +msgstr "" + +#: ../src/gdb-ui-main.c:801 +msgid "Step to the next line." +msgstr "" + +#: ../src/gdb-ui-main.c:803 +msgid "Ne_xt in" +msgstr "" + +#: ../src/gdb-ui-main.c:804 +msgid "Execute the next machine instruction." +msgstr "" + +#: ../src/gdb-ui-main.c:806 +msgid "Run _to" +msgstr "" + +#: ../src/gdb-ui-main.c:807 +msgid "Run to specified source line." +msgstr "" + +#: ../src/gdb-ui-main.c:809 +msgid "Stac_k" +msgstr "" + +#: ../src/gdb-ui-main.c:810 +msgid "Display a backtrace of the current call stack." +msgstr "" + +#: ../src/gdb-ui-main.c:811 +msgid "Add or remove breakpoints." +msgstr "Haltepunkte hinzufügen oder entfernen." + +#: ../src/gdb-ui-main.c:812 +msgid "Add or remove watchpoints." +msgstr "" + +#: ../src/gdb-ui-main.c:814 +msgid "_Finish" +msgstr "_Beenden" + +#: ../src/gdb-ui-main.c:815 +msgid "Complete the currently executing function." +msgstr "" + +#: ../src/gdb-ui-main.c:817 +msgid "_Return" +msgstr "" + +#: ../src/gdb-ui-main.c:818 +msgid "Return immediately from the current function." +msgstr "" + +#: ../src/gdb-ui-main.c:820 +msgid "En_viron" +msgstr "" + +#: ../src/gdb-ui-main.c:821 +msgid "Set target environment and command line options." +msgstr "" + +#: ../src/gdb-ui-main.c:823 +msgid "_Options" +msgstr "_Optionen" + +#: ../src/gdb-ui-main.c:824 +msgid "Set user interface options." +msgstr "" + +#: ../src/gdb-ui-main.c:873 +msgid "Run in terminal" +msgstr "In Terminal ausführen" + +#: ../src/gdb-ui-main.c:875 +msgid "Execute target program inside a terminal window." +msgstr "Zielprogramm in einem Konsolenfenster ausführen" + +#: ../src/gdb-ui-main.c:878 +msgid "Ignore SIGPIPE" +msgstr "SIGPIPE ignorieren" + +#: ../src/gdb-ui-main.c:880 +msgid "" +"Don't pause execution when target gets a SIGPIPE signal.\n" +"(Useful for certain networking applications.)" +msgstr "" +"Die Ausführung des Programms nicht unterbrechen wenn das Signal SIGPIPE " +"empfangen wird.\n" +"(Nützlich bei einigen Netzwerkanwendungen)" + +#: ../src/gdb-ui-main.c:887 +msgid "Console:" +msgstr "Konsole:" + +#: ../src/gdb-ui-main.c:888 +msgid "Send a GDB command directly to the debugger." +msgstr "Sendet einen GDB-Befehl direkt an den Debugger." + +#: ../src/gdb-ui-main.c:944 +msgid "_Quit" +msgstr "_Beenden" + +#: ../src/gdb-ui-main.c:944 +msgid "Exit everything" +msgstr "Alles beenden" + +#: ../src/geanydebug.c:55 +msgid "Debugger" +msgstr "Debugger" + +#: ../src/geanydebug.c:55 +msgid "Integrated debugging with GDB." +msgstr "Debugging integriert in Geany" + +#: ../src/geanydebug.c:55 +msgid "Jeff Pohlmeyer" +msgstr "Jeff Pohlmeyer" + +#: ../src/geanydebug.c:283 +msgid "Plugin configuration directory could not be created." +msgstr "Plugin-Konfigurationsverzeichnis konnte nicht erstellt werden."
Added: trunk/geany-plugins/geanygdb/po/ru.po =================================================================== --- trunk/geany-plugins/geanygdb/po/ru.po (rev 0) +++ trunk/geany-plugins/geanygdb/po/ru.po 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,716 @@ +msgid "" +msgstr "" +"Project-Id-Version: geanygdb\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-05-28 22:36+0200\n" +"PO-Revision-Date: \n" +"Last-Translator: John Wehin john.wehin@gmail.com\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Russian\n" +"X-Poedit-Country: RUSSIAN FEDERATION\n" +"X-Poedit-Basepath: .\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../src/gdb-io-break.c:142 +#, c-format +msgid "Added breakpoint #%s in %s() at %s:%s\n" +msgstr "Добавлена точка останова #%s в %s() на %s:%s\n" + +#: ../src/gdb-io-break.c:147 +#, c-format +msgid "Added breakpoint #%s at %s:%s\n" +msgstr "Добавлена точка останова #%s на %s:%s\n" + +#: ../src/gdb-io-break.c:159 +#, c-format +msgid "Added write watchpoint #%s for %s\n" +msgstr "Добавлена точка контроля(для записи) #%s на %s\n" + +#: ../src/gdb-io-break.c:168 +#, c-format +msgid "Added read/write watchpoint #%s for %s\n" +msgstr "Добавлена точка контроля(для чтения/записи) #%s на %s\n" + +#: ../src/gdb-io-break.c:179 +#, c-format +msgid "Added read watchpoint #%s for %s\n" +msgstr "Добавлена точка контроля(для чтения) #%s на %s\n" + +#: ../src/gdb-io-break.c:226 +msgid "Watch/breakpoint deleted.\n" +msgstr "Точка останова/контроля удалена.\n" + +#: ../src/gdb-io-break.c:250 +msgid "Failed to toggle breakpoint -\n" +msgstr "Ошибка переключения точки останова -\n" + +#: ../src/gdb-io-break.c:268 +msgid "Watch/breakpoint toggled.\n" +msgstr "Точка останова/контроля переключена.\n" + +#: ../src/gdb-io-break.c:282 +msgid "Watch/breakpoint modified.\n" +msgstr "Точка останова/контроля изменена.\n" + +#: ../src/gdb-io-envir.c:122 +msgid "Failed to retrieve source search path setting from GDB." +msgstr "" +"Ошибка установки пути, для поиска исходных файлов, указанного в настройках " +"GDB." + +#: ../src/gdb-io-envir.c:143 +msgid "Failed to retrieve executable search path setting from GDB." +msgstr "" +"Ошибку установки пути, для поиска исполняемых файлов, указанного в " +"настройках GDB." + +#: ../src/gdb-io-envir.c:165 +msgid "Failed to retrieve working directory setting from GDB." +msgstr "Ошибка установки рабочего каталога, указанного в настройках GDB." + +#: ../src/gdb-io-frame.c:489 +msgid "Field list too long, not all items can be displayed.\n" +msgstr "Список полей слишком велик, не все элементы могут быть отображены.\n" + +#: ../src/gdb-io-read.c:232 +msgid "Error starting target process!\n" +msgstr "Ошибка запуска целевого процесса!\n" + +#: ../src/gdb-io-read.c:277 +msgid "" +"This executable does not appear to contain the required debugging " +"information." +msgstr "Исполняемый файл не содержит необходимой отладочной информации." + +#: ../src/gdb-io-read.c:539 +#, c-format +msgid "Program received signal %s (%s) at %s in function %s() at %s:%s" +msgstr "Программа получила сигнал %s (%s) по адресу %s в функции %s() на %s:%s" + +#: ../src/gdb-io-read.c:590 +#, c-format +msgid "Watchpoint #%s out of scope" +msgstr "Контрольная точка #%s вне области видимости" + +#: ../src/gdb-io-read.c:599 +#, c-format +msgid "Program exited on signal %s (%s).\n" +msgstr "Программа завершилась по сигналу %s (%s).\n" + +#: ../src/gdb-io-read.c:601 +msgid "Unknown signal" +msgstr "Неизвестный сигнал" + +#: ../src/gdb-io-read.c:618 +#, c-format +msgid "Program exited with code %d [%s]\n" +msgstr "Программа завершилась с кодом %d [%s].\n" + +#: ../src/gdb-io-read.c:619 +msgid "(unknown)" +msgstr "(неизвестно)" + +#: ../src/gdb-io-read.c:625 +msgid "Program exited normally.\n" +msgstr "Программа завершилась правильно.\n" + +#: ../src/gdb-io-run.c:264 +msgid "tty temporary directory not specified!\n" +msgstr "tty: директория для временных файлов не указанна!\n" + +#: ../src/gdb-io-run.c:269 +msgid "tty temporary directory not found!\n" +msgstr "tty: директория для временных файлов не найдена!\n" + +#: ../src/gdb-io-run.c:288 +msgid "tty helper program not specified!\n" +msgstr "программа ttyhelper, не указанна!\n" + +#: ../src/gdb-io-run.c:295 +msgid "tty helper program not found!\n" +msgstr "программа ttyhelper, не найдена!\n" + +# ?Добавить %s к терминалу\n +#: ../src/gdb-io-run.c:348 +#, c-format +msgid "Attaching to terminal %s\n" +msgstr "Отправить на терминал %s\n" + +#: ../src/gdb-io-run.c:363 +msgid "Timeout waiting for TTY name.\n" +msgstr "Время ожидания терминала истекло.\n" + +#: ../src/gdb-io-run.c:412 +#, c-format +msgid "GDB exited (pid=%d)\n" +msgstr "Завершаем работу GDB (pid=%d)\n" + +#: ../src/gdb-io-run.c:473 +#, c-format +msgid "Target process exited. (pid=%d; %s%s)\n" +msgstr "Завершение целевого процесса. (pid=%d; %s%s)\n" + +#: ../src/gdb-io-run.c:475 +msgid "code=" +msgstr "код=" + +#: ../src/gdb-io-run.c:475 +msgid "reason:" +msgstr "причина:" + +#: ../src/gdb-io-run.c:541 ../src/gdb-io-run.c:606 +#, c-format +msgid "Directory %s not found!\n" +msgstr "Каталог %s не найден!\n" + +#: ../src/gdb-io-run.c:546 +msgid "Shutting down target program.\n" +msgstr "Завершение работы целевой программы.\n" + +#: ../src/gdb-io-run.c:553 +msgid "Killing target program.\n" +msgstr "Убить целевую программу.\n" + +#: ../src/gdb-io-run.c:561 +msgid "Timeout waiting for target process.\n" +msgstr "Время ожидание процесса истекло.\n" + +#: ../src/gdb-io-run.c:564 +msgid "Using a bigger hammer!\n" +msgstr "Используем кувалду!\n" + +#: ../src/gdb-io-run.c:578 +msgid "Waiting for target process to exit.\n" +msgstr "Закончилось время ожидания завершения процесса.\n" + +#: ../src/gdb-io-run.c:614 +#, c-format +msgid "Killing GDB (pid=%d)\n" +msgstr "Убиваем GDB (pid=%d)\n" + +# Вообще-то убиства но уж совсем не звучит :( +#: ../src/gdb-io-run.c:628 +msgid "Timeout trying to kill GDB.\n" +msgstr "Истекло время ожидания, прерывания работы GDB.\n" + +#: ../src/gdb-io-run.c:638 +msgid "Shutting down GDB\n" +msgstr "Завершение работы GDB\n" + +#: ../src/gdb-io-run.c:651 +msgid "Waiting for GDB to exit.\n" +msgstr "Ожидание завершения GDB.\n" + +#: ../src/gdb-io-run.c:659 +msgid "Timeout waiting for GDB to exit.\n" +msgstr "Истекло время ожидания, завершения работы GDB.\n" + +#: ../src/gdb-io-run.c:722 +#, c-format +msgid "Starting gdb (pid=%d)\n" +msgstr "Запущен gdb (pid=%d)\n" + +#: ../src/gdb-io-run.c:782 +#, c-format +msgid "Started target process. (pid=%d)\n" +msgstr "Запуск процесса (pid=%d).\n" + +#: ../src/gdb-io-stack.c:178 +#, c-format +msgid "" +"Stack too deep to display!\n" +"(Showing only %d frame)" +msgid_plural "" +"Stack too deep to display!\n" +"(Showing only %d frames)" +msgstr[0] "" +"Стек слишком велик для отображения!\n" +"(Показан только %d блок)" +msgstr[1] "" +"Стек слишком велик для отображения!\n" +"(Показано только %d блока)" +msgstr[2] "" +"Стек слишком велик для отображения!\n" +"(Показано только %d блоков)" + +#: ../src/gdb-ui-break.c:108 +#, c-format +msgid "No %s selected" +msgstr "Не выбрана %s " + +#: ../src/gdb-ui-break.c:108 ../src/gdb-ui-break.c:343 +msgid "watchpoint" +msgstr "точка контроля" + +#: ../src/gdb-ui-break.c:108 ../src/gdb-ui-break.c:343 +#: ../src/gdb-ui-break.c:397 +msgid "breakpoint" +msgstr "точка останова" + +#: ../src/gdb-ui-break.c:114 +msgid "Delete selected watchpoint?" +msgstr "Удалить контрольную точку?" + +#: ../src/gdb-ui-break.c:114 +msgid "Delete selected breakpoint?" +msgstr "Удалить точку останова?" + +#: ../src/gdb-ui-break.c:142 +msgid "Edit watchpoint" +msgstr "Править точку контроля" + +#: ../src/gdb-ui-break.c:142 +msgid "Edit breakpoint" +msgstr "Править точку останова" + +#: ../src/gdb-ui-break.c:152 +msgid "Enabled" +msgstr "Включено" + +#: ../src/gdb-ui-break.c:158 +msgid " Break after " +msgstr "Прервать после" + +# ???? +#: ../src/gdb-ui-break.c:165 +msgid " times. " +msgstr " раз." + +#: ../src/gdb-ui-break.c:170 +msgid " Break when " +msgstr " Прервать когда " + +#: ../src/gdb-ui-break.c:177 +msgid " is true. " +msgstr " это истина." + +#: ../src/gdb-ui-break.c:242 +msgid "Add watchpoint" +msgstr "Добавить точку контроля" + +#: ../src/gdb-ui-break.c:242 +msgid "Add breakpoint" +msgstr "Добавить точку останова" + +#: ../src/gdb-ui-break.c:493 +msgid "Watchpoints" +msgstr "Точки контроля" + +#: ../src/gdb-ui-break.c:493 +msgid "Breakpoints" +msgstr "Точки останова" + +#: ../src/gdb-ui-envir.c:83 +msgid "Environment settings" +msgstr "Параметры окружения" + +#: ../src/gdb-ui-envir.c:105 +msgid "" +"\n" +" Command-line arguments passed to target program:" +msgstr "" +"\n" +" Параметры командной строки для целевой программы:" + +#: ../src/gdb-ui-envir.c:106 +msgid "" +"\n" +" Search path for source files:" +msgstr "" +"\n" +"Путь для поиска исходных файлов:" + +#: ../src/gdb-ui-envir.c:107 +msgid "" +"\n" +" Working directory for target program:" +msgstr "" +"\n" +" Рабочий каталог для целевой программы:" + +#: ../src/gdb-ui-envir.c:108 +msgid "" +"\n" +" Search path for executables:" +msgstr "" +"\n" +"Путь для поиска исполняемых файлов:" + +#: ../src/gdb-ui-envir.c:151 +msgid "Select Font" +msgstr "Выбрать шрифт" + +#: ../src/gdb-ui-envir.c:173 +msgid "Preferences" +msgstr "Настройки" + +#: ../src/gdb-ui-envir.c:189 +msgid "Keep debug window on top." +msgstr "Окно отладки всегда поверх всех." + +#: ../src/gdb-ui-envir.c:191 +msgid "Show tooltips." +msgstr "Показывать подсказки" + +#: ../src/gdb-ui-envir.c:192 +msgid "Show icons." +msgstr "Показывать иконки" + +#: ../src/gdb-ui-envir.c:197 +msgid "Font for source code listings:" +msgstr "Шрифт для исходного кода:" + +#: ../src/gdb-ui-envir.c:209 +msgid "Terminal program:" +msgstr "Терминал:" + +#: ../src/gdb-ui-frame.c:127 +msgid "_Examine" +msgstr "_Проверить" + +#: ../src/gdb-ui-frame.c:277 +msgid "Object info" +msgstr "Информация об объекте " + +#: ../src/gdb-ui-frame.c:284 +msgid "Elements" +msgstr "Элементы" + +#: ../src/gdb-ui-frame.c:284 +msgid "Fields" +msgstr "Поля" + +#: ../src/gdb-ui-frame.c:292 +msgid "Return to previous dialog." +msgstr "Вернуться к предыдущему диалогу" + +#: ../src/gdb-ui-frame.c:297 ../src/gdb-ui-frame.c:371 +msgid "Display additional information about the selected item." +msgstr "Отобразить дополнительную информацию о выбранном элементе." + +# Кадр? часть? блок? wtf frame :) +#: ../src/gdb-ui-frame.c:344 +msgid "Frame info" +msgstr "Информация о блоке" + +#: ../src/gdb-ui-frame.c:347 +#, c-format +msgid "" +"\n" +"Frame #%s in %s() at %s:%s\n" +msgstr "" +"\n" +"Блок #%s в %s() на %s:%s\n" + +#: ../src/gdb-ui-frame.c:357 +msgid "Function arguments" +msgstr "Аргументы функции" + +#: ../src/gdb-ui-frame.c:361 +msgid "Local variables" +msgstr "Локальные переменные" + +#: ../src/gdb-ui-frame.c:366 +msgid "Return to stack list dialog." +msgstr "Вернуться к диалогу просмотра стека." + +#: ../src/gdb-ui-frame.c:578 +msgid "Stack trace" +msgstr "Трассировка стека" + +#: ../src/gdb-ui-frame.c:595 +msgid "Display additional information about the selected frame." +msgstr "Показать дополнительную информацию о выбранном блоке." + +#: ../src/gdb-ui-locn.c:53 +msgid "Clea_r" +msgstr "О_чистить" + +#: ../src/gdb-ui-locn.c:68 +msgid "Filename: " +msgstr "Имя файла:" + +#: ../src/gdb-ui-locn.c:81 +msgid "Variable to watch:" +msgstr "Контролировать переменную:" + +#: ../src/gdb-ui-locn.c:82 +msgid "Line number or function name: " +msgstr "Номер строки или имя функции:" + +# read/write/both +#: ../src/gdb-ui-locn.c:123 +msgid "Access trigger:" +msgstr "Тип доступа:" + +#: ../src/gdb-ui-main.c:124 +msgid "(no program)" +msgstr "(нет программы)" + +#: ../src/gdb-ui-main.c:138 +msgid "loaded" +msgstr "загружено" + +#: ../src/gdb-ui-main.c:143 +msgid "starting" +msgstr "запущено" + +#: ../src/gdb-ui-main.c:150 +msgid "running" +msgstr "выполняется" + +#: ../src/gdb-ui-main.c:169 +msgid "stopped" +msgstr "остановленно" + +#: ../src/gdb-ui-main.c:183 +msgid "terminated" +msgstr "прервано" + +#: ../src/gdb-ui-main.c:220 +msgid "paused" +msgstr "приостановленно" + +#: ../src/gdb-ui-main.c:229 +msgid "Program received signal:" +msgstr "Программа возвратила сигнал:" + +#: ../src/gdb-ui-main.c:298 +msgid "Error:" +msgstr "Ошибка:" + +#: ../src/gdb-ui-main.c:478 +msgid "Select executable to debug" +msgstr "Выбор исполняемого файла для отладки" + +#: ../src/gdb-ui-main.c:501 +msgid "Debugging of object files is not supported." +msgstr "Отладка объектных файлов не поддерживается." + +#: ../src/gdb-ui-main.c:556 +msgid "You don't have permission to execute this file." +msgstr "У Вас нет прав для выполнения этого файла." + +#: ../src/gdb-ui-main.c:562 +msgid "Debugging of shared libraries is not supported." +msgstr "Отладка разделяемых библиотек не поддерживается." + +# ??? +#: ../src/gdb-ui-main.c:567 +msgid "Debugging of core files id not supported." +msgstr "Отладка исполняемых модулей ядра не поддерживается." + +#: ../src/gdb-ui-main.c:572 +msgid "Target file must be ELF 32-bit x86 executable." +msgstr "Файл должен быть 32-разрядной(x86) исполняемой программой." + +#: ../src/gdb-ui-main.c:578 +msgid "You don't have permission to read this file." +msgstr "У Вас нет прав для чтения этого файла." + +# ? Запустить в директории +#: ../src/gdb-ui-main.c:695 +msgid "Run to location" +msgstr "Перейти к размещению" + +#: ../src/gdb-ui-main.c:814 +msgid "no program" +msgstr "нет программы" + +#: ../src/gdb-ui-main.c:821 +msgid "_Load" +msgstr "_Загрузить" + +#: ../src/gdb-ui-main.c:821 +msgid "Load target program into debugger." +msgstr "Загрузка программы в отладчик." + +#: ../src/gdb-ui-main.c:823 +msgid "_Unload" +msgstr "_Выгрузить" + +#: ../src/gdb-ui-main.c:824 +msgid "Kill the target program AND the debugger." +msgstr "Убить программу и отладчик. " + +#: ../src/gdb-ui-main.c:826 +msgid "_Run" +msgstr "_Запустить" + +#: ../src/gdb-ui-main.c:827 +msgid "Execute target program in debugger." +msgstr "Выполнить программу в отладчике." + +#: ../src/gdb-ui-main.c:829 +msgid "_Kill" +msgstr "_Убить" + +#: ../src/gdb-ui-main.c:830 +msgid "Kill the target program with SIGKILL." +msgstr "Убить программу сигналом SIGKILL." + +#: ../src/gdb-ui-main.c:832 +msgid "_Pause" +msgstr "_Пауза" + +#: ../src/gdb-ui-main.c:833 +msgid "Pause the target program with SIGINT." +msgstr "Приостановить программу сигналом SIGINT." + +#: ../src/gdb-ui-main.c:835 +msgid "_Continue" +msgstr "_Продолжить" + +#: ../src/gdb-ui-main.c:836 +msgid "Continue executing target program." +msgstr "Продолжить выполнение программы" + +#: ../src/gdb-ui-main.c:838 +msgid "_Step" +msgstr "Следующая _строка" + +#: ../src/gdb-ui-main.c:839 +msgid "Step to the next line or function call." +msgstr "Шаг к следующей строке или вызову функции." + +#: ../src/gdb-ui-main.c:841 +msgid "Step _in" +msgstr "Следующий _вызов" + +#: ../src/gdb-ui-main.c:842 +msgid "Execute the next machine instruction or function call." +msgstr "Выполнить следующую машинную команду или вызов функции." + +#: ../src/gdb-ui-main.c:843 +msgid "Step to the next line." +msgstr "Переход к следующей строке" + +#: ../src/gdb-ui-main.c:845 +msgid "Ne_xt in" +msgstr "Следующая _инструкция" + +#: ../src/gdb-ui-main.c:846 +msgid "Execute the next machine instruction." +msgstr "Выполнить следующую машинную команду." + +#: ../src/gdb-ui-main.c:848 +msgid "Run _to" +msgstr "_Перейти" + +# ? Перейти к указанной строке. +#: ../src/gdb-ui-main.c:849 +msgid "Run to specified source line." +msgstr "Выполнить до указанной строки." + +#: ../src/gdb-ui-main.c:851 +msgid "Stac_k" +msgstr "Сте_к" + +# ?? Отобразить отслеживание стека текущего вызова. +#: ../src/gdb-ui-main.c:852 +msgid "Display a backtrace of the current call stack." +msgstr "Отобразить состояние стека текущего вызова." + +#: ../src/gdb-ui-main.c:853 +msgid "Add or remove breakpoints." +msgstr "Добавить или удалить точку останова." + +#: ../src/gdb-ui-main.c:854 +msgid "Add or remove watchpoints." +msgstr "Добавить или удалить контрольную точку." + +# Выполнить до коца функции +#: ../src/gdb-ui-main.c:856 +msgid "_Finish" +msgstr "_Завершить" + +#: ../src/gdb-ui-main.c:857 +msgid "Complete the currently executing function." +msgstr "Завершить исполнение текущей функции." + +#: ../src/gdb-ui-main.c:859 +msgid "_Return" +msgstr "_Возврат" + +#: ../src/gdb-ui-main.c:860 +msgid "Return immediately from the current function." +msgstr "Принудительно выйти из текущей функции." + +#: ../src/gdb-ui-main.c:862 +msgid "En_viron" +msgstr "_Окружение" + +#: ../src/gdb-ui-main.c:863 +msgid "Set target environment and command line options." +msgstr "Установка окружения и опций командной строки." + +#: ../src/gdb-ui-main.c:865 +msgid "_Options" +msgstr "_Опции" + +#: ../src/gdb-ui-main.c:866 +msgid "Set user interface options." +msgstr "Установка опций пользовательского интерфейса." + +#: ../src/gdb-ui-main.c:915 +msgid "Run in terminal" +msgstr "Запуск в терминале" + +#: ../src/gdb-ui-main.c:917 +msgid "Execute target program inside a terminal window." +msgstr "Выполнить программу в окне терминала." + +#: ../src/gdb-ui-main.c:920 +msgid "Ignore SIGPIPE" +msgstr "Игнорировать SIGPIPE" + +#: ../src/gdb-ui-main.c:922 +msgid "" +"Don't pause execution when target gets a SIGPIPE signal.\n" +"(Useful for certain networking applications.)" +msgstr "" +"Не приостанавливать выполнение, когда цель получает сигнал SIGPIPE\n" +"(Полезно для определённых сетевых приложений.)" + +#: ../src/gdb-ui-main.c:929 +msgid "Console:" +msgstr "Консоль:" + +#: ../src/gdb-ui-main.c:930 +msgid "Send a GDB command directly to the debugger." +msgstr "Послать команду непосредственно в отладчик." + +#: ../src/gdb-ui-main.c:986 +msgid "_Quit" +msgstr "_Выйти" + +#: ../src/gdb-ui-main.c:986 +msgid "Exit everything" +msgstr "Закрыть все" + +#: ../src/geanydebug.c:56 +msgid "Debugger" +msgstr "Отладчик" + +#: ../src/geanydebug.c:56 +msgid "Integrated debugging with GDB." +msgstr "Комплексная отладка в GDB." + +#: ../src/geanydebug.c:56 +msgid "Jeff Pohlmeyer" +msgstr "Джефф Похлмейер(Jeff Pohlmeyer)" + +# ? +# Каталог настроек плагинов (%s) не может быть создан. +#: ../src/geanydebug.c:373 +#, c-format +msgid "Plugin configuration directory (%s) could not be created." +msgstr "Не возможно создать каталог настройки плагинов (%s)." + +#: ../src/geanydebug.c:390 +msgid "geanygdb: ttyhelper program not found." +msgstr "geanygdb: программа ttyhelper, не найдена."
Added: trunk/geany-plugins/geanygdb/src/Makefile.am =================================================================== --- trunk/geany-plugins/geanygdb/src/Makefile.am (rev 0) +++ trunk/geany-plugins/geanygdb/src/Makefile.am 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,31 @@ + +geanylibdir = $(libdir)/geany +geanylib_LTLIBRARIES = geanygdb.la +geanygdb_la_SOURCES = gdb-io-break.c \ + gdb-io-envir.c \ + gdb-io-frame.c \ + gdb-io-priv.h \ + gdb-io-read.c \ + gdb-io-run.c \ + gdb-io-stack.c \ + gdb-io.h \ + gdb-lex.c \ + gdb-lex.h \ + gdb-ui-break.c \ + gdb-ui-envir.c \ + gdb-ui-frame.c \ + gdb-ui-locn.c \ + gdb-ui-main.c \ + gdb-ui.h \ + geanydebug.c + +geanygdb_la_LDFLAGS = -module -avoid-version +geanygdb_la_LIBADD = @GEANY_LIBS@ $(INTLLIBS) + +geanylib_PROGRAMS = ttyhelper +ttyhelper_SOURCES = ttyhelper.c + + + +AM_CFLAGS = @GEANY_CFLAGS@ -DLOCALEDIR=""$(localedir)"" -DLIBDIR=""$(libdir)"" +
Added: trunk/geany-plugins/geanygdb/src/gdb-io-break.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-break.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-break.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,313 @@ + +/* + * gdb-io-break.c - Breakpoint management functions for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + + +#include <string.h> +#include <glib.h> +#include "gdb-io-priv.h" +#include "support.h" + + +static GdbListFunc gdbio_break_list_func = NULL; + +static GSList *breakpoint_list = NULL; + + +static void +free_breakpoint_list() +{ + GSList *p; + for (p = breakpoint_list; p; p = p->next) + { + GdbBreakPointInfo *bpi = p->data; + if (bpi) + { + g_free(bpi->addr); + g_free(bpi->disp); + g_free(bpi->enabled); + g_free(bpi->file); + g_free(bpi->fullname); + g_free(bpi->func); + g_free(bpi->line); + g_free(bpi->number); + g_free(bpi->times); + g_free(bpi->type); + g_free(bpi->what); + g_free(bpi->cond); + g_free(bpi->ignore); + g_free(bpi); + } + } + g_slist_free(breakpoint_list); + breakpoint_list = NULL; +} + + + +#define populate(rec, hash, key) \ + rec->key=gdblx_lookup_string(hash, #key""); \ + if (rec->key) {rec->key=g_strdup(rec->key);} + + + +static void +breakpoint_cb(gpointer data, gpointer user_data) +{ + GdbLxValue *v = (GdbLxValue *) data; + if (v && (v->type == vt_HASH) && (v->hash)) + { + GHashTable *bkpt = v->hash; + if (bkpt) + { + GdbBreakPointInfo *bpi = g_new0(GdbBreakPointInfo, 1); + populate(bpi, bkpt, addr); + populate(bpi, bkpt, disp); + populate(bpi, bkpt, enabled); + populate(bpi, bkpt, file); + populate(bpi, bkpt, fullname); + populate(bpi, bkpt, func); + populate(bpi, bkpt, line); + populate(bpi, bkpt, number); + populate(bpi, bkpt, times); + populate(bpi, bkpt, type); + populate(bpi, bkpt, what); + populate(bpi, bkpt, cond); + populate(bpi, bkpt, ignore); + breakpoint_list = g_slist_append(breakpoint_list, bpi); + } + } +} + + +static void +parse_break_list(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HTAB(h, BreakpointTable); + gdbio_pop_seq(seq); + if (BreakpointTable && gdbio_break_list_func) + { + HLST(BreakpointTable, body); + if (body) + { + free_breakpoint_list(); + g_slist_foreach(body, breakpoint_cb, NULL); + gdbio_break_list_func(breakpoint_list); + free_breakpoint_list(); + } + else + { + gdbio_break_list_func(NULL); + } + } + if (h) + g_hash_table_destroy(h); +} + + + +void +gdbio_show_breaks(GdbListFunc func) +{ + gdbio_break_list_func = func; + if (func) + { + gdbio_send_seq_cmd(parse_break_list, "-break-list\n"); + } +} + + + +static void +added_break(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + HTAB(h, bkpt); + if (bkpt) + { + HSTR(bkpt, file); + HSTR(bkpt, line); + HSTR(bkpt, func); + HSTR(bkpt, number); + if (func) + { + gdbio_info_func(_("Added breakpoint #%s in %s() at %s:%s\n"), number, + func, file, line); + } + else + { + gdbio_info_func(_("Added breakpoint #%s at %s:%s\n"), number, file, + line); + } + + } + else + { + HTAB(h, wpt); + if (wpt) + { + HSTR(wpt, exp); + HSTR(wpt, number); + gdbio_info_func(_("Added write watchpoint #%s for %s\n"), number, exp); + } + else + { + HTAB(h, hw_awpt); + if (hw_awpt) + { + HSTR(hw_awpt, exp); + HSTR(hw_awpt, number); + gdbio_info_func(_("Added read/write watchpoint #%s for %s\n"), + number, exp); + } + else + { + HTAB(h, hw_rwpt); + if (hw_rwpt) + { + HSTR(hw_rwpt, exp); + HSTR(hw_rwpt, number); + gdbio_info_func + (_("Added read watchpoint #%s for %s\n"), + number, exp); + } + } + } + } + g_hash_table_destroy(h); + } + if (gdbio_break_list_func) + { + gdbio_show_breaks(gdbio_break_list_func); + } +} + +/* opt is "-r" (read) or "-a" (r/w) or NULL or empty (write) */ +void +gdbio_add_watch(GdbListFunc func, const gchar * option, const gchar * varname) +{ + gdbio_break_list_func = func; + gdbio_send_seq_cmd(added_break, "-break-watch %s %s\n", option ? option : "", varname); +} + + + +void +gdbio_add_break(GdbListFunc func, const gchar * filename, const gchar * locn) +{ + gdbio_break_list_func = func; + if (filename && *filename) + { + gdbio_send_seq_cmd(added_break, "-break-insert %s:%s\n", filename, locn); + } + else + { + gdbio_send_seq_cmd(added_break, "-break-insert %s\n", locn); + } +} + + +static void +deleted_break(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + g_hash_table_destroy(h); + gdbio_info_func(_("Watch/breakpoint deleted.\n")); + } + if (gdbio_break_list_func) + { + gdbio_show_breaks(gdbio_break_list_func); + } +} + + + +static void +toggled_break(gint seq, gchar ** list, gchar * resp) +{ + gdbio_pop_seq(seq); + if (strncmp(resp, "^error", 6) == 0) + { + if (resp[6] == ',') + { + GHashTable *h = gdblx_parse_results(resp + 7); + HSTR(h, msg); + + if (msg) + { + gchar *tmp = + g_strconcat(_("Failed to toggle breakpoint -\n"), msg, NULL); + gdbio_error_func(tmp); + if (tmp) + { + g_free(tmp); + } + } + else + { + } + if (h) + { + g_hash_table_destroy(h); + } + } + } + else + { + gdbio_info_func(_("Watch/breakpoint toggled.\n")); + } +} + + + +static void +edited_break(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + g_hash_table_destroy(h); + gdbio_info_func(_("Watch/breakpoint modified.\n")); + } +} + + +void +gdbio_delete_break(GdbListFunc func, const gchar * number) +{ + gdbio_break_list_func = func; + gdbio_send_seq_cmd(deleted_break, "-break-delete %s\n", number); +} + + +void +gdbio_enable_break(const gchar * number, gboolean enabled) +{ + gdbio_send_seq_cmd(toggled_break, "-break-%s %s\n", enabled ? "enable" : "disable", number); +} + + +void +gdbio_ignore_break(const gchar * number, const gchar * times) +{ + gdbio_send_seq_cmd(edited_break, "-break-after %s %s\n", number, times); +} + + +void +gdbio_break_cond(const gchar * number, const gchar * expr) +{ + gdbio_send_seq_cmd(edited_break, "-break-condition %s %s\n", number, expr); +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io-envir.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-envir.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-envir.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,182 @@ + +/* + * gdb-io-envir.c - Environment settings for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + + +#include <string.h> +#include <glib.h> +#include "gdb-io-priv.h" +#include "support.h" + + +static GdbEnvironFunc gdbio_environ_func = NULL; + +static GdbEnvironInfo env_info = { NULL, NULL, NULL, NULL }; + + +static void +free_env_info() +{ + g_free(env_info.cwd); + g_free(env_info.path); + g_free(env_info.args); + g_free(env_info.dirs); + memset(&env_info, '\0', sizeof(env_info)); +} + + + +static gchar * +unquote(gchar * quoted) +{ + gint len = quoted ? strlen(quoted) : 0; + if (len && (quoted[0] == '"') && (quoted[len - 1] == '"')) + { + gchar *tmp = g_strndup(quoted + 1, len - 2); + gchar *rv = g_strcompress(tmp); + g_free(tmp); + return rv; + } + else + return NULL; +} + + + +static void +get_env_args(gint seq, gchar ** list, gchar * resp) +{ + gchar *args; + gint i; + gdbio_pop_seq(seq); + for (i = 0; list[i]; i++) + { + if (strncmp(list[i], "~"", 2) == 0) + { + args = unquote(list[i] + 1); + if (args && *args) + { + gchar *quote = strchr(g_strstrip(args), '"'); + if (quote) + { + memmove(args, quote + 1, strlen(quote)); + quote = strrchr(args, '"'); + if (quote && g_str_equal(quote, "".")) + { + *quote = '\0'; + break; + } + } + } + g_free(args); + args = NULL; + } + } + env_info.args = args; + if (gdbio_environ_func) + { + gdbio_environ_func(&env_info); + } +} + + + +static void +get_env_dirs(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HSTR(h, source_path); + gdbio_pop_seq(seq); + if (source_path) + { + gchar *p; + env_info.dirs = g_strdup(source_path); + p = strstr(env_info.dirs, "$cdir:$cwd"); + if (p) + { + memmove(p, p + 10, strlen(p + 10) + 1); + } + p = strchr(env_info.dirs, '\0'); + if (p) + { + while (p > env_info.dirs) + { + p--; + if (*p == ':') + { + *p = '\0'; + } + else + { + break; + } + } + } + } + else + { + gdbio_info_func(_("Failed to retrieve source search path setting from GDB.")); +// gdblx_dump_table(h); + } + if (h) + g_hash_table_destroy(h); + gdbio_send_seq_cmd(get_env_args, "show args\n"); +} + + +static void +get_env_path(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HSTR(h, path); + gdbio_pop_seq(seq); + if (path) + { + env_info.path = g_strdup(path); + } + else + { + gdbio_info_func(_("Failed to retrieve executable search path setting from GDB.")); +// gdblx_dump_table(h); + } + if (h) + g_hash_table_destroy(h); + gdbio_send_seq_cmd(get_env_dirs, "-environment-directory\n"); +} + + +static void +get_env_cwd(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HSTR(h, cwd); + gdbio_pop_seq(seq); + free_env_info(); + if (cwd) + { + env_info.cwd = g_strdup(cwd); + } + else + { + gdbio_info_func(_("Failed to retrieve working directory setting from GDB.")); +// gdblx_dump_table(h); + } + if (h) + g_hash_table_destroy(h); + gdbio_send_seq_cmd(get_env_path, "-environment-path\n"); +} + + +void +gdbio_get_env(GdbEnvironFunc func) +{ + gdbio_environ_func = func; + if (func) + { + gdbio_send_seq_cmd(get_env_cwd, "-environment-pwd\n"); + } +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io-frame.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-frame.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-frame.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,544 @@ + +/* + * gdb-io-frame.c - Stack frame information functions for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + + +#include <string.h> +#include <glib.h> + +#include "gdb-io-priv.h" +#include "support.h" + + +static GdbFrameFunc gdbio_locals_func = NULL; + +static GSList *locals_list = NULL; +static GSList **which_list = NULL; + +static gint locals_index = 0; +static gint args_index = 0; +static gint *which_index = NULL; + +static void var_created(gint seq, gchar ** list, gchar * resp); +static void got_varlist(gint seq, gchar ** list, gchar * resp); + +typedef enum _FrameProcState +{ + fpBegin, + fpGotLocals, + fpGotArgs +} FrameProcState; + + +static FrameProcState state = fpBegin; +static GdbFrameInfo current_frame; + + + +static void +gdbio_free_var(GdbVar * v) +{ + if (v) + { + g_free(v->type); + g_free(v->name); + g_free(v->value); + g_free(v->numchild); + g_free(v); + } +} + + +void +gdbio_free_var_list(GSList * args) +{ + GSList *p; + for (p = args; p; p = p->next) + { + gdbio_free_var((GdbVar *) p->data); + } + g_slist_free(args); +} + + + +static void +free_lists() +{ + gdbio_free_var_list(locals_list); + locals_list = NULL; + locals_index = 0; + args_index = 0; + which_list = &locals_list; + which_index = &locals_index; + state = fpBegin; + g_free(current_frame.func); + g_free(current_frame.filename); + gdbio_free_var_list(current_frame.args); + memset(¤t_frame, 0, sizeof(current_frame)); +} + +static void +get_arglist() +{ + which_list = ¤t_frame.args; + which_index = &args_index; + gdbio_send_seq_cmd(got_varlist, "-stack-list-arguments 1 %s %s\n", + current_frame.level, current_frame.level); +} + + +static void +create_var(gchar * varname) +{ + gdbio_send_seq_cmd(var_created, "-var-create x%s * %s\n", varname, varname); +} + + +static void +var_deleted(gint seq, gchar ** list, gchar * resp) +{ + GdbVar *lv; + gdbio_pop_seq(seq); + (*which_index)++; + lv = g_slist_nth_data(*which_list, *which_index); + if (lv) + { + create_var(lv->name); + } + else + { + if (state == fpBegin) + { + state = fpGotLocals; + get_arglist(); + } + else + { + if (gdbio_locals_func) + { + gdbio_locals_func(¤t_frame, locals_list); + } + free_lists(); + } + } +} + + + +static void +delete_var(gchar * varname) +{ + gdbio_send_seq_cmd(var_deleted, "-var-delete x%s\n", varname); +} + + + +static gchar * +fmt_val(gchar * value) +{ + gchar buf[256]; + if (!value) + return g_strdup("0"); + if (strlen(value) < sizeof(buf)) + { + return g_strdup(value); + } + strncpy(buf, value, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; + return g_strdup_printf("%s...%s", buf, strchr(buf, '"') ? """ : ""); +} + + + +static void +var_created(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HSTR(h, type); + HSTR(h, value); + HSTR(h, numchild); + gdbio_pop_seq(seq); + if (type) + { + GdbVar *lv = g_slist_nth_data(*which_list, *which_index); + if (lv) + { + lv->type = g_strdup(type ? type : "int"); + lv->value = fmt_val(value); + lv->numchild = g_strdup(numchild ? numchild : "0"); + } + delete_var(lv->name); + } + if (h) + g_hash_table_destroy(h); +} + + + +void +got_varlist(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + GSList *hlist = NULL; + HLST(h, locals); + HLST(h, stack_args); + gdbio_pop_seq(seq); + if (state == fpBegin) + { + hlist = locals; + } + else + { + GdbLxValue *v = stack_args->data; + if (v && (v->type == vt_HASH)) + { + HLST(v->hash, args); + if (args) + { + hlist = args; + } + } + } + if (hlist) + { + GSList *p; + GdbVar *lv; + for (p = hlist; p; p = p->next) + { + GdbLxValue *v = p->data; + if (v && (v->type == vt_HASH) && v->hash) + { + HSTR(v->hash, name); + if (name) + { + lv = g_new0(GdbVar, 1); + lv->name = g_strdup(name); + *which_list = g_slist_append(*which_list, lv); + } + } + } + lv = g_slist_nth_data(*which_list, *which_index); + if (lv) + { + create_var(lv->name); + } + } + else + { + if (state == fpBegin) + { + state = fpGotLocals; + get_arglist(); + } + else + { + if (gdbio_locals_func) + { + gdbio_locals_func(¤t_frame, locals_list); + } + } + } + if (h) + g_hash_table_destroy(h); +} + + + + + +static void +got_current_level(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HTAB(h, frame); + gdbio_pop_seq(seq); + if (frame) + { + HSTR(frame, level); + if (level) + { + HSTR(frame, addr); + HSTR(frame, func); + HSTR(frame, file); + HSTR(frame, fullname); + HSTR(frame, line); + strncpy(current_frame.level, level, sizeof(current_frame.level) - 1); + strncpy(current_frame.addr, addr ? addr : "", + sizeof(current_frame.addr) - 1); + strncpy(current_frame.line, line ? line : "", + sizeof(current_frame.line) - 1); + current_frame.filename = g_strdup(fullname ? fullname : file ? file : ""); + current_frame.func = g_strdup(func ? func : ""); + } + } + if (h) + g_hash_table_destroy(h); + gdbio_send_seq_cmd(got_varlist, "-stack-list-locals 1\n"); +} + + +static void +set_current_level(gint seq, gchar ** list, gchar * resp) +{ + gdbio_pop_seq(seq); + gdbio_send_seq_cmd(got_current_level, "-stack-info-frame\n"); +} + +void +gdbio_show_locals(GdbFrameFunc func, gchar * level) +{ + free_lists(); + gdbio_locals_func = func; + gdbio_send_seq_cmd(set_current_level, "-stack-select-frame %s\n", level); +} + + + + +static gpointer +qpop(GQueue ** q) +{ + gpointer p = NULL; + if (*q) + { + p = g_queue_pop_head(*q); + if (g_queue_get_length(*q) == 0) + { + g_queue_free(*q); + *q = NULL; + } + } + return p; +} + +static void +qpush(GQueue ** q, gpointer p) +{ + if (p) + { + if (!*q) + { + *q = g_queue_new(); + } + g_queue_push_head(*q, p); + } +} + +static gpointer +qtop(GQueue * q) +{ + return q ? g_queue_peek_head(q) : NULL; +} + + + +/* +static gpointer qnth(GQueue*q, gint n) +{ + return q?g_queue_peek_nth(q, n):NULL; +} + +static gint qlen(GQueue*q) +{ + return q?g_queue_get_length(q):0; +} +*/ + + +static GQueue *obj_list_queue = NULL; +static void +push_list(GSList * p) +{ + qpush(&obj_list_queue, p); +} +static void +pop_list() +{ + gdbio_free_var_list(qpop(&obj_list_queue)); +} +static GSList * +top_list() +{ + return qtop(obj_list_queue); +} + + +static GQueue *obj_var_queue = NULL; +static void +push_var(GdbVar * p) +{ + qpush(&obj_var_queue, p); +} +static void +pop_var() +{ + gdbio_free_var(qpop(&obj_var_queue)); +} +static GdbVar * +top_var() +{ + return qtop(obj_var_queue); +} + + + + +//static GdbObjectFunc gdbio_object_list_func=NULL; + +static GQueue *obj_func_queue = NULL; +static void +push_func(GdbObjectFunc p) +{ + qpush(&obj_func_queue, p); +} +static void +pop_func() +{ + qpop(&obj_func_queue); +} +static GdbObjectFunc +top_func() +{ + return qtop(obj_func_queue); +} + + + + +static void +done_top() +{ + pop_var(); + pop_list(); +// pop_name(); + pop_func(); +} + + + +static void +object_deleted(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + if (top_func() && top_var() && top_list()) + { + top_func()(top_var(), top_list()); + } + done_top(); + g_hash_table_destroy(h); + } +} + + + +static GdbVar * +hash_val_to_var(GHashTable * h) +{ + HSTR(h, name); + if (name) + { + GdbVar *var = g_new0(GdbVar, 1); + HSTR(h, type); + HSTR(h, value); + HSTR(h, numchild); + var->name = g_strdup(name + 1); + var->type = g_strdup(type ? type : "int"); + var->value = fmt_val(value); + var->numchild = g_strdup(numchild ? numchild : "0"); + return var; + } + return NULL; +} + + +#define MAX_ITEMS 1024 + +static GSList * +hash_list_to_var_list(GSList * hlist) +{ + GSList *vlist = NULL; + GSList *p; + gint i; + for (p = hlist, i = 0; p; p = p->next, i++) + { + GdbLxValue *hv = p->data; + if (hv && (hv->type == vt_HASH) && hv->hash) + { + GdbVar *var = hash_val_to_var(hv->hash); + if (var) + { + vlist = g_slist_append(vlist, var); + } + } + if (i >= MAX_ITEMS) + { + GdbVar *var = g_new0(GdbVar, 1); + var->type = g_strdup(" "); + var->name = g_strdup_printf("* LIST TRUNCATED AT ITEM #%d *", i + 1); + var->value = g_strdup(" "); + var->numchild = g_strdup("0"); + vlist = g_slist_append(vlist, var); + gdbio_error_func(_("Field list too long, not all items can be displayed.\n")); + break; + } + } + return vlist; +} + + + +static void +object_listed(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + HLST(h, children); + if (children) + { + push_list(hash_list_to_var_list(children)); + } + gdbio_send_seq_cmd(object_deleted, "-var-delete x%s\n", top_var()->name); + g_hash_table_destroy(h); + } +} + + + +static void +object_created(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + HSTR(h, name); + if (name) + { + push_var(hash_val_to_var(h)); + gdbio_send_seq_cmd(object_listed, "-var-list-children 1 %s\n", name); + } + g_hash_table_destroy(h); + } +} + + +void +gdbio_show_object(GdbObjectFunc func, const gchar * varname) +{ + + if (func) + { + push_func(func); + gdbio_send_seq_cmd(object_created, "-var-create x%s * %s\n", varname, varname); + } +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io-priv.h =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-priv.h (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-priv.h 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,95 @@ + +/* + * gdb-io-priv.h - private header for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + + +#include "gdb-lex.h" +#include "gdb-io.h" + + +void gdbio_free_var_list(GSList * args); + + +typedef void (*ResponseHandler) (gint seq, gchar ** lines, gchar * resp); + + +/* + Sends a command to GDB, and returns the results to the specified + ResponseHandler function. +*/ +gint gdbio_send_seq_cmd(ResponseHandler func, const gchar * fmt, ...); + + +/* Look up a handler function */ +ResponseHandler gdbio_seq_lookup(gint seq); + + +/* + gdbio_pop_seq() removes a handler function from the sequencer. + This should (almost) always be called from the associated + ResponseHandler function, to avoid filling up the sequencer + with stale commands. +*/ +void gdbio_pop_seq(gint seq); + + +/* + Parses the output of GDB and returns it as a hash table, + unless the response is an error message, it calls the + error handler function and then returns NULL. +*/ +GHashTable *gdbio_get_results(gchar * resp, gchar ** list); + +/* +Preprocessor sugar for declaring C variables from hash key names, e.g. + HSTR(myhash,somevar) +expands to: + gchar *somevar = gdblx_lookup_string ( myhash, "somevar" ); +*/ +#define HSTR(hash,token) gchar* token = gdblx_lookup_string(hash, #token"") +#define HTAB(hash,token) GHashTable* token = gdblx_lookup_hash(hash, #token"") +#define HLST(hash,token) GSList* token = gdblx_lookup_list(hash, #token"") + + +#if 0 +#define do_loop() \ + while (g_main_context_pending(NULL)) \ + g_main_context_iteration(NULL,FALSE); +#else +#define do_loop() g_main_context_iteration(NULL,FALSE); +#endif + + + + +void gdbio_info_func(gchar * fmt, ...); +void gdbio_error_func(gchar * fmt, ...); +void gdbio_do_status(GdbStatus s); + + +void gdbio_target_exited(gchar * reason); +void gdbio_set_target_pid(GPid pid); +GPid gdbio_get_target_pid(); +void gdbio_set_running(gboolean running); + +/* + Max/Min values for sequencer tokens. +The current values of 100000-999999 allow for 899999 pending commands. +I can't imagine why you would need more, but if you change this,keep in mind +that the number of digits for any possible value *must* be exactly SEQ_LEN. +*/ + +#define SEQ_MIN 100000 +#define SEQ_MAX 999999 +#define SEQ_LEN 6 + + + +void gdbio_consume_response(GString * recv_buf); + +void gdbio_set_starting(gboolean s); +void gdbio_target_started(gint seq, gchar ** list, gchar * resp);
Added: trunk/geany-plugins/geanygdb/src/gdb-io-read.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-read.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-read.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,811 @@ +/* + * + * gdb-io-read.c - Output reading functions for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + */ + + +#include <stdlib.h> +#include <sys/time.h> + +#include <string.h> +#include <unistd.h> +#include <stdarg.h> +#include <glib.h> + +#include "gdb-io-priv.h" +#include "support.h" + + + +static GSList *source_files = NULL; + +static gboolean starting = FALSE; + + + +static void +free_string_list(GSList ** list) +{ + GSList *p; + for (p = *list; p; p = p->next) + { + if (p->data) + { + g_free(p->data); + } + } + *list = NULL; +} + + +static void +free_source_list() +{ + free_string_list(&source_files); +} + + + +static gint +find_file_and_fullname(gconstpointer data, gconstpointer user_data) +{ + GdbLxValue *v = (GdbLxValue *) data; + gchar *ref = (gchar *) user_data; + HSTR(v->hash, fullname); + HSTR(v->hash, file); + return (fullname && file + && (g_str_equal(ref, file) || g_str_equal(ref, fullname))) ? 0 : -1; +} + + + +static void +parse_file_list_cb(gpointer data, gpointer user_data) +{ + GdbLxValue *v = (GdbLxValue *) data; + if (v && (v->type == vt_HASH)) + { + HSTR(v->hash, fullname); + HSTR(v->hash, file); + if (file && !fullname) + { + if (g_slist_find_custom((GSList *) user_data, file, find_file_and_fullname)) + { + return; + } + } + if (fullname) + { + file = fullname; + } + if (file) + { + if (!g_slist_find_custom(source_files, file, (GCompareFunc) strcmp)) + { + source_files = g_slist_append(source_files, g_strdup(file)); + } + } + } +} + + + +static void handle_response_line(gchar * str, gchar ** list); + + +static void +handle_response_lines(gchar ** list) +{ + if (list) + { + gint i; + for (i = 0; list[i]; i++) + { + handle_response_line(list[i], list); + } + } +} + + + +static gboolean +response_is_error(gchar * resp, gchar ** list) +{ + if (strncmp(resp, "^error", 6) == 0) + { + handle_response_line(resp, list); + return TRUE; + } + else + { + return FALSE; + } +} + +#define CHK_RESP_ERR(resp, list) if (response_is_error(resp,list)) { return; } + +#define IsDigit g_ascii_isdigit + +static void +parse_process_info(gint seq, gchar ** list, gchar * resp) +{ + CHK_RESP_ERR(resp, list); + gdbio_pop_seq(seq); + if (g_str_equal(resp, "^done")) + { + gchar *pidstr = strchr(list[0], ' '); + if (pidstr) + { + GPid pid = -1; + while (g_ascii_isspace(*pidstr)) + { + pidstr++; + } + if (IsDigit(*pidstr)) + { + gchar *end = pidstr; + while (IsDigit(*end)) + { + end++; + } + *end = '\0'; + pid = gdbio_atoi(pidstr); + if ((pid > 0) && (!gdbio_get_target_pid())) + { + gdbio_set_target_pid(pid); + gdbio_send_cmd("-exec-continue\n"); + } + } + } + } +} + + +GHashTable * +gdbio_get_results(gchar * resp, gchar ** list) +{ + if (strncmp(resp, "^error", 6) == 0) + { + if (resp[6] == ',') + { + GHashTable *h = gdblx_parse_results(resp + 7); + HSTR(h, msg); + gchar *tmp = NULL; + if (msg) + { + if (g_str_equal(msg, "unknown error")) + { + gint len = g_strv_length(list); + if ((len > 1) && list[len - 2] && *list[len - 2]) + { + tmp = list[len - 2]; + if (tmp[0] == '&') + { + tmp++; + } + tmp = g_strcompress(tmp); + g_strstrip(tmp); + msg = tmp; + } + } + gdbio_error_func(msg); + if (tmp) + { + g_free(tmp); + } + } + if (h) + { + g_hash_table_destroy(h); + } + } + return NULL; + } + if (strncmp(resp, "^done,", 6) == 0) + return gdblx_parse_results(resp + 6); + if (strncmp(resp, "*stopped,", 9) == 0) + { + gdbio_do_status(GdbStopped); + return gdblx_parse_results(resp + 9); + } + return NULL; +} + + + +static void handle_response_line(gchar * str, gchar ** list); + + +void +gdbio_set_starting(gboolean s) +{ + starting = s; +} + +void +gdbio_target_started(gint seq, gchar ** list, gchar * resp) +{ + if ((strncmp(resp, "^error", 6) == 0) && (!gdbio_get_target_pid())) + { + gdbio_error_func(_("Error starting target process!\n")); + gdbio_do_status(GdbFinished); + } + else + { + handle_response_lines(list); + } +} + + + +static void +set_main_break(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HTAB(h, bkpt); + gdbio_pop_seq(seq); + if (bkpt) + { + if (gdblx_check_keyval(bkpt, "number", "1")) + { + gdbio_do_status(GdbLoaded); + } + } + if (h) + g_hash_table_destroy(h); +} + + +void +gdbio_parse_file_list(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HLST(h, files); + gdbio_pop_seq(seq); + if (files) + { + free_source_list(); + g_slist_foreach(files, parse_file_list_cb, files); + free_source_list(); + gdbio_send_seq_cmd(set_main_break, "-break-insert _start\n"); + } + else + { + gdbio_error_func + (_("This executable does not appear to contain the required debugging information.")); + } + if (h) + g_hash_table_destroy(h); +} + + + + + +static gboolean +do_step_func(GHashTable * h, gchar * reason) +{ + HTAB(h, frame); + HSTR(frame, fullname); + HSTR(frame, line); + if (fullname && line) + { + if (gdbio_setup.step_func) + { + gchar *p; + for (p = reason; *p; p++) + { + if (*p == '-') + { + *p = ' '; + } + } + gdbio_setup.step_func(fullname, line, reason); + } + else + { + gdbio_info_func("%s:%s", fullname, line); + } + return TRUE; + } + else + { + HSTR(frame, func); + if (func) + { + return TRUE; + } + } + return FALSE; +} + + + +#define reason_is(r) (r && reason && g_str_equal(reason, r)) + +static void +finish_function(gint seq, gchar ** list, gchar * resp) +{ + if (strncmp(resp, "^running", 8) == 0) + { + gdbio_set_running(TRUE); + gdbio_do_status(GdbRunning); + } + else + { + GHashTable *h = gdbio_get_results(resp, list); + HSTR(h, reason); + gdbio_pop_seq(seq); + if (reason_is("function-finished")) + { + gdbio_do_status(GdbStopped); + do_step_func(h, reason); + } + else + { + handle_response_lines(list); + } + if (h) + g_hash_table_destroy(h); + } +} + + +static void +return_function(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + do_step_func(h, "returned"); + } + else + { + handle_response_lines(list); + } +} + + + + +static void +watchpoint_trigger(GHashTable * h, GHashTable * wp, gchar * reason) +{ + HTAB(h, value); + HSTR(wp, exp); + HSTR(wp, number); + HSTR(value, new); + HSTR(value, old); + gchar *readval = gdblx_lookup_string(value, "value"); + if (new && old) + { + gdbio_info_func("%s #%s expression:%s old-value:%s new-value:%s\n", + reason, number ? number : "?", exp ? exp : "?", old, new); + } + else + { + if (old) + { + gdbio_info_func("%s #%s expression:%s value:%s", reason, + number ? number : "?", exp ? exp : "?", old); + } + else + { + if (new) + { + gdbio_info_func("%s #%s expression:%s value:%s", reason, + number ? number : "?", exp ? exp : "?", new); + } + else + { + if (readval) + { + gdbio_info_func("%s #%s expression:%s value:%s", reason, + number ? number : "?", exp ? exp : "?", + readval); + } + else + { + gdbio_info_func("%s #%s expression:%s", reason, + number ? number : "?", exp ? exp : "?"); + } + } + } + } +} + +static gboolean +handle_results_hash(GHashTable * h, gchar * rectype, gchar ** list) +{ + if (g_str_equal(rectype, "^error")) + { + HSTR(h, msg); + gchar *tmp = NULL; + if (msg) + { + if (g_str_equal(msg, "unknown error")) + { + gint len = g_strv_length(list); + if ((len > 1) && list[len - 2] && *list[len - 2]) + { + tmp = list[len - 2]; + if (tmp[0] == '&') + { + tmp++; + } + tmp = g_strcompress(tmp); + g_strstrip(tmp); + msg = tmp; + } + } + gdbio_error_func(msg); + if (tmp) + { + g_free(tmp); + } + return TRUE; + } + else + return FALSE; + } + if (g_str_equal(rectype, "^done")) + { + + HTAB(h, frame); + if (frame) + { + HSTR(frame, fullname); + HSTR(frame, line); + if (fullname && line) + { + return do_step_func(h, "done"); + } + } + return FALSE; + } + if (g_str_equal(rectype, "*stopped")) + { + HSTR(h, reason); + if (!reason) + { + return FALSE; + } + if (reason_is("breakpoint-hit")) + { + if (gdblx_check_keyval(h, "bkptno", "1")) + { + gdbio_send_seq_cmd(parse_process_info, + "-interpreter-exec console "info proc"\n"); + return TRUE; + } + else + { + return (do_step_func(h, reason)); + } + return FALSE; + } + gdbio_set_running(FALSE); + if (reason_is("signal-received")) + { + HSTR(h, signal_name); + HSTR(h, signal_meaning); + HSTR(h, thread_id); + HTAB(h, frame); + HSTR(frame, func); + HSTR(frame, file); + HSTR(frame, fullname); + HSTR(frame, line); + HSTR(frame, addr); + HSTR(frame, from); + HLST(frame, args); + if (!fullname) + { + fullname = "??"; + } + if (!file) + { + file = "??"; + } + if (!line) + { + line = "??"; + } + if (!args) + { + args = NULL; + } + if (signal_name && signal_meaning && thread_id && frame && + addr && func && file && fullname) + { + if (gdbio_setup.signal_func) + { + GdbSignalInfo si; + si.signal_name = signal_name; + si.signal_meaning = signal_meaning; + si.addr = addr; + si.func = func; + si.file = file; + si.fullname = fullname; + si.line = line; + si.from = from; + gdbio_setup.signal_func(&si); + } + else + { + gdbio_info_func + (_("Program received signal %s (%s) at %s in function %s() at %s:%s"), + signal_name, signal_meaning, addr, func, file, + line); + } + return TRUE; + } + } + + + if (reason_is("end-stepping-range")) + { + return do_step_func(h, reason); + } + if (reason_is("function-finished")) + { + return do_step_func(h, reason); + } + if (reason_is("location-reached")) + { + return do_step_func(h, reason); + } + if (reason_is("watchpoint-trigger")) + { + HTAB(h, wpt); + if (wpt) + { + watchpoint_trigger(h, wpt, reason); + } + return do_step_func(h, reason); + } + if (reason_is("access-watchpoint-trigger")) + { + HTAB(h, hw_awpt); + if (hw_awpt) + { + watchpoint_trigger(h, hw_awpt, reason); + } + return do_step_func(h, reason); + } + if (reason_is("read-watchpoint-trigger")) + { + HTAB(h, hw_rwpt); + if (hw_rwpt) + { + watchpoint_trigger(h, hw_rwpt, reason); + } + return do_step_func(h, reason); + } + if (reason_is("watchpoint-scope")) + { + HSTR(h, wpnum); + gdbio_info_func(_("Watchpoint #%s out of scope"), wpnum ? wpnum : "?"); + gdbio_send_cmd("-exec-continue\n"); + return do_step_func(h, reason); + } + + if (reason_is("exited-signalled")) + { + HSTR(h, signal_name); + HSTR(h, signal_meaning); + gdbio_info_func(_("Program exited on signal %s (%s).\n"), + signal_name ? signal_name : "UNKNOWN", + signal_meaning ? signal_meaning : _("Unknown signal")); + gdbio_target_exited(signal_name); + return TRUE; + } + if (reason_is("exited")) + { + HSTR(h, exit_code); + gchar *tail = NULL; + gint ec = -1; + if (exit_code) + { + ec = strtoull(exit_code, &tail, 8); + if ((!tail) || (*tail)) + { + ec = -1; + } + } + gdbio_info_func(_("Program exited with code %d [%s]\n"), ec, + exit_code ? exit_code : _("(unknown)")); + gdbio_target_exited(exit_code); + return TRUE; + } + if (g_str_equal(reason, "exited-normally")) + { + gdbio_info_func(_("Program exited normally.\n")); + gdbio_target_exited("0"); + return TRUE; + } + } + return FALSE; +} + + + +static void +handle_response_line(gchar * str, gchar ** list) +{ + gchar *rv = str; + if (!rv) + { + return; + } + switch (rv[0]) + { + case '~': + case '@': + case '&': + { + rv++; + if (rv[0] == '"') + { + gint len = strlen(rv); + memmove(rv, rv + 1, len); + if (rv[len - 2] == '"') + { + rv[len - 2] = '\0'; + } + } + rv = g_strcompress(rv); + gdbio_info_func(rv); + g_free(rv); + break; + } + case '^': + case '*': + { + gchar *comma = strchr(rv, ','); + if (comma) + { + GHashTable *h = gdblx_parse_results(comma + 1); + *comma = '\0'; + if (g_str_equal(rv, "*stopped")) + { + gdbio_do_status(GdbStopped); + } + if (!handle_results_hash(h, rv, list)) + { + gdblx_dump_table(h); + } + g_hash_table_destroy(h); + } + else + { + if (g_str_equal(rv, "^running")) + { + if (starting) + { + starting = FALSE; + } + else + { + gdbio_do_status(GdbRunning); + } + gdbio_set_running(TRUE); + } + } + break; + } + default: + { + break; + } + } +} + + + + +#define prompt "\n(gdb) \n" +#define prlen 8 + + +#define starts_with_token(resp) \ + ( IsDigit(resp[0]) && IsDigit(resp[1]) && \ + IsDigit(resp[2]) && IsDigit(resp[3]) && \ + IsDigit(resp[4]) && IsDigit(resp[5]) && \ + strchr("^*=+", resp[6]) ) + + +void +gdbio_consume_response(GString * recv_buf) +{ + gchar *eos = NULL; + do + { + if (recv_buf->len) + { + eos = strstr(recv_buf->str, prompt); + } + else + { + eos = NULL; + } + if (eos) + { + gint seq = -1; + gchar seqbuf[SEQ_LEN + 2]; + ResponseHandler handler = NULL; + gchar **lines; + gint len; + *eos = '\0'; + lines = g_strsplit(recv_buf->str, "\n", 0); + *eos = '\n'; + len = g_strv_length(lines); + g_string_erase(recv_buf, 0, (eos - recv_buf->str) + 8); + if (len) + { + gchar *resp = lines[len - 1]; + if (starts_with_token(resp)) + { + strncpy(seqbuf, resp, SEQ_LEN); + seqbuf[SEQ_LEN] = '\0'; + seq = gdbio_atoi(seqbuf); + if (seq >= 0) + { + handler = gdbio_seq_lookup(seq); + if (handler) + { + memmove(resp, resp + SEQ_LEN, + strlen(resp + SEQ_LEN) + 1); + g_strstrip(resp); + handler(seq, lines, resp); + g_strfreev(lines); + do_loop(); + continue; + } + else + { + g_printerr + ("***Error: Could not find handler for token #%s\n", + seqbuf); + } + } + } + } + if (lines) + { + handle_response_lines(lines); + g_strfreev(lines); + } + } + do_loop(); + } + while (eos); +} + + + + + +void +gdbio_continue() +{ + gdbio_send_cmd("-exec-continue\n"); +} + + + + +void +gdbio_return() +{ + gdbio_send_seq_cmd(return_function, "-exec-return\n"); +} + + +void +gdbio_finish() +{ + gdbio_send_seq_cmd(finish_function, "-exec-finish\n"); +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io-run.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-run.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-run.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,792 @@ + +/* + * gdb-io-run.c - Process execution and input functions for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + + +#include <unistd.h> +#include <signal.h> +#include <string.h> +#include <glib.h> +#include "gdb-io-priv.h" +#include "support.h" + + +extern gint g_unlink(const gchar * filename); + + +GdbIoSetup gdbio_setup; + + +static gchar *gdbio_args[] = { "gdb", "--interpreter=mi", "-nx", NULL }; + +static GPid gdbio_pid = 0; +static GPid target_pid = 0; +static GPid xterm_pid = 0; + +static GSource *gdbio_src; +static gint gdbio_in; +static gint gdbio_out; +static GIOChannel *gdbio_ch_in; +static GIOChannel *gdbio_ch_out; +static guint gdbio_id_in; +static guint gdbio_id_out; + +static GString send_buf = { NULL, 0, 0 }; +static GString recv_buf = { NULL, 0, 0 }; + +static gchar *xterm_tty_file = NULL; + + +static gint sequence = SEQ_MIN; +static gboolean is_running = FALSE; +static gint process_token = 0; + + +/* + Hash table to associate a "tokenized" GDB command with a function call. + This stores a list of key-value pairs where the unique sequence-number + (GDB token) is the key, and a ResponseHandler function pointer is the value. +*/ +static GHashTable *sequencer; + + + +#if !GLIB_CHECK_VERSION(2, 14, 0) +static void +g_string_append_vprintf(GString *str, const gchar *fmt, va_list args) +{ + gchar *tmp = g_strdup_vprintf(fmt, args); + g_string_append(str, tmp); + g_free(tmp); +} +#endif + + +/* Add a handler function to the sequencer */ +gint +gdbio_send_seq_cmd(ResponseHandler func, const gchar * fmt, ...) +{ + va_list args; + if (!gdbio_pid) + { + return 0; + } + if (sequence >= SEQ_MAX) + { + sequence = SEQ_MIN; + } + else + { + sequence++; + } + if (!sequencer) + { + sequencer = g_hash_table_new(g_direct_hash, g_direct_equal); + } + g_hash_table_insert(sequencer, GINT_TO_POINTER(sequence), func); + g_string_append_printf(&send_buf, "%d", sequence); + va_start(args, fmt); + g_string_append_vprintf(&send_buf, fmt, args); + va_end(args); + return sequence; +} + + +ResponseHandler +gdbio_seq_lookup(gint seq) +{ + return g_hash_table_lookup(sequencer, GINT_TO_POINTER(seq)); +} + + +void +gdbio_pop_seq(gint seq) +{ + g_hash_table_remove(sequencer, GINT_TO_POINTER(seq)); +} + +static gboolean +gerror(gchar * msg, GError ** err) +{ + if (*err) + { + if (msg) + { + gdbio_error_func("%s\n%s\n", msg, (*err)->message); + } + else + { + gdbio_error_func("%s\n", (*err)->message); + } + g_error_free(*err); + *err = NULL; + return TRUE; + } + else + { + return FALSE; + } +} + + +gint +gdbio_atoi(gchar * str) +{ + gchar *tail = NULL; + gint rv = strtol(str, &tail, 10); + return (tail && !*tail) ? rv : -1; +} + + +void +gdbio_error_func(gchar * fmt, ...) +{ + va_list args; + gchar *msg; + va_start(args, fmt); + msg = g_strdup_vprintf(fmt, args); + if (gdbio_setup.error_func) + { + gdbio_setup.error_func(g_strstrip(msg)); + } + else + { + g_printerr("%s", msg); + } + g_free(msg); + va_end(args); +} + + +void +gdbio_info_func(gchar * fmt, ...) +{ + va_list args; + gchar *msg; + va_start(args, fmt); + msg = g_strdup_vprintf(fmt, args); + if (gdbio_setup.info_func) + { + gdbio_setup.info_func(g_strstrip(msg)); + } + else + { + g_printerr("%s", msg); + } + g_free(msg); + va_end(args); +} + + +gint +gdbio_wait(gint ms) +{ + struct timespec req = { 0, 0 }, rem = + { + 0, 0}; + gint rms = ms; + if (ms >= 1000) + { + req.tv_sec = ms / 1000; + rms = ms % 1000; + } + req.tv_nsec = rms * 1000000; /* 1 millisecond = 1,000,000 nanoseconds */ + do + { + nanosleep(&req, &rem); + if ((rem.tv_sec || rem.tv_nsec)) + { + memcpy(&req, &rem, sizeof(req)); + memset(&rem, 0, sizeof(rem)); + } + else + { + break; + } + + } + while (1); + return ms; +} + + + +void +gdbio_send_cmd(const gchar * fmt, ...) +{ + va_list args; + if (!gdbio_pid) + { + return; + } + va_start(args, fmt); + g_string_append_vprintf(&send_buf, fmt, args); + va_end(args); +} + + + +void +gdbio_set_running(gboolean running) +{ + is_running = running; +} + + + +static void +kill_xterm() +{ + if (xterm_pid) + { + kill(xterm_pid, SIGKILL); + xterm_pid = 0; + } +} + + + +static gchar * +start_xterm(gchar * term_cmd) +{ + gchar *term_args[] = { "xterm", "-title", "Debug terminal", "-e", NULL, NULL, NULL }; + GError *err = NULL; + gint i = 0; + gchar *tty_name = NULL; + const gchar *exe_name = basename(term_cmd); + gchar *all; + if (!gdbio_setup.temp_dir) + { + gdbio_error_func(_("tty temporary directory not specified!\n")); + return NULL; + } + if (!g_file_test(gdbio_setup.temp_dir, G_FILE_TEST_IS_DIR)) + { + gdbio_error_func(_("tty temporary directory not found!\n")); + return NULL; + } + if (!xterm_tty_file) + { + xterm_tty_file = g_strdup_printf("%s/%d.tty", gdbio_setup.temp_dir, getpid()); + } + if (g_file_set_contents(xterm_tty_file, "", -1, &err)) + { + g_unlink(xterm_tty_file); + } + else + { + gerror("writing ttyname logfile", &err); + g_unlink(xterm_tty_file); + return FALSE; + } + if (!gdbio_setup.tty_helper) + { + gdbio_error_func(_("tty helper program not specified!\n")); + return NULL; + } + if (! + (g_file_test(gdbio_setup.tty_helper, G_FILE_TEST_IS_EXECUTABLE) && + g_file_test(gdbio_setup.tty_helper, G_FILE_TEST_IS_REGULAR))) + { + gdbio_error_func(_("tty helper program not found!\n")); + return NULL; + } + term_args[0] = term_cmd; + if (g_str_equal(exe_name, "xterm") || g_str_equal(exe_name, "konsole")) + { + term_args[1] = "-T"; + } + else + { + if (g_str_equal(exe_name, "gnome-terminal")) + { + term_args[1] = "--title"; + term_args[3] = "-x"; + } + else + { + if (g_str_equal(exe_name, "rxvt") || g_str_equal(exe_name, "urxvt")) + { + term_args[1] = "-title"; + } + else + { + term_args[1] = "-e"; + term_args[2] = NULL; + } + } + } + i = 0; + while (term_args[i]) + { + i++; + } + term_args[i] = gdbio_setup.tty_helper; + term_args[i + 1] = xterm_tty_file; + all = g_strjoinv("" "", term_args); + gdbio_info_func(""%s"\n", all); + g_free(all); + if (g_spawn_async(NULL, term_args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &xterm_pid, &err)) + { + gchar *contents = NULL; + gsize len; + gint ms = 0; + do + { + if (g_file_test(xterm_tty_file, G_FILE_TEST_EXISTS)) + { + if (g_file_get_contents(xterm_tty_file, &contents, &len, &err)) + { + g_strstrip(contents); + if (strlen(contents)) + { + tty_name = g_strdup(contents); + gdbio_info_func(_("Attaching to terminal %s\n"), + tty_name); + } + break; + } + else + { + gerror("Error getting tty name:", &err); + } + } + ms += gdbio_wait(250); + } + while (ms <= 10000); + if (ms > 10000) + { + gdbio_error_func(_("Timeout waiting for TTY name.\n")); + kill_xterm(); + } + } + else + { + gerror("Error starting terminal: ", &err); + } + g_unlink(xterm_tty_file); + return tty_name; +} + + + +static void +free_buf(GString * buf) +{ + if (buf->str) + { + g_free(buf->str); + buf->str = NULL; + buf->len = 0; + buf->allocated_len = 0; + } +} + +static void +shutdown_channel(GIOChannel ** ch) +{ + if (*ch) + { + GError *err = NULL; + gint fd = g_io_channel_unix_get_fd(*ch); + g_io_channel_shutdown(*ch, TRUE, &err); + gerror("Shutting down channel", &err); + g_io_channel_unref(*ch); + *ch = NULL; + if (fd >= 0) + { + close(fd); + } + } +} + + +static void +on_gdb_exit(GPid pid, gint status, gpointer data) +{ + gdbio_pid = 0; + gdbio_info_func(_("GDB exited (pid=%d)\n"), pid); + g_spawn_close_pid(pid); + + + g_source_remove(gdbio_id_in); + shutdown_channel(&gdbio_ch_in); + + g_source_remove(gdbio_id_out); + shutdown_channel(&gdbio_ch_out); + + free_buf(&send_buf); + if (recv_buf.len) + { + gdbio_info_func("%s\n", recv_buf.str); + } + free_buf(&recv_buf); + + if (target_pid) + { + kill(target_pid, SIGKILL); + target_pid = 0; + } + gdbio_set_running(FALSE); + gdblx_scanner_done(); + gdbio_do_status(GdbDead); +} + + + +static gboolean +on_send_to_gdb(GIOChannel * src, GIOCondition cond, gpointer data) +{ + GIOStatus st; + GError *err = NULL; + gsize count; + if (send_buf.len) + { + while (send_buf.len) + { + st = g_io_channel_write_chars(src, send_buf.str, send_buf.len, &count, + &err); + g_string_erase(&send_buf, 0, count); + if (err || (st == G_IO_STATUS_ERROR) || (st == G_IO_STATUS_EOF)) + { + gerror("Error sending command", &err); + break; + } + } + st = g_io_channel_flush(src, &err); + gerror("Error pushing command", &err); + } + do_loop(); + gdbio_wait(10); + return TRUE; +} + + + +void +gdbio_target_exited(gchar * reason) +{ + gdbio_info_func(_("Target process exited. (pid=%d; %s%s)\n"), target_pid, + reason + && g_ascii_isdigit(reason[0]) ? _("code=") : _("reason:"), + reason ? reason : "unknown"); + target_pid = 0; + kill_xterm(); + gdbio_set_running(FALSE); + gdbio_do_status(GdbFinished); + if (process_token) + { + gdbio_pop_seq(process_token); + process_token = 0; + } +} + +static GdbStatus gdbio_status = GdbDead; + +void +gdbio_do_status(GdbStatus s) +{ + gdbio_status = s; + if (gdbio_setup.status_func) + { + gdbio_setup.status_func(s); + } +} + + + +void +gdbio_pause_target() +{ + if (target_pid) + { + kill(target_pid, SIGINT); + } +} + + + +static void +target_killed(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + gdbio_pop_seq(seq); + if (h) + { + g_hash_table_destroy(h); + } + if (strncmp(resp, "^done", 5) == 0) + { + gdbio_target_exited("killed by GDB"); + } +} + + + +void +gdbio_kill_target(gboolean force) +{ + if (target_pid) + { + gchar pidstr[64]; + GPid this_pid = target_pid; + gint ms = 0; + snprintf(pidstr, sizeof(pidstr) - 1, "/proc/%d", target_pid); + if (!g_file_test(pidstr, G_FILE_TEST_IS_DIR)) + { + gdbio_info_func(_("Directory %s not found!\n"), pidstr); + pidstr[0] = '\0'; + } + if (!force) + { + gdbio_info_func(_("Shutting down target program.\n")); + gdbio_send_seq_cmd(target_killed, "kill SIGKILL\n"); + gdbio_wait(250); + do_loop(); + } + else + { + gdbio_info_func(_("Killing target program.\n")); + kill(this_pid, SIGKILL); + } + while (1) + { + do_loop(); + if (ms >= 2000) + { + gdbio_info_func(_("Timeout waiting for target process.\n")); + if (!force) + { + gdbio_info_func(_("Using a bigger hammer!\n")); + gdbio_kill_target(TRUE); + } + break; + } + if (target_pid != this_pid) + { + break; + } + if ((pidstr[0]) && !g_file_test(pidstr, G_FILE_TEST_EXISTS)) + { + break; + } + if (!(ms % 1000)) + gdbio_info_func(_("Waiting for target process to exit.\n")); + ms += gdbio_wait(250); + } + } + kill_xterm(); +} + +static gboolean +have_console() +{ + return (gdbio_status == GdbLoaded) || (gdbio_status == GdbStopped) + || (gdbio_status == GdbFinished); +} + +void +gdbio_exit() +{ + gdbio_kill_target(!have_console()); + if (gdbio_pid) + { + GPid this_gdb = gdbio_pid; + gint ms = 0; + gchar pidstr[64]; + snprintf(pidstr, sizeof(pidstr) - 1, "/proc/%d", this_gdb); + if (is_running) + { + if (!g_file_test(pidstr, G_FILE_TEST_IS_DIR)) + { + gdbio_info_func(_("Directory %s not found!\n"), pidstr); + pidstr[0] = '\0'; + } + do + { + do_loop(); + if (gdbio_pid == this_gdb) + { + gdbio_info_func(_("Killing GDB (pid=%d)\n"), this_gdb); + } + else + { + break; + } + kill(this_gdb, SIGKILL); + ms += gdbio_wait(500); + if (pidstr[0] && !g_file_test(pidstr, G_FILE_TEST_EXISTS)) + { + break; + } + if (ms > 2000) + { + gdbio_error_func(_("Timeout trying to kill GDB.\n")); + break; + } + } + while (1); + free_buf(&send_buf); + gdbio_wait(500); + } + else + { + gdbio_info_func(_("Shutting down GDB\n")); + gdbio_send_cmd("-gdb-exit\n"); + while (1) + { + do_loop(); + ms += gdbio_wait(250); + if (pidstr[0] && !g_file_test(pidstr, G_FILE_TEST_EXISTS)) + { + break; + } + if (gdbio_pid == this_gdb) + { + if (!(ms % 1000)) + gdbio_info_func(_("Waiting for GDB to exit.\n")); + } + else + { + break; + } + if (ms > 2000) + { + gdbio_info_func(_("Timeout waiting for GDB to exit.\n")); + gdbio_set_running(TRUE); + gdbio_exit(); + break; + } + } + } + } + if (sequencer) + { + g_hash_table_destroy(sequencer); + sequencer = NULL; + } + g_free(xterm_tty_file); + xterm_tty_file = NULL; +} + + + +void gdbio_parse_file_list(gint seq, gchar ** list, gchar * resp); + +static void +load_target(const gchar * exe_name) +{ + gdbio_set_running(FALSE); + gdbio_send_cmd("-file-exec-and-symbols %s\n", exe_name); + gdbio_send_seq_cmd(gdbio_parse_file_list, "-file-list-exec-source-files\n"); + +} + + + +static gboolean +on_read_from_gdb(GIOChannel * src, GIOCondition cond, gpointer data) +{ + gchar buf[1024]; + GIOStatus st; + GError *err = NULL; + gsize count; + st = g_io_channel_read_chars(src, buf, sizeof(buf) - 1, &count, &err); + buf[count] = '\0'; + g_string_append_len(&recv_buf, buf, count); + gerror("Error reading response", &err); + gdbio_consume_response(&recv_buf); + gdbio_wait(10); + return TRUE; +} + + +#define GDB_SPAWN_FLAGS \ +G_SPAWN_SEARCH_PATH | \ +G_SPAWN_DO_NOT_REAP_CHILD + + +void +gdbio_load(const gchar * exe_name) +{ + GError *err = NULL; + gdbio_exit(); + if (g_spawn_async_with_pipes(NULL, gdbio_args, NULL, + GDB_SPAWN_FLAGS, NULL, + NULL, &gdbio_pid, &gdbio_in, &gdbio_out, NULL, &err)) + { + gdbio_info_func(_("Starting gdb (pid=%d)\n"), gdbio_pid); + + g_child_watch_add(gdbio_pid, on_gdb_exit, NULL); + gdbio_src = g_child_watch_source_new(gdbio_pid); + + gdbio_ch_in = g_io_channel_unix_new(gdbio_in); + g_io_channel_set_encoding(gdbio_ch_in, NULL, &err); + gerror("Error setting encoding", &err); + g_io_channel_set_buffered(gdbio_ch_in, FALSE); + + gdbio_ch_out = g_io_channel_unix_new(gdbio_out); + g_io_channel_set_encoding(gdbio_ch_out, NULL, &err); + gerror("Error setting encoding", &err); + g_io_channel_set_buffered(gdbio_ch_out, FALSE); + + gdbio_id_in = g_io_add_watch(gdbio_ch_in, G_IO_OUT, on_send_to_gdb, NULL); + gdbio_id_out = g_io_add_watch(gdbio_ch_out, G_IO_IN, on_read_from_gdb, NULL); + + gdbio_send_cmd("-gdb-set width 0\n-gdb-set height 0\n"); + if (exe_name) + { + load_target(exe_name); + } + } + else + { + gerror("Error starting debugger.", &err); + } +} + + + +void +gdbio_exec_target(gchar * terminal_command) +{ + if (terminal_command) + { + gchar *tty_name = start_xterm(terminal_command); + if (tty_name) + { + gdbio_send_cmd("-inferior-tty-set %s\n", tty_name); + g_free(tty_name); + } + else + return; + } + if (process_token) + { + gdbio_pop_seq(process_token); + } + gdbio_set_starting(TRUE); + gdbio_do_status(GdbStartup); + process_token = gdbio_send_seq_cmd(gdbio_target_started, "-exec-run\n"); +} + + + +void +gdbio_set_target_pid(GPid pid) +{ + gdbio_info_func(_("Started target process. (pid=%d)\n"), pid); + target_pid = pid; +} + + + +GPid +gdbio_get_target_pid() +{ + return target_pid; +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io-stack.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io-stack.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io-stack.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,201 @@ + +/* + * gdb-io-stack.c - Stack information functions for GDB wrapper library. + * + * See the file "gdb-io.h" for license information. + * + */ + +#include <string.h> +#include <glib.h> + +#include "gdb-io-priv.h" +#include "support.h" + +static GdbListFunc gdbio_stack_list_func = NULL; +static GSList *frame_list = NULL; + +/* + Max number of frames to return in stack list - + you can increase if you want, but too large + value can be *very* slow! +*/ +#define MAX_STACK_RETURN 1024 + + + +static void +free_frame_list() +{ + GSList *p; + for (p = frame_list; p; p = p->next) + { + if (p->data) + { + GdbFrameInfo *f = p->data; + if (f->func) + { + g_free(f->func); + } + if (f->filename) + { + g_free(f->filename); + } + if (f->args) + { + gdbio_free_var_list(f->args); + } + g_free(f); + p->data = NULL; + } + } + g_slist_free(frame_list); + frame_list = NULL; +} + + + +static void +stack_cb(gpointer data, gpointer user_data) +{ + GdbLxValue *v = (GdbLxValue *) data; + if (v && (v->type == vt_HASH)) + { + GHashTable *frame = v->hash; + HSTR(frame, level); + HSTR(frame, addr); + HSTR(frame, func); + HSTR(frame, file); + HSTR(frame, fullname); + HSTR(frame, line); + if (!fullname) + fullname = file; + if (level && addr && func && fullname && line) + { + GdbFrameInfo *frame_info = g_new0(GdbFrameInfo, 1); + strncpy(frame_info->level, level, sizeof(frame_info->level) - 1); + strncpy(frame_info->addr, addr, sizeof(frame_info->addr) - 1); + strncpy(frame_info->line, line, sizeof(frame_info->line) - 1); + frame_info->func = g_strdup(func); + frame_info->filename = g_strdup(fullname); + frame_list = g_slist_append(frame_list, frame_info); + } + } +} + + + +static void +merge_stack_args_cb(gpointer data, gpointer user_data) +{ + GdbLxValue *v = (GdbLxValue *) data; + if (v && (v->type = vt_HASH)) + { + GHashTable *hash = v->hash; + HSTR(hash, level); + HLST(hash, args); + if (level && args) + { + gchar *tail; + gint n = strtoull(level, &tail, 10); + GdbFrameInfo *frame = NULL; + GSList *p; + for (p = frame_list; p; p = p->next) + { + if (p->data) + { + GdbFrameInfo *f = p->data; + if (gdbio_atoi(f->level) == n) + { + frame = f; + break; + } + } + } + if (frame) + { + for (p = args; p; p = p->next) + { + v = p->data; + if (v && (v->type = vt_HASH)) + { + HSTR(v->hash, name); + HSTR(v->hash, value); + if (name && value) + { + GdbVar *arg = g_new0(GdbVar, 1); + arg->name = g_strdup(name); + arg->value = g_strdup(value); + frame->args = + g_slist_append(frame->args, arg); + } + } + } + } + } + } +} + + + +static void +parse_stack_args(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HLST(h, stack_args); + gdbio_pop_seq(seq); + if (stack_args) + { + if (frame_list) + { + g_slist_foreach(stack_args, merge_stack_args_cb, NULL); + gdbio_stack_list_func(frame_list); + free_frame_list(); + } + } + if (h) + g_hash_table_destroy(h); +} + + + +static void +parse_stack_list(gint seq, gchar ** list, gchar * resp) +{ + GHashTable *h = gdbio_get_results(resp, list); + HLST(h, stack); + gdbio_pop_seq(seq); + if (stack) + { + g_slist_foreach(stack, stack_cb, h); + if (frame_list) + { + gint len = g_slist_length(frame_list); + if (len >= MAX_STACK_RETURN) + { + gdbio_error_func + (ngettext( + "Stack too deep to display!\n(Showing only %d frame)", + "Stack too deep to display!\n(Showing only %d frames)", + len), len); + } + gdbio_send_seq_cmd(parse_stack_args, "-stack-list-arguments 1 0 %d\n", + len - 1); + } + } + if (h) + g_hash_table_destroy(h); +} + + + +void +gdbio_show_stack(GdbListFunc func) +{ + gdbio_stack_list_func = func; + if (func) + { + gdbio_send_seq_cmd(parse_stack_list, "-stack-list-frames 0 %d\n", + MAX_STACK_RETURN - 1); + } +}
Added: trunk/geany-plugins/geanygdb/src/gdb-io.h =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-io.h (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-io.h 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,232 @@ +/* + * gdb-io.h - A GLib-based library wrapper for the GNU debugger. + * Copyright 2008 Jeff Pohlmeyer <yetanothergeek(at)gmail(dot)com> + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> + + +extern ssize_t getline(char **lineptr, size_t * n, FILE * stream); +extern const gchar *basename(const gchar * path); + +gint gdbio_atoi(gchar * str); +gint gdbio_wait(gint ms); + + +typedef enum +{ + GdbDead, + GdbLoaded, + GdbStartup, + GdbRunning, + GdbStopped, + GdbFinished +} GdbStatus; + + +typedef struct +{ + gchar *type; + gchar *name; + gchar *value; + gchar *numchild; +} GdbVar; + + +typedef struct +{ + gchar level[12]; + gchar addr[12]; + gchar line[12]; + gchar *func; + gchar *filename; + GSList *args; +} GdbFrameInfo; + + +typedef struct +{ + gchar *signal_name; + gchar *signal_meaning; + gchar *addr; + gchar *func; + gchar *file; + gchar *fullname; + gchar *line; + gchar *from; +} GdbSignalInfo; + + +typedef struct +{ + gchar *addr; + gchar *disp; + gchar *enabled; + gchar *file; + gchar *fullname; + gchar *func; + gchar *line; + gchar *number; + gchar *times; + gchar *type; + gchar *what; + gchar *cond; + gchar *ignore; +} GdbBreakPointInfo; + + +typedef struct +{ + gchar *cwd; + gchar *path; + gchar *args; + gchar *dirs; +} GdbEnvironInfo; + + +typedef void (*GdbMsgFunc) (const gchar * msg); +typedef void (*GdbListFunc) (const GSList * list); +typedef void (*GdbFrameFunc) (const GdbFrameInfo * frame, const GSList * locals); +typedef void (*GdbSignalFunc) (const GdbSignalInfo * si); +typedef void (*GdbStatusFunc) (GdbStatus status); +typedef void (*GdbStepFunc) (const gchar * filename, const gchar * line, const gchar * reason); +typedef void (*GdbObjectFunc) (const GdbVar * obj, const GSList * list); +typedef void (*GdbEnvironFunc) (const GdbEnvironInfo * env); + + + +/* Load a program into the debugger */ +void gdbio_load(const gchar * exe_name); + +/* Terminate the debugger ( and the target program, if running ) */ +void gdbio_exit(); + +/* Resume execution after a breakpoint or SIGINT, etc... */ +void gdbio_continue(); + +/* Complete the current function */ +void gdbio_finish(); + +/* Return immediately from the current function */ +void gdbio_return(); + +/* + Execute the previously loaded program in the debugger. + If the terminal_command argument is non-null, it will + be started first, and the target program will be run + in the resulting console. +*/ +void gdbio_exec_target(gchar * terminal_command); + + +/* Send SIGINT to target */ +void gdbio_pause_target(); + + +/* Send SIGKILL to target */ +void gdbio_kill_target(); + + +/* Send a command to GDB */ +void gdbio_send_cmd(const gchar * fmt, ...); + + +/* + Pass a GSList of GdbBreakPointInfo pointers to the func callback + Showing the current list of breakpoints and watchpoints +*/ +void gdbio_show_breaks(GdbListFunc func); + + +/* + These 3 functions pass a GSList of GdbBreakPointInfo pointers to + the func callback showing the current list of breakpoints and + watchpoints after the requested change has been completed. +*/ +void gdbio_add_watch(GdbListFunc func, const gchar * option, const gchar * varname); +void gdbio_add_break(GdbListFunc func, const gchar * filename, const gchar * locn); +void gdbio_delete_break(GdbListFunc func, const gchar * number); + + +void gdbio_enable_break(const gchar * number, gboolean enabled); +void gdbio_ignore_break(const gchar * number, const gchar * times); +void gdbio_break_cond(const gchar * number, const gchar * expr); + + + +/* + Pass a GdbEnvironInfo pointer to the callback to show some + information about current GDB settings. +*/ +void gdbio_get_env(GdbEnvironFunc func); + + +/* + Pass a GSList of GdbFrameInfo pointers to the func callback + representing a backtrace of current call stack. +*/ +void gdbio_show_stack(GdbListFunc func); + + +/* + Passes a GdbFrameInfo pointer and a GSList of GdbVar pointers to func + representing the state of the local variables at the specified level. +*/ +void gdbio_show_locals(GdbFrameFunc func, gchar * level); + + +/* + Passes GdbVar pointer containing information about the variable to + the callback along with a GSList of GdbVar pointers containing + information about each array element or struct field. +*/ +void gdbio_show_object(GdbObjectFunc func, const gchar * varname); + + + +/* + The fields of the gdbio_setup struct should be initialized by the + client application before loading the first target program. + + The tty_helper field must point to the full path and filename + of the included "ttyhelper" program (see ttyhelper.c) + + The temp_dir must point to a readable and writeable directory. + + The client is also responsible for allocating/freeing the + string fields. +*/ + +typedef struct _GdbIoSetup +{ + GdbMsgFunc info_func; + GdbMsgFunc error_func; + GdbSignalFunc signal_func; + GdbStatusFunc status_func; + GdbStepFunc step_func; + gchar *tty_helper; + gchar *temp_dir; +} GdbIoSetup; + +extern GdbIoSetup gdbio_setup;
Added: trunk/geany-plugins/geanygdb/src/gdb-lex.c =================================================================== --- trunk/geany-plugins/geanygdb/src/gdb-lex.c (rev 0) +++ trunk/geany-plugins/geanygdb/src/gdb-lex.c 2009-06-12 22:12:12 UTC (rev 714) @@ -0,0 +1,337 @@ + +/* + * gdb-lex.c - A GLib-based parser for GNU debugger machine interface output. + * + * See the file "gdb-lex.h" for license information. + * + */ + +#include <string.h> +#include <glib.h> +#include "gdb-lex.h" + + +static void +free_value(GdbLxValue * v) +{ + if (v) + { + switch (v->type) + { + case vt_STRING: + { + g_free(v->string); + break; + } + case vt_HASH: + { + g_hash_table_destroy(v->hash); + break; + } + case vt_LIST: + { + GSList *p; + for (p = v->list; p; p = p->next) + { + free_value(p->data); + } + g_slist_free(v->list); + break; + } + } + } +} + + +static GdbLxValue * +new_value(GdbLxValueType type, gpointer data) +{ + GdbLxValue *v = g_new0(GdbLxValue, 1); + v->type = type; + v->data = data; + return v; +} + + +static void +scan_error(GScanner * scanner, gchar * message, gboolean error) +{ + g_printerr("\n%s\n", message); +} + + + + +#define ID_NTH G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "_-" +static GScanner * +init_scanner() +{ + GScanner *scanner = g_scanner_new(NULL); + scanner->msg_handler = scan_error; + scanner->config->cset_identifier_nth = ID_NTH; + return scanner; +} + + +#define new_hash() g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)free_value) +#define curr ((GdbLxValue*)(g_queue_peek_head(queue))) + + + +static void +add_node(GScanner * scanner, gchar ** key, GdbLxValueType type, gpointer data, GQueue * queue) +{ + GdbLxValue *v = new_value(type, data); + switch (curr->type) + { + case vt_STRING: + { + g_scanner_error(scanner, "***** queue head is a string\n"); + break; + } + case vt_HASH: + { + if (*key) + { + g_hash_table_insert(curr->hash, *key, v); + } + else + { + g_scanner_error(scanner, "***** no key for hash\n"); + } + break; + } + case vt_LIST: + { + curr->list = g_slist_append(curr->list, v); + break; + } + } + *key = NULL; + if (type != vt_STRING) + { + g_queue_push_head(queue, v); + } +} + + +static GScanner *scanner = NULL; + +GHashTable * +gdblx_parse_results(gchar * results) +{ + gchar *key = NULL; + gboolean equals = FALSE; + GHashTable *rv = new_hash();
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
plugins-commits@lists.geany.org