]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mac-xdep.c
import gdb-1999-07-07 post reformat
[thirdparty/binutils-gdb.git] / gdb / mac-xdep.c
CommitLineData
c906108c
SS
1/* Top level support for Mac interface to GDB, the GNU debugger.
2 Copyright 1994 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Stan Shebs.
4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b
JM
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22#include "defs.h"
23
24#include <readline/readline.h>
25#include <readline/history.h>
26
27#include <Types.h>
28#include <Resources.h>
29#include <QuickDraw.h>
30#include <Fonts.h>
31#include <Events.h>
32#include <Windows.h>
33#include <Menus.h>
34#include <TextEdit.h>
35#include <Dialogs.h>
36#include <Desk.h>
37#include <ToolUtils.h>
38#include <Memory.h>
39#include <SegLoad.h>
40#include <Files.h>
41#include <Folders.h>
42#include <OSUtils.h>
43#include <OSEvents.h>
44#include <DiskInit.h>
45#include <Packages.h>
46#include <Traps.h>
47#include <Lists.h>
48#include <Gestalt.h>
49#include <PPCToolbox.h>
50#include <AppleEvents.h>
51#include <StandardFile.h>
52#include <Sound.h>
53
54#ifdef MPW
55#define QD(whatever) (qd.##whatever)
56#define QDPat(whatever) (&(qd.##whatever))
57#endif /* MPW */
58
59#ifdef THINK_C
60#define QD(whatever) (whatever)
61#endif
62
63#define p2c(pstr,cbuf) \
64 strncpy(cbuf, ((char *) (pstr) + 1), pstr[0]); \
65 cbuf[pstr[0]] = '\0';
66
67#define pascalify(STR) \
68 sprintf(tmpbuf, " %s", STR); \
69 tmpbuf[0] = strlen(STR);
70
71#include "gdbcmd.h"
72#include "call-cmds.h"
73#include "symtab.h"
74#include "inferior.h"
75#include "signals.h"
76#include "target.h"
77#include "breakpoint.h"
78#include "gdbtypes.h"
79#include "expression.h"
80#include "language.h"
81
82#include "mac-defs.h"
83
84int debug_openp = 0;
85
86/* This is true if we are running as a standalone application. */
87
88int mac_app;
89
90/* This is true if we are using WaitNextEvent. */
91
92int use_wne;
93
94/* This is true if we have Color Quickdraw. */
95
96int has_color_qd;
97
98/* This is true if we are using Color Quickdraw. */
99
100int use_color_qd;
101
102int inbackground;
103
c5aa993b
JM
104Rect dragrect =
105{-32000, -32000, 32000, 32000};
c906108c
SS
106Rect sizerect;
107
108int sbarwid = 15;
109
110/* Globals for the console window. */
111
112WindowPtr console_window;
113
114ControlHandle console_v_scrollbar;
115
116Rect console_v_scroll_rect;
117
118TEHandle console_text;
119
120Rect console_text_rect;
121
122/* This will go away eventually. */
c5aa993b
JM
123gdb_has_a_terminal ()
124{
125 return 1;
126}
c906108c
SS
127
128mac_init ()
129{
130 SysEnvRec se;
131 int eventloopdone = 0;
132 char *str;
133 Boolean gotevent;
134 Point mouse;
135 EventRecord event;
136 WindowPtr win;
137 RgnHandle cursorRgn;
138 int i;
139 Handle menubar;
140 MenuHandle menu;
141 Handle siow_resource;
142
143 mac_app = 0;
144
c5aa993b 145 str = getenv ("DEBUG_GDB");
c906108c
SS
146 if (str != NULL && str[0] != '\0')
147 {
c5aa993b 148 if (strcmp (str, "openp") == 0)
c906108c
SS
149 debug_openp = 1;
150 }
c5aa993b 151
c906108c
SS
152 /* Don't do anything if we`re running under MPW. */
153 if (!StandAlone)
154 return;
155
156 /* Don't do anything if we're using SIOW. */
157 /* This test requires that the siow 0 resource, as defined in
158 {RIncludes}siow.r, not be messed with. If it is, then the
159 standard Mac setup below will step on SIOW's Mac setup and
160 most likely crash the machine. */
c5aa993b 161 siow_resource = GetResource ('siow', 0);
c906108c
SS
162 if (siow_resource != nil)
163 return;
164
165 mac_app = 1;
166
167 /* Do the standard Mac environment setup. */
168 InitGraf (&QD (thePort));
169 InitFonts ();
170 FlushEvents (everyEvent, 0);
171 InitWindows ();
172 InitMenus ();
173 TEInit ();
174 InitDialogs (NULL);
175 InitCursor ();
176
177 /* Color Quickdraw is different from Classic QD. */
c5aa993b 178 SysEnvirons (2, &se);
c906108c
SS
179 has_color_qd = se.hasColorQD;
180 /* Use it if we got it. */
181 use_color_qd = has_color_qd;
182
183 sizerect.top = 50;
184 sizerect.left = 50;
185 sizerect.bottom = 1000;
c5aa993b 186 sizerect.right = 1000;
c906108c
SS
187#if 0
188 sizerect.bottom = screenBits.bounds.bottom - screenBits.bounds.top;
c5aa993b 189 sizerect.right = screenBits.bounds.right - screenBits.bounds.left;
c906108c
SS
190#endif
191
192 /* Set up the menus. */
193 menubar = GetNewMBar (mbMain);
194 SetMenuBar (menubar);
195 /* Add the DAs etc as usual. */
196 menu = GetMHandle (mApple);
c5aa993b
JM
197 if (menu != nil)
198 {
199 AddResMenu (menu, 'DRVR');
200 }
c906108c
SS
201 DrawMenuBar ();
202
203 new_console_window ();
204}
205
206new_console_window ()
207{
208 /* Create the main window we're going to play in. */
209 if (has_color_qd)
c5aa993b 210 console_window = GetNewCWindow (wConsole, NULL, (WindowPtr) - 1L);
c906108c 211 else
c5aa993b 212 console_window = GetNewWindow (wConsole, NULL, (WindowPtr) - 1L);
c906108c
SS
213
214 SetPort (console_window);
215 console_text_rect = console_window->portRect;
216 /* Leave 8 pixels of blank space, for aesthetic reasons and to
217 make it easier to select from the beginning of a line. */
218 console_text_rect.left += 8;
219 console_text_rect.bottom -= sbarwid - 1;
220 console_text_rect.right -= sbarwid - 1;
221 console_text = TENew (&console_text_rect, &console_text_rect);
222 TESetSelect (0, 40000, console_text);
223 TEDelete (console_text);
224 TEAutoView (1, console_text);
225
226 console_v_scroll_rect = console_window->portRect;
227 console_v_scroll_rect.bottom -= sbarwid - 1;
228 console_v_scroll_rect.left = console_v_scroll_rect.right - sbarwid;
229 console_v_scrollbar =
230 NewControl (console_window, &console_v_scroll_rect,
231 "\p", 1, 0, 0, 0, scrollBarProc, 0L);
232
233 ShowWindow (console_window);
234 SelectWindow (console_window);
235}
236
c5aa993b 237mac_command_loop ()
c906108c
SS
238{
239 SysEnvRec se;
240 int eventloopdone = 0;
241 Boolean gotevent;
242 Point mouse;
243 EventRecord event;
244 WindowPtr win;
245 RgnHandle cursorRgn;
246 int i, tm;
247 Handle menubar;
248 MenuHandle menu;
249
250 /* Figure out if the WaitNextEvent Trap is available. */
251 use_wne =
252 (NGetTrapAddress (0x60, ToolTrap) != NGetTrapAddress (0x9f, ToolTrap));
253 /* Pass WaitNextEvent an empty region the first time through. */
254 cursorRgn = NewRgn ();
255 /* Go into the main event-handling loop. */
256 while (!eventloopdone)
257 {
258 /* Use WaitNextEvent if it is available, otherwise GetNextEvent. */
259 if (use_wne)
260 {
261 get_global_mouse (&mouse);
262 adjust_cursor (mouse, cursorRgn);
c5aa993b 263 tm = GetCaretTime ();
c906108c
SS
264 gotevent = WaitNextEvent (everyEvent, &event, tm, cursorRgn);
265 }
266 else
267 {
268 SystemTask ();
269 gotevent = GetNextEvent (everyEvent, &event);
270 }
271 /* First decide if the event is for a dialog or is just any old event. */
272 if (FrontWindow () != nil && IsDialogEvent (&event))
273 {
274 short itemhit;
275 DialogPtr dialog;
c5aa993b 276
c906108c
SS
277 /* Handle all the modeless dialogs here. */
278 if (DialogSelect (&event, &dialog, &itemhit))
279 {
280 }
281 }
282 else if (gotevent)
283 {
284 /* Make sure we have the right cursor before handling the event. */
285 adjust_cursor (event.where, cursorRgn);
286 do_event (&event);
287 }
288 else
289 {
290 do_idle ();
291 }
292 }
293}
294
295/* Collect the global coordinates of the mouse pointer. */
296
297get_global_mouse (mouse)
c5aa993b 298 Point *mouse;
c906108c
SS
299{
300 EventRecord evt;
c5aa993b 301
c906108c
SS
302 OSEventAvail (0, &evt);
303 *mouse = evt.where;
304}
305
306/* Change the cursor's appearance to be appropriate for the given mouse
307 location. */
308
309adjust_cursor (mouse, region)
c5aa993b
JM
310 Point mouse;
311 RgnHandle region;
c906108c
SS
312{
313}
314
315/* Decipher an event, maybe do something with it. */
316
317do_event (evt)
c5aa993b 318 EventRecord *evt;
c906108c
SS
319{
320 short part, err, rslt = 0;
321 WindowPtr win;
322 Boolean hit;
323 char key;
324 Point pnt;
325
326 switch (evt->what)
327 {
328 case mouseDown:
329 /* See if the click happened in a special part of the screen. */
330 part = FindWindow (evt->where, &win);
331 switch (part)
332 {
333 case inMenuBar:
334 adjust_menus ();
335 do_menu_command (MenuSelect (evt->where));
336 break;
337 case inSysWindow:
338 SystemClick (evt, win);
339 break;
340 case inContent:
341 if (win != FrontWindow ())
342 {
343 /* Bring the clicked-on window to the front. */
344 SelectWindow (win);
345 /* Fix the menu to match the new front window. */
346 adjust_menus ();
347 /* We always want to discard the event now, since clicks in a
c5aa993b
JM
348 windows are often irreversible actions. */
349 }
350 else
351 /* Mouse clicks in the front window do something useful. */
352 do_mouse_down (win, evt);
c906108c
SS
353 break;
354 case inDrag:
355 /* Standard drag behavior, no tricks necessary. */
356 DragWindow (win, evt->where, &dragrect);
357 break;
358 case inGrow:
359 grow_window (win, evt->where);
360 break;
361 case inZoomIn:
362 case inZoomOut:
363 zoom_window (win, evt->where, part);
364 break;
365 case inGoAway:
366 close_window (win);
367 break;
368 }
369 break;
370 case keyDown:
371 case autoKey:
372 key = evt->message & charCodeMask;
373 /* Check for menukey equivalents. */
374 if (evt->modifiers & cmdKey)
375 {
376 if (evt->what == keyDown)
377 {
378 adjust_menus ();
379 do_menu_command (MenuKey (key));
380 }
381 }
382 else
383 {
384 if (evt->what == keyDown)
385 {
386 /* Random keypress, interpret it. */
387 do_keyboard_command (key);
388 }
389 }
390 break;
391 case activateEvt:
392 activate_window ((WindowPtr) evt->message, evt->modifiers & activeFlag);
393 break;
394 case updateEvt:
395 update_window ((WindowPtr) evt->message);
396 break;
397 case diskEvt:
398 /* Call DIBadMount in response to a diskEvt, so that the user can format
c5aa993b 399 a floppy. (from DTS Sample) */
c906108c
SS
400 if (HiWord (evt->message) != noErr)
401 {
402 SetPt (&pnt, 50, 50);
403 err = DIBadMount (pnt, evt->message);
404 }
405 break;
406 case app4Evt:
407 /* Grab only a single byte. */
408 switch ((evt->message >> 24) & 0xFF)
409 {
410 case 0xfa:
411 break;
412 case 1:
413 inbackground = !(evt->message & 1);
414 activate_window (FrontWindow (), !inbackground);
415 break;
416 }
417 break;
418 case kHighLevelEvent:
419 AEProcessAppleEvent (evt);
420 break;
421 case nullEvent:
422 do_idle ();
423 rslt = 1;
424 break;
425 default:
426 break;
427 }
428 return rslt;
429}
430
431/* Do any idle-time activities. */
432
433do_idle ()
434{
435 TEIdle (console_text);
436}
437
438grow_window (win, where)
c5aa993b
JM
439 WindowPtr win;
440 Point where;
c906108c
SS
441{
442 long winsize;
443 int h, v;
444 GrafPtr oldport;
445
446 winsize = GrowWindow (win, where, &sizerect);
447 /* Only do anything if it actually changed size. */
448 if (winsize != 0)
449 {
450 GetPort (&oldport);
451 SetPort (win);
452 if (win == console_window)
453 {
454 EraseRect (&win->portRect);
455 h = LoWord (winsize);
456 v = HiWord (winsize);
457 SizeWindow (win, h, v, 1);
458 resize_console_window ();
459 }
460 SetPort (oldport);
461 }
462}
463
464zoom_window (win, where, part)
c5aa993b
JM
465 WindowPtr win;
466 Point where;
467 short part;
c906108c
SS
468{
469 ZoomWindow (win, part, (win == FrontWindow ()));
470 if (win == console_window)
471 {
472 resize_console_window ();
473 }
474}
475
476resize_console_window ()
477{
478 adjust_console_sizes ();
479 adjust_console_scrollbars ();
480 adjust_console_text ();
481 InvalRect (&console_window->portRect);
482}
483
484close_window (win)
c5aa993b 485 WindowPtr win;
c906108c
SS
486{
487}
488
489pascal void
490v_scroll_proc (ControlHandle control, short part)
491{
492 int oldval, amount = 0, newval;
493 int pagesize = ((*console_text)->viewRect.bottom - (*console_text)->viewRect.top) / (*console_text)->lineHeight;
494 if (part)
495 {
496 oldval = GetCtlValue (control);
497 switch (part)
498 {
499 case inUpButton:
500 amount = 1;
501 break;
502 case inDownButton:
503 amount = -1;
504 break;
505 case inPageUp:
506 amount = pagesize;
507 break;
508 case inPageDown:
c5aa993b 509 amount = -pagesize;
c906108c
SS
510 break;
511 default:
512 /* (should freak out) */
513 break;
514 }
c5aa993b 515 SetCtlValue (control, oldval - amount);
c906108c
SS
516 newval = GetCtlValue (control);
517 amount = oldval - newval;
518 if (amount)
519 TEScroll (0, amount * (*console_text)->lineHeight, console_text);
520 }
521}
522
c5aa993b 523do_mouse_down (WindowPtr win, EventRecord * event)
c906108c
SS
524{
525 short part, value;
526 Point mouse;
527 ControlHandle control;
528
c5aa993b 529 if (1 /*is_app_window(win) */ )
c906108c
SS
530 {
531 SetPort (win);
532 mouse = event->where;
533 GlobalToLocal (&mouse);
c5aa993b 534 part = FindControl (mouse, win, &control);
c906108c
SS
535 if (control == console_v_scrollbar)
536 {
537 switch (part)
538 {
539 case inThumb:
540 value = GetCtlValue (control);
541 part = TrackControl (control, mouse, nil);
542 if (part)
543 {
544 value -= GetCtlValue (control);
545 if (value)
c5aa993b
JM
546 TEScroll (0, value * (*console_text)->lineHeight,
547 console_text);
c906108c
SS
548 }
549 break;
550 default:
c5aa993b
JM
551#if 0 /* don't deal with right now */
552#if 1 /* universal headers */
c906108c
SS
553 value = TrackControl (control, mouse, (ControlActionUPP) v_scroll_proc);
554#else
555 value = TrackControl (control, mouse, (ProcPtr) v_scroll_proc);
556#endif
557#endif
558 break;
559 }
560 }
561 else
562 {
563 TEClick (mouse, 0, console_text);
564 }
565 }
566}
567
568scroll_text (hlines, vlines)
c5aa993b 569 int hlines, vlines;
c906108c
SS
570{
571}
572
573activate_window (win, activate)
c5aa993b
JM
574 WindowPtr win;
575 int activate;
c906108c
SS
576{
577 Rect grow_rect;
578
c5aa993b
JM
579 if (win == nil)
580 return;
c906108c
SS
581 /* It's convenient to make the activated window also be the
582 current GrafPort. */
583 if (activate)
c5aa993b 584 SetPort (win);
c906108c
SS
585 /* Activate the console window's scrollbar. */
586 if (win == console_window)
587 {
588 if (activate)
589 {
590 TEActivate (console_text);
591 /* Cause the grow icon to be redrawn at the next update. */
592 grow_rect = console_window->portRect;
593 grow_rect.top = grow_rect.bottom - sbarwid;
594 grow_rect.left = grow_rect.right - sbarwid;
595 InvalRect (&grow_rect);
596 }
597 else
598 {
599 TEDeactivate (console_text);
600 DrawGrowIcon (console_window);
601 }
602 HiliteControl (console_v_scrollbar, (activate ? 0 : 255));
603 }
604}
605
606update_window (win)
c5aa993b 607 WindowPtr win;
c906108c
SS
608{
609 int controls = 1, growbox = 0;
610 GrafPtr oldport;
611
612 /* Set the updating window to be the current grafport. */
613 GetPort (&oldport);
614 SetPort (win);
615/* recalc_depths(); */
616 BeginUpdate (win);
617 if (win == console_window)
618 {
619 draw_console ();
620 controls = 1;
621 growbox = 1;
622 }
623 if (controls)
624 UpdateControls (win, win->visRgn);
625 if (growbox)
626 DrawGrowIcon (win);
627 EndUpdate (win);
628 SetPort (oldport);
629}
630
631adjust_menus ()
632{
633}
634
635do_menu_command (which)
c5aa993b 636 long which;
c906108c
SS
637{
638 short menuid, menuitem;
639 short itemHit;
640 Str255 daname;
641 short daRefNum;
642 Boolean handledbyda;
643 WindowPtr win;
644 short ditem;
645 int i;
646 char cmdbuf[300];
647
648 cmdbuf[0] = '\0';
649 menuid = HiWord (which);
650 menuitem = LoWord (which);
651 switch (menuid)
652 {
653 case mApple:
654 switch (menuitem)
655 {
656 case miAbout:
657 Alert (128, nil);
658 break;
659#if 0
660 case miHelp:
661 /* (should pop up help info) */
662 break;
663#endif
664 default:
665 GetItem (GetMHandle (mApple), menuitem, daname);
666 daRefNum = OpenDeskAcc (daname);
667 }
668 break;
669 case mFile:
670 switch (menuitem)
671 {
672 case miFileNew:
673 if (console_window == FrontWindow ())
674 {
675 close_window (console_window);
676 }
677 new_console_window ();
678 break;
679 case miFileOpen:
680 SysBeep (20);
681 break;
682 case miFileQuit:
683 ExitToShell ();
684 break;
685 }
686 break;
687 case mEdit:
688 /* handledbyda = SystemEdit(menuitem-1); */
689 switch (menuitem)
690 {
691 case miEditCut:
692 TECut (console_text);
693 break;
694 case miEditCopy:
695 TECopy (console_text);
696 break;
697 case miEditPaste:
698 TEPaste (console_text);
699 break;
700 case miEditClear:
701 TEDelete (console_text);
702 break;
703 }
704 /* All of these operations need the same postprocessing. */
705 adjust_console_sizes ();
706 adjust_console_scrollbars ();
707 adjust_console_text ();
708 break;
709 case mDebug:
710 switch (menuitem)
711 {
712 case miDebugTarget:
713 sprintf (cmdbuf, "target %s", "remote");
714 break;
715 case miDebugRun:
716 sprintf (cmdbuf, "run");
717 break;
718 case miDebugContinue:
719 sprintf (cmdbuf, "continue");
720 break;
721 case miDebugStep:
722 sprintf (cmdbuf, "step");
723 break;
724 case miDebugNext:
725 sprintf (cmdbuf, "next");
726 break;
727 }
728 break;
729 }
730 HiliteMenu (0);
731 /* Execute a command if one had been given. Do here because a command
732 may longjmp before we get a chance to unhilite the menu. */
733 if (strlen (cmdbuf) > 0)
734 execute_command (cmdbuf, 0);
735}
736
737char commandbuf[1000];
738
739do_keyboard_command (key)
c5aa993b 740 int key;
c906108c
SS
741{
742 int startpos, endpos, i, len;
743 char *last_newline;
744 char buf[10], *text_str, *command, *cmd_start;
745 CharsHandle text;
746
747 if (key == '\015' || key == '\003')
748 {
749 text = TEGetText (console_text);
750 HLock ((Handle) text);
751 text_str = *text;
752 startpos = (*console_text)->selStart;
753 endpos = (*console_text)->selEnd;
754 if (startpos != endpos)
755 {
756 len = endpos - startpos;
757 cmd_start = text_str + startpos;
758 }
759 else
760 {
761 for (i = startpos - 1; i >= 0; --i)
762 if (text_str[i] == '\015')
763 break;
764 last_newline = text_str + i;
765 len = (text_str + startpos) - 1 - last_newline;
766 cmd_start = last_newline + 1;
767 }
c5aa993b
JM
768 if (len > 1000)
769 len = 999;
770 if (len < 0)
771 len = 0;
c906108c
SS
772 strncpy (commandbuf + 1, cmd_start, len);
773 commandbuf[1 + len] = 0;
774 command = commandbuf + 1;
775 HUnlock ((Handle) text);
c5aa993b 776 commandbuf[0] = strlen (command);
c906108c
SS
777
778 /* Insert a newline and recalculate before doing any command. */
779 key = '\015';
780 TEKey (key, console_text);
781 TEInsert (buf, 1, console_text);
782 adjust_console_sizes ();
783 adjust_console_scrollbars ();
784 adjust_console_text ();
785
786 if (strlen (command) > 0)
787 {
788 execute_command (command, 0);
789 bpstat_do_actions (&stop_bpstat);
790 }
791 }
792 else
793 {
794 /* A self-inserting character. This includes delete. */
795 TEKey (key, console_text);
796 }
797}
798
799/* Draw all graphical stuff in the console window. */
800
801draw_console ()
802{
803 SetPort (console_window);
804 TEUpdate (&(console_window->portRect), console_text);
805}
806
807/* Cause an update of a given window's entire contents. */
808
809force_update (win)
c5aa993b 810 WindowPtr win;
c906108c
SS
811{
812 GrafPtr oldport;
813
c5aa993b
JM
814 if (win == nil)
815 return;
c906108c
SS
816 GetPort (&oldport);
817 SetPort (win);
818 EraseRect (&win->portRect);
819 InvalRect (&win->portRect);
820 SetPort (oldport);
821}
822
823adjust_console_sizes ()
824{
825 Rect tmprect;
826
827 tmprect = console_window->portRect;
828 /* Move and size the scrollbar. */
829 MoveControl (console_v_scrollbar, tmprect.right - sbarwid, 0);
830 SizeControl (console_v_scrollbar, sbarwid + 1, tmprect.bottom - sbarwid + 1);
831 /* Move and size the text. */
832 tmprect.left += 7;
833 tmprect.right -= sbarwid;
834 tmprect.bottom -= sbarwid;
c5aa993b 835 InsetRect (&tmprect, 1, 1);
c906108c
SS
836 (*console_text)->destRect = tmprect;
837 /* Fiddle bottom of viewrect to be even multiple of text lines. */
838 tmprect.bottom = tmprect.top
839 + ((tmprect.bottom - tmprect.top) / (*console_text)->lineHeight)
c5aa993b 840 * (*console_text)->lineHeight;
c906108c
SS
841 (*console_text)->viewRect = tmprect;
842}
843
844adjust_console_scrollbars ()
845{
846 int lines, newmax, value;
847
848 (*console_v_scrollbar)->contrlVis = 0;
849 lines = (*console_text)->nLines;
850 newmax = lines - (((*console_text)->viewRect.bottom
851 - (*console_text)->viewRect.top)
852 / (*console_text)->lineHeight);
c5aa993b
JM
853 if (newmax < 0)
854 newmax = 0;
c906108c
SS
855 SetCtlMax (console_v_scrollbar, newmax);
856 value = ((*console_text)->viewRect.top - (*console_text)->destRect.top)
857 / (*console_text)->lineHeight;
858 SetCtlValue (console_v_scrollbar, value);
859 (*console_v_scrollbar)->contrlVis = 0xff;
860 ShowControl (console_v_scrollbar);
861}
862
863/* Scroll the TE record so that it is consistent with the scrollbar(s). */
864
865adjust_console_text ()
866{
867 TEScroll (((*console_text)->viewRect.left
868 - (*console_text)->destRect.left)
c5aa993b 869 - 0 /* get h scroll value */ ,
c906108c
SS
870 ((((*console_text)->viewRect.top - (*console_text)->destRect.top)
871 / (*console_text)->lineHeight)
872 - GetCtlValue (console_v_scrollbar))
873 * (*console_text)->lineHeight,
874 console_text);
875}
876
877/* Readline substitute. */
878
879char *
880readline (char *prrompt)
881{
882 return gdb_readline (prrompt);
883}
884
885char *rl_completer_word_break_characters;
886
887char *rl_completer_quote_characters;
888
889int (*rl_completion_entry_function) ();
890
891int rl_point;
892
893char *rl_line_buffer;
894
895char *rl_readline_name;
896
897/* History substitute. */
898
899void
900add_history (char *buf)
901{
902}
903
904void
905stifle_history (int n)
906{
907}
908
909int
910unstifle_history ()
911{
912}
913
914int
915read_history (char *name)
916{
917}
918
919int
920write_history (char *name)
921{
922}
923
924int
925history_expand (char *x, char **y)
926{
927}
928
929extern HIST_ENTRY *
930history_get (int xxx)
931{
932 return NULL;
933}
934
935int history_base;
936
937char *
938filename_completion_function (char *text, char *name)
939{
940 return "?";
941}
942
943char *
944tilde_expand (char *str)
945{
946 return strsave (str);
947}
948
949/* Modified versions of standard I/O. */
950
951#undef fprintf
952
953int
c5aa993b 954hacked_fprintf (FILE * fp, const char *fmt,...)
c906108c
SS
955{
956 int ret;
957 va_list ap;
958
959 va_start (ap, fmt);
960 if (mac_app && (fp == stdout || fp == stderr))
961 {
962 char buf[1000];
963
c5aa993b
JM
964 ret = vsprintf (buf, fmt, ap);
965 TEInsert (buf, strlen (buf), console_text);
c906108c
SS
966 }
967 else
968 ret = vfprintf (fp, fmt, ap);
969 va_end (ap);
970 return ret;
971}
972
973#undef printf
974
975int
c5aa993b 976hacked_printf (const char *fmt,...)
c906108c
SS
977{
978 int ret;
979 va_list ap;
980
981 va_start (ap, fmt);
c5aa993b 982 ret = hacked_vfprintf (stdout, fmt, ap);
c906108c
SS
983 va_end (ap);
984 return ret;
985}
986
987#undef vfprintf
988
c5aa993b
JM
989int
990hacked_vfprintf (FILE * fp, const char *format, va_list args)
c906108c
SS
991{
992 if (mac_app && (fp == stdout || fp == stderr))
993 {
994 char buf[1000];
995 int ret;
996
c5aa993b
JM
997 ret = vsprintf (buf, format, args);
998 TEInsert (buf, strlen (buf), console_text);
999 if (strchr (buf, '\n'))
c906108c
SS
1000 {
1001 adjust_console_sizes ();
1002 adjust_console_scrollbars ();
1003 adjust_console_text ();
1004 }
1005 return ret;
1006 }
1007 else
1008 return vfprintf (fp, format, args);
1009}
1010
1011#undef fputs
1012
c5aa993b 1013hacked_fputs (const char *s, FILE * fp)
c906108c
SS
1014{
1015 if (mac_app && (fp == stdout || fp == stderr))
1016 {
c5aa993b
JM
1017 TEInsert (s, strlen (s), console_text);
1018 if (strchr (s, '\n'))
c906108c
SS
1019 {
1020 adjust_console_sizes ();
1021 adjust_console_scrollbars ();
1022 adjust_console_text ();
1023 }
1024 return 0;
1025 }
1026 else
1027 return fputs (s, fp);
1028}
1029
1030#undef fputc
1031
c5aa993b 1032hacked_fputc (const char c, FILE * fp)
c906108c
SS
1033{
1034 if (mac_app && (fp == stdout || fp == stderr))
1035 {
1036 char buf[1];
1037
1038 buf[0] = c;
1039 TEInsert (buf, 1, console_text);
1040 if (c == '\n')
1041 {
1042 adjust_console_sizes ();
1043 adjust_console_scrollbars ();
1044 adjust_console_text ();
1045 }
1046 return c;
1047 }
1048 else
1049 return fputc (c, fp);
1050}
1051
1052#undef putc
1053
c5aa993b 1054hacked_putc (const char c, FILE * fp)
c906108c
SS
1055{
1056 if (mac_app && (fp == stdout || fp == stderr))
1057 {
1058 char buf[1];
1059
1060 buf[0] = c;
1061 TEInsert (buf, 1, console_text);
1062 if (c == '\n')
1063 {
1064 adjust_console_sizes ();
1065 adjust_console_scrollbars ();
1066 adjust_console_text ();
1067 }
1068 return c;
1069 }
1070 else
1071 return fputc (c, fp);
1072}
1073
1074#undef fflush
1075
c5aa993b 1076hacked_fflush (FILE * fp)
c906108c
SS
1077{
1078 if (mac_app && (fp == stdout || fp == stderr))
1079 {
1080 adjust_console_sizes ();
1081 adjust_console_scrollbars ();
1082 adjust_console_text ();
1083 return 0;
1084 }
1085 return fflush (fp);
1086}
1087
1088#undef fgetc
1089
c5aa993b 1090hacked_fgetc (FILE * fp)
c906108c
SS
1091{
1092 if (mac_app && (fp == stdin))
1093 {
1094 /* Catch any attempts to use this. */
c5aa993b 1095 DebugStr ("\pShould not be reading from stdin!");
c906108c
SS
1096 return '\n';
1097 }
1098 return fgetc (fp);
1099}