// OBSOLETE /* Definitions to make GDB run on a Sequent Symmetry under ptx, with
// OBSOLETE    Weitek 1167 and i387 support.
// OBSOLETE    Copyright 1986, 1987, 1989, 1992, 1993, 1994, 1995
// OBSOLETE    Free Software Foundation, Inc.
// OBSOLETE 
// OBSOLETE    This file is part of GDB.
// OBSOLETE 
// OBSOLETE    This program is free software; you can redistribute it and/or modify
// OBSOLETE    it under the terms of the GNU General Public License as published by
// OBSOLETE    the Free Software Foundation; either version 2 of the License, or
// OBSOLETE    (at your option) any later version.
// OBSOLETE 
// OBSOLETE    This program is distributed in the hope that it will be useful,
// OBSOLETE    but WITHOUT ANY WARRANTY; without even the implied warranty of
// OBSOLETE    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// OBSOLETE    GNU General Public License for more details.
// OBSOLETE 
// OBSOLETE    You should have received a copy of the GNU General Public License
// OBSOLETE    along with this program; if not, write to the Free Software
// OBSOLETE    Foundation, Inc., 59 Temple Place - Suite 330,
// OBSOLETE    Boston, MA 02111-1307, USA.  */
// OBSOLETE 
// OBSOLETE /* Symmetry version by Jay Vosburgh (fubar@sequent.com) */
// OBSOLETE 
// OBSOLETE #ifdef _SEQUENT_PTX4_
// OBSOLETE #include "config/xm-sysv4.h"
// OBSOLETE #endif /* _SEQUENT_PTX4_ */
// OBSOLETE 
// OBSOLETE /* This machine doesn't have the siginterrupt call.  */
// OBSOLETE #define NO_SIGINTERRUPT
// OBSOLETE 
// OBSOLETE #define HAVE_WAIT_STRUCT
// OBSOLETE 
// OBSOLETE #undef HAVE_TERMIO
// OBSOLETE #define HAVE_TERMIOS
// OBSOLETE #define USG
// OBSOLETE 
// OBSOLETE #define USE_O_NOCTTY
