gnuplot.shar.05
John Campbell
jdc at naucse.UUCP
Tue Sep 5 02:41:36 AEST 1989
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 5 (of 7)."
# Contents: ./internal.c ./pc.trm ./term.c
# Wrapped by jdc at naucse on Mon Sep 4 09:22:35 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f './internal.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./internal.c'\"
else
echo shar: Extracting \"'./internal.c'\" \(13596 characters\)
sed "s/^X//" >'./internal.c' <<'END_OF_FILE'
X/*
X *
X * G N U P L O T -- internal.c
X *
X * Copyright (C) 1986, 1987 Colin Kelley, Thomas Williams
X *
X * You may use this code as you wish if credit is given and this message
X * is retained.
X *
X * Please e-mail any useful additions to vu-vlsi!plot so they may be
X * included in later releases.
X *
X * This file should be edited with 4-column tabs! (:set ts=4 sw=4 in vi)
X */
X
X#include <math.h>
X#include <stdio.h>
X#include "plot.h"
X
Xextern BOOLEAN undefined;
X
Xchar *strcpy();
X
Xstruct value *pop(), *complex(), *integer();
Xdouble magnitude(), angle(), real();
X
Xstruct value stack[STACK_DEPTH];
X
Xint s_p = -1; /* stack pointer */
X
X
X/*
X * System V and MSC 4.0 call this when they wants to print an error message.
X * Don't!
X */
Xmatherr()
X{
X return (undefined = TRUE); /* don't print error message */
X}
X
X
Xreset_stack()
X{
X s_p = -1;
X}
X
X
Xcheck_stack() /* make sure stack's empty */
X{
X if (s_p != -1)
X fprintf(stderr,"\nwarning: internal error--stack not empty!\n");
X}
X
X
Xstruct value *pop(x)
Xstruct value *x;
X{
X if (s_p < 0 )
X int_error("stack underflow",NO_CARET);
X *x = stack[s_p--];
X return(x);
X}
X
X
Xpush(x)
Xstruct value *x;
X{
X if (s_p == STACK_DEPTH - 1)
X int_error("stack overflow",NO_CARET);
X stack[++s_p] = *x;
X}
X
X
X#define ERR_VAR "undefined variable: "
X
Xf_push(x)
Xunion argument *x; /* contains pointer to value to push; */
X{
Xstatic char err_str[sizeof(ERR_VAR) + MAX_ID_LEN] = ERR_VAR;
Xstruct udvt_entry *udv;
X
X udv = x->udv_arg;
X if (udv->udv_undef) { /* undefined */
X (void) strcpy(&err_str[sizeof(ERR_VAR) - 1], udv->udv_name);
X int_error(err_str,NO_CARET);
X }
X push(&(udv->udv_value));
X}
X
X
Xf_pushc(x)
Xunion argument *x;
X{
X push(&(x->v_arg));
X}
X
X
Xf_pushd(x)
Xunion argument *x;
X{
X push(&(x->udf_arg->dummy_value));
X}
X
X
X#define ERR_FUN "undefined function: "
X
Xf_call(x) /* execute a udf */
Xunion argument *x;
X{
Xstatic char err_str[sizeof(ERR_FUN) + MAX_ID_LEN] = ERR_FUN;
Xregister struct udft_entry *udf;
X
X udf = x->udf_arg;
X if (!udf->at) { /* undefined */
X (void) strcpy(&err_str[sizeof(ERR_FUN) - 1],
X udf->udf_name);
X int_error(err_str,NO_CARET);
X }
X (void) pop(&(udf->dummy_value));
X
X execute_at(udf->at);
X}
X
X
Xstatic int_check(v)
Xstruct value *v;
X{
X if (v->type != INT)
X int_error("non-integer passed to boolean operator",NO_CARET);
X}
X
X
Xf_lnot()
X{
Xstruct value a;
X int_check(pop(&a));
X push(integer(&a,!a.v.int_val) );
X}
X
X
Xf_bnot()
X{
Xstruct value a;
X int_check(pop(&a));
X push( integer(&a,~a.v.int_val) );
X}
X
X
Xf_bool()
X{ /* converts top-of-stack to boolean */
X int_check(&top_of_stack);
X top_of_stack.v.int_val = !!top_of_stack.v.int_val;
X}
X
X
Xf_lor()
X{
Xstruct value a,b;
X int_check(pop(&b));
X int_check(pop(&a));
X push( integer(&a,a.v.int_val || b.v.int_val) );
X}
X
Xf_land()
X{
Xstruct value a,b;
X int_check(pop(&b));
X int_check(pop(&a));
X push( integer(&a,a.v.int_val && b.v.int_val) );
X}
X
X
Xf_bor()
X{
Xstruct value a,b;
X int_check(pop(&b));
X int_check(pop(&a));
X push( integer(&a,a.v.int_val | b.v.int_val) );
X}
X
X
Xf_xor()
X{
Xstruct value a,b;
X int_check(pop(&b));
X int_check(pop(&a));
X push( integer(&a,a.v.int_val ^ b.v.int_val) );
X}
X
X
Xf_band()
X{
Xstruct value a,b;
X int_check(pop(&b));
X int_check(pop(&a));
X push( integer(&a,a.v.int_val & b.v.int_val) );
X}
X
X
Xf_uminus()
X{
Xstruct value a;
X (void) pop(&a);
X switch(a.type) {
X case INT:
X a.v.int_val = -a.v.int_val;
X break;
X case CMPLX:
X a.v.cmplx_val.real =
X -a.v.cmplx_val.real;
X a.v.cmplx_val.imag =
X -a.v.cmplx_val.imag;
X }
X push(&a);
X}
X
X
Xf_eq() /* note: floating point equality is rare because of roundoff error! */
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val ==
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val ==
X b.v.cmplx_val.real &&
X b.v.cmplx_val.imag == 0.0);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (b.v.int_val == a.v.cmplx_val.real &&
X a.v.cmplx_val.imag == 0.0);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real==
X b.v.cmplx_val.real &&
X a.v.cmplx_val.imag==
X b.v.cmplx_val.imag);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_ne()
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val !=
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val !=
X b.v.cmplx_val.real ||
X b.v.cmplx_val.imag != 0.0);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (b.v.int_val !=
X a.v.cmplx_val.real ||
X a.v.cmplx_val.imag != 0.0);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real !=
X b.v.cmplx_val.real ||
X a.v.cmplx_val.imag !=
X b.v.cmplx_val.imag);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_gt()
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val >
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val >
X b.v.cmplx_val.real);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (a.v.cmplx_val.real >
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real >
X b.v.cmplx_val.real);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_lt()
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val <
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val <
X b.v.cmplx_val.real);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (a.v.cmplx_val.real <
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real <
X b.v.cmplx_val.real);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_ge()
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val >=
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val >=
X b.v.cmplx_val.real);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (a.v.cmplx_val.real >=
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real >=
X b.v.cmplx_val.real);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_le()
X{
Xstruct value a, b;
X register int result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X result = (a.v.int_val <=
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.int_val <=
X b.v.cmplx_val.real);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X result = (a.v.cmplx_val.real <=
X b.v.int_val);
X break;
X case CMPLX:
X result = (a.v.cmplx_val.real <=
X b.v.cmplx_val.real);
X }
X }
X push(integer(&a,result));
X}
X
X
Xf_plus()
X{
Xstruct value a, b, result;
X (void) pop(&b);
X (void) pop(&a);
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X (void) integer(&result,a.v.int_val +
X b.v.int_val);
X break;
X case CMPLX:
X (void) complex(&result,a.v.int_val +
X b.v.cmplx_val.real,
X b.v.cmplx_val.imag);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X (void) complex(&result,b.v.int_val +
X a.v.cmplx_val.real,
X a.v.cmplx_val.imag);
X break;
X case CMPLX:
X (void) complex(&result,a.v.cmplx_val.real+
X b.v.cmplx_val.real,
X a.v.cmplx_val.imag+
X b.v.cmplx_val.imag);
X }
X }
X push(&result);
X}
X
X
Xf_minus()
X{
Xstruct value a, b, result;
X (void) pop(&b);
X (void) pop(&a); /* now do a - b */
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X (void) integer(&result,a.v.int_val -
X b.v.int_val);
X break;
X case CMPLX:
X (void) complex(&result,a.v.int_val -
X b.v.cmplx_val.real,
X -b.v.cmplx_val.imag);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X (void) complex(&result,a.v.cmplx_val.real -
X b.v.int_val,
X a.v.cmplx_val.imag);
X break;
X case CMPLX:
X (void) complex(&result,a.v.cmplx_val.real-
X b.v.cmplx_val.real,
X a.v.cmplx_val.imag-
X b.v.cmplx_val.imag);
X }
X }
X push(&result);
X}
X
X
Xf_mult()
X{
Xstruct value a, b, result;
X (void) pop(&b);
X (void) pop(&a); /* now do a*b */
X
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X (void) integer(&result,a.v.int_val *
X b.v.int_val);
X break;
X case CMPLX:
X (void) complex(&result,a.v.int_val *
X b.v.cmplx_val.real,
X a.v.int_val *
X b.v.cmplx_val.imag);
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X (void) complex(&result,b.v.int_val *
X a.v.cmplx_val.real,
X b.v.int_val *
X a.v.cmplx_val.imag);
X break;
X case CMPLX:
X (void) complex(&result,a.v.cmplx_val.real*
X b.v.cmplx_val.real-
X a.v.cmplx_val.imag*
X b.v.cmplx_val.imag,
X a.v.cmplx_val.real*
X b.v.cmplx_val.imag+
X a.v.cmplx_val.imag*
X b.v.cmplx_val.real);
X }
X }
X push(&result);
X}
X
X
Xf_div()
X{
Xstruct value a, b, result;
Xregister double square;
X (void) pop(&b);
X (void) pop(&a); /* now do a/b */
X
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X if (b.v.int_val)
X (void) integer(&result,a.v.int_val /
X b.v.int_val);
X else {
X (void) integer(&result,0);
X undefined = TRUE;
X }
X break;
X case CMPLX:
X square = b.v.cmplx_val.real*
X b.v.cmplx_val.real +
X b.v.cmplx_val.imag*
X b.v.cmplx_val.imag;
X if (square)
X (void) complex(&result,a.v.int_val*
X b.v.cmplx_val.real/square,
X -a.v.int_val*
X b.v.cmplx_val.imag/square);
X else {
X (void) complex(&result,0.0,0.0);
X undefined = TRUE;
X }
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X if (b.v.int_val)
X
X (void) complex(&result,a.v.cmplx_val.real/
X b.v.int_val,
X a.v.cmplx_val.imag/
X b.v.int_val);
X else {
X (void) complex(&result,0.0,0.0);
X undefined = TRUE;
X }
X break;
X case CMPLX:
X square = b.v.cmplx_val.real*
X b.v.cmplx_val.real +
X b.v.cmplx_val.imag*
X b.v.cmplx_val.imag;
X if (square)
X (void) complex(&result,(a.v.cmplx_val.real*
X b.v.cmplx_val.real+
X a.v.cmplx_val.imag*
X b.v.cmplx_val.imag)/square,
X (a.v.cmplx_val.imag*
X b.v.cmplx_val.real-
X a.v.cmplx_val.real*
X b.v.cmplx_val.imag)/
X square);
X else {
X (void) complex(&result,0.0,0.0);
X undefined = TRUE;
X }
X }
X }
X push(&result);
X}
X
X
Xf_mod()
X{
Xstruct value a, b;
X (void) pop(&b);
X (void) pop(&a); /* now do a%b */
X
X if (a.type != INT || b.type != INT)
X int_error("can only mod ints",NO_CARET);
X if (b.v.int_val)
X push(integer(&a,a.v.int_val % b.v.int_val));
X else {
X push(integer(&a,0));
X undefined = TRUE;
X }
X}
X
X
Xf_power()
X{
Xstruct value a, b, result;
Xregister int i, t, count;
Xregister double mag, ang;
X (void) pop(&b);
X (void) pop(&a); /* now find a**b */
X
X switch(a.type) {
X case INT:
X switch (b.type) {
X case INT:
X count = abs(b.v.int_val);
X t = 1;
X for(i = 0; i < count; i++)
X t *= a.v.int_val;
X if (b.v.int_val >= 0)
X (void) integer(&result,t);
X else
X (void) complex(&result,1.0/t,0.0);
X break;
X case CMPLX:
X mag =
X pow(magnitude(&a),fabs(b.v.cmplx_val.real));
X if (b.v.cmplx_val.real < 0.0)
X mag = 1.0/mag;
X ang = angle(&a)*b.v.cmplx_val.real+
X b.v.cmplx_val.imag;
X (void) complex(&result,mag*cos(ang),
X mag*sin(ang));
X }
X break;
X case CMPLX:
X switch (b.type) {
X case INT:
X if (a.v.cmplx_val.imag == 0.0) {
X mag = pow(a.v.cmplx_val.real,(double)abs(b.v.int_val));
X if (b.v.int_val < 0)
X mag = 1.0/mag;
X (void) complex(&result,mag,0.0);
X }
X else {
X /* not so good, but...! */
X mag = pow(magnitude(&a),(double)abs(b.v.int_val));
X if (b.v.int_val < 0)
X mag = 1.0/mag;
X ang = angle(&a)*b.v.int_val;
X (void) complex(&result,mag*cos(ang),
X mag*sin(ang));
X }
X break;
X case CMPLX:
X mag = pow(magnitude(&a),fabs(b.v.cmplx_val.real));
X if (b.v.cmplx_val.real < 0.0)
X mag = 1.0/mag;
X ang = angle(&a)*b.v.cmplx_val.real+ b.v.cmplx_val.imag;
X (void) complex(&result,mag*cos(ang),
X mag*sin(ang));
X }
X }
X push(&result);
X}
X
X
Xf_factorial()
X{
Xstruct value a;
Xregister int i;
Xregister double val;
X
X (void) pop(&a); /* find a! (factorial) */
X
X switch (a.type) {
X case INT:
X val = 1.0;
X for (i = a.v.int_val; i > 1; i--) /*fpe's should catch overflows*/
X val *= i;
X break;
X default:
X int_error("factorial (!) argument must be an integer",
X NO_CARET);
X }
X
X push(complex(&a,val,0.0));
X
X}
X
X
Xint
Xf_jump(x)
Xunion argument *x;
X{
X return(x->j_arg);
X}
X
X
Xint
Xf_jumpz(x)
Xunion argument *x;
X{
Xstruct value a;
X int_check(&top_of_stack);
X if (top_of_stack.v.int_val) { /* non-zero */
X (void) pop(&a);
X return 1; /* no jump */
X }
X else
X return(x->j_arg); /* leave the argument on TOS */
X}
X
X
Xint
Xf_jumpnz(x)
Xunion argument *x;
X{
Xstruct value a;
X int_check(&top_of_stack);
X if (top_of_stack.v.int_val) /* non-zero */
X return(x->j_arg); /* leave the argument on TOS */
X else {
X (void) pop(&a);
X return 1; /* no jump */
X }
X}
X
X
Xint
Xf_jtern(x)
Xunion argument *x;
X{
Xstruct value a;
X
X int_check(pop(&a));
X if (a.v.int_val)
X return(1); /* no jump; fall through to TRUE code */
X else
X return(x->j_arg); /* go jump to FALSE code */
X}
END_OF_FILE
if test 13596 -ne `wc -c <'./internal.c'`; then
echo shar: \"'./internal.c'\" unpacked with wrong size!
fi
# end of './internal.c'
fi
if test -f './pc.trm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./pc.trm'\"
else
echo shar: Extracting \"'./pc.trm'\" \(15550 characters\)
sed "s/^X//" >'./pc.trm' <<'END_OF_FILE'
X#ifdef __TURBOC__
X#include <graphics.h>
X#include <dos.h>
X#include <string.h>
X int g_driver, g_mode, g_error;
X char far *path;
X char *pathp, path_s[128];
X
Xget_path()
X{
X path=getenv("BGI");
X if (path==NULL) {
X strcpy(path_s,_argv[0]);
X pathp=strrchr(path_s,'\\');
X *pathp=0x00;
X path=path_s;
X }
X}
X
X#endif
X
X/* all of the Turbo C routines for the different graphics devices go here */
X
X#define EGALIB_XMAX 640
X#define EGALIB_YMAX 350
X
X#define EGALIB_XLAST (EGA_XMAX - 1)
X#define EGALIB_YLAST (EGA_YMAX - 1)
X
X#define EGALIB_VCHAR 14
X#define EGALIB_HCHAR 8
X#define EGALIB_VTIC 4
X#define EGALIB_HTIC 5
X
Xstatic int ega64color[] = {1,1,5,4,3,5,4,3, 5, 4, 3, 5, 4, 3,5};
Xstatic int ega256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *egacolor;
X
Xstatic char near buf[80]; /* kludge since EGA.LIB is compiled SMALL */
X
Xstatic int pattern[] = {0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f};
X
Xstatic int graphics_on = FALSE;
Xint startx, starty;
X
Xpause() /* press any key to continue... */
X{
X while (kbhit())
X (void) getch(); /* flush the keyboard buffer */
X while (!kbhit())
X ;
X}
X
X
XPC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef __TURBOC__
X gotoxy(78-strlen(str),24-row);
X puts(str);
X#else
X PC_curloc(24-row,78-strlen(str));
X PC_puts(str);
X#endif
X}
X
XPC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef __TURBOC__
X gotoxy(2,row+1);
X puts(str);
X#else
X PC_curloc(row+1,2);
X PC_puts(str);
X#endif
X}
X
XPC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X#ifdef __TURBOC__
X closegraph();
X#else
X Vmode(3);
X#endif
X}
X
XPC_reset()
X{
X#ifdef __TURBOC__
X closegraph();
X#endif
X}
X
X
X#ifdef __TURBOC__
X
X#define VGA_XMAX 640
X#define VGA_YMAX 480
X
X#define VGA_XLAST (VGA_XMAX - 1)
X#define VGA_YLAST (VGA_YMAX - 1)
X
X#define VGA_VCHAR 14
X#define VGA_HCHAR 8
X#define VGA_VTIC 4
X#define VGA_HTIC 5
X
Xstatic int vga256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *vgacolor;
X
XVGA_init()
X{
X g_driver=VGA;
X g_mode=2;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver!=9){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X/* int_error("color EGA board not found",NO_CARET);*/
X }
X if(g_driver==VGA) vgacolor=vga256color;
X}
X
XVGA_graphics()
X{ g_driver=VGA;
X g_mode=2;
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
XVGA_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X setcolor(vgacolor[linetype+2]);
X}
X
XVGA_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),450-row*16,buf);
X}
X
X#define VGA_reset EGALIB_reset
X#define VGA_text EGALIB_text
X#define VGA_move EGALIB_move
X#define VGA_vector EGALIB_vector
X#define VGA_ulput_text EGALIB_ulput_text
X
XVGAMONO_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X setlinestyle(4,pattern[linetype+2],1);
X}
X
X#define MCGA_XMAX 640
X#define MCGA_YMAX 480
X
X#define MCGA_XLAST (MCGA_XMAX - 1)
X#define MCGA_YLAST (MCGA_YMAX - 1)
X
X#define MCGA_VCHAR 14
X#define MCGA_HCHAR 8
X#define MCGA_VTIC 4
X#define MCGA_HTIC 5
X
Xstatic int *MCGAcolor;
X
XMCGA_init()
X{
X g_driver=MCGA;
X g_mode=5;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver!=2){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X }
X}
X
XMCGA_graphics()
X{ g_driver=MCGA;
X g_mode=5;
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
X
XMCGA_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),450-row*16,buf);
X}
X
X#define MCGA_reset EGALIB_reset
X#define MCGA_text EGALIB_text
X#define MCGA_move EGALIB_move
X#define MCGA_vector EGALIB_vector
X#define MCGA_ulput_text EGALIB_ulput_text
X
XMCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X setlinestyle(4,pattern[linetype+2],1);
X}
X
X
XEGALIB_init()
X{
X g_driver=EGA;
X g_mode=1;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver<3 || g_driver>4){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X/* int_error("color EGA board not found",NO_CARET);*/
X }
X if(g_driver==EGA) egacolor=ega256color;
X if(g_driver==EGA64) egacolor=ega64color;
X}
X
XEGALIB_graphics()
X{
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
XEGALIB_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X closegraph();
X}
X
XEGALIB_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X setcolor(egacolor[linetype+2]);
X}
X
XEGALIB_move(x,y)
X{
X moveto(x,getmaxy()-y);
X}
X
X
XEGALIB_vector(x,y)
X{
X lineto(x,getmaxy()-y);
X}
X
X
XEGALIB_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),320-row*16,buf);
X}
X
XEGALIB_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(10,row*16+16,buf);
X}
X
XEGALIB_reset()
X{
X closegraph();
X}
X
X#define CGA_XMAX 640
X#define CGA_YMAX 200
X
X#define CGA_XLAST (CGA_XMAX - 1)
X#define CGA_YLAST (CGA_YMAX - 1)
X
X#define CGA_VCHAR 8
X#define CGA_HCHAR 8
X#define CGA_VTIC 2
X#define CGA_HTIC 3
X
XCGA_init()
X{
X g_driver=CGA;
X g_mode=4;
X initgraph(&g_driver,&g_mode,path);
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X/* PC_color(1); monochrome */
X
X}
X
XCGA_graphics()
X{
X graphics_on = TRUE;
X g_driver=CGA;
X g_mode=4;
X initgraph(&g_driver,&g_mode,path);
X /* Vmode(6);*/
X}
X
X#define CGA_text PC_text
X
XCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X/* PC_mask(pattern[linetype+2]); */
X setlinestyle(4,pattern[linetype+2],1);
X}
X
XCGA_move(x,y)
X{
X moveto(x,y);
X}
X
X
XCGA_vector(x,y)
X{
X lineto(x,y);
X}
X
X#define CGA_lrput_text PC_lrput_text
X#define CGA_ulput_text PC_ulput_text
X
X
X#define CGA_reset PC_reset
X
X#define HERC_XMAX 720
X#define HERC_YMAX 348
X
X#define HERC_XLAST (HERC_XMAX - 1)
X#define HERC_YLAST (HERC_YMAX - 1)
X
X#define HERC_VCHAR 8
X#define HERC_HCHAR 8
X#define HERC_VTIC 4
X#define HERC_HTIC 4
X
XHERC_init()
X{
X g_driver=HERCMONO;
X g_mode=0;
X initgraph(&g_driver,&g_mode,path);
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X}
X
XHERC_graphics()
X{
X g_driver=HERCMONO;
X g_mode=0;
X initgraph(&g_driver,&g_mode,path);
X graphics_on = TRUE;
X}
X
XHERC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X closegraph();
X}
X
XHERC_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X
X setlinestyle(linetype,0,1);
X}
X
XHERC_move(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X moveto(x,y);
X}
X
XHERC_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X
X lineto(x,y);
X}
X
X/*
X Thanks to James Dugal (jpd at usl.edu) for patching these two HERC
X routines. (We need to remove the OLD (probably bad) code someday.)
X*/
X
XHERC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef OLDHERC
X gotoxy(79-strlen(str),24-row);
X puts(str);
X#else
X strcpy((char far *)buf,str);
X outtextxy(710-(strlen(str)*8),318-row*10,buf);
X#endif
X}
X
XHERC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef OLDHERC
X gotoxy(2,row+1);
X puts(str);
X#else
X strcpy((char far *)buf,str);
X outtextxy(10,row*10+10,buf);
X#endif
X}
X
X#define HERC_reset PC_reset
X
X
X#else
X
Xpause() /* press any key to continue... */
X{
X while (kbhit())
X (void) getch(); /* flush the keyboard buffer */
X while (!kbhit())
X ;
X}
X
X
XPC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X PC_curloc(24-row,78-strlen(str));
X PC_puts(str);
X}
X
XPC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X PC_curloc(row+1,2);
X PC_puts(str);
X}
X
XPC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X Vmode(3);
X}
X
XPC_reset()
X{
X}
X#define CGA_XMAX 640
X#define CGA_YMAX 200
X
X#define CGA_XLAST (CGA_XMAX - 1)
X#define CGA_YLAST (CGA_YMAX - 1)
X
X#define CGA_VCHAR 8
X#define CGA_HCHAR 8
X#define CGA_VTIC 2
X#define CGA_HTIC 3
X
XCGA_init()
X{
X PC_color(1); /* monochrome */
X}
X
XCGA_graphics()
X{
X graphics_on = TRUE;
X Vmode(6);
X}
X
X#define CGA_text PC_text
X
XCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X PC_mask(pattern[linetype+2]);
X}
X
XCGA_move(x,y)
X{
X startx = x;
X starty = y;
X}
X
X
XCGA_vector(x,y)
X{
X PC_line(startx,CGA_YLAST-starty,x,CGA_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define CGA_lrput_text PC_lrput_text
X#define CGA_ulput_text PC_ulput_text
X
X
X#define CGA_reset PC_reset
X
X
X#define EGA_XMAX 640
X#define EGA_YMAX 350
X
X#define EGA_XLAST (EGA_XMAX - 1)
X#define EGA_YLAST (EGA_YMAX - 1)
X
X#define EGA_VCHAR 14
X#define EGA_HCHAR 8
X#define EGA_VTIC 5
X#define EGA_HTIC 5
X
Xstatic int ega64color[] = {1,1,5,4,3,5,4,3, 5, 4, 3, 5, 4, 3,5};
Xstatic int ega256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *egacolor;
X
X
XEGA_init()
X{
X PC_mask(0xffff);
X egacolor = ega256color; /* should be smarter */
X}
X
XEGA_graphics()
X{
X graphics_on = TRUE;
X Vmode(16);
X}
X
X#define EGA_text PC_text
X
XEGA_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X PC_color(egacolor[linetype+2]);
X}
X
XEGA_move(x,y)
X{
X startx = x;
X starty = y;
X}
X
XEGA_vector(x,y)
X{
X PC_line(startx,EGA_YLAST-starty,x,EGA_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define EGA_lrput_text PC_lrput_text
X#define EGA_ulput_text PC_ulput_text
X
X
X#define EGA_reset PC_reset
X
X
X
X#ifdef EGALIB
X
X#define EGALIB_XMAX 640
X#define EGALIB_YMAX 350
X
X#define EGALIB_XLAST (EGA_XMAX - 1)
X#define EGALIB_YLAST (EGA_YMAX - 1)
X
X#define EGALIB_VCHAR 14
X#define EGALIB_HCHAR 8
X#define EGALIB_VTIC 4
X#define EGALIB_HTIC 5
X
X#include "mcega.h"
X
XEGALIB_init()
X{
X GPPARMS();
X if (GDTYPE != 5) {
X term = 0;
X int_error("color EGA board not found",NO_CARET);
X }
X egacolor = (GDMEMORY < 256) ? ega64color : ega256color;
X}
X
XEGALIB_graphics()
X{
X graphics_on = TRUE;
X GPINIT();
X}
X
XEGALIB_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X GPTERM();
X}
X
XEGALIB_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X GPCOLOR(egacolor[linetype+2]);
X}
X
XEGALIB_move(x,y)
X{
X GPMOVE(x,GDMAXROW-y);
X}
X
X
XEGALIB_vector(x,y)
X{
X GPLINE(x,GDMAXROW-y);
X}
X
X
XEGALIB_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X GotoXY(78-strlen(str),24-row);
X gprintf(buf);
X}
X
XEGALIB_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X GotoXY(2,row+1);
X gprintf(buf);
X}
X
X#define EGALIB_reset PC_reset
X
X#endif /* EGALIB */
X
X
X#ifdef HERCULES
X
X#define HERC_XMAX 720
X#define HERC_YMAX 348
X
X#define HERC_XLAST (HERC_XMAX - 1)
X#define HERC_YLAST (HERC_YMAX - 1)
X
X#define HERC_VCHAR 8
X#define HERC_HCHAR 8
X#define HERC_VTIC 4
X#define HERC_HTIC 4
X
X
XHERC_init()
X{
X}
X
XHERC_graphics()
X{
X HVmode(1);
X graphics_on = TRUE;
X}
X
XHERC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X HVmode(0);
X}
X
XHERC_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X H_mask(pattern[linetype+2]);
X}
X
XHERC_move(x,y)
X{
X if (x < 0)
X startx = 0;
X else if (x > HERC_XLAST)
X startx = HERC_XLAST;
X else
X startx = x;
X
X if (y < 0)
X starty = 0;
X else if (y > HERC_YLAST)
X starty = HERC_YLAST;
X else
X starty = y;
X}
X
XHERC_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X
X H_line(startx,HERC_YLAST-starty,x,HERC_YLAST-y);
X startx = x;
X starty = y;
X}
X
XHERC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X H_puts(str, 41-row, 87-strlen(str));
X}
X
XHERC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X H_puts(str, row+1, 2);
X}
X
X#define HERC_reset PC_reset
X
X#endif /* HERCULES */
X
X
X/* thanks to sask!macphed (Geoff Coleman and Ian Macphedran) for the
X ATT 6300 driver */
X
X
X#ifdef ATT6300
X
X#define ATT_XMAX 640
X#define ATT_YMAX 400
X
X#define ATT_XLAST (ATT_XMAX - 1)
X#define ATT_YLAST (ATT_YMAX - 1)
X
X#define ATT_VCHAR 8
X#define ATT_HCHAR 8
X#define ATT_VTIC 3
X#define ATT_HTIC 3
X
X#define ATT_init CGA_init
X
XATT_graphics()
X{
X graphics_on = TRUE;
X Vmode(0x40); /* 40H is the magic number for the AT&T driver */
X}
X
X#define ATT_text CGA_text
X
X#define ATT_linetype CGA_linetype
X
X#define ATT_move CGA_move
X
XATT_vector(x,y)
X{
X PC_line(startx,ATT_YLAST-starty,x,ATT_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define ATT_lrput_text PC_lrput_text
X#define ATT_ulput_text PC_ulput_text
X
X
X#define ATT_reset CGA_reset
X
X#endif /* ATT6300 */
X
X
X#ifdef CORONA
X
X#define COR_XMAX 640
X#define COR_YMAX 325
X
X#define COR_XLAST (COR_XMAX - 1)
X#define COR_YLAST (COR_YMAX - 1)
X
X#define COR_VCHAR 13
X#define COR_HCHAR 8
X#define COR_VTIC 4
X#define COR_HTIC 4
X
X
Xstatic int corscreen; /* screen number, 0 - 7 */
X
XCOR_init()
X{
Xregister char *p;
X if (!(p = getenv("CORSCREEN")))
X int_error("must run CORPLOT for Corona graphics",NO_CARET);
X corscreen = *p - '0';
X}
X
XCOR_graphics()
X{
X graphics_on = TRUE;
X Vmode(3); /* clear text screen */
X grinit(corscreen);
X grandtx();
X}
X
XCOR_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X grreset();
X txonly();
X Vmode(3);
X}
X
XCOR_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X Cor_mask(pattern[linetype+2]);
X}
X
XCOR_move(x,y)
X{
X if (x < 0)
X startx = 0;
X else if (x > COR_XLAST)
X startx = COR_XLAST;
X else
X startx = x;
X
X if (y < 0)
X starty = 0;
X else if (y > COR_YLAST)
X starty = COR_YLAST;
X else
X starty = y;
X}
X
XCOR_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > COR_XLAST)
X x = COR_XLAST;
X if (y < 0)
X y = 0;
X else if (y > COR_YLAST)
X y = COR_YLAST;
X
X Cor_line(startx,COR_YLAST-starty,x,COR_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define COR_lrput_text PC_lrput_text
X#define COR_ulput_text PC_ulput_text
X
X#define COR_reset PC_reset
X
X#endif /* CORONA */
X
X#endif /* __TURBOC__ */
X
END_OF_FILE
if test 15550 -ne `wc -c <'./pc.trm'`; then
echo shar: \"'./pc.trm'\" unpacked with wrong size!
fi
# end of './pc.trm'
fi
if test -f './term.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./term.c'\"
else
echo shar: Extracting \"'./term.c'\" \(19496 characters\)
sed "s/^X//" >'./term.c' <<'END_OF_FILE'
X/*
X *
X * G N U P L O T -- term.c
X *
X * Copyright (C) 1986, 1987 Colin Kelley, Thomas Williams
X *
X * You may use this code as you wish if credit is given and this message
X * is retained.
X *
X * Please e-mail any useful additions to vu-vlsi!plot so they may be
X * included in later releases.
X *
X * This file should be edited with 4-column tabs! (:set ts=4 sw=4 in vi)
X */
X
X#include <stdio.h>
X#include "plot.h"
X
Xchar *getenv();
X
Xextern FILE *outfile;
Xextern BOOLEAN term_init;
Xextern int term;
X
Xextern char input_line[];
Xextern struct lexical_unit token[];
Xextern struct termentry term_tbl[];
X
X/* This is needed because the unixplot library only writes to stdout. */
XFILE save_stdout;
Xint unixplot=0;
X
X#define NICE_LINE 0
X#define POINT_TYPES 6
X
X
Xdo_point(x,y,number)
Xint x,y;
Xint number;
X{
Xregister int htic,vtic;
Xregister struct termentry *t;
X
X number %= POINT_TYPES;
X t = &term_tbl[term];
X htic = (t->h_tic/2); /* should be in term_tbl[] in later version */
X vtic = (t->v_tic/2);
X
X if ( x < t->h_tic || y < t->v_tic || x >= t->xmax-t->h_tic ||
X y >= t->ymax-t->v_tic )
X return; /* add clipping in later version maybe */
X
X switch(number) {
X case 0: /* do diamond */
X (*t->move)(x-htic,y);
X (*t->vector)(x,y-vtic);
X (*t->vector)(x+htic,y);
X (*t->vector)(x,y+vtic);
X (*t->vector)(x-htic,y);
X (*t->move)(x,y);
X (*t->vector)(x,y);
X break;
X case 1: /* do plus */
X (*t->move)(x-htic,y);
X (*t->vector)(x-htic,y);
X (*t->vector)(x+htic,y);
X (*t->move)(x,y-vtic);
X (*t->vector)(x,y-vtic);
X (*t->vector)(x,y+vtic);
X break;
X case 2: /* do box */
X (*t->move)(x-htic,y-vtic);
X (*t->vector)(x+htic,y-vtic);
X (*t->vector)(x+htic,y+vtic);
X (*t->vector)(x-htic,y+vtic);
X (*t->vector)(x-htic,y-vtic);
X (*t->move)(x,y);
X (*t->vector)(x,y);
X break;
X case 3: /* do X */
X (*t->move)(x-htic,y-vtic);
X (*t->vector)(x-htic,y-vtic);
X (*t->vector)(x+htic,y+vtic);
X (*t->move)(x-htic,y+vtic);
X (*t->vector)(x-htic,y+vtic);
X (*t->vector)(x+htic,y-vtic);
X break;
X case 4: /* do triangle */
X (*t->move)(x,y+(4*vtic/3));
X (*t->vector)(x-(4*htic/3),y-(2*vtic/3));
X (*t->vector)(x+(4*htic/3),y-(2*vtic/3));
X (*t->vector)(x,y+(4*vtic/3));
X (*t->move)(x,y);
X (*t->vector)(x,y);
X break;
X case 5: /* do star */
X (*t->move)(x-htic,y);
X (*t->vector)(x-htic,y);
X (*t->vector)(x+htic,y);
X (*t->move)(x,y-vtic);
X (*t->vector)(x,y-vtic);
X (*t->vector)(x,y+vtic);
X (*t->move)(x-htic,y-vtic);
X (*t->vector)(x-htic,y-vtic);
X (*t->vector)(x+htic,y+vtic);
X (*t->move)(x-htic,y+vtic);
X (*t->vector)(x-htic,y+vtic);
X (*t->vector)(x+htic,y-vtic);
X break;
X }
X}
X
X
X/*
X * general point routine
X */
Xline_and_point(x,y,number)
Xint x,y,number;
X{
X /* temporary(?) kludge to allow terminals with bad linetypes
X to make nice marks */
X
X (*term_tbl[term].linetype)(NICE_LINE);
X do_point(x,y,number);
X}
X
X
X#ifdef HPLJET
X#define RASTER
X#endif /* HPLJET */
X
X#ifdef RASTER
X/*
X** General raster plotting routines.
X** Raster routines written and copyrighted 1987 by
X** Jyrki Yli-Nokari (jty at intrin.UUCP)
X** Intrinsic, Ltd.
X**
X** You may use this code for anything you like as long as
X** you are not selling it and the credit is given and
X** this message retained.
X**
X** The plotting area is defined as a huge raster.
X** The raster is stored in a dynamically allocated pixel array r_p
X**
X** The raster is allocated (and initialized to zero) with
X** r_makeraster(xsize, ysize)
X** and freed with r_freeraster()
X**
X** Valid (unsigned) coordinates range from zero to (xsize-1,ysize-1)
X**
X** Plotting is done via r_move(x, y) and r_draw(x, y, value) functions,
X** where the point (x,y) is the target to go from the current point
X** and value is the value (of type pixel) to be stored in every pixel.
X**
X** Internally all plotting goes through r_setpixel(x, y, val).
X** If you want different plotting styles (like OR, XOR...), use "value"
X** in r_draw() to mark different styles and change r_setpixel() accordingly.
X*/
X
X#define IN(i,size) ((unsigned)i < (unsigned)size)
Xtypedef char pixel; /* the type of one pixel in raster */
Xtypedef pixel *raster[]; /* the raster */
X
Xstatic raster *r_p; /* global pointer to raster */
Xstatic unsigned r_currx, r_curry; /* the current coordinates */
Xstatic unsigned r_xsize, r_ysize; /* the size of the raster */
X
Xchar *calloc();
Xvoid free();
X
X/*
X** set pixel (x, y, val) to value val (this can be 1/0 or a color number).
X*/
Xvoid
Xr_setpixel(x, y, val)
Xunsigned x, y;
Xpixel val;
X{
X if (IN(x, r_xsize) && IN(y, r_ysize)) {
X *(((*r_p)[y]) + x) = val;
X }
X#ifdef RASTERDEBUG
X else {
X fprintf(stderr, "Warning: setpixel(%d, %d, %d) out of bounds\n", x, y, val);
X }
X#endif
X}
X
X/*
X** get pixel (x,y) value
X*/
Xpixel
Xr_getpixel(x, y)
Xunsigned x, y;
X{
X if (IN(x, r_xsize) && IN(y, r_ysize)) {
X return *(((*r_p)[y]) + x);
X } else {
X#ifdef RASTERDEBUG
X fprintf(stderr, "Warning: getpixel(%d,%d) out of bounds\n", x, y);
X#endif
X return 0;
X }
X}
X
X/*
X** allocate the raster
X*/
Xvoid
Xr_makeraster(x, y)
Xunsigned x, y;
X{
X register unsigned j;
X
X /* allocate row pointers */
X if ((r_p = (raster *)calloc(y, sizeof(pixel *))) == (raster *)0) {
X fprintf(stderr, "Raster buffer allocation failure\n");
X exit(1);
X }
X for (j = 0; j < y; j++) {
X if (((*r_p)[j] = (pixel *)calloc(x, sizeof(pixel))) == (pixel *)0) {
X fprintf(stderr, "Raster buffer allocation failure\n");
X exit(1);
X }
X }
X r_xsize = x; r_ysize = y;
X r_currx = r_curry = 0;
X}
X
X/*
X** plot a line from (x0,y0) to (x1,y1) with color val.
X*/
Xvoid
Xr_plot(x0, y0, x1, y1, val)
Xunsigned x0, y0, x1, y1;
Xpixel val;
X{
X unsigned hx, hy, i;
X int e, dx, dy;
X
X hx = abs((int)(x1 - x0));
X hy = abs((int)(y1 - y0));
X dx = (x1 > x0) ? 1 : -1;
X dy = (y1 > y0) ? 1 : -1;
X
X if (hx > hy) {
X /*
X ** loop over x-axis
X */
X e = hy + hy - hx;
X for (i = 0; i <= hx; i++) {
X r_setpixel(x0, y0, val);
X if (e > 0) {
X y0 += dy;
X e += hy + hy - hx - hx;
X } else {
X e += hy + hy;
X }
X x0 += dx;
X }
X } else {
X /*
X ** loop over y-axis
X */
X e = hx + hx - hy;
X for (i = 0; i <= hy; i++) {
X r_setpixel(x0, y0, val);
X if (e > 0) {
X x0 += dx;
X e += hx + hx - hy - hy;
X } else {
X e += hx + hx;
X }
X y0 += dy;
X }
X }
X}
X
X/*
X** move to (x,y)
X*/
Xvoid
Xr_move(x, y)
Xunsigned x, y;
X{
X r_currx = x;
X r_curry = y;
X}
X
X/*
X** draw to (x,y) with color val
X** (move pen down)
X*/
Xvoid
Xr_draw(x, y, val)
Xunsigned x, y;
Xpixel val;
X{
X r_plot(r_currx, r_curry, x, y, val);
X r_currx = x;
X r_curry = y;
X}
X
X/*
X** free the allocated raster
X*/
Xvoid
Xr_freeraster()
X{
X int y;
X
X for (y = 0; y < r_ysize; y++) {
X free((char *)(*r_p)[y]);
X }
X free((char *)r_p);
X}
X#endif /* RASTER */
X
X#ifdef HPLJET
X#include "hpljet.trm"
X#endif /* HPLJET */
X
X#ifdef PC
X#include "pc.trm"
X#endif /* PC */
X
X#ifdef AED
X#include "aed.trm"
X#endif /* AED */
X
X#ifdef BITGRAPH
X#include "bitgraph.trm"
X#endif /* BITGRAPH */
X
X#ifdef HP26
X#include "hp26.trm"
X#endif /* HP26 */
X
X#ifdef HP75
X#include "hp75.trm"
X#endif /* HP75 */
X
X#ifdef IRIS4D
X#include "iris4d.trm"
X#endif /* IRIS4D */
X
X#ifdef POSTSCRIPT
X#include "postscpt.trm"
X#endif /* POSTSCRIPT */
X
X
X#ifdef QMS
X#include "qms.trm"
X#endif /* QMS */
X
X
X#ifdef REGIS
X#include "regis.trm"
X#endif /* REGIS */
X
X
X#ifdef SELANAR
X#include "selanar.trm"
X#endif /* SELANAR */
X
X
X#ifdef TEK
X#include "tek.trm"
X#endif /* TEK */
X
X
X#ifdef V384
X#include "v384.trm"
X#endif /* V384 */
X
X
X#ifdef UNIXPLOT
X/*
X Unixplot library writes to stdout. A fix was put in place by
X ..!arizona!naucse!jdc to let set term and set output redirect
X stdout. All other terminals write to outfile.
X*/
X#include "unixplot.trm"
X#endif /* UNIXPLOT */
X
X#ifdef UNIXPC /* unix-PC ATT 7300 or 3b1 machine */
X#include "unixpc.trm"
X#endif /* UNIXPC */
X
X
XUNKNOWN_null()
X{
X}
X
X
X/*
X * term_tbl[] contains an entry for each terminal. "unknown" must be the
X * first, since term is initialized to 0.
X */
Xstruct termentry term_tbl[] = {
X {"unknown", 100, 100, 1, 1, 1, 1, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null,
X UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null,
X UNKNOWN_null, UNKNOWN_null}
X#ifdef HPLJET
X ,{"laserjet1",HPLJETXMAX,HPLJETYMAX,HPLJET1VCHAR, HPLJET1HCHAR, HPLJETVTIC,
X HPLJETHTIC, HPLJET1init,HPLJETreset, HPLJETtext, HPLJETgraphics,
X HPLJETmove, HPLJETvector,HPLJETlinetype,HPLJETlrput_text,
X HPLJETulput_text, line_and_point}
X ,{"laserjet2",HPLJETXMAX,HPLJETYMAX,HPLJET2VCHAR, HPLJET2HCHAR, HPLJETVTIC,
X HPLJETHTIC, HPLJET2init,HPLJETreset, HPLJETtext, HPLJETgraphics,
X HPLJETmove, HPLJETvector,HPLJETlinetype,HPLJETlrput_text,
X HPLJETulput_text, line_and_point}
X ,{"laserjet3",HPLJETXMAX,HPLJETYMAX,HPLJET3VCHAR, HPLJET3HCHAR, HPLJETVTIC,
X HPLJETHTIC, HPLJET3init,HPLJETreset, HPLJETtext, HPLJETgraphics,
X HPLJETmove, HPLJETvector,HPLJETlinetype,HPLJETlrput_text,
X HPLJETulput_text, line_and_point}
X#endif
X
X#ifdef PC
X#ifdef __TURBOC__
X
X ,{"egalib", EGALIB_XMAX, EGALIB_YMAX, EGALIB_VCHAR, EGALIB_HCHAR,
X EGALIB_VTIC, EGALIB_HTIC, EGALIB_init, EGALIB_reset,
X EGALIB_text, EGALIB_graphics, EGALIB_move, EGALIB_vector,
X EGALIB_linetype, EGALIB_lrput_text, EGALIB_ulput_text, line_and_point}
X
X ,{"vgalib", VGA_XMAX, VGA_YMAX, VGA_VCHAR, VGA_HCHAR,
X VGA_VTIC, VGA_HTIC, VGA_init, VGA_reset,
X VGA_text, VGA_graphics, VGA_move, VGA_vector,
X VGA_linetype, VGA_lrput_text, VGA_ulput_text, line_and_point}
X
X ,{"vgamono", VGA_XMAX, VGA_YMAX, VGA_VCHAR, VGA_HCHAR,
X VGA_VTIC, VGA_HTIC, VGA_init, VGA_reset,
X VGA_text, VGA_graphics, VGA_move, VGA_vector,
X VGAMONO_linetype, VGA_lrput_text, VGA_ulput_text, line_and_point}
X
X ,{"mcga", MCGA_XMAX, MCGA_YMAX, MCGA_VCHAR, MCGA_HCHAR,
X MCGA_VTIC, MCGA_HTIC, MCGA_init, MCGA_reset,
X MCGA_text, MCGA_graphics, MCGA_move, MCGA_vector,
X MCGA_linetype, MCGA_lrput_text, MCGA_ulput_text, line_and_point}
X
X ,{"cga", CGA_XMAX, CGA_YMAX, CGA_VCHAR, CGA_HCHAR,
X CGA_VTIC, CGA_HTIC, CGA_init, CGA_reset,
X CGA_text, CGA_graphics, CGA_move, CGA_vector,
X CGA_linetype, CGA_lrput_text, CGA_ulput_text, line_and_point}
X
X ,{"hercules", HERC_XMAX, HERC_YMAX, HERC_VCHAR, HERC_HCHAR,
X HERC_VTIC, HERC_HTIC, HERC_init, HERC_reset,
X HERC_text, HERC_graphics, HERC_move, HERC_vector,
X HERC_linetype, HERC_lrput_text, HERC_ulput_text, line_and_point}
X
X#else
X ,{"cga", CGA_XMAX, CGA_YMAX, CGA_VCHAR, CGA_HCHAR,
X CGA_VTIC, CGA_HTIC, CGA_init, CGA_reset,
X CGA_text, CGA_graphics, CGA_move, CGA_vector,
X CGA_linetype, CGA_lrput_text, CGA_ulput_text, line_and_point}
X
X ,{"egabios", EGA_XMAX, EGA_YMAX, EGA_VCHAR, EGA_HCHAR,
X EGA_VTIC, EGA_HTIC, EGA_init, EGA_reset,
X EGA_text, EGA_graphics, EGA_move, EGA_vector,
X EGA_linetype, EGA_lrput_text, EGA_ulput_text, do_point}
X
X#ifdef EGALIB
X ,{"egalib", EGALIB_XMAX, EGALIB_YMAX, EGALIB_VCHAR, EGALIB_HCHAR,
X EGALIB_VTIC, EGALIB_HTIC, EGALIB_init, EGALIB_reset,
X EGALIB_text, EGALIB_graphics, EGALIB_move, EGALIB_vector,
X EGALIB_linetype, EGALIB_lrput_text, EGALIB_ulput_text, do_point}
X#endif
X
X#ifdef HERCULES
X ,{"hercules", HERC_XMAX, HERC_YMAX, HERC_VCHAR, HERC_HCHAR,
X HERC_VTIC, HERC_HTIC, HERC_init, HERC_reset,
X HERC_text, HERC_graphics, HERC_move, HERC_vector,
X HERC_linetype, HERC_lrput_text, HERC_ulput_text, line_and_point}
X#endif /* HERCULES */
X
X#ifdef ATT6300
X ,{"att", ATT_XMAX, ATT_YMAX, ATT_VCHAR, ATT_HCHAR,
X ATT_VTIC, ATT_HTIC, ATT_init, ATT_reset,
X ATT_text, ATT_graphics, ATT_move, ATT_vector,
X ATT_linetype, ATT_lrput_text, ATT_ulput_text, line_and_point}
X#endif
X
X#ifdef CORONA
X ,{"corona325", COR_XMAX, COR_YMAX, COR_VCHAR, COR_HCHAR,
X COR_VTIC, COR_HTIC, COR_init, COR_reset,
X COR_text, COR_graphics, COR_move, COR_vector,
X COR_linetype, COR_lrput_text, COR_ulput_text, line_and_point}
X#endif /* CORONA */
X#endif /* TURBOC */
X#endif /* PC */
X
X#ifdef AED
X ,{"aed512", AED5_XMAX, AED_YMAX, AED_VCHAR, AED_HCHAR,
X AED_VTIC, AED_HTIC, AED_init, AED_reset,
X AED_text, AED_graphics, AED_move, AED_vector,
X AED_linetype, AED5_lrput_text, AED_ulput_text, do_point}
X ,{"aed767", AED_XMAX, AED_YMAX, AED_VCHAR, AED_HCHAR,
X AED_VTIC, AED_HTIC, AED_init, AED_reset,
X AED_text, AED_graphics, AED_move, AED_vector,
X AED_linetype, AED_lrput_text, AED_ulput_text, do_point}
X#endif
X
X#ifdef UNIXPC
X ,{"unixpc",uPC_XMAX,uPC_YMAX,uPC_VCHAR, uPC_HCHAR, uPC_VTIC,
X uPC_HTIC, uPC_init,uPC_reset, uPC_text, uPC_graphics,
X uPC_move, uPC_vector,uPC_linetype,uPC_lrput_text,
X uPC_ulput_text, line_and_point}
X#endif
X
X#ifdef BITGRAPH
X ,{"bitgraph",BG_XMAX,BG_YMAX,BG_VCHAR, BG_HCHAR, BG_VTIC,
X BG_HTIC, BG_init,BG_reset, BG_text, BG_graphics,
X BG_move, BG_vector,BG_linetype,BG_lrput_text,
X BG_ulput_text, line_and_point}
X#endif
X
X#ifdef HP26
X ,{"hp2623A",HP26_XMAX,HP26_YMAX, HP26_VCHAR, HP26_HCHAR,HP26_VTIC,HP26_HTIC,
X HP26_init,HP26_reset,HP26_text, HP26_graphics, HP26_move, HP26_vector,
X HP26_linetype, HP26_lrput_text, HP26_ulput_text, line_and_point}
X#endif
X
X#ifdef HP75
X ,{"hp7580B",HP75_XMAX,HP75_YMAX, HP75_VCHAR, HP75_HCHAR,HP75_VTIC,HP75_HTIC,
X HP75_init,HP75_reset,HP75_text, HP75_graphics, HP75_move, HP75_vector,
X HP75_linetype, HP75_lrput_text, HP75_ulput_text, do_point}
X#endif
X
X#ifdef IRIS4D
X ,{"iris4d", IRIS4D_XMAX, IRIS4D_YMAX, IRIS4D_VCHAR,
X IRIS4D_HCHAR, IRIS4D_VTIC, IRIS4D_HTIC,
X IRIS4D_init, IRIS4D_reset, IRIS4D_text,
X IRIS4D_graphics, IRIS4D_move, IRIS4D_vector,
X IRIS4D_linetype, IRIS4D_lrput_text, IRIS4D_ulput_text,
X do_point}
X#endif
X
X#ifdef POSTSCRIPT
X ,{"postscript", PS_XMAX, PS_YMAX, PS_VCHAR, PS_HCHAR, PS_VTIC, PS_HTIC,
X PS_init, PS_reset, PS_text, PS_graphics, PS_move, PS_vector,
X PS_linetype, PS_lrput_text, PS_ulput_text, line_and_point}
X#endif
X
X#ifdef QMS
X ,{"qms",QMS_XMAX,QMS_YMAX, QMS_VCHAR, QMS_HCHAR, QMS_VTIC, QMS_HTIC,
X QMS_init,QMS_reset, QMS_text, QMS_graphics, QMS_move, QMS_vector,
X QMS_linetype,QMS_lrput_text,QMS_ulput_text,line_and_point}
X#endif
X
X#ifdef REGIS
X ,{"regis", REGISXMAX, REGISYMAX, REGISVCHAR, REGISHCHAR, REGISVTIC,
X REGISHTIC, REGISinit, REGISreset, REGIStext, REGISgraphics,
X REGISmove,REGISvector,REGISlinetype, REGISlrput_text, REGISulput_text,
X line_and_point}
X#endif
X
X
X#ifdef SELANAR
X ,{"selanar",TEK40XMAX,TEK40YMAX,TEK40VCHAR, TEK40HCHAR, TEK40VTIC,
X TEK40HTIC, SEL_init, SEL_reset, SEL_text, SEL_graphics,
X TEK40move, TEK40vector, TEK40linetype, TEK40lrput_text,
X TEK40ulput_text, line_and_point}
X#endif
X
X#ifdef TEK
X ,{"tek40xx",TEK40XMAX,TEK40YMAX,TEK40VCHAR, TEK40HCHAR, TEK40VTIC,
X TEK40HTIC, TEK40init, TEK40reset, TEK40text, TEK40graphics,
X TEK40move, TEK40vector, TEK40linetype, TEK40lrput_text,
X TEK40ulput_text, line_and_point}
X#endif
X
X#ifdef UNIXPLOT
X ,{"unixplot", UP_XMAX, UP_YMAX, UP_VCHAR, UP_HCHAR, UP_VTIC, UP_HTIC,
X UP_init, UP_reset, UP_text, UP_graphics, UP_move, UP_vector,
X UP_linetype, UP_lrput_text, UP_ulput_text, line_and_point}
X#endif
X
X#ifdef V384
X ,{"vx384", V384_XMAX, V384_YMAX, V384_VCHAR, V384_HCHAR, V384_VTIC,
X V384_HTIC, V384_init, V384_reset, V384_text, V384_graphics,
X V384_move, V384_vector, V384_linetype, V384_lrput_text,
X V384_ulput_text, do_point}
X#endif
X };
X
X#define TERMCOUNT (sizeof(term_tbl)/sizeof(struct termentry))
X
X
Xlist_terms()
X{
Xregister int i;
X
X fprintf(stderr,"\navailable terminals types:\n");
X for (i = 0; i < TERMCOUNT; i++)
X fprintf(stderr,"\t%s\n",term_tbl[i].name);
X (void) putc('\n',stderr);
X}
X
X
Xset_term(c_token)
Xint c_token;
X{
Xregister int i,t;
X
X if (!token[c_token].is_token)
X int_error("terminal name expected",c_token);
X t = -1;
X
X for (i = 0; i < TERMCOUNT; i++) {
X if (!strncmp(input_line + token[c_token].start_index,term_tbl[i].name,
X token[c_token].length)) {
X if (t != -1)
X int_error("ambiguous terminal name",c_token);
X t = i;
X }
X }
X if (t == -1)
X int_error("unknown terminal type; type just 'set terminal' for a list",
X c_token);
X else if (!strncmp("unixplot",term_tbl[t].name,sizeof(unixplot))) {
X UP_redirect (2); /* Redirect actual stdout for unixplots */
X }
X else if (unixplot) {
X UP_redirect (3); /* Put stdout back together again. */
X }
X term_init = FALSE;
X return(t);
X}
X
X
X/*
X Routine to detect what terminal is being used (or do anything else
X that would be nice). One anticipated (or allowed for) side effect
X is that the global ``term'' may be set.
X*/
Xinit()
X{
Xchar *term_name = NULL;
Xint t = -1, i;
X#ifdef __TURBOC__
X int g_driver,g_mode;
X char far *c1,*c2;
X
X/* Some of this code including BGI drivers is copyright Borland Intl. */
X g_driver=DETECT;
X get_path();
X initgraph(&g_driver,&g_mode,path);
X c1=getdrivername();
X c2=getmodename(g_mode);
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X closegraph();
X fprintf(stderr,"\tTC Graphics, driver %s mode %s\n",c1,c2);
X#endif
X#ifdef VMS
X/*
X Determine if we have a regis terminal. If not use TERM
X (tek40xx) as default.
X*/
X#include <descrip>
X#include <dvidef>
X
Xextern int term;
Xchar *term_str="tt:";
Xtypedef struct
X {
X short cond_value;
X short count;
X int info;
X } status_block;
Xtypedef struct
X {
X short buffer_len;
X short item_code;
X int buffer_addr;
X int ret_len_addr;
X } item_desc;
Xstruct {
X item_desc dev_type;
X int terminator;
X } dvi_list;
X int status, dev_type, zero=0;
X char buffer[255];
X $DESCRIPTOR(term_desc, term_str);
X
X/* set up dvi item list */
X dvi_list.dev_type.buffer_len = 4;
X dvi_list.dev_type.item_code = DVI$_TT_REGIS;
X dvi_list.dev_type.buffer_addr = &dev_type;
X dvi_list.dev_type.ret_len_addr = 0;
X
X dvi_list.terminator = 0;
X
X/* See what type of terminal we have. */
X status = SYS$GETDVIW (0, 0, &term_desc, &dvi_list, 0, 0, 0, 0);
X if ((status & 1) && dev_type) {
X term_name = "regis";
X }
X#endif
X if (term_name != NULL) {
X /* We have a name to set! */
X for (i = 0; i < TERMCOUNT; i++) {
X if (!strncmp("regis",term_tbl[i].name,5)) {
X t = i;
X }
X }
X if (t != -1)
X term = t;
X }
X}
X
X
X/*
X This is always defined so we don't have to have command.c know if it
X is there or not.
X*/
X#ifndef UNIXPLOT
XUP_redirect(caller) int caller; {}
X#else
XUP_redirect (caller)
Xint caller;
X/*
X Unixplot can't really write to outfile--it wants to write to stdout.
X This is normally ok, but the original design of gnuplot gives us
X little choice. Originally users of unixplot had to anticipate
X their needs and redirect all I/O to a file... Not very gnuplot-like.
X
X caller: 1 - called from SET OUTPUT "FOO.OUT"
X 2 - called from SET TERM UNIXPLOT
X 3 - called from SET TERM other
X 4 - called from SET OUTPUT
X*/
X{
X switch (caller) {
X case 1:
X /* Don't save, just replace stdout w/outfile (save was already done). */
X if (unixplot)
X *(stdout) = *(outfile); /* Copy FILE structure */
X break;
X case 2:
X if (!unixplot) {
X fflush(stdout);
X save_stdout = *(stdout);
X *(stdout) = *(outfile); /* Copy FILE structure */
X unixplot = 1;
X }
X break;
X case 3:
X /* New terminal in use--put stdout back to original. */
X closepl();
X fflush(stdout);
X *(stdout) = save_stdout; /* Copy FILE structure */
X unixplot = 0;
X break;
X case 4:
X /* User really wants to go to normal output... */
X if (unixplot) {
X fflush(stdout);
X *(stdout) = save_stdout; /* Copy FILE structure */
X }
X break;
X }
X}
X#endif
END_OF_FILE
if test 19496 -ne `wc -c <'./term.c'`; then
echo shar: \"'./term.c'\" unpacked with wrong size!
fi
# end of './term.c'
fi
echo shar: End of archive 5 \(of 7\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 7 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
John Campbell ...!arizona!naucse!jdc
CAMPBELL at NAUVAX.bitnet
unix? Sure send me a dozen, all different colors.
More information about the Unix-pc.sources
mailing list