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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: $
        !             3:  */
        !             4:
        !             5: /* GNUPLOT - multitos.trm */
        !             6:
        !             7: /*[
        !             8:  * Copyright 1994, 1998
        !             9:  *
        !            10:  * Permission to use, copy, and distribute this software and its
        !            11:  * documentation for any purpose with or without fee is hereby granted,
        !            12:  * provided that the above copyright notice appear in all copies and
        !            13:  * that both that copyright notice and this permission notice appear
        !            14:  * in supporting documentation.
        !            15:  *
        !            16:  * Permission to modify the software is granted, but not the right to
        !            17:  * distribute the complete modified source code.  Modifications are to
        !            18:  * be distributed as patches to the released version.  Permission to
        !            19:  * distribute binaries produced by compiling modified sources is granted,
        !            20:  * provided you
        !            21:  *   1. distribute the corresponding source modifications from the
        !            22:  *    released version in the form of a patch file along with the binaries,
        !            23:  *   2. add special version identification to distinguish your version
        !            24:  *    in addition to the base release version number,
        !            25:  *   3. provide your name and address as the primary contact for the
        !            26:  *    support of your modified version, and
        !            27:  *   4. retain our contact information in regard to use of the base
        !            28:  *    software.
        !            29:  * Permission to distribute the released version of the source code along
        !            30:  * with corresponding source modifications in the form of a patch file is
        !            31:  * granted with same provisions 2 through 4 for binary distributions.
        !            32:  *
        !            33:  * This software is provided "as is" without express or implied warranty
        !            34:  * to the extent permitted by applicable law.
        !            35: ]*/
        !            36:
        !            37: /*
        !            38:  * This file is included by ../term.c.
        !            39:  *
        !            40:  * This terminal driver supports:
        !            41:  *   mtos : ATARI Systems MiNT/MULTITOS/MAGIC with external client
        !            42:  *
        !            43:  * AUTHOR
        !            44:  *  Dirk Stadler (email: dirk_stadler@n.maus.de, dirk@lstm.uni-erlangen.de)
        !            45:  *
        !            46:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            47:  *
        !            48:  */
        !            49:
        !            50: #include "driver.h"
        !            51:
        !            52: #ifdef TERM_REGISTER
        !            53: register_term(mtos)
        !            54: #endif
        !            55:
        !            56: #ifdef TERM_PROTO
        !            57:
        !            58: /* function-prototypes */
        !            59: TERM_PUBLIC void MTOS_options(void);
        !            60: TERM_PUBLIC void MTOS_init(void);
        !            61: TERM_PUBLIC void MTOS_reset(void);
        !            62: TERM_PUBLIC void MTOS_graphics(void);
        !            63: TERM_PUBLIC void MTOS_text(void);
        !            64: TERM_PUBLIC void MTOS_move(unsigned int x, unsigned int y);
        !            65: TERM_PUBLIC void MTOS_vector(unsigned int x, unsigned int y);
        !            66: TERM_PUBLIC void MTOS_linetype(int lt);
        !            67: TERM_PUBLIC int MTOS_text_angle(int ang);
        !            68: TERM_PUBLIC void MTOS_put_text(unsigned int x, unsigned int y, char *str);
        !            69: TERM_PUBLIC int MTOS_justify_text(enum JUSTIFY mode);
        !            70: TERM_PUBLIC void MTOS_point(unsigned int x, unsigned int y, int number);
        !            71:
        !            72: /* default to ST high resolution */
        !            73: #define MTOS_XMAX  640
        !            74: #define MTOS_YMAX  400
        !            75: #define MTOS_VCHAR 18
        !            76: #define MTOS_HCHAR 12
        !            77: #define MTOS_HTIC  5
        !            78: #define MTOS_VTIC  MTOS_HTIC
        !            79:
        !            80: #define GOT_MTOS_PROTO
        !            81: #endif /* TERM_PROTO */
        !            82:
        !            83: #ifndef TERM_PROTO_ONLY
        !            84: #ifdef TERM_BODY
        !            85:
        !            86: #include <unistd.h>
        !            87: #include <fcntl.h>
        !            88: #include <param.h>
        !            89: #include <process.h>
        !            90: #include <signal.h>
        !            91: #include <support.h>
        !            92: #include <sys/stat.h>
        !            93: #include <time.h>
        !            94: #include <errno.h>
        !            95: #include <aesbind.h>
        !            96: #include <osbind.h>
        !            97: #include <mintbind.h>
        !            98:
        !            99: int MTOS_pause(char *str);
        !           100: static void MTOS_quit(void);
        !           101: void MTOS_open_pipe(void);
        !           102: static void write_pid(void);
        !           103: static void init_exit(void);
        !           104:
        !           105: /* commands for GPCLIENT */
        !           106: #define SET_GRAPHICS    'G'
        !           107: #define SET_TEXT        'E'
        !           108: #define SET_LINE        'L'
        !           109: #define SET_ANGLE       'A'
        !           110: #define SET_JUSTIFY     'J'
        !           111: #define SET_POINTMODE   'D'
        !           112: #define GR_MOVE         'M'
        !           113: #define GR_DRAW         'V'
        !           114: #define GR_RESET        'R'
        !           115: #define GR_TEXT         'T'
        !           116:
        !           117: #define PAUSE           'P'
        !           118: #define PID             'I'
        !           119: #define QUIT            'Q'
        !           120:
        !           121: /* for creating pipes */
        !           122: #define PIPE1           "u:\\pipe\\GPLT%d"
        !           123: #define PIPE2           "u:\\pipe\\gpclient.tmp"
        !           124: #define NAMESIZE        25
        !           125: #define SIZE            ((unsigned)sizeof(short))
        !           126:
        !           127: /* default name for client */
        !           128: #define GPCLIENT1       "gpclient.prg"
        !           129: #define GPCLIENT2       "gpclient"
        !           130:
        !           131: /* environment */
        !           132: #define MYENV          "GNUPLOTPATH"
        !           133: #define PATH           "PATH"
        !           134:
        !           135: /* some global variables */
        !           136: static char MTOS_mode = 0;
        !           137: static int handle = -1;
        !           138: static int pid = -1;
        !           139:
        !           140: TERM_PUBLIC void MTOS_options()
        !           141: {
        !           142:     term_options[0] = NUL;
        !           143: }
        !           144:
        !           145: TERM_PUBLIC void MTOS_init()
        !           146: {
        !           147:     char pipe[NAMESIZE];
        !           148:     char *file, cmd[MAXPATHLEN+1];
        !           149:     char const *const ext[] = { "prg", "app", NULL };
        !           150:
        !           151:     if (handle < 0) {
        !           152:        if (aesid < 0) {
        !           153:            if ((aesid = appl_init()) < 0)
        !           154:                int_error("APPL_INIT failed !", NO_CARET);
        !           155:        }
        !           156:        file = findfile(GPCLIENT2, getenv(MYENV), ext);
        !           157:        if (!file)
        !           158:            safe_strncpy(cmd, GPCLIENT1, sizeof(cmd));
        !           159:        else if (file && !strchr(file, '\\') && !strchr(file, '/'))
        !           160:            safe_strncpy(cmd, file, sizeof(cmd));
        !           161:        else
        !           162:            unx2dos(file, cmd);
        !           163:        if (!shel_find(cmd))
        !           164:            int_error("Cannot find GPCLIENT !", NO_CARET);
        !           165:
        !           166:        sprintf(&pipe[1], PIPE1, aesid);
        !           167:
        !           168:        if ((handle = open(&pipe[1], O_RDWR | O_CREAT)) < 0) {
        !           169:            if ((handle = (int) Fcreate(&pipe[1], 0)) < 0)
        !           170:                int_error("Cannot open PIPE to GPCLIENT !", NO_CARET);
        !           171:        }
        !           172:        pipe[0] = (char) (strlen(&pipe[1]) + 1);
        !           173:
        !           174:        if (!shel_write(1, 1, 100, cmd, pipe)) {
        !           175:            close(handle);
        !           176:            handle = -1;
        !           177:            int_error("Cannot spawn GPCLIENT !", NO_CARET);
        !           178:        }
        !           179:        init_exit();
        !           180:     }
        !           181:     if (aesid > -1)
        !           182:        menu_register(aesid, "  Terminal: mtos");
        !           183: }
        !           184:
        !           185: TERM_PUBLIC void MTOS_reset()
        !           186: {
        !           187:     short buff;
        !           188:
        !           189:     buff = (short) GR_RESET;
        !           190:     write(handle, &buff, SIZE);
        !           191: }
        !           192:
        !           193: TERM_PUBLIC void MTOS_text()
        !           194: {
        !           195:     short buff;
        !           196:
        !           197:     buff = (short) SET_TEXT;
        !           198:     if (MTOS_mode != SET_TEXT)
        !           199:        write(handle, &buff, SIZE);
        !           200:     MTOS_mode = SET_TEXT;
        !           201: }
        !           202:
        !           203: TERM_PUBLIC void MTOS_graphics()
        !           204: {
        !           205:     short buff;
        !           206:
        !           207:     buff = (short) SET_GRAPHICS;
        !           208:     write(handle, &buff, SIZE);
        !           209:     MTOS_mode = SET_GRAPHICS;
        !           210: }
        !           211:
        !           212: TERM_PUBLIC void MTOS_move(unsigned int x, unsigned int y)
        !           213: {
        !           214:     short x_1, y_1, buff;
        !           215:
        !           216:     x_1 = (short) x;
        !           217:     y_1 = (short) y;
        !           218:     buff = (short) GR_MOVE;
        !           219:     write(handle, &buff, SIZE);
        !           220:     write(handle, &x_1, SIZE);
        !           221:     write(handle, &y_1, SIZE);
        !           222: }
        !           223:
        !           224: TERM_PUBLIC void MTOS_vector(unsigned int x, unsigned int y)
        !           225: {
        !           226:     short x_1, y_1, buff;
        !           227:
        !           228:     x_1 = (short) x;
        !           229:     y_1 = (short) y;
        !           230:     buff = (short) GR_DRAW;
        !           231:     write(handle, &buff, SIZE);
        !           232:     write(handle, &x_1, SIZE);
        !           233:     write(handle, &y_1, SIZE);
        !           234: }
        !           235:
        !           236: TERM_PUBLIC void MTOS_linetype(int lt)
        !           237: {
        !           238:     short lt_1, buff;
        !           239:
        !           240:     lt_1 = (short) lt;
        !           241:     buff = (short) SET_LINE;
        !           242:     write(handle, &buff, SIZE);
        !           243:     write(handle, &lt_1, SIZE);
        !           244: }
        !           245:
        !           246: TERM_PUBLIC int MTOS_text_angle(int ang)
        !           247: {
        !           248:     short ta_1, buff;
        !           249:
        !           250:     ta_1 = (short) ang;
        !           251:     buff = (short) SET_ANGLE;
        !           252:     write(handle, &buff, SIZE);
        !           253:     write(handle, &ta_1, SIZE);
        !           254:     return (TRUE);
        !           255: }
        !           256:
        !           257: TERM_PUBLIC void MTOS_put_text(unsigned int x, unsigned int y, char *str)
        !           258: {
        !           259:     short x_1, y_1, len, buff;
        !           260:
        !           261:     x_1 = (short) x;
        !           262:     y_1 = (short) y;
        !           263:     len = (short) strlen(str) + 1;
        !           264:     buff = (short) GR_TEXT;
        !           265:     write(handle, &buff, SIZE);
        !           266:     write(handle, &x_1, SIZE);
        !           267:     write(handle, &y_1, SIZE);
        !           268:     write(handle, &len, SIZE);
        !           269:     write(handle, str, (unsigned) len);
        !           270: }
        !           271:
        !           272: TERM_PUBLIC int MTOS_justify_text(enum JUSTIFY mode)
        !           273: {
        !           274:     short j_mode, buff;
        !           275:
        !           276:     j_mode = (short) mode;
        !           277:     buff = (short) SET_JUSTIFY;
        !           278:     write(handle, &buff, SIZE);
        !           279:     write(handle, &j_mode, SIZE);
        !           280:     return (TRUE);
        !           281: }
        !           282:
        !           283: TERM_PUBLIC void MTOS_point(unsigned int x, unsigned int y, int number)
        !           284: {
        !           285:     short mode, buff;
        !           286:
        !           287:     buff = (short) SET_POINTMODE;
        !           288:     mode = 1;
        !           289:     write(handle, &buff, SIZE);
        !           290:     write(handle, &mode, SIZE);
        !           291:     do_point(x, y, number);
        !           292:     mode = 0;
        !           293:     write(handle, &buff, SIZE);
        !           294:     write(handle, &mode, SIZE);
        !           295: }
        !           296:
        !           297: int MTOS_pause(char *str)
        !           298: {
        !           299:     short len, buff;
        !           300:
        !           301:     len = (short) strlen(str) + 1;
        !           302:     buff = (short) PAUSE;
        !           303:     write(handle, &buff, SIZE);
        !           304:     write(handle, &len, SIZE);
        !           305:     write(handle, str, (unsigned) len);
        !           306:     read(handle, &len, SIZE);
        !           307:     return ((int) len);
        !           308: }
        !           309:
        !           310: static void MTOS_quit()
        !           311: {
        !           312:     short buff;
        !           313:
        !           314:     if (pid > -1)
        !           315:        kill(pid, SIGTERM);
        !           316:     if (handle > -1) {
        !           317:        buff = (short) QUIT;
        !           318:        write(handle, &buff, SIZE);
        !           319:        close(handle);
        !           320:     }
        !           321: }
        !           322:
        !           323: void MTOS_open_pipe()
        !           324: {
        !           325:     char pipe[NAMESIZE];
        !           326:     short len;
        !           327:
        !           328:     if (handle < 0) {
        !           329:        if ((handle = open(PIPE2, O_RDWR)) < 0)
        !           330:            return;
        !           331:        read(handle, &len, SIZE);
        !           332:        if (len > 0) {
        !           333:            read(handle, pipe, (unsigned) len);
        !           334:            close(handle);
        !           335:            if ((handle = open(pipe, O_RDWR)) < 0) {
        !           336:                fprintf(stderr, "\n\n\33p Can't open Pipe: (%s) Error: (%s) !\33q\n\n", pipe,sys_errlist[errno]);
        !           337:                fflush(stderr);
        !           338:                return;
        !           339:            }
        !           340:        }
        !           341:        init_exit();
        !           342:     }
        !           343: }
        !           344:
        !           345: static void write_pid()
        !           346: {
        !           347:     short buff, mypid, gpclpid;
        !           348:
        !           349:     mypid = (short) getpid();
        !           350:     buff = (short) PID;
        !           351:     while (write(handle, &buff, SIZE) <= 0)
        !           352:        Fselect(100, 0L, 0L, 0L);
        !           353:     while (read(handle, &gpclpid, SIZE) <= 0)
        !           354:        Fselect(100, 0L, 0L, 0L);
        !           355:     write(handle, &mypid, SIZE);
        !           356:     pid = (int) gpclpid;
        !           357: }
        !           358:
        !           359: static void init_exit()
        !           360: {
        !           361:     Cconout(7);
        !           362:     write_pid();
        !           363:     atexit(MTOS_quit);
        !           364: }
        !           365:
        !           366: #endif /* TERM_BODY */
        !           367:
        !           368: #ifdef TERM_TABLE
        !           369:
        !           370: TERM_TABLE_START(mtos_driver)
        !           371:     "mtos", "Atari MiNT/MULTITOS/Magic Terminal",
        !           372:     MTOS_XMAX, MTOS_YMAX, MTOS_VCHAR, MTOS_HCHAR,
        !           373:     MTOS_VTIC, MTOS_HTIC, MTOS_options, MTOS_init, MTOS_reset,
        !           374:     MTOS_text, null_scale, MTOS_graphics, MTOS_move, MTOS_vector,
        !           375:     MTOS_linetype, MTOS_put_text, MTOS_text_angle,
        !           376:     MTOS_justify_text, MTOS_point, do_arrow, set_font_null,
        !           377:     0, TERM_CAN_MULTIPLOT, 0, 0
        !           378: TERM_TABLE_END(mtos_driver)
        !           379:
        !           380: #undef LAST_TERM
        !           381: #define LAST_TERM mtos_driver
        !           382:
        !           383: #endif /* TERM_TABLE */
        !           384:
        !           385: #endif /* TERM_PROTO_ONLY */
        !           386:
        !           387: #ifdef TERM_HELP
        !           388: START_HELP(mtos)
        !           389: "1 mtos",
        !           390: "?commands set terminal mtos",
        !           391: "?set terminal mtos",
        !           392: "?set term mtos",
        !           393: "?terminal mtos",
        !           394: "?term mtos",
        !           395: "?mtos",
        !           396: " The `mtos` terminal has no options.  It sends data via a pipe to an external",
        !           397: " program called GPCLIENT.  It runs under MULTITOS, Magic 3.x, MagicMAC. and",
        !           398: " MiNT.  If you cannot find GPCLIENT, than mail to dirk@lstm.uni-erlangen.de."
        !           399: END_HELP(mtos)
        !           400: #endif /* TERM_HELP */

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