home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
applications
/
xlispstat
/
src
/
src2.lzh
/
XLisp-Stat
/
xsiview2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-02
|
16KB
|
514 lines
/* xsiview2 - XLISP interface to IVIEW dynamic graphics package. */
/* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
/* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
/* You may give out copies of this software; for conditions see the */
/* file COPYING included with this distribution. */
#include <string.h>
#include "xlisp.h"
#include "osdef.h"
#ifdef ANSI
#include "xlproto.h"
#include "xlsproto.h"
#include "iviewproto.h"
#else
#include "xlfun.h"
#include "xlsfun.h"
#include "iviewfun.h"
#endif ANSI
#include "xlsvar.h"
/* forward declarations */
#ifdef ANSI
LVAL number_of(int),base_coordinate(void),coordinate(void),
basic_data_coordinate(int,int),base_mask(void),mask(void),
basic_data_mask(int),base_color(void),color(void),
basic_data_color(int),base_point_info(void),point_info(void),
internal_point_info(int),base_line_info(void),line_info(void),
internal_line_info(int),base_string_modifiers(void),
string_modifiers(void),internal_string_modifiers(void);
#else
LVAL number_of(),base_coordinate(),coordinate(),
basic_data_coordinate(),base_mask(),mask(),
basic_data_mask(,base_color(),color(),
basic_data_color(,base_point_info(),point_info(),
internal_point_info(),base_line_info(),line_info(),
internal_line_info(),base_string_modifiers(),
string_modifiers(),internal_string_modifiers();
#endif ANSI
/* static global variables */
static IVIEW_WINDOW wind;
static int data_type, coordinate_type, info_type;
/**************************************************************************/
/** **/
/** General IView Data Functions **/
/** **/
/**************************************************************************/
static LVAL number_of(what)
int what;
{
IVIEW_WINDOW w;
int val;
w = get_iview_address(xlgaobject());
xllastarg();
switch(what) {
case 'V': val = IViewNumVariables(w); break;
case 'P': val = IViewNumPoints(w); break;
case 'L': val = IViewNumLines(w); break;
#ifdef USESTRINGS
case 'S': val = IViewNumStrings(w); break;
#endif /* USESTRINGS */
}
return(cvfixnum((FIXTYPE) val));
}
LVAL iview_num_variables() { return(number_of('V')); }
static LVAL base_coordinate()
{
int var, point, set = FALSE;
double value;
LVAL result;
var = getfixnum(xlgafixnum());
point = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
switch (coordinate_type) {
case 'V': value = makedouble(xlgetarg()); break;
case 'S': xlfail("can't set screen coordinate directly");
case 'T': xlfail("can't set transformed coordinate directly");
default: xlfail("unknown coordinate type");
}
}
if (set)
switch (data_type) {
case 'P': IViewSetPointValue(wind, var, point, value); break;
case 'L': IViewSetLineValue(wind, var, point, value); break;
#ifdef USESTRINGS
case 'S': IViewSetStringValue(wind, var, point, value); break;
#endif /* USESTRINGS */
}
switch (data_type) {
case 'P':
if (coordinate_type == 'V')
result = cvflonum((FLOTYPE) IViewPointValue(wind, var, point));
else if (coordinate_type == 'S')
result = cvfixnum((FIXTYPE) IViewPointScreenValue(wind, var, point));
else
result = cvflonum((FLOTYPE) IViewPointTransformedValue(wind, var, point));
break;
case 'L':
if (coordinate_type == 'V')
result = cvflonum((FLOTYPE) IViewLineValue(wind, var, point));
else if (coordinate_type == 'S')
result = cvfixnum((FIXTYPE) IViewLineScreenValue(wind, var, point));
else
result = cvflonum((FLOTYPE) IViewLineTransformedValue(wind, var, point));
break;
#ifdef USESTRINGS
case 'S':
if (coordinate_type == 'V')
result = cvflonum((FLOTYPE) IViewStringValue(wind, var, point));
else if (coordinate_type == 'S')
result = cvfixnum((FIXTYPE) IViewStringScreenValue(wind, var, point));
else
result = cvflonum((FLOTYPE) IViewStringTransformedValue(wind, var, point));
break;
#endif /* USESTRINGS */
}
return(result);
}
static LVAL coordinate()
{
return(recursive_subr_map_elements(base_coordinate, coordinate));
}
static LVAL basic_data_coordinate(type, action)
int type, action;
{
wind = get_iview_address(xlgaobject());
data_type = type;
coordinate_type = action;
return(coordinate());
}
static LVAL base_mask()
{
int point, masked, set = FALSE;
point = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
masked = (xlgetarg() != NIL) ? TRUE : FALSE;
}
if (set)
switch (data_type) {
case 'P': IViewSetPointMask(wind, point, masked); break;
case 'L': IViewSetLineMask(wind, point, masked); break;
#ifdef USESTRINGS
case 'S': IViewSetStringMask(wind, point, masked); break;
#endif /* USESTRINGS */
}
switch (data_type) {
case 'P': masked = IViewPointMasked(wind, point); break;
case 'L': masked = IViewLineMasked(wind, point); break;
#ifdef USESTRINGS
case 'S': masked = IViewStringMasked(wind, point); break;
#endif /* USESTRINGS */
}
return((masked) ? s_true : NIL);
}
static LVAL mask()
{
return(recursive_subr_map_elements(base_mask, mask));
}
static LVAL basic_data_mask(type)
int type;
{
wind = get_iview_address(xlgaobject());
data_type = type;
return(mask());
}
static LVAL base_color()
{
int point, /* color, */ set = FALSE; /* changed JKL */
ColorCode color;
LVAL arg;
point = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
arg = xlgetarg();
color = (arg != NIL) ? decode_lisp_color(arg) : -1;
}
if (set)
switch (data_type) {
case 'P': IViewSetPointColor(wind, point, color); break;
case 'L': IViewSetLineColor(wind, point, color); break;
#ifdef USESTRINGS
case 'S': IViewSetStringColor(wind, point, color); break;
#endif /* USESTRINGS */
}
switch (data_type) {
case 'P': color = IViewPointColor(wind, point); break;
case 'L': color = IViewLineColor(wind, point); break;
#ifdef USESTRINGS
case 'S': color = IViewStringColor(wind, point); break;
#endif /* USESTRINGS */
}
return((color >= 0) ? encode_lisp_color(color) : NIL);
}
static LVAL color()
{
return(recursive_subr_map_elements(base_color, color));
}
static LVAL basic_data_color(type)
int type;
{
wind = get_iview_address(xlgaobject());
data_type = type;
return(color());
}
/**************************************************************************/
/** **/
/** IView Point Data Functions **/
/** **/
/**************************************************************************/
LVAL iview_num_points() { return(number_of('P')); }
LVAL iview_point_coordinate() { return(basic_data_coordinate('P', 'V')); }
LVAL iview_point_screen_coordinate() { return(basic_data_coordinate('P', 'S')); }
LVAL iview_point_transformed_coordinate() { return(basic_data_coordinate('P', 'T')); }
LVAL iview_point_masked() { return(basic_data_mask('P')); }
LVAL iview_point_color() { return(basic_data_color('P')); }
static LVAL base_point_info()
{
int point, marked, sym, hsym, set = FALSE;
char *label;
PointState state;
LVAL arg, result;
/* get the arguments */
point = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
switch(info_type) {
case 'S':
case 's':
arg = xlgasymbol();
if (arg == s_invisible) state = pointInvisible;
else if (arg == s_normal) state = pointNormal;
else if (arg == s_hilited) state = pointHilited;
else if (arg == s_selected) state = pointSelected;
else xlerror("unknown point state", arg);
break;
case 'M': marked = (xlgetarg() != NIL) ? TRUE : FALSE; break;
case 'L': label = (char *) getstring(xlgastring()); break;
case 'X':
arg = xlgetarg();
if (symbolp(arg)) decode_point_symbol(arg, &sym, &hsym);
else {
if (! fixp(arg)) xlbadtype(arg);
sym = getfixnum(arg);
hsym = getfixnum(xlgafixnum());
}
break;
}
}
/* set the new state if value was supplied */
if (set)
switch (info_type) {
case 'S': IViewSetPointState(wind, point, state); break;
case 's': IViewSetPointScreenState(wind, point, state); break;
case 'M': IViewSetPointMark(wind, point, marked); break;
case 'L': IViewSetPointLabel(wind, point, label); break;
case 'X': IViewSetPointSymbol(wind, point, sym, hsym); break;
}
/* get the current state */
switch (info_type) {
case 'S': state = IViewPointState(wind, point); break;
case 's': state = IViewPointScreenState(wind, point); break;
case 'M': marked = IViewPointMarked(wind, point); break;
case 'L': label = IViewPointLabel(wind, point); break;
case 'X': IViewGetPointSymbol(wind, point, &sym, &hsym); break;
}
/* code the current state as a lisp object */
switch (info_type) {
case 'S':
case 's':
switch (state) {
case pointInvisible: result = s_invisible; break;
case pointNormal: result = s_normal; break;
case pointHilited: result = s_hilited; break;
case pointSelected: result = s_selected; break;
default: xlfail("unknown point state");
}
break;
case 'M': result = (marked) ? s_true : NIL; break;
case 'L':
if (label == nil) result = newstring(1);
else {
result = newstring(strlen(label) + 1);
strcpy(getstring(result), label);
}
break;
case 'X': result = encode_point_symbol(sym, hsym); break;
}
/* return the current state */
return(result);
}
static LVAL point_info()
{
return(recursive_subr_map_elements(base_point_info, point_info));
}
static LVAL internal_point_info(type)
int type;
{
wind = get_iview_address(xlgaobject());
if (type == 'S' && xlargc > 1) IViewCheckLinks(wind);
info_type = type;
return(point_info());
}
LVAL iview_point_state() { return(internal_point_info('S')); }
LVAL iview_point_screen_state() { return(internal_point_info('s')); }
LVAL iview_point_marked() { return(internal_point_info('M')); }
LVAL iview_point_label() { return(internal_point_info('L')); }
LVAL iview_point_symbol() { return(internal_point_info('X')); }
/**************************************************************************/
/** **/
/** IView Line Data Functions **/
/** **/
/**************************************************************************/
LVAL iview_num_lines() { return(number_of('L')); }
LVAL iview_line_coordinate() { return(basic_data_coordinate('L', 'V')); }
LVAL iview_line_screen_coordinate() { return(basic_data_coordinate('L', 'S')); }
LVAL iview_line_transformed_coordinate() { return(basic_data_coordinate('L', 'T')); }
LVAL iview_line_masked() { return(basic_data_mask('L')); }
LVAL iview_line_color() { return(basic_data_color('L')); }
static LVAL base_line_info()
{
int line, next, type, width, set = FALSE;
LVAL arg, result;
/* get the arguments */
line = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
switch(info_type) {
case 'N':
arg = xlgetarg();
next = (fixp(arg)) ? getfixnum(arg) : -1;
break;
case 'T':
arg = xlgasymbol();
if (arg == s_solid) type = 0;
else if (arg == s_dashed) type = 1;
else xlerror("unknown line type", arg);
break;
case 'P':
width = getfixnum(xlgafixnum());
}
}
/* set the new state if value was supplied */
if (set)
switch (info_type) {
case 'N': IViewSetNextLine(wind, line, next); break;
case 'T': IViewSetLineType(wind, line, type); break;
case 'P': IViewSetLineWidth(wind, line, width); break;
}
/* get the current state */
switch (info_type) {
case 'N': next = IViewNextLine(wind, line); break;
case 'T': type = IViewLineType(wind, line); break;
case 'P': IViewGetLineWidth(wind, line, &width); break;
}
/* code the current state as a lisp object */
switch (info_type) {
case 'N': result = (next >= 0) ? cvfixnum((FIXTYPE) next) : NIL; break;
case 'T':
if (type == 0) result = s_solid;
else result = s_dashed;
break;
case 'P': result = cvfixnum((FIXTYPE) width); break;
}
/* return the current state */
return(result);
}
static LVAL line_info()
{
return(recursive_subr_map_elements(base_line_info, line_info));
}
static LVAL internal_line_info(type)
int type;
{
wind = get_iview_address(xlgaobject());
info_type = type;
return(line_info());
}
LVAL iview_line_next() { return(internal_line_info('N')); }
LVAL iview_line_type() { return(internal_line_info('T')); }
LVAL iview_line_width() { return(internal_line_info('P')); }
#ifdef USESTRINGS
/**************************************************************************/
/** **/
/** IView String Data Functions **/
/** **/
/**************************************************************************/
LVAL iview_num_strings() { return(number_of('S')); }
LVAL iview_string_coordinate() { return(basic_data_coordinate('S', 'V')); }
LVAL iview_string_screen_coordinate() { return(basic_data_coordinate('S', 'S')); }
LVAL iview_string_transformed_coordinate() { return(basic_data_coordinate('S', 'T')); }
LVAL iview_string_masked() { return(basic_data_mask('S')); }
LVAL iview_string_color() { return(basic_data_color('S')); }
static LVAL base_string_modifiers()
{
int string, up, h, v, set = FALSE;
LVAL arg, temp, result;
/* get the arguments */
string = getfixnum(xlgafixnum());
if (moreargs()) {
set = TRUE;
up = (xlgetarg() != NIL) ? TRUE : FALSE;
arg = xlgasymbol();
if (arg == s_left) h = 0;
else if (arg == s_center) h = 1;
else if (arg == s_right) h = 2;
else xlerror("unknown string justification mode", arg);
arg = xlgasymbol();
if (arg == s_bottom) v = 0;
else if (arg == s_top) v = 1;
else xlerror("unknown string justification mode", arg);
}
/* set the new state if value was supplied */
if (set) IViewSetStringModifiers(wind, string, up, h, v);
/* get the current state */
IViewGetStringModifiers(wind, string, &up, &h, &v);
/* code the current state as a lisp object */
xlsave1(result);
switch (v) {
case 0: temp = s_bottom; break;
case 1: temp = s_top; break;
default: xlfail("unknown string justification mode");
}
result = consa(temp);
switch(h) {
case 0: temp = s_left; break;
case 1: temp = s_center; break;
case 2: temp = s_right; break;
default: xlfail("unknown string justification mode");
}
result = cons(temp, result);
temp = (up) ? s_true : NIL;
result = cons(temp, result);
xlpop();
/* return the current state */
return(result);
}
static LVAL string_modifiers()
{
return(recursive_subr_map_elements(base_string_modifiers, string_modifiers));
}
static LVAL internal_string_modifiers()
{
wind = get_iview_address(xlgaobject());
return(string_modifiers());
}
LVAL iview_string_modifiers() { return(internal_string_modifiers()); }
#endif /* USESTRINGS */