[BACK]Return to next.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/next.trm, Revision 1.1

1.1     ! maekawa     1: /*
        !             2:  * $Id: next.trm,v 1.22 1998/06/18 14:59:21 ddenholm Exp $
        !             3:  *
        !             4:  */
        !             5:
        !             6: /* GNUPLOT - next.trm */
        !             7:
        !             8: /*[
        !             9:  * Copyright 1991 - 1993, 1998
        !            10:  *
        !            11:  * Permission to use, copy, and distribute this software and its
        !            12:  * documentation for any purpose with or without fee is hereby granted,
        !            13:  * provided that the above copyright notice appear in all copies and
        !            14:  * that both that copyright notice and this permission notice appear
        !            15:  * in supporting documentation.
        !            16:  *
        !            17:  * Permission to modify the software is granted, but not the right to
        !            18:  * distribute the complete modified source code.  Modifications are to
        !            19:  * be distributed as patches to the released version.  Permission to
        !            20:  * distribute binaries produced by compiling modified sources is granted,
        !            21:  * provided you
        !            22:  *   1. distribute the corresponding source modifications from the
        !            23:  *    released version in the form of a patch file along with the binaries,
        !            24:  *   2. add special version identification to distinguish your version
        !            25:  *    in addition to the base release version number,
        !            26:  *   3. provide your name and address as the primary contact for the
        !            27:  *    support of your modified version, and
        !            28:  *   4. retain our contact information in regard to use of the base
        !            29:  *    software.
        !            30:  * Permission to distribute the released version of the source code along
        !            31:  * with corresponding source modifications in the form of a patch file is
        !            32:  * granted with same provisions 2 through 4 for binary distributions.
        !            33:  *
        !            34:  * This software is provided "as is" without express or implied warranty
        !            35:  * to the extent permitted by applicable law.
        !            36: ]*/
        !            37:
        !            38: /*
        !            39:  * This file is included by ../term.c via ../term.h.
        !            40:  *
        !            41:  * This terminal driver supports:
        !            42:  *     next
        !            43:  *
        !            44:  * AUTHORS
        !            45:  *  Robert Lutwak from Russell Lang's post.trm
        !            46:  *  'old' option invokes Nick Strobel's original, single viewport terminal
        !            47:  *
        !            48:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            49:  *
        !            50:  * This terminal attempts to connect, via the NeXTstep Distributed
        !            51:  * Objects system, to the "gnuplotServer."  If there is no such
        !            52:  * service registered with the OS, the terminal attempts to fire
        !            53:  * up GnuTerm.app.  If the user has not set the environment variable
        !            54:  * GNUTERMPATH, the terminal uses the users ApplicationPaths Workspace
        !            55:  * dwrite to search for GnuTerm.app (Note:  this is usually something
        !            56:  * like ~/Apps, ~/LocalApps, ~/NextApps, etc.).
        !            57:  * In order to use this filter, you MUST have GnuTerm.app installed
        !            58:  * on your system.
        !            59:  *
        !            60:  * Once connected to the server, this filter is basically Russell Lang's
        !            61:  * Postscript filter, except that the resultant postscript code
        !            62:  * is sent, via the D.O. system, to GnuTerm.app, which manages
        !            63:  * the windows which produce the postscript output on the screen.
        !            64:  *
        !            65:  *
        !            66:  * Defaults are
        !            67:  * 'set term next new dashed auto "Helvetica" 14'
        !            68:  *
        !            69:  * To change font to Times-Roman and font size to 20pts use
        !            70:  * 'set term next "Times-Roman" 20'.
        !            71:  *
        !            72:  * to choose window by title
        !            73:  * 'set term next title "Window title"
        !            74:  *
        !            75:  * Monitor Options:
        !            76:  * monochrome, color
        !            77:  *
        !            78:  * To invoke Nick Strobel's old terminal
        !            79:  * 'set term next old'
        !            80:  */
        !            81:
        !            82: #include "driver.h"
        !            83:
        !            84: #ifdef TERM_REGISTER
        !            85: register_term(next)
        !            86: #endif
        !            87:
        !            88: #ifdef TERM_PROTO
        !            89:
        !            90: /* whether or not to compile support for the old (self-contained)
        !            91:    NeXT terminal */
        !            92: /* #define NEXT_OLDTERMINAL    1 */
        !            93:
        !            94: #import <appkit/appkit.h>
        !            95: #import <remote/NXProxy.h>     /* setProtocolForProxy */
        !            96: #import <remote/NXConnection.h>        /* setProtocolForProxy */
        !            97: #import <machkit/NXNetNameServer.h>
        !            98: #import <machkit/senderIsInvalid.h>
        !            99: #import <stdarg.h>
        !           100:
        !           101:
        !           102: #ifdef NEXT_OLDTERMINAL
        !           103: static void window_create __PROTO((void));
        !           104: @interface EpsViewer:Application
        !           105: {
        !           106:     id theNewWin;
        !           107: }
        !           108:
        !           109: -windowCreate:(NXCoord)
        !           110: width Height:(NXCoord) height;
        !           111: -(NXRect *) nextRectForWidth:(NXCoord)
        !           112: width Height:(NXCoord) height;
        !           113: @end
        !           114: #endif /* NEXT_OLDTERMINAL */
        !           115:
        !           116:
        !           117: TERM_PUBLIC void NEXT_options __PROTO((void));
        !           118: TERM_PUBLIC void NEXT_common_init __PROTO((int uses_fonts, unsigned int xoff, unsigned int yoff, unsigned int xsize, unsigned int ysize, char **dict));
        !           119: TERM_PUBLIC void NEXT_init __PROTO((void));
        !           120: TERM_PUBLIC void NEXT_graphics __PROTO((void));
        !           121: TERM_PUBLIC void NEXT_text __PROTO((void));
        !           122: TERM_PUBLIC void NEXT_reset __PROTO((void));
        !           123: TERM_PUBLIC void NEXT_linetype __PROTO((int linetype));
        !           124: TERM_PUBLIC void NEXT_move __PROTO((unsigned int x, unsigned int y));
        !           125: TERM_PUBLIC void NEXT_vector __PROTO((unsigned int x, unsigned int y));
        !           126: TERM_PUBLIC void NEXT_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !           127: TERM_PUBLIC int NEXT_text_angle __PROTO((int ang));
        !           128: TERM_PUBLIC int NEXT_justify_text __PROTO((enum JUSTIFY mode));
        !           129: TERM_PUBLIC void NEXT_point __PROTO((unsigned int x, unsigned int y, int number));
        !           130: TERM_PUBLIC int NEXT_set_font __PROTO((char *font));
        !           131: TERM_PUBLIC char *NEXT_RememberFont __PROTO((char *fname));
        !           132: TERM_PUBLIC void NEXT_set_pointsize __PROTO((double size));
        !           133:
        !           134:
        !           135: #define NEXT_POINT_TYPES 8     /* div */
        !           136: #define NEXT_XOFF      1       /* page offset in pts */
        !           137: #define NEXT_YOFF      1
        !           138: #define NEXT_XMAX 6400
        !           139: #define NEXT_YMAX 4800
        !           140: #define NEXT_XLAST (NEXT_XMAX - 1)
        !           141: #define NEXT_YLAST (NEXT_YMAX - 1)
        !           142: #define NEXT_VTIC (NEXT_YMAX/80)
        !           143: #define NEXT_HTIC (NEXT_YMAX/80)
        !           144: #define NEXT_SC (10)           /* scale is 1pt = 10 units */
        !           145: #define        NEXT_LW (0.5*NEXT_SC)   /* linewidth = 0.5 pts */
        !           146: #define NEXT_VCHAR (14*NEXT_SC)        /* default is 14 point characters */
        !           147: #define NEXT_HCHAR (14*NEXT_SC*6/10)
        !           148:
        !           149: #define GOT_NEXT_PROTO
        !           150: #endif
        !           151:
        !           152:
        !           153: #ifndef TERM_PROTO_ONLY
        !           154:
        !           155: #ifdef TERM_BODY
        !           156:
        !           157: @interface GnuTermDriver:Object < NXSenderIsInvalid >
        !           158: {
        !           159:     id server;
        !           160: }
        !           161:
        !           162: -senderIsInvalid:(id) sender;
        !           163: -plot:(char *) PSstr;
        !           164: -init;
        !           165: @end
        !           166:
        !           167:
        !           168: #define DEFAULTNEXTSIZE 10000
        !           169:
        !           170: static id gnuTermAccess;       /* local object manages the D.O. connection */
        !           171:
        !           172: static char *NEXTBuffer, *NEXTBufAt, *NEXTBufEnd;
        !           173: static int NEXTsize;
        !           174: static char NEXTTmpBuf[1000];
        !           175: static void NEXTPrintf(char *,...);
        !           176: static TBOOLEAN NEXT_oldterminal = FALSE;
        !           177: /*static TBOOLEAN NEXT_colordetect();*/
        !           178:
        !           179: static char NEXT_title[MAX_LINE_LEN + 1];      /* name of font */
        !           180:
        !           181: static char NEXT_font[MAX_LINE_LEN + 1] = "Helvetica"; /* name of font */
        !           182: static int NEXT_fontsize = 14; /* size of font in pts */
        !           183: static TBOOLEAN NEXT_color = FALSE;
        !           184: static TBOOLEAN NEXT_solid = FALSE;    /*  use dashed lines */
        !           185: static int NEXT_path_count = 0;        /* count of lines in path */
        !           186: static int NEXT_ang = 0;       /* text angle */
        !           187: static enum JUSTIFY NEXT_justify = LEFT;       /* text is flush left */
        !           188:
        !           189: static TBOOLEAN NEXT_duplex_state = FALSE;
        !           190: static TBOOLEAN NEXT_duplex_option = FALSE;
        !           191:
        !           192: static char GPFAR *GPFAR NEXT_header[] =
        !           193: {
        !           194:     "/M {moveto} bind def\n",
        !           195:     "/L {lineto} bind def\n",
        !           196:     "/R {rmoveto} bind def\n",
        !           197:     "/V {rlineto} bind def\n",
        !           198:     "/vpt2 vpt 2 mul def\n",
        !           199:     "/hpt2 hpt 2 mul def\n",
        !           200: /* flush left show */
        !           201:     "/Lshow { currentpoint stroke M\n",
        !           202:     "  0 vshift R show } def\n",
        !           203: /* flush right show */
        !           204:     "/Rshow { currentpoint stroke M\n",
        !           205:     "  dup stringwidth pop neg vshift R show } def\n",
        !           206: /* centred show */
        !           207:     "/Cshow { currentpoint stroke M\n",
        !           208:     "  dup stringwidth pop -2 div vshift R show } def\n",
        !           209: /* Dash or Color Line */
        !           210:     "/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }\n",
        !           211:     " {pop pop pop Solid {pop []} if 0 setdash} ifelse } def\n",
        !           212: /* Border Lines */
        !           213:     "/BL { stroke gnulinewidth 2 mul setlinewidth } def\n",
        !           214: /* Axes Lines */
        !           215:     "/AL { stroke gnulinewidth 2 div setlinewidth } def\n",
        !           216: /* Plot Lines */
        !           217:     "/PL { stroke gnulinewidth setlinewidth } def\n",
        !           218: /* Line Types */
        !           219:     "/LTb { BL [] 0 0 0 DL } def\n",   /* border */
        !           220:     "/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def\n",       /* axes */
        !           221:     "/LT0 { PL [] 0 1 0 DL } def\n",
        !           222:     "/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def\n",
        !           223:     "/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def\n",
        !           224:     "/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def\n",
        !           225:     "/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def\n",
        !           226:     "/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def\n",
        !           227:     "/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def\n",
        !           228:     "/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def\n",
        !           229:     "/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def\n",
        !           230: /* Point (Round) *//* Matt Heffron make it round */
        !           231:     "/Pnt { stroke [] 0 setdash\n",
        !           232:     "   gsave 1 setlinecap M 0 0 V stroke grestore } def\n",
        !           233:
        !           234: /* Diamond */
        !           235:     "/Dia { stroke [] 0 setdash 2 copy vpt add M\n",
        !           236:     "  hpt neg vpt neg V hpt vpt neg V\n",
        !           237:     "  hpt vpt V hpt neg vpt V closepath stroke\n",
        !           238:     "  Pnt } def\n",
        !           239:
        !           240: /* Plus */
        !           241:     "/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V\n",
        !           242:     "  currentpoint stroke M\n",
        !           243:     "  hpt neg vpt neg R hpt2 0 V stroke\n",
        !           244:     "  } def\n",
        !           245:
        !           246: /* Box */
        !           247:     "/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M\n",
        !           248:     "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
        !           249:     "  hpt2 neg 0 V closepath stroke\n",
        !           250:     "  Pnt } def\n",
        !           251:
        !           252: /* Cross (X) */
        !           253:     "/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           254:     "  hpt2 vpt2 neg V currentpoint stroke M\n",
        !           255:     "  hpt2 neg 0 R hpt2 vpt2 V stroke } def\n",
        !           256:
        !           257: /* Triangle Up*/
        !           258:     "/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M\n",
        !           259:     "  hpt neg vpt -1.62 mul V\n",
        !           260:     "  hpt 2 mul 0 V\n",
        !           261:     "  hpt neg vpt 1.62 mul V closepath stroke\n",
        !           262:     "  Pnt  } def\n",
        !           263:
        !           264: /* Star */
        !           265:     "/Star { 2 copy Pls Crs } def\n",
        !           266:
        !           267: /* div added filed box */
        !           268: /* Filled Box */
        !           269:     "/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           270:     "  0 vpt2 neg V  hpt2 0 V  0 vpt2 V\n",
        !           271:     "  hpt2 neg 0 V  closepath fill } def\n",
        !           272:
        !           273: /* div added filled triangle */
        !           274: /* Triangle Up, Filled */
        !           275:     "/TriUF { stroke [] 0 setdash vpt 1.12 mul add M\n",
        !           276:     "  hpt neg vpt -1.62 mul V\n",
        !           277:     "  hpt 2 mul 0 V\n",
        !           278:     "  hpt neg vpt 1.62 mul V closepath fill } def\n",
        !           279:
        !           280: /* Matt Heffron: added a few more types */
        !           281: /* Triangle Down */
        !           282:     "/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M\n",
        !           283:     "  hpt neg vpt 1.62 mul V\n",
        !           284:     "  hpt 2 mul 0 V\n",
        !           285:     "  hpt neg vpt -1.62 mul V closepath stroke\n",
        !           286:     "  Pnt  } def\n",
        !           287:
        !           288: /* Triangle Down, Filled*/
        !           289:     "/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M\n",
        !           290:     "  hpt neg vpt 1.62 mul V\n",
        !           291:     "  hpt 2 mul 0 V\n",
        !           292:     "  hpt neg vpt -1.62 mul V closepath fill} def\n",
        !           293:
        !           294: /* Diamond, Filled */
        !           295:     "/DiaF { stroke [] 0 setdash vpt add M\n",
        !           296:     "  hpt neg vpt neg V hpt vpt neg V\n",
        !           297:     "  hpt vpt V hpt neg vpt V closepath fill } def\n",
        !           298:
        !           299: /* Pentagon */
        !           300:     "/Pent { stroke [] 0 setdash 2 copy gsave\n",
        !           301:     "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           302:     "  closepath stroke grestore Pnt } def\n",
        !           303:
        !           304: /* Pentagon, Filled */
        !           305:     "/PentF { stroke [] 0 setdash gsave\n",
        !           306:     "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           307:     "  closepath fill grestore } def\n",
        !           308:
        !           309: /* Circle */
        !           310:     "/Circle { stroke [] 0 setdash 2 copy\n",
        !           311:     "  hpt 0 360 arc stroke Pnt } def\n",
        !           312:
        !           313: /* Circle,Filled */
        !           314:     "/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def\n",
        !           315: /* 16 differently filled circles */
        !           316:     "/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def\n",
        !           317:     "/C1 { BL [] 0 setdash 2 copy        moveto\n",
        !           318:     "       2 copy  vpt 0 90 arc closepath fill\n",
        !           319:     "               vpt 0 360 arc closepath } bind def\n",
        !           320:     "/C2 { BL [] 0 setdash 2 copy moveto\n",
        !           321:     "       2 copy  vpt 90 180 arc closepath fill\n",
        !           322:     "               vpt 0 360 arc closepath } bind def\n",
        !           323:     "/C3 { BL [] 0 setdash 2 copy moveto\n",
        !           324:     "       2 copy  vpt 0 180 arc closepath fill\n",
        !           325:     "               vpt 0 360 arc closepath } bind def\n",
        !           326:     "/C4 { BL [] 0 setdash 2 copy moveto\n",
        !           327:     "       2 copy  vpt 180 270 arc closepath fill\n",
        !           328:     "               vpt 0 360 arc closepath } bind def\n",
        !           329:     "/C5 { BL [] 0 setdash 2 copy moveto\n",
        !           330:     "       2 copy  vpt 0 90 arc\n",
        !           331:     "       2 copy moveto\n",
        !           332:     "       2 copy  vpt 180 270 arc closepath fill\n",
        !           333:     "               vpt 0 360 arc } bind def\n",
        !           334:     "/C6 { BL [] 0 setdash 2 copy moveto\n",
        !           335:     "      2 copy  vpt 90 270 arc closepath fill\n",
        !           336:     "              vpt 0 360 arc closepath } bind def\n",
        !           337:     "/C7 { BL [] 0 setdash 2 copy moveto\n",
        !           338:     "      2 copy  vpt 0 270 arc closepath fill\n",
        !           339:     "              vpt 0 360 arc closepath } bind def\n",
        !           340:     "/C8 { BL [] 0 setdash 2 copy moveto\n",
        !           341:     "      2 copy vpt 270 360 arc closepath fill\n",
        !           342:     "              vpt 0 360 arc closepath } bind def\n",
        !           343:     "/C9 { BL [] 0 setdash 2 copy moveto\n",
        !           344:     "      2 copy  vpt 270 450 arc closepath fill\n",
        !           345:     "              vpt 0 360 arc closepath } bind def\n",
        !           346:     "/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill\n",
        !           347:     "       2 copy moveto\n",
        !           348:     "       2 copy vpt 90 180 arc closepath fill\n",
        !           349:     "               vpt 0 360 arc closepath } bind def\n",
        !           350:     "/C11 { BL [] 0 setdash 2 copy moveto\n",
        !           351:     "       2 copy  vpt 0 90 arc closepath fill\n",
        !           352:     "       2 copy moveto\n",
        !           353:     "       2 copy  vpt 180 360 arc closepath fill\n",
        !           354:     "               vpt 0 360 arc closepath } bind def\n",
        !           355:     "/C12 { BL [] 0 setdash 2 copy moveto\n",
        !           356:     "       2 copy  vpt 180 360 arc closepath fill\n",
        !           357:     "               vpt 0 360 arc closepath } bind def\n",
        !           358:     "/C13 { BL [] 0 setdash  2 copy moveto\n",
        !           359:     "       2 copy  vpt 0 90 arc closepath fill\n",
        !           360:     "       2 copy moveto\n",
        !           361:     "       2 copy  vpt 180 360 arc closepath fill\n",
        !           362:     "               vpt 0 360 arc closepath } bind def\n",
        !           363:     "/C14 { BL [] 0 setdash 2 copy moveto\n",
        !           364:     "       2 copy  vpt 90 360 arc closepath fill\n",
        !           365:     "               vpt 0 360 arc } bind def\n",
        !           366:     "/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill\n",
        !           367:     "               vpt 0 360 arc closepath } bind def\n",
        !           368:
        !           369: /* Auxiliary definitions for rectangles */
        !           370:
        !           371:     "/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n",
        !           372:     "       neg 0 rlineto closepath } bind def\n",
        !           373:     "/Square { dup Rec } bind def\n",
        !           374:     "/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def\n",
        !           375:
        !           376: /* 16 differently filled squares */
        !           377:
        !           378:     "/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def\n",
        !           379:     "/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def\n",
        !           380:     "/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
        !           381:     "/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def\n",
        !           382:     "/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
        !           383:     "/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill\n",
        !           384:     "       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
        !           385:     "/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
        !           386:     "/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill\n",
        !           387:     "       2 copy vpt Square fill\n",
        !           388:     "       Bsquare } bind def\n",
        !           389:     "/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def\n",
        !           390:     "/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
        !           391:     "/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill\n",
        !           392:     "       Bsquare } bind def\n",
        !           393:     "/S11 { 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill\n",
        !           394:     "       Bsquare } bind def\n",
        !           395:     "/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def\n",
        !           396:     "/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
        !           397:     "       2 copy vpt Square fill Bsquare } bind def\n",
        !           398:     "/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
        !           399:     "       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
        !           400:     "/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def\n",
        !           401:
        !           402: /* 16 different diamonds (actually just rotated squares) */
        !           403:
        !           404:     "/D0 { gsave translate 45 rotate 0 0 Box stroke grestore } bind def\n",
        !           405:     "/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def\n",
        !           406:     "/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def\n",
        !           407:     "/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def\n",
        !           408:     "/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def\n",
        !           409:     "/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def\n",
        !           410:     "/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def\n",
        !           411:     "/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def\n",
        !           412:     "/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def\n",
        !           413:     "/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def\n",
        !           414:     "/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def\n",
        !           415:     "/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def\n",
        !           416:     "/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def\n",
        !           417:     "/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def\n",
        !           418:     "/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def\n",
        !           419:     "/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def\n",
        !           420:
        !           421:     NULL
        !           422: };
        !           423:
        !           424: static char GPFAR *GPFAR ENHNEXT_header[] =
        !           425: {
        !           426: /* For MFshow and MFwidth the tos is an array with the string and font info:  */
        !           427: /*     [<fontname (a string)> <fontsize> <vertical offset> <width significant?> <text string>]  */
        !           428:
        !           429:     "/MFshow {{dup dup 0 get findfont exch 1 get scalefont setfont\n",
        !           430:     "     [ currentpoint ] exch dup 2 get 0 exch rmoveto dup 4 get show dup\n",
        !           431:     "     3 get {2 get neg 0 exch rmoveto pop} {pop aload pop moveto}ifelse} forall} bind def\n",
        !           432:     "/MFwidth {0 exch {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont\n",
        !           433:     "      4 get stringwidth pop add}\n",
        !           434:     "    {pop} ifelse} forall} bind def\n",
        !           435:
        !           436: /* flush left show */
        !           437:     "/MLshow { currentpoint stroke M\n",
        !           438:     "  0 exch R MFshow } bind def\n",
        !           439:
        !           440: /* flush right show */
        !           441:     "/MRshow { currentpoint stroke M\n",
        !           442:     "  exch dup MFwidth neg 3 -1 roll R MFshow } def\n",
        !           443:
        !           444: /* centred show */
        !           445:     "/MCshow { currentpoint stroke M\n",
        !           446:     "  exch dup MFwidth -2 div 3 -1 roll R MFshow } def\n",
        !           447:     NULL
        !           448: };
        !           449:
        !           450: /* added to post by Matt Heffron <heffron@falstaff.css.beckman.com> */
        !           451: /* moved to post.trm by drd */
        !           452:
        !           453: struct NEXT_FontName {
        !           454:     char *name;
        !           455:     struct NEXT_FontName *next;
        !           456: } *NEXT_DocFonts = NULL;
        !           457:
        !           458: TERM_PUBLIC char *NEXT_RememberFont(fname)
        !           459: char *fname;
        !           460: {
        !           461:     struct NEXT_FontName *fnp;
        !           462:
        !           463:     for (fnp = NEXT_DocFonts; fnp && strcmp(fnp->name, fname); fnp = fnp->next);
        !           464:     if (fnp)
        !           465:        return fnp->name;       /* we must have found it in the list */
        !           466:
        !           467:     if (encoding == ENCODING_ISO_8859_1) {
        !           468:        NEXTPrintf("/%s reencodeISO def\n", fname);
        !           469:     }
        !           470:     fnp = (struct NEXT_FontName *) gp_alloc(sizeof(struct NEXT_FontName), "PostScript Font record");
        !           471:     fnp->name = gp_alloc(1 + strlen(fname), "PostScript Font name");
        !           472:     strcpy(fnp->name, fname);
        !           473:     fnp->next = NEXT_DocFonts;
        !           474:     NEXT_DocFonts = fnp;
        !           475:     return fnp->name;
        !           476: }
        !           477:
        !           478: int NEXT_pen_x, NEXT_pen_y;
        !           479: int NEXT_taken;
        !           480: int NEXT_linetype_last;
        !           481: TBOOLEAN NEXT_relative_ok;
        !           482:
        !           483: TERM_PUBLIC void NEXT_options()
        !           484: {
        !           485:     char buf[40];
        !           486:     for (; !END_OF_COMMAND; ++c_token) {
        !           487:        if (almost_equals(c_token, "d$efault")) {
        !           488:            NEXT_oldterminal = FALSE;
        !           489:            /*NEXT_color=NEXT_colordetect(); */
        !           490:            NEXT_color = FALSE;
        !           491:            NEXT_solid = FALSE;
        !           492:            NEXT_duplex_option = FALSE;
        !           493:            strcpy(NEXT_font, "Helvetica");
        !           494:            NEXT_fontsize = 14;
        !           495:            term->v_char = (unsigned int) (NEXT_fontsize * NEXT_SC);
        !           496:            term->h_char = (unsigned int) (NEXT_fontsize * NEXT_SC * 6 / 10);
        !           497:            term->put_text = NEXT_put_text;
        !           498:        } else if (almost_equals(c_token, "mono$chrome")) {
        !           499:            NEXT_color = FALSE;
        !           500:        } else if (almost_equals(c_token, "col$or")
        !           501:                   || almost_equals(c_token, "col$our")) {
        !           502:            NEXT_color = TRUE;
        !           503:        }
        !           504:        /*
        !           505:           else if (almost_equals(c_token,"auto$detect")) {
        !           506:           NEXT_color = NEXT_colordetect();
        !           507:           }
        !           508:         */
        !           509:
        !           510:        else if (almost_equals(c_token, "so$lid")) {
        !           511:            NEXT_solid = TRUE;
        !           512:        } else if (almost_equals(c_token, "da$shed")) {
        !           513:            NEXT_solid = FALSE;
        !           514:        } else if (almost_equals(c_token, "si$mplex")) {
        !           515:            NEXT_duplex_state = FALSE;
        !           516:            NEXT_duplex_option = TRUE;
        !           517:        } else if (almost_equals(c_token, "du$plex")) {
        !           518:            NEXT_duplex_state = TRUE;
        !           519:            NEXT_duplex_option = TRUE;
        !           520:        } else if (almost_equals(c_token, "defaultp$lex")) {
        !           521:            NEXT_duplex_option = FALSE;
        !           522:        } else if (isstring(c_token)) {
        !           523:            quote_str(NEXT_font, c_token, MAX_LINE_LEN + 1);
        !           524:
        !           525:            /* We must have font size specified */
        !           526:            copy_str(buf, ++c_token, 40);
        !           527:            NEXT_fontsize = atoi(buf);
        !           528:            term->v_char = (unsigned int) (NEXT_fontsize * NEXT_SC);
        !           529:            term->h_char = (unsigned int) (NEXT_fontsize * NEXT_SC * 6 / 10);
        !           530:            sprintf(default_font, "%s,%d", NEXT_font, NEXT_fontsize);
        !           531:        } else if (almost_equals(c_token, "ti$tle")) {
        !           532:            if (!isstring(++c_token)) {
        !           533:                fprintf(stderr, "usage:  set term next title \"newtitle\"\n");
        !           534:                --c_token;
        !           535:            }
        !           536:            quote_str(NEXT_title, c_token, MAX_LINE_LEN + 1);
        !           537:        } else if (almost_equals(c_token, "old")) {
        !           538:            NEXT_oldterminal = TRUE;
        !           539:        } else if (almost_equals(c_token, "new")) {
        !           540:            NEXT_oldterminal = FALSE;
        !           541:        }
        !           542:     }
        !           543:
        !           544:
        !           545:
        !           546:     sprintf(term_options, "%s %s %s %s \"%s\" %d title \"%s\"",
        !           547:            NEXT_oldterminal ? "old" : "new",
        !           548:            NEXT_color ? "color" : "monochrome",
        !           549:            NEXT_solid ? "solid" : "dashed",
        !           550:            NEXT_duplex_option ? (NEXT_duplex_state ? "duplex" : "simplex")
        !           551:            : "defaultplex",
        !           552:            NEXT_font,
        !           553:            NEXT_fontsize,
        !           554:            NEXT_title);
        !           555: }
        !           556:
        !           557: /* store settings passed to common_init() for use in NEXT_graphics()
        !           558:  * are reserved for storing the term options
        !           559:  */
        !           560: static int NEXT_common_uses_fonts;
        !           561: static unsigned int NEXT_common_xoff, NEXT_common_yoff;
        !           562:
        !           563:
        !           564: TERM_PUBLIC void NEXT_common_init(uses_fonts, xoff, yoff, width, height, dict)
        !           565: int uses_fonts;                        /* 0 for NEXT(la)tex */
        !           566: unsigned int xoff, yoff;       /* offset  - 50 for /post, 0 for NEXT(la)tex */
        !           567: unsigned int width, height;    /* for bounding box */
        !           568: char **dict;                   /* extra entries for the dictionary */
        !           569: {
        !           570:     static char GPFAR NEXTi1[] = "%%%%Creator: gnuplot\n\
        !           571: %%%%DocumentFonts: %s\n";
        !           572:     static char GPFAR NEXTi2[] = "%%%%EndComments\n\
        !           573: /gnudict 120 dict def\ngnudict begin\n\
        !           574: /Color %s def\n\
        !           575: /Solid %s def\n\
        !           576: /gnulinewidth %.3f def\n\
        !           577: /vshift %d def\n\
        !           578: /dl {%d mul} def\n\
        !           579: /hpt %.1f def\n\
        !           580: /vpt %.1f def\n";
        !           581:     static char GPFAR *NEXT_iso_8859_1_encoding[] =
        !           582:     {
        !           583:        "/reencodeISO {\n",
        !           584:        "dup dup findfont dup length dict begin\n",
        !           585:        "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
        !           586:        "/Encoding ISOLatin1Encoding def\n",
        !           587:        "currentdict end definefont\n",
        !           588:        "} def\n",
        !           589:        "/ISOLatin1Encoding [\n",
        !           590:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           591:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           592:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           593:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           594:        "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
        !           595:        "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
        !           596:        "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
        !           597:        "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
        !           598:        "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
        !           599:        "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
        !           600:        "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde\n",
        !           601:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           602:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           603:        "/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve\n",
        !           604:        "/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut\n",
        !           605:        "/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar\n",
        !           606:        "/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot\n",
        !           607:        "/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior\n",
        !           608:        "/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine\n",
        !           609:        "/guillemotright/onequarter/onehalf/threequarters/questiondown\n",
        !           610:        "/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla\n",
        !           611:        "/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n",
        !           612:        "/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n",
        !           613:        "/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute\n",
        !           614:        "/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis\n",
        !           615:        "/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave\n",
        !           616:        "/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex\n",
        !           617:        "/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n",
        !           618:        "/yacute/thorn/ydieresis\n",
        !           619:        "] def\n",
        !           620:        NULL};
        !           621:
        !           622:
        !           623:     struct termentry *t = term;
        !           624:     int i;
        !           625:
        !           626:     NEXT_common_uses_fonts = uses_fonts;
        !           627:     NEXT_common_xoff = xoff;
        !           628:     NEXT_common_yoff = yoff;
        !           629:
        !           630:
        !           631:     NEXTPrintf("%%!NEXT-Adobe-2.0\n");
        !           632:
        !           633:     NEXTPrintf(NEXTi1, uses_fonts ? "(atend)" : "");
        !           634:
        !           635:     NEXTPrintf("%%%%BoundingBox: %d %d %d %d\n", xoff, yoff,
        !           636:               (int) (xsize * width / NEXT_SC + 0.5 + xoff),
        !           637:               (int) (ysize * height / NEXT_SC + 0.5 + yoff));
        !           638:
        !           639:     NEXTPrintf(NEXTi2,
        !           640:               NEXT_color ? "true" : "false",
        !           641:               NEXT_solid ? "true" : "false",
        !           642:               NEXT_LW,         /* line width */
        !           643:               (int) (t->v_char) / (-3),        /* shift for vertical centring */
        !           644:               NEXT_SC,         /* dash length */
        !           645:               NEXT_HTIC / 2.0, /* half point width */
        !           646:               NEXT_VTIC / 2.0);        /* half point height */
        !           647:
        !           648:     if (uses_fonts && (encoding == ENCODING_ISO_8859_1)) {
        !           649:        for (i = 0; NEXT_iso_8859_1_encoding[i] != NULL; i++) {
        !           650:            NEXTPrintf("%s", NEXT_iso_8859_1_encoding[i]);
        !           651:        }
        !           652:     }
        !           653:     for (i = 0; NEXT_header[i] != NULL; i++)
        !           654:        NEXTPrintf("%s", NEXT_header[i]);
        !           655:     if (NEXT_duplex_option)
        !           656:        NEXTPrintf("statusdict begin %s setduplexmode end\n",
        !           657:                   NEXT_duplex_state ? "true" : "false");
        !           658:     NEXT_RememberFont(NEXT_font);
        !           659:
        !           660:     if (dict)
        !           661:        while (*dict)
        !           662:            NEXTPrintf("%s", *(dict++));
        !           663:
        !           664:     NEXTPrintf("end\n%%%%EndProlog\n");
        !           665: }
        !           666:
        !           667: /* the init fn for the NeXT Terminal driver */
        !           668: TERM_PUBLIC void NEXT_init()
        !           669: {
        !           670:
        !           671:     /* Initialize output string */
        !           672:     NEXTsize = DEFAULTNEXTSIZE;
        !           673:     if ((NEXTBuffer = malloc(NEXTsize)) == NULL) {
        !           674:        printf("Malloc error in next filter init\n");
        !           675:        exit(1);
        !           676:     }
        !           677:     NEXTBufEnd = NEXTBuffer + NEXTsize;
        !           678:     NEXTBufAt = NEXTBuffer;
        !           679:
        !           680:
        !           681:     term->xmax = NEXT_XMAX;
        !           682:     term->ymax = NEXT_YMAX;
        !           683:
        !           684: #ifdef NEXT_OLDTERMINAL
        !           685:     if (NEXT_oldterminal)
        !           686:        window_create();
        !           687:     else
        !           688:        gnuTermAccess =[[GnuTermDriver alloc] init];
        !           689: #else
        !           690:     gnuTermAccess =[[GnuTermDriver alloc] init];
        !           691: #endif
        !           692:
        !           693:
        !           694:
        !           695: }
        !           696:
        !           697:
        !           698: TERM_PUBLIC void NEXT_graphics()
        !           699: {
        !           700:     static char GPFAR NEXTg1[] = "0 setgray\nnewpath\n";
        !           701:     struct termentry *t = term;
        !           702:
        !           703:     *NEXTBuffer = 0;
        !           704:     NEXTBufAt = NEXTBuffer;
        !           705:
        !           706:     NEXT_common_init(1, NEXT_XOFF, NEXT_YOFF, term->xmax, term->ymax,
        !           707:                     ENHNEXT_header);
        !           708:
        !           709:     NEXTPrintf("gnudict begin\ngsave\n");
        !           710:     NEXTPrintf("%d %d translate\n", NEXT_common_xoff, NEXT_common_yoff);
        !           711:     NEXTPrintf("%.3f %.3f scale\n", 1.0 / NEXT_SC, 1.0 / NEXT_SC);
        !           712:
        !           713:
        !           714:     NEXTPrintf(NEXTg1);
        !           715:     if (NEXT_common_uses_fonts)
        !           716:        NEXTPrintf("(%s) findfont %d scalefont setfont\n", NEXT_font, (t->v_char));
        !           717:     NEXT_path_count = 0;
        !           718:     NEXT_relative_ok = FALSE;
        !           719:     NEXT_pen_x = NEXT_pen_y = -4000;
        !           720:     NEXT_taken = 0;
        !           721:     NEXT_linetype_last = -1;
        !           722:
        !           723: #ifdef NEXT_OLDTERMINAL
        !           724:     if (NEXT_oldterminal) {
        !           725:        /* Fill window with white */
        !           726:        NEXTPrintf("1 setgray\n");
        !           727:        NEXTPrintf("0 0 %d %d rectfill\n", NEXT_XMAX, NEXT_YMAX);
        !           728:        NEXTPrintf("0 setgray\n");
        !           729:     }
        !           730: #endif
        !           731:
        !           732:
        !           733: }
        !           734:
        !           735:
        !           736: TERM_PUBLIC void NEXT_text()
        !           737: {
        !           738:     static DPSContext d;
        !           739:
        !           740:     NEXT_path_count = 0;
        !           741:     NEXTPrintf("stroke\ngrestore\nend\n");
        !           742:
        !           743:     /* Terminate string */
        !           744:     *NEXTBufAt = 0;
        !           745:
        !           746:     if (NEXT_oldterminal) {
        !           747:        d = DPSGetCurrentContext();
        !           748:        DPSPrintf(d, NEXTBuffer);
        !           749:        DPSFlushContext(d);
        !           750:     } else {
        !           751:        /* Here's the call that dumps the string to the server */
        !           752:       [gnuTermAccess plot:NEXTBuffer];
        !           753:
        !           754:     }
        !           755:
        !           756: }
        !           757:
        !           758:
        !           759: TERM_PUBLIC void NEXT_reset()
        !           760: {
        !           761:     NEXTPrintf("%%%%Trailer\n");
        !           762:     if (!NEXT_common_uses_fonts) {
        !           763:        NEXTPrintf("%%%%DocumentFonts: ");
        !           764:        while (NEXT_DocFonts) {
        !           765:            struct NEXT_FontName *fnp;
        !           766:            fnp = NEXT_DocFonts->next;
        !           767:            NEXTPrintf("%s%s", NEXT_DocFonts->name, fnp ? ", " : "\n");
        !           768:            free(NEXT_DocFonts->name);
        !           769:            free(NEXT_DocFonts);
        !           770:            NEXT_DocFonts = fnp;
        !           771:        }
        !           772:     }
        !           773: }
        !           774:
        !           775:
        !           776: TERM_PUBLIC void NEXT_linetype(linetype)
        !           777: int linetype;
        !           778: {
        !           779:     linetype = (linetype % 9) + 2;
        !           780:     if (linetype < 0)
        !           781:        linetype = 0;
        !           782:     NEXT_relative_ok = FALSE;
        !           783:     if (NEXT_linetype_last == linetype)
        !           784:        return;
        !           785:     NEXT_linetype_last = linetype;
        !           786:     NEXTPrintf("LT%c\n", "ba012345678"[linetype]);
        !           787:     NEXT_path_count = 0;
        !           788: }
        !           789:
        !           790:
        !           791: TERM_PUBLIC void NEXT_move(x, y)
        !           792: unsigned int x, y;
        !           793: {
        !           794:     int dx, dy;
        !           795:     char abso[20], rel[20];
        !           796:     dx = x - NEXT_pen_x;
        !           797:     dy = y - NEXT_pen_y;
        !           798:     /* can't cancel all null moves--need a move after stroke'ing */
        !           799:     if (dx == 0 && dy == 0 && NEXT_relative_ok)
        !           800:        return;
        !           801:     sprintf(abso, "%d %d M\n", x, y);
        !           802:     sprintf(rel, "%d %d R\n", dx, dy);
        !           803:     if (strlen(rel) < strlen(abso) && NEXT_relative_ok) {
        !           804:        NEXTPrintf("%s", rel);
        !           805:        NEXT_taken++;
        !           806:     } else
        !           807:        NEXTPrintf("%s", abso);
        !           808:     NEXT_relative_ok = TRUE;
        !           809:     NEXT_path_count += 1;
        !           810:
        !           811:     NEXT_pen_x = x;
        !           812:     NEXT_pen_y = y;
        !           813: }
        !           814:
        !           815: TERM_PUBLIC void NEXT_vector(x, y)
        !           816: unsigned int x, y;
        !           817: {
        !           818:     int dx, dy;
        !           819:     char abso[20], rel[20];
        !           820:     dx = x - NEXT_pen_x;
        !           821:     dy = y - NEXT_pen_y;
        !           822:     if (dx == 0 && dy == 0)
        !           823:        return;
        !           824:     sprintf(abso, "%d %d L\n", x, y);
        !           825:     sprintf(rel, "%d %d V\n", dx, dy);
        !           826:     if (strlen(rel) < strlen(abso) && NEXT_relative_ok) {
        !           827:        NEXTPrintf("%s", rel);
        !           828:        NEXT_taken++;
        !           829:     } else
        !           830:        NEXTPrintf("%s", abso);
        !           831:     NEXT_relative_ok = TRUE;
        !           832:     NEXT_path_count += 1;
        !           833:     NEXT_pen_x = x;
        !           834:     NEXT_pen_y = y;
        !           835:     if (NEXT_path_count >= 400) {
        !           836:        NEXTPrintf("currentpoint stroke M\n");
        !           837:        NEXT_path_count = 0;
        !           838:     }
        !           839: }
        !           840:
        !           841:
        !           842:
        !           843:
        !           844: TERM_PUBLIC int NEXT_text_angle(ang)
        !           845: int ang;
        !           846: {
        !           847:     NEXT_ang = ang;
        !           848:     return TRUE;
        !           849: }
        !           850:
        !           851:
        !           852: TERM_PUBLIC int NEXT_justify_text(mode)
        !           853: enum JUSTIFY mode;
        !           854: {
        !           855:     NEXT_justify = mode;
        !           856:     return TRUE;
        !           857: }
        !           858:
        !           859:
        !           860: TERM_PUBLIC int NEXT_set_font(font) /* Entry font added by DJL */
        !           861: char *font;
        !           862: {
        !           863:     char name[32];
        !           864:     int size, sep;
        !           865:
        !           866:     sep = strcspn(font, ",");
        !           867:     strncpy(name, font, sep);
        !           868:     name[sep] = NUL;
        !           869:     size = NEXT_fontsize;
        !           870:     sscanf(&(font[sep + 1]), "%d", &size);
        !           871:     NEXTPrintf("/%s findfont %d scalefont setfont\n", name, size * NEXT_SC);
        !           872:     NEXT_RememberFont(name);
        !           873:     return TRUE;
        !           874: }
        !           875:
        !           876:
        !           877: /* postscript point routines */
        !           878:
        !           879: TERM_PUBLIC void NEXT_set_pointsize(size)
        !           880: double size;
        !           881: {
        !           882:     NEXTPrintf("/vpt %.1f def /hpt %.1f def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def\n",
        !           883:               pointsize * NEXT_VTIC * 0.5, pointsize * NEXT_HTIC * 0.5);
        !           884: }
        !           885:
        !           886: TERM_PUBLIC void NEXT_point(x, y, number)
        !           887: unsigned int x, y;
        !           888: int number;
        !           889: {
        !           890:     static char *pointFNS[] =
        !           891:     {"Pnt", "Pls", "Crs", "Star",
        !           892:      "Box", "BoxF", "Circle", "CircleF",
        !           893:      "TriU", "TriUF", "TriD", "TriDF",
        !           894:      "Dia", "DiaF", "Pent", "PentF",
        !           895:      "C0", "C1", "C2", "C3",
        !           896:      "C4", "C5", "C6", "C7",
        !           897:      "C8", "C9", "C10", "C11",
        !           898:      "C12", "C13", "C14", "C15",
        !           899:      "S0", "S1", "S2", "S3",
        !           900:      "S4", "S5", "S6", "S7",
        !           901:      "S8", "S9", "S10", "S11",
        !           902:      "S12", "S13", "S14", "S15",
        !           903:      "D0", "D1", "D2", "D3",
        !           904:      "D4", "D5", "D6", "D7",
        !           905:      "D8", "D9", "D10", "D11",
        !           906:      "D12", "D13", "D14", "D15"
        !           907:     };
        !           908:     if (number < 0)
        !           909:        number = -1;            /* negative types are all 'dot' */
        !           910:     else
        !           911:        number %= sizeof(pointFNS) / sizeof(pointFNS[0]) - 1;
        !           912:     NEXTPrintf("%d %d %s\n", x, y, pointFNS[number + 1]);
        !           913:
        !           914:     NEXT_relative_ok = 0;
        !           915:     NEXT_path_count = 0;
        !           916:     NEXT_linetype_last = -1;   /* force next linetype change */
        !           917: }
        !           918:
        !           919:
        !           920:
        !           921:
        !           922: /* All lifted from the enhanced postscript driver */
        !           923:
        !           924:
        !           925:
        !           926: static TBOOLEAN NEXT_opened_string;    /* try to cut out empty ()'s */
        !           927:
        !           928: /* used in determining height of processed text */
        !           929:
        !           930: static float NEXT_max_height, NEXT_min_height;
        !           931:
        !           932:
        !           933: /* process a bit of string, and return the last character used.
        !           934:  * p is start of string
        !           935:  * brace is TRUE to keep processing to }, FALSE for do one character
        !           936:  * fontname & fontsize are obvious
        !           937:  * base is the current baseline
        !           938:  * widthflag is TRUE if the width of this should count,
        !           939:  *              FALSE for zero width boxes
        !           940:  */
        !           941:
        !           942: static char *NEXT_recurse(p, brace, fontname, fontsize, base, widthflag)
        !           943: char *p, *fontname;
        !           944: TBOOLEAN brace, widthflag;
        !           945: double fontsize, base;
        !           946: {
        !           947:
        !           948: /* close a postscript string if it has been opened */
        !           949: #define NEXT_FLUSH      \
        !           950: {      if (NEXT_opened_string)  \
        !           951:        {       NEXTPrintf("%s", ")]\n");   \
        !           952:                NEXT_opened_string = FALSE; \
        !           953:        }                         \
        !           954: }
        !           955:
        !           956: #define NEXT_OPEN      \
        !           957: {      if (!NEXT_opened_string) \
        !           958:        { NEXTPrintf( "[(%s) %.1f %.1f %s (",  \
        !           959:                  fontname, fontsize, base, \
        !           960:                  widthflag ? "true" : "false");  \
        !           961:          NEXT_opened_string = TRUE; \
        !           962:        }       \
        !           963: }
        !           964:
        !           965:
        !           966:     /* Start each recursion with a clean string */
        !           967:     NEXT_FLUSH
        !           968:
        !           969:        if (base + fontsize > NEXT_max_height) {
        !           970:        NEXT_max_height = base + fontsize;
        !           971:     }
        !           972:     if (base < NEXT_min_height) {
        !           973:        NEXT_min_height = base;
        !           974:     }
        !           975:     for (; *p; ++p) {
        !           976:        float shift;
        !           977:        float f = 0;            /* used for getting new font size */
        !           978:        char *localfontname, ch;
        !           979:
        !           980:        switch (*p) {
        !           981:        case '}':
        !           982:            if (brace)
        !           983:                return (p);
        !           984:
        !           985:            fprintf(stderr, "next driver - spurious }\n");
        !           986:            break;
        !           987:
        !           988:        case '_':
        !           989:        case '^':
        !           990:            shift = (*p == '^') ? 0.5 : -0.3;
        !           991:
        !           992:            NEXT_FLUSH
        !           993:
        !           994:                p = NEXT_recurse(p + 1, FALSE, fontname, fontsize * 0.8, base + shift * fontsize, widthflag);
        !           995:
        !           996:            break;
        !           997:
        !           998:        case '{':
        !           999:            /*{{{  recurse (possibly with a new font) */
        !          1000:
        !          1001:            if (*++p == '/') {  /* then parse a fontname, optional fontsize */
        !          1002:                while (*++p == ' ');
        !          1003:                localfontname = p;
        !          1004:                while ((ch = *p) > ' ' && ch != '=')
        !          1005:                    ++p;
        !          1006:                if (ch == '=') {
        !          1007:                    *p++ = '\0';
        !          1008:                    /*{{{  get optional font size */
        !          1009:                    f = (float) strtod(p, &p);
        !          1010:
        !          1011:                    if (f)
        !          1012:                        f *= NEXT_SC;   /* remember the scaling */
        !          1013:                    else
        !          1014:                        f = fontsize;
        !          1015:
        !          1016:                    /*}}} */
        !          1017:                } else {
        !          1018:                    *p++ = '\0';
        !          1019:                    f = fontsize;
        !          1020:                }
        !          1021:
        !          1022:                while (*p == ' ')
        !          1023:                    ++p;
        !          1024:                if (*localfontname)
        !          1025:                    localfontname = NEXT_RememberFont(localfontname);
        !          1026:                else
        !          1027:                    localfontname = fontname;
        !          1028:            } else {
        !          1029:                localfontname = fontname;
        !          1030:                f = fontsize;
        !          1031:            }
        !          1032:            /*}}} */
        !          1033:
        !          1034:
        !          1035:            p = NEXT_recurse(p, TRUE, localfontname, f, base, widthflag);
        !          1036:
        !          1037:
        !          1038:            NEXT_FLUSH
        !          1039:
        !          1040:                break;
        !          1041:
        !          1042:        case '@':
        !          1043:            /*{{{  phantom box - prints next 'char', then restores currentpoint */
        !          1044:
        !          1045:            NEXT_FLUSH
        !          1046:
        !          1047:                p = NEXT_recurse(++p, FALSE, fontname, fontsize, base, FALSE);
        !          1048:
        !          1049:            break;
        !          1050:            /*}}} */
        !          1051:
        !          1052:        case '(':
        !          1053:        case ')':
        !          1054:            /* special cases */
        !          1055:            NEXT_OPEN
        !          1056:                NEXTPrintf("\\");
        !          1057:            NEXTPrintf("%c", *p);
        !          1058:            break;
        !          1059:            /*}}} */
        !          1060:
        !          1061:        case '\\':
        !          1062:            /*{{{  is it an escape */
        !          1063:            /* special cases */
        !          1064:
        !          1065:            if (p[1] == '\\' || p[1] == '(' || p[1] == ')') {
        !          1066:                NEXT_OPEN
        !          1067:                    NEXTPrintf("%c", '\\');
        !          1068:            } else if ((ch = p[1]) >= '0' && ch <= '7') {
        !          1069:                /* up to 3 octal digits */
        !          1070:                NEXT_OPEN
        !          1071:                    NEXTPrintf("%c", '\\');
        !          1072:                NEXTPrintf("%c", ch);
        !          1073:                ++p;
        !          1074:                if ((ch = p[1]) >= '0' && ch <= '7') {
        !          1075:                    NEXTPrintf("%c", ch);
        !          1076:                    ++p;
        !          1077:                    if ((ch = p[1]) >= '0' && ch <= '7') {
        !          1078:                        NEXTPrintf("%c", ch);
        !          1079:                        ++p;
        !          1080:                    }
        !          1081:                }
        !          1082:                break;
        !          1083:            }
        !          1084:            ++p;
        !          1085:            /* just go and print it (fall into the 'default' case) */
        !          1086:
        !          1087:            /*}}} */
        !          1088:        default:
        !          1089:            NEXT_OPEN
        !          1090:
        !          1091:                NEXTPrintf("%c", *p);
        !          1092:        }
        !          1093:
        !          1094:        /* like TeX, we only do one character in a recursion, unless it's
        !          1095:         * in braces
        !          1096:         */
        !          1097:
        !          1098:        if (!brace) {
        !          1099:            NEXT_FLUSH
        !          1100:                return (p);     /* the ++p in the outer copy will increment us */
        !          1101:        }
        !          1102:     }
        !          1103:     NEXT_FLUSH
        !          1104:        return p;
        !          1105: }
        !          1106:
        !          1107:
        !          1108: TERM_PUBLIC void NEXT_put_text(x, y, str)
        !          1109: unsigned int x, y;
        !          1110: char *str;
        !          1111: {
        !          1112:     /* flush any pending graphics (all the XShow routines do this...) */
        !          1113:
        !          1114:     if (!strlen(str))
        !          1115:        return;
        !          1116:
        !          1117:     if (NEXT_path_count) {
        !          1118:        NEXTPrintf(" stroke\n");
        !          1119:        NEXT_path_count = 0;
        !          1120:        NEXT_relative_ok = FALSE;
        !          1121:     }
        !          1122:     NEXT_move(x, y);
        !          1123:
        !          1124:     if (NEXT_ang != 0)
        !          1125:        NEXTPrintf("currentpoint gsave translate %d rotate 0 0 moveto\n",
        !          1126:                   NEXT_ang * 90);
        !          1127:
        !          1128:     NEXTPrintf("[ ");
        !          1129:
        !          1130:     /* set up the globals */
        !          1131:
        !          1132:     NEXT_opened_string = FALSE;
        !          1133:     NEXT_max_height = -1000;
        !          1134:     NEXT_min_height = 1000;
        !          1135:
        !          1136:     while (*(str = NEXT_recurse(str, TRUE, NEXT_font,
        !          1137:                                (double) term->v_char,
        !          1138:                                0.0, TRUE)));
        !          1139:
        !          1140:     NEXT_max_height += NEXT_min_height;
        !          1141:
        !          1142:     NEXTPrintf("] %.1f ", -NEXT_max_height / 3);
        !          1143:
        !          1144:     switch (NEXT_justify) {
        !          1145:     case LEFT:
        !          1146:        NEXTPrintf("MLshow\n");
        !          1147:        break;
        !          1148:     case CENTRE:
        !          1149:        NEXTPrintf("MCshow\n");
        !          1150:        break;
        !          1151:     case RIGHT:
        !          1152:        NEXTPrintf("MRshow\n");
        !          1153:        break;
        !          1154:     }
        !          1155:
        !          1156:     if (NEXT_ang != 0)
        !          1157:        NEXTPrintf("grestore\n");
        !          1158:     NEXT_path_count = 0;
        !          1159:     NEXT_relative_ok = FALSE;
        !          1160: }
        !          1161:
        !          1162:
        !          1163:
        !          1164: /*
        !          1165: static TBOOLEAN NEXT_colordetect()
        !          1166: {
        !          1167:        NXScreen * mainscreen;
        !          1168:
        !          1169:        mainscreen = [Application mainScreen];
        !          1170:        if (mainscreen->depth == NX_TwoBitGrayDepth) return(FALSE);
        !          1171:        return(TRUE);
        !          1172: }
        !          1173: */
        !          1174:
        !          1175:        /* This just packs all the postscript into one (possibly huge) string
        !          1176:         * which will be passed (as a fake pointer) via D.O. to the server
        !          1177:         */
        !          1178:
        !          1179: void NEXTPrintf(char *fmt,...)
        !          1180: {
        !          1181:     va_list ap;
        !          1182:     char *pb;
        !          1183:     int NEXToff;
        !          1184:
        !          1185:     /* Process formatting instructions */
        !          1186:     va_start(ap, fmt);
        !          1187:     vsprintf(NEXTTmpBuf, fmt, ap);
        !          1188:     va_end(ap);
        !          1189:
        !          1190:     /* Add to buffer */
        !          1191:     for (pb = NEXTTmpBuf; (*pb != 0); ++pb, ++NEXTBufAt) {
        !          1192:        /* reallocate if necessary */
        !          1193:        if (NEXTBufAt >= NEXTBufEnd) {
        !          1194:            NEXToff = NEXTBufAt - NEXTBuffer;
        !          1195:            NEXTsize *= 2;
        !          1196:            NEXTBuffer = realloc(NEXTBuffer, NEXTsize);
        !          1197:            NEXTBufEnd = NEXTBuffer + NEXTsize;
        !          1198:            NEXTBufAt = NEXTBuffer + NEXToff;
        !          1199:        }
        !          1200:        *NEXTBufAt = *pb;
        !          1201:     }
        !          1202:
        !          1203:     return;
        !          1204:
        !          1205: }
        !          1206:
        !          1207: /*  This next section implements the GnuTermDriver object which manages
        !          1208:        the D.O. connection and interface to OBjC
        !          1209: */
        !          1210:
        !          1211:
        !          1212: @protocol GnuTermServerMethods
        !          1213: /*- (oneway) executePScode:(in char *)PStext termTitle:(in char *)title;*/
        !          1214: - executePScode:(in char *)
        !          1215: PStext termTitle:(in char *) title;
        !          1216: @end
        !          1217:
        !          1218:
        !          1219: @ implementation GnuTermDriver
        !          1220:
        !          1221: - init
        !          1222: {
        !          1223:     NXConnection *myConnection;
        !          1224:     char serverpath[100], *envstring;
        !          1225:     int GnuTermPathSet = 0;
        !          1226:
        !          1227:
        !          1228:     /* Ask OS for connection to server */
        !          1229:   server =[NXConnection connectToName:"gnuplotServer"];
        !          1230:
        !          1231:     /* Server is running ready to go */
        !          1232:     if (server)                        /*printf("Connected to server\n") */
        !          1233:        ;
        !          1234:
        !          1235:     /* Server isn't running, we must fire it up */
        !          1236:     else {
        !          1237:        /*printf("Launching GnuTerm\n"); */
        !          1238:        *serverpath = 0;
        !          1239:
        !          1240:        /* Check for path set in environment */
        !          1241:        if ((envstring = getenv("GNUTERMPATH")) != (char *) NULL) {
        !          1242:            sprintf(serverpath, "%s/GnuTerm.app/GnuTerm", envstring);
        !          1243:            GnuTermPathSet = 1;
        !          1244:        }
        !          1245:        /* Not in environment */
        !          1246:        else
        !          1247:            strcpy(serverpath, "GnuTerm");
        !          1248:
        !          1249:        /* Try to launch application */
        !          1250:       if ([[Application workspace] launchApplication:serverpath] == NO) {
        !          1251:            printf("Failed to launch %s.\n", serverpath);
        !          1252:            /* Offer a little advice */
        !          1253:            if (GnuTermPathSet) {
        !          1254:                printf("You must have setenv GNUTERMPATH to something wrong\n");
        !          1255:                printf("I recommend you exit gnuplot and fix this.\n");
        !          1256:            } else {
        !          1257:                printf("It must be located in ~/Apps or /LocalApps\n");
        !          1258:                printf("I recommend that you either\n");
        !          1259:                printf("- move GnuTerm.app to one of these locations\n");
        !          1260:                printf("- set GNUTERMPATH with host%%  setenv GNUTERMPATH /directory/containing_GnuTerm.app\n");
        !          1261:                printf("- start GnuTerm ahead of the first plot command\n");
        !          1262: #ifdef NEXT_OLDTERMINAL
        !          1263:                printf("- use the old driver version (set term next old)\n");
        !          1264: #endif
        !          1265:            }
        !          1266:        }
        !          1267:        /* I wish the gnuplot terminal interface would
        !          1268:           let me return an error here.
        !          1269:         */
        !          1270:
        !          1271:        /* Application is launching */
        !          1272:        else {
        !          1273:            /* Wait for it to register Server methods with OS */
        !          1274:            do {
        !          1275:              server =[NXConnection connectToName:"gnuplotServer"];
        !          1276:            } while (!server);  /* This could result in a hang,
        !          1277:                                   but I've never seen it fail */
        !          1278:        }
        !          1279:     }
        !          1280:
        !          1281:
        !          1282:     /* By limiting ourselves to known protocol
        !          1283:      * we speed up the messaging
        !          1284:      */
        !          1285:   [server setProtocolForProxy:@protocol(GnuTermServerMethods)];
        !          1286:
        !          1287:     myConnection =[server connectionForProxy];
        !          1288:
        !          1289:     /* If the server dies we want to know about it */
        !          1290:   [myConnection registerForInvalidationNotification:self];
        !          1291:     /* In fact, we'll worry about it */
        !          1292:     [NXPort worryAboutPortInvalidation];
        !          1293:
        !          1294:     return self;
        !          1295: }
        !          1296:
        !          1297:
        !          1298: -plot:(char *) PSstr;
        !          1299: {
        !          1300:     /* If server has become invalid, re-initialize */
        !          1301:     if (!server)
        !          1302:        [self init];
        !          1303:
        !          1304:     /* This is where we send the huge postscript string to the server
        !          1305:        Note:
        !          1306:        The D.O. system doesn't actually give this pointer to the server.
        !          1307:        The pointer is dereferenced on the client side and the
        !          1308:        resulting data is sent to the server. On the server side,
        !          1309:        space for the data is automatically allocated, and a pointer to
        !          1310:        the local data is received.
        !          1311:        For details check out:
        !          1312:        /NextLibrary/Documentation/NextDev/GeneralRef/06_DistributedObjects/IntroDistObjects.rtf
        !          1313:      */
        !          1314:
        !          1315:     /*printf("Calling server..."); */
        !          1316:   [server executePScode: PSstr termTitle:NEXT_title];
        !          1317:     /*printf("returned\n"); */
        !          1318:     *NEXT_title = 0;
        !          1319:
        !          1320:     return self;
        !          1321: }
        !          1322:
        !          1323:                                                        /* This gets called by OS if server goes down */
        !          1324: -senderIsInvalid:(id) sender
        !          1325: {
        !          1326:     server = 0;
        !          1327: }
        !          1328:
        !          1329: @end
        !          1330:
        !          1331: #ifdef NEXT_OLDTERMINAL
        !          1332:
        !          1333: static void window_create()
        !          1334: {
        !          1335:     float width, height;
        !          1336:
        !          1337:     width = (xsize * (NEXT_XMAX) / NEXT_SC + 0.5 + NEXT_XOFF);
        !          1338:     height = (ysize * (NEXT_YMAX) / NEXT_SC + 0.5 + NEXT_YOFF);
        !          1339:
        !          1340:     NXApp =[EpsViewer new];
        !          1341:   [NXApp windowCreate: width Height:height];
        !          1342: }
        !          1343:
        !          1344: @implementation EpsViewer
        !          1345:
        !          1346: - windowCreate:(NXCoord)
        !          1347: width Height:(NXCoord) height
        !          1348: {
        !          1349:
        !          1350:     /* create the new window, in a good place */
        !          1351:     theNewWin =[Window
        !          1352:   newContent: [self nextRectForWidth: width Height:height]
        !          1353:   style:       NX_TITLEDSTYLE
        !          1354:   backing:     NX_RETAINED
        !          1355:   buttonMask:  (NX_CLOSEBUTTONMASK | NX_MINIATURIZEBUTTONMASK)
        !          1356:   defer:       NO];
        !          1357:     /* we need to receive windowDidBecomeMain: and windowDidResignMain: */
        !          1358:   [theNewWin setDelegate:self];
        !          1359:     /*
        !          1360:      * create a new View, make it the contentView of our new window,
        !          1361:      * and destroy the window's old contentView
        !          1362:      */
        !          1363:   [[theNewWin setContentView:[[View alloc] init]] free];
        !          1364:     /* display the window, and bring it forth */
        !          1365:     [theNewWin display];
        !          1366:   [theNewWin makeKeyAndOrderFront:self];
        !          1367: /*     [theNewWin orderBack:self];                     */
        !          1368:     /* show the frame */
        !          1369:     return self;
        !          1370: }
        !          1371:
        !          1372: /***************************************************************************/
        !          1373: /* nextRectForWidth:Height: - return the next good content rectangle       */
        !          1374: /*  from Carl F. Sutter's wonderful ViewGif2 'Controller' method...        */
        !          1375: /***************************************************************************/
        !          1376: /* nextTopLeft - return the next good top left window position            */
        !          1377: /***************************************************************************/
        !          1378:
        !          1379: -(NXRect *) nextRectForWidth:(NXCoord)
        !          1380: width Height:(NXCoord) height
        !          1381: {
        !          1382: #define OFFSET 10.0
        !          1383: #define MAX_STEPS 20
        !          1384: #define INITIAL_X 356.0
        !          1385: #define INITIAL_Y 241.0
        !          1386:     NXPoint nxpTopLeft;
        !          1387:     NXRect nxrTemp;            /* used to find window height    */
        !          1388:     NXRect nxrWinHeight;       /* bounds of enclosing window    */
        !          1389:     NXSize nxsScreen;          /* size of screen                */
        !          1390:     static NXRect nxrResult;   /* the Answer!                   */
        !          1391:     static int nCurStep = 0;
        !          1392:
        !          1393:     /* find a good top-left coord */
        !          1394:     nxpTopLeft.x = INITIAL_X + nCurStep * OFFSET;
        !          1395:     nxpTopLeft.y = INITIAL_Y + nCurStep * OFFSET;
        !          1396:     if (++nCurStep > MAX_STEPS)
        !          1397:        nCurStep = 0;
        !          1398:     /* find window height using nxrTemp */
        !          1399:     nxrTemp.size.width = width;
        !          1400:     nxrTemp.size.height = height;
        !          1401:     nxrTemp.origin.x = nxrTemp.origin.y = 0;
        !          1402:   [Window getFrameRect: &nxrWinHeight forContentRect:&nxrTemp
        !          1403:   style:NX_TITLEDSTYLE];
        !          1404:   [NXApp getScreenSize:&nxsScreen];
        !          1405:     /* find the lower-left coord */
        !          1406:     nxrResult.origin.x = nxpTopLeft.x;
        !          1407:     nxrResult.origin.y = nxsScreen.height - nxrWinHeight.size.height - nxpTopLeft.y;
        !          1408:     nxrResult.size.width = width;
        !          1409:     nxrResult.size.height = height;
        !          1410:     return (&nxrResult);
        !          1411: }
        !          1412:
        !          1413: @end
        !          1414: #endif /* NEXT_OLDTERMINAL */
        !          1415:
        !          1416:
        !          1417: #endif /* TERM_BODY */
        !          1418:
        !          1419: #ifdef TERM_TABLE
        !          1420:
        !          1421:
        !          1422: TERM_TABLE_START(next_driver)
        !          1423:     "next",
        !          1424:     "Interface to GnuTerm.app under NeXTstep",
        !          1425:     NEXT_XMAX, NEXT_YMAX, NEXT_VCHAR, NEXT_HCHAR,
        !          1426:     NEXT_VTIC, NEXT_HTIC, NEXT_options, NEXT_init, NEXT_reset,
        !          1427:     NEXT_text, null_scale, NEXT_graphics, NEXT_move, NEXT_vector,
        !          1428:     NEXT_linetype, NEXT_put_text, NEXT_text_angle,
        !          1429:     NEXT_justify_text, NEXT_point, do_arrow, NEXT_set_font,
        !          1430:     NEXT_set_pointsize
        !          1431: TERM_TABLE_END(next_driver)
        !          1432:
        !          1433: #undef LAST_TERM
        !          1434: #define LAST_TERM next_driver
        !          1435:
        !          1436: #endif /* TERM_TABLE */
        !          1437: #endif /* TERM_PROTO_ONLY */
        !          1438:
        !          1439:
        !          1440:
        !          1441: #ifdef TERM_HELP
        !          1442: START_HELP(next)
        !          1443: "1 next",
        !          1444: "?commands set terminal next",
        !          1445: "?set terminal next",
        !          1446: "?set term next",
        !          1447: "?terminal next",
        !          1448: "?term next",
        !          1449: "?next",
        !          1450: "?NeXT",
        !          1451: " Several options may be set in the next driver.",
        !          1452: "",
        !          1453: " Syntax:",
        !          1454: "       set terminal next {<mode>} {<type> } {<color>} {<dashed>}",
        !          1455: "                  {\"<fontname>\"} {<fontsize>} title {\"<newtitle>\"}",
        !          1456: "",
        !          1457: " where <mode> is  `default`, which sets all options to their defaults;",
        !          1458: " <type> is either `new` or `old`, where `old` invokes the old single window;",
        !          1459: " <color> is either `color` or `monochrome`;",
        !          1460: " <dashed> is either `solid` or `dashed`;",
        !          1461: " \"<fontname>\" is the name of a valid PostScript font;",
        !          1462: " <fontsize> is the size of the font in PostScript points; and",
        !          1463: " <title> is the title for the GnuTerm window.",
        !          1464: " Defaults are  `new`, `monochrome`, `dashed`, \"Helvetica\", 14pt.",
        !          1465: "",
        !          1466: " Examples:",
        !          1467: "       set term next default",
        !          1468: "       set term next 22",
        !          1469: "       set term next color \"Times-Roman\" 14",
        !          1470: "       set term next color \"Helvetica\" 12 title \"MyPlot\"",
        !          1471: "       set term next old",
        !          1472: "",
        !          1473: " Pointsizes may be changed with `set linestyle`."
        !          1474: END_HELP(next)
        !          1475: #endif /* TERM_HELP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>