Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
8.9 KiB

2 years ago
/*
* Copyright(C) 1999-2022 National Technology & Engineering Solutions
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
* NTESS, the U.S. Government retains certain rights in this software.
*
* See packages/seacas/LICENSE for details
*/
/* mdcgi - multiple simultaneous devices routines for cgi */
#include "mdcgi.h"
#include "stdtyp.h"
#include <stdio.h> // for fprintf, stderr, NULL
/******************************************************************************/
/* */
/* Global variables */
/* */
/******************************************************************************/
/* these are shared with sdcgi.c, and are defined there */
extern device_struct devices[MAX_DEVICES]; /* list of currently active */
extern anything *in_params[MAX_IN_PARAMS]; /* params sent to driver */
extern short num_devices; /* how many items in devices*/
extern anything *sol_surf; /* current solicitation surface, */
/* these aren't shared with anybody */
static int num_oldest = 0; /* # surfs in oldest_surfs */
static anything *oldest_surfs[MAX_SURFACES]; /* states of oldest surfaces */
/******************************************************************************/
/* */
/* Added functions to allow for multiple simultaneous devices */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* xcoon - turn output on for a cgi display surface. */
/* Note: it is not an error to turn output on for a surface which is */
/* already on. */
/* Note: it is an error to turn output on for a surface which is not */
/* initialized. */
/* */
/******************************************************************************/
#if defined(ADDC_)
void xcoon_(anything **surface_id) /* which surface to turn output on for*/
#else
void xcoon(anything **surface_id) /* which surface to turn output on for*/
#endif
{
/* does surface_id point to a valid surface? */
/* if not, do error action */
/* find out which device this surface is on */
/* rearrange the surface list for that device */
/* search active devices for this surface */
short dev_found = -1;
short surf_found = 0; /* which active_surface was found */
for (short dev = 0; (dev < num_devices) && (dev_found == -1); ++dev) {
for (short surf = 0; surf < devices[dev].num_active_surfaces; ++surf) {
if (*surface_id == devices[dev].statelist[surf]) {
dev_found = dev;
surf_found = surf;
break;
} /* end if found on list */
} /* end for */
} /* end for all devices */
/* does surface_id point to a valid surface? */
if (dev_found < 0) {
fprintf(stderr, "xcoon: surface id not a valid surface\n");
return;
} /* end if surface not found */
/* if surface was off */
if (surf_found >= devices[dev_found].num_on_surfaces) {
++devices[dev_found].num_on_surfaces;
/* swap target surface with first off surface if there is one */
if (devices[dev_found].num_on_surfaces != devices[dev_found].num_active_surfaces) {
anything *temp = devices[dev_found].statelist[surf_found];
devices[dev_found].statelist[surf_found] =
devices[dev_found].statelist[devices[dev_found].num_on_surfaces - 1];
devices[dev_found].statelist[devices[dev_found].num_on_surfaces - 1] = temp;
} /* end if there is an off surface */
} /* end if surface was off */
} /* end xcoon */
/******************************************************************************/
/* */
/* xcact - initialize and activate a cgi display surface */
/* */
/******************************************************************************/
#if defined(ADDC_)
void xcact_(void (*device_fn)(anything **, int, anything **), anything **p_surface_id)
#else
void xcact(void (*device_fn)(anything **, int, anything **), anything **p_surface_id)
#endif
{
/* is device already initialized? */
short which_device = -1;
for (short i = 0; i < num_devices; ++i) {
if (device_fn == devices[i].device_fn) {
which_device = i;
break;
} /* end if */
} /* end for */
if (which_device < 0) { /* if device not initialized */
if (num_devices >= MAX_DEVICES) { /* if no room */
fprintf(stderr, "xcact: can't activate: too many initialized devices\n");
*p_surface_id = NULL;
return;
} /* end if no room for device */
} /* end if device not initialized */
/* call the device driver with ACTIVATE, so it can allocate a state list */
short arg1 = ACTIVATE_FN;
in_params[0] = (anything *)&arg1;
anything *temp_surface[1]; /* for calling driver */
(*device_fn)(in_params, 1, temp_surface);
if (temp_surface[0] == NULL) { /* error */
fprintf(stderr, "xcact: can't activate surface: driver error\n");
*p_surface_id = NULL;
return;
} /* end if error on activate */
if (which_device < 0) { /* if device not initialized */
/* then initialize it */
which_device = num_devices;
++num_devices;
devices[which_device].num_active_surfaces = 0;
devices[which_device].num_on_surfaces = 0;
devices[which_device].device_fn = device_fn;
} /* end if */
/* add new surface to device */
short which_surface = devices[which_device].num_active_surfaces;
++devices[which_device].num_active_surfaces;
devices[which_device].statelist[which_surface] = temp_surface[0];
/* if new surface is the oldest surface, make it the solicitation surface */
if (num_oldest == 0) {
sol_surf = temp_surface[0];
}
/* put this surface as newest surf on oldest_surfs list */
oldest_surfs[num_oldest] = temp_surface[0];
++num_oldest;
/* return id of new surface */
*p_surface_id = temp_surface[0];
} /* end xcact */
/******************************************************************************/
/* */
/* xcooff - turn output off for a display surface */
/* Note: it is not an error to turn off a surface which is */
/* already off. */
/* Note: it is an error to turn off a surface which is not active. */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* xcdact - deactivate a cgi display surface */
/* Note: it is an error to deactivate a surface which is not active. */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* xcsol - set solicitation surface */
/* */
/******************************************************************************/
#if defined(ADDC_)
void xcsol_(anything **surface_id)
#else
void xcsol(anything **surface_id)
#endif
{
/* does surface_id point to a valid surface? */
/* if not, do error action */
/* set the solicitation surface to surface_id */
/* search devices for this surface */
short dev_found = -1;
for (short dev = 0; (dev < num_devices) && (dev_found == -1); ++dev) {
for (short surf = 0; surf < devices[dev].num_active_surfaces; ++surf) {
if (*surface_id == devices[dev].statelist[surf]) {
dev_found = dev;
break;
} /* end if found on list */
} /* end for */
} /* end for all devices */
/* does surface_id point to a valid surface? */
if (dev_found < 0) {
fprintf(stderr, "xcsol: surface id not a valid surface\n");
return;
} /* end if surface not found */
sol_surf = *surface_id;
} /* end xcsol */