Initial release of Maemo 5 port of gnuplot
[gnuplot] / term / multitos.trm
diff --git a/term/multitos.trm b/term/multitos.trm
new file mode 100644 (file)
index 0000000..c677ff7
--- /dev/null
@@ -0,0 +1,421 @@
+/* Hello, Emacs, this is -*-C-*-
+ * $Id: multitos.trm,v 1.15 2006/07/21 02:35:47 sfeam Exp $
+ */
+
+/* GNUPLOT - multitos.trm */
+
+/*[
+ * Copyright 1994, 1998, 2004
+ *
+ * Permission to use, copy, and distribute this software and its
+ * documentation for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.
+ *
+ * Permission to modify the software is granted, but not the right to
+ * distribute the complete modified source code.  Modifications are to
+ * be distributed as patches to the released version.  Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ *   1. distribute the corresponding source modifications from the
+ *    released version in the form of a patch file along with the binaries,
+ *   2. add special version identification to distinguish your version
+ *    in addition to the base release version number,
+ *   3. provide your name and address as the primary contact for the
+ *    support of your modified version, and
+ *   4. retain our contact information in regard to use of the base
+ *    software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+/*
+ * This file is included by ../term.c.
+ *
+ * This terminal driver supports:
+ *   mtos : ATARI Systems MiNT/MULTITOS/MAGIC with external client
+ *
+ * AUTHOR
+ *  Dirk Stadler (email: dirk_stadler@n.maus.de, dirk@lstm.uni-erlangen.de)
+ *
+ * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
+ *
+ */
+
+#include "driver.h"
+
+#ifdef TERM_REGISTER
+register_term(mtos)
+#endif
+
+#ifdef TERM_PROTO
+
+/* function-prototypes */
+TERM_PUBLIC void MTOS_options(void);
+TERM_PUBLIC void MTOS_init(void);
+TERM_PUBLIC void MTOS_reset(void);
+TERM_PUBLIC void MTOS_graphics(void);
+TERM_PUBLIC void MTOS_text(void);
+TERM_PUBLIC void MTOS_move(unsigned int x, unsigned int y);
+TERM_PUBLIC void MTOS_vector(unsigned int x, unsigned int y);
+TERM_PUBLIC void MTOS_linetype(int lt);
+TERM_PUBLIC int MTOS_text_angle(int ang);
+TERM_PUBLIC void MTOS_put_text(unsigned int x, unsigned int y, const char *str);
+TERM_PUBLIC int MTOS_justify_text(enum JUSTIFY mode);
+TERM_PUBLIC void MTOS_point(unsigned int x, unsigned int y, int number);
+
+/* default to ST high resolution */
+#define MTOS_XMAX  640
+#define MTOS_YMAX  400
+#define MTOS_VCHAR 18
+#define MTOS_HCHAR 12
+#define MTOS_HTIC  5
+#define MTOS_VTIC  MTOS_HTIC
+
+#define GOT_MTOS_PROTO
+#endif /* TERM_PROTO */
+
+#ifndef TERM_PROTO_ONLY
+#ifdef TERM_BODY
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <param.h>
+#include <process.h>
+#include <signal.h>
+#include <support.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <errno.h>
+#include <aesbind.h>
+#include <osbind.h>
+#include <mintbind.h>
+
+/* plot.c */
+extern const char *user_gnuplotpath;
+
+int MTOS_pause(char *str);
+static void MTOS_quit(void);
+void MTOS_open_pipe(void);
+static void write_pid(void);
+static void init_exit(void);
+
+/* commands for GPCLIENT */
+#define SET_GRAPHICS    'G'
+#define SET_TEXT        'E'
+#define SET_LINE        'L'
+#define SET_ANGLE       'A'
+#define SET_JUSTIFY     'J'
+#define SET_POINTMODE   'D'
+#define GR_MOVE         'M'
+#define GR_DRAW         'V'
+#define GR_RESET        'R'
+#define GR_TEXT         'T'
+
+#define PAUSE           'P'
+#define PID             'I'
+#define QUIT            'Q'
+
+/* for creating pipes */
+#define PIPE1           "u:\\pipe\\GPLT%d"
+#define PIPE2           "u:\\pipe\\gpclient.tmp"
+#define NAMESIZE        25
+#define SIZE            ((unsigned)sizeof(short))
+
+/* default name for client */
+#define GPCLIENT1       "gpclient.prg"
+#define GPCLIENT2       "gpclient"
+
+/* environment */
+#define PATH           "PATH"
+
+/* some global variables */
+static char MTOS_mode = 0;
+static int handle = -1;
+static int pid = -1;
+
+TERM_PUBLIC void
+MTOS_options()
+{
+    term_options[0] = NUL;
+}
+
+TERM_PUBLIC void
+MTOS_init()
+{
+    char pipe[NAMESIZE];
+    char *file, cmd[MAXPATHLEN+1];
+    char const *const ext[] = { "prg", "app", NULL };
+
+    if (handle < 0) {
+       if (aesid < 0) {
+           if ((aesid = appl_init()) < 0)
+               int_error(NO_CARET, "APPL_INIT failed !");
+       }
+       file = findfile(GPCLIENT2, user_gnuplotpath, ext);
+       if (!file)
+           safe_strncpy(cmd, GPCLIENT1, sizeof(cmd));
+       else if (file && !strchr(file, '\\') && !strchr(file, '/'))
+           safe_strncpy(cmd, file, sizeof(cmd));
+       else
+           unx2dos(file, cmd);
+       if (!shel_find(cmd))
+           int_error(NO_CARET, "Cannot find GPCLIENT !");
+
+       sprintf(&pipe[1], PIPE1, aesid);
+
+       if ((handle = open(&pipe[1], O_RDWR | O_CREAT)) < 0) {
+           if ((handle = (int) Fcreate(&pipe[1], 0)) < 0)
+               int_error(NO_CARET, "Cannot open PIPE to GPCLIENT !");
+       }
+       pipe[0] = (char) (strlen(&pipe[1]) + 1);
+
+       if (!shel_write(1, 1, 100, cmd, pipe)) {
+           close(handle);
+           handle = -1;
+           int_error(NO_CARET, "Cannot spawn GPCLIENT !");
+       }
+       init_exit();
+    }
+    if (aesid > -1)
+       menu_register(aesid, "  Terminal: mtos");
+}
+
+TERM_PUBLIC void
+MTOS_reset()
+{
+    short buff;
+
+    buff = (short) GR_RESET;
+    write(handle, &buff, SIZE);
+}
+
+TERM_PUBLIC void
+MTOS_text()
+{
+    short buff;
+
+    buff = (short) SET_TEXT;
+    if (MTOS_mode != SET_TEXT)
+       write(handle, &buff, SIZE);
+    MTOS_mode = SET_TEXT;
+}
+
+TERM_PUBLIC void
+MTOS_graphics()
+{
+    short buff;
+
+    buff = (short) SET_GRAPHICS;
+    write(handle, &buff, SIZE);
+    MTOS_mode = SET_GRAPHICS;
+}
+
+TERM_PUBLIC void
+MTOS_move(unsigned int x, unsigned int y)
+{
+    short x_1, y_1, buff;
+
+    x_1 = (short) x;
+    y_1 = (short) y;
+    buff = (short) GR_MOVE;
+    write(handle, &buff, SIZE);
+    write(handle, &x_1, SIZE);
+    write(handle, &y_1, SIZE);
+}
+
+TERM_PUBLIC void
+MTOS_vector(unsigned int x, unsigned int y)
+{
+    short x_1, y_1, buff;
+
+    x_1 = (short) x;
+    y_1 = (short) y;
+    buff = (short) GR_DRAW;
+    write(handle, &buff, SIZE);
+    write(handle, &x_1, SIZE);
+    write(handle, &y_1, SIZE);
+}
+
+TERM_PUBLIC void
+MTOS_linetype(int lt)
+{
+    short lt_1, buff;
+
+    lt_1 = (short) lt;
+    buff = (short) SET_LINE;
+    write(handle, &buff, SIZE);
+    write(handle, &lt_1, SIZE);
+}
+
+TERM_PUBLIC int
+MTOS_text_angle(int ang)
+{
+    short ta_1, buff;
+
+    ta_1 = (short) (ang ? 1 : 0);
+    buff = (short) SET_ANGLE;
+    write(handle, &buff, SIZE);
+    write(handle, &ta_1, SIZE);
+    return (TRUE);
+}
+
+TERM_PUBLIC void
+MTOS_put_text(unsigned int x, unsigned int y, const char *str)
+{
+    short x_1, y_1, len, buff;
+
+    x_1 = (short) x;
+    y_1 = (short) y;
+    len = (short) strlen(str) + 1;
+    buff = (short) GR_TEXT;
+    write(handle, &buff, SIZE);
+    write(handle, &x_1, SIZE);
+    write(handle, &y_1, SIZE);
+    write(handle, &len, SIZE);
+    write(handle, str, (unsigned) len);
+}
+
+TERM_PUBLIC int
+MTOS_justify_text(enum JUSTIFY mode)
+{
+    short j_mode, buff;
+
+    j_mode = (short) mode;
+    buff = (short) SET_JUSTIFY;
+    write(handle, &buff, SIZE);
+    write(handle, &j_mode, SIZE);
+    return (TRUE);
+}
+
+TERM_PUBLIC void
+MTOS_point(unsigned int x, unsigned int y, int number)
+{
+    short mode, buff;
+
+    buff = (short) SET_POINTMODE;
+    mode = 1;
+    write(handle, &buff, SIZE);
+    write(handle, &mode, SIZE);
+    do_point(x, y, number);
+    mode = 0;
+    write(handle, &buff, SIZE);
+    write(handle, &mode, SIZE);
+}
+
+int
+MTOS_pause(char *str)
+{
+    short len, buff;
+
+    len = (short) strlen(str) + 1;
+    buff = (short) PAUSE;
+    write(handle, &buff, SIZE);
+    write(handle, &len, SIZE);
+    write(handle, str, (unsigned) len);
+    read(handle, &len, SIZE);
+    return ((int) len);
+}
+
+static void
+MTOS_quit()
+{
+    short buff;
+
+    if (pid > -1)
+       kill(pid, SIGTERM);
+    if (handle > -1) {
+       buff = (short) QUIT;
+       write(handle, &buff, SIZE);
+       close(handle);
+    }
+}
+
+void
+MTOS_open_pipe()
+{
+    char pipe[NAMESIZE];
+    short len;
+
+    if (handle < 0) {
+       if ((handle = open(PIPE2, O_RDWR)) < 0)
+           return;
+       read(handle, &len, SIZE);
+       if (len > 0) {
+           read(handle, pipe, (unsigned) len);
+           close(handle);
+           if ((handle = open(pipe, O_RDWR)) < 0) {
+               fprintf(stderr,
+                       "\n\n\33p Can't open Pipe: (%s) Error: (%s) !\33q\n\n",
+                       pipe,sys_errlist[errno]);
+               fflush(stderr);
+               return;
+           }
+       }
+       init_exit();
+    }
+}
+
+static void
+write_pid()
+{
+    short buff, mypid, gpclpid;
+
+    mypid = (short) getpid();
+    buff = (short) PID;
+    while (write(handle, &buff, SIZE) <= 0)
+       Fselect(100, 0L, 0L, 0L);
+    while (read(handle, &gpclpid, SIZE) <= 0)
+       Fselect(100, 0L, 0L, 0L);
+    write(handle, &mypid, SIZE);
+    pid = (int) gpclpid;
+}
+
+static void
+init_exit()
+{
+    Cconout(7);
+    write_pid();
+    atexit(MTOS_quit);
+}
+
+#endif /* TERM_BODY */
+
+#ifdef TERM_TABLE
+
+TERM_TABLE_START(mtos_driver)
+    "mtos", "Atari MiNT/MULTITOS/Magic Terminal",
+    MTOS_XMAX, MTOS_YMAX, MTOS_VCHAR, MTOS_HCHAR,
+    MTOS_VTIC, MTOS_HTIC, MTOS_options, MTOS_init, MTOS_reset,
+    MTOS_text, null_scale, MTOS_graphics, MTOS_move, MTOS_vector,
+    MTOS_linetype, MTOS_put_text, MTOS_text_angle,
+    MTOS_justify_text, MTOS_point, do_arrow, set_font_null,
+    0, TERM_CAN_MULTIPLOT, 0, 0
+TERM_TABLE_END(mtos_driver)
+
+#undef LAST_TERM
+#define LAST_TERM mtos_driver
+
+#endif /* TERM_TABLE */
+
+#endif /* TERM_PROTO_ONLY */
+
+#ifdef TERM_HELP
+START_HELP(mtos)
+"1 mtos",
+"?commands set terminal mtos",
+"?set terminal mtos",
+"?set term mtos",
+"?terminal mtos",
+"?term mtos",
+"?mtos",
+" The `mtos` terminal has no options.  It sends data via a pipe to an external",
+" program called GPCLIENT.  It runs under MULTITOS, Magic 3.x, MagicMAC. and",
+" MiNT.  If you cannot find GPCLIENT, than mail to dirk@lstm.uni-erlangen.de."
+END_HELP(mtos)
+#endif /* TERM_HELP */