This is lang.c in view mode; [Download] [Up]
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/signal.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include "ooglutil.h"
#include "drawer.h"
#include "lisp.h"
#include "lispext.h"
#include "lang.h"
#include "event.h"
#include "ui.h"
#include "comm.h"
#include "streampool.h"
#include "handleP.h"
#include "transform.h"
#include "mgrib.h"
#include "version.h"
#include "clang.c"
/* do-lang, do-lang, do-lang... */
void lang_init()
{
LInit();
lispext_init();
clang_init();
/*
* Functions that don't use LDECLARE need to be LDefun'ed
* here because they are not part of the "clang" interface.
*/
{
extern LObject *Lread(Lake *, LList *);
extern char Hread[];
extern LObject *Lmerge(Lake *, LList *);
extern char Hmerge[];
extern LObject *Lhdefine(Lake *, LList *);
extern char Hhdefine[];
extern LObject *LND_xform(Lake *, LList *);
extern char HND_xform[];
LDefun("read", Lread, Hread);
LDefun("merge", Lmerge, Hmerge);
LDefun("hdefine", Lhdefine, Hhdefine);
LDefun("ND-xform", LND_xform, HND_xform);
}
/*
* Define the language keywords
*/
define_keyword("yes", YES_KEYWORD);
define_keyword("no", NO_KEYWORD);
define_keyword("on", ON_KEYWORD);
define_keyword("off", OFF_KEYWORD);
define_keyword("0", ZERO_KEYWORD);
define_keyword("1", ONE_KEYWORD);
define_keyword("none", NONE_KEYWORD);
define_keyword("each", EACH_KEYWORD);
define_keyword("keep", KEEP_KEYWORD);
define_keyword("all", ALL_KEYWORD);
define_keyword("euclidean", EUCLIDEAN_KEYWORD);
define_keyword("hyperbolic", HYPERBOLIC_KEYWORD);
define_keyword("spherical", SPHERICAL_KEYWORD);
define_keyword("virtual", VIRTUAL_KEYWORD);
define_keyword("projective", PROJECTIVE_KEYWORD);
define_keyword("conformal-ball", CONFORMALBALL_KEYWORD);
define_keyword("conformal", CONFORMALBALL_KEYWORD);
define_keyword("tiff", TIFF_KEYWORD);
define_keyword("frame", FRAME_KEYWORD);
define_keyword("camera", CAMERA_KEYWORD);
define_keyword("geometry", GEOM_KEYWORD);
define_keyword("transform", TRANSFORM_KEYWORD);
define_keyword("command", COMMAND_KEYWORD);
define_keyword("window", WINDOW_KEYWORD);
define_keyword("translate", TRANSLATE_KEYWORD);
define_keyword("e-translate", E_TRANSLATE_KEYWORD);
define_keyword("h-translate", H_TRANSLATE_KEYWORD);
define_keyword("s-translate", S_TRANSLATE_KEYWORD);
define_keyword("translate-scaled", TRANSLATE_SCALED_KEYWORD);
define_keyword("e-translate-scaled", E_TRANSLATE_SCALED_KEYWORD);
define_keyword("h-translate-scaled", H_TRANSLATE_SCALED_KEYWORD);
define_keyword("s-translate-scaled", S_TRANSLATE_SCALED_KEYWORD);
define_keyword("rotate", ROTATE_KEYWORD);
define_keyword("scale", SCALE_KEYWORD);
define_keyword("zoom", ZOOM_KEYWORD);
define_keyword("horizontal", HORIZONTAL_KEYWORD);
define_keyword("vertical", VERTICAL_KEYWORD);
define_keyword("colored", COLORED_KEYWORD);
define_keyword("toggle", TOGGLE_KEYWORD);
/*
* Define various synonyms
*/
LDefun("!", Lshell, "! is a synonym for \"shell\"");
LDefun("|", Lemodule_run, "| is a synonym for \"emodule-run\"");
LDefun("ui-emotion-program", Lui_emodule_define,
"ui-emotion-program is an obsolete command.\n\
Use its new eqivalent \"emodule-define\" instead.");
LDefun("ui-emotion-run", Lui_emodule_start,
"ui-emotion-run is an obsolete command.\n\
Use its new eqivalent \"emodule_start\" instead.");
LDefun("quit", Lexit, "quit is a synonym for \"exit\"");
LDefun("merge-base-ap", Lmerge_baseap,
"merge-base-ap is a synonym for merge-baseap.");
/*
* And some extra help entries.
*/
LHelpDef("ID",
"ID is a string which names a geometry or camera. Besides\n\
those you create, valid ones are:\n\
\n\
World, world,\n\
worldgeom, g0: the collection of all geom's\n\
target: selected target object (cam or geom)\n\
center: selected center-of-motion object\n\
targetcam: last selected target camera\n\
targetgeom: last selected target geom\n\
focus: camera where cursor is (or most\n\
recently was)\n\
allgeoms: all geom objects\n\
allcams: all cameras\n\
default, defaultcam: prototype; future cameras inherit\n\
default's settings\n\
\n\
The following IDs are used to name coordinate systems,\n\
e.g. in \"pick\" and \"write\" commands:\n\
\n\
world, World, etc.: the world, within which all other\n\
geoms live.\n\
universe: the universe, in which the World, lights\n\
and cameras live. Cameras' world2cam\n\
transforms might better be called\n\
universe2cam, etc.\n\
self: \"this geomview object\". Transform from\n\
an object to \"self\" is the identity;\n\
writing its geometry gives the object\n\
itself with no enclosing transform;\n\
picked points appear in the object's\n\
coordinates.\n\
primitive: (for \"pick\" only) Picked points appear in\n\
the coordinate system of the\n\
lowest-level OOGL primitive.\n\
\n\
A name is also an acceptable id. Given names are made unique\n\
by appending numbers if necessary (i.e. \"foo<2>\"). Every geom\n\
is also named g[n] and every camera is also named c[n] (\"g0\"\n\
is always the worldgeom): this name is used as a prefix to\n\
keyboard commands and can also be used as a command language\n\
id. Numbers are reused after an object is deleted. Both names\n\
are shown in the Object browser.");
LHelpDef("CAM-ID",
"CAM-ID is an ID that refers to a camera.");
LHelpDef("GEOM-ID",
"GEOM-ID is an ID that refers to a geometry.");
LHelpDef("GEOMETRY",
"GEOMETRY is an OOGL geometry specification.");
LHelpDef("CAMERA",
"CAMERA is an OOGL camera specification.");
LHelpDef("APPEARANCE",
"APPEARANCE is an OOGL appearance specification.");
LHelpDef("TRANSFORM",
"TRANSFORM is an OOGL 4x4 transformation matrix.");
}
HandleOps *keyword2ops(int keyword)
{
switch (keyword) {
case CAMERA_KEYWORD: return &CamOps;
case GEOM_KEYWORD: return &GeomOps;
case TRANSFORM_KEYWORD: return &TransOps;
case COMMAND_KEYWORD: return &CommandOps;
case WINDOW_KEYWORD: return &WindowOps;
default: return NULL;
}
}
char *keywordname(int keyword)
{
switch (keyword) {
case NO_KEYWORD: return "no";
case YES_KEYWORD: return "yes";
case ON_KEYWORD: return "on";
case OFF_KEYWORD: return "off";
case ZERO_KEYWORD: return "no";
case ONE_KEYWORD: return "yes";
case NONE_KEYWORD: return "none";
case EACH_KEYWORD: return "each";
case KEEP_KEYWORD: return "keep";
case ALL_KEYWORD: return "all";
case EUCLIDEAN_KEYWORD: return "euclidean";
case HYPERBOLIC_KEYWORD: return "hyperbolic";
case SPHERICAL_KEYWORD: return "spherical";
case VIRTUAL_KEYWORD: return "virtual";
case PROJECTIVE_KEYWORD: return "projective";
case CONFORMALBALL_KEYWORD: return "conformal";
case TIFF_KEYWORD: return "tiff";
case FRAME_KEYWORD: return "frame";
case CAMERA_KEYWORD: return "camera";
case GEOM_KEYWORD: return "geometry";
case TRANSFORM_KEYWORD: return "transform";
case COMMAND_KEYWORD: return "command";
case WINDOW_KEYWORD: return "window";
case TRANSLATE_KEYWORD: return "translate";
case E_TRANSLATE_KEYWORD: return "e-translate";
case H_TRANSLATE_KEYWORD: return "h-translate";
case S_TRANSLATE_KEYWORD: return "s-translate";
case TRANSLATE_SCALED_KEYWORD: return "translate-scaled";
case E_TRANSLATE_SCALED_KEYWORD: return "e-translate-scaled";
case H_TRANSLATE_SCALED_KEYWORD: return "h-translate-scaled";
case S_TRANSLATE_SCALED_KEYWORD: return "s-translate-scaled";
case ROTATE_KEYWORD: return "rotate";
case SCALE_KEYWORD: return "scale";
case ZOOM_KEYWORD: return "zoom";
case HORIZONTAL_KEYWORD: return "horizontal";
case VERTICAL_KEYWORD: return "vertical";
case COLORED_KEYWORD: return "colored";
default: return "???";
}
}
/**********************************************************************/
LDEFINE(shell, LVOID,
"(shell SHELL-COMMAND)\n\
Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview\n\
waits for it to complete and will be unresponsive until it does.")
{
char *cmd;
int status;
void (*oldsigchld)();
LDECLARE(("shell", LBEGIN,
LSTRINGS, &cmd,
LEND));
oldsigchld = signal(SIGCHLD, SIG_DFL);
status = system(cmd);
signal(SIGCHLD, oldsigchld);
return LNew(LINT, &status);
}
LDEFINE(write_sexpr, LVOID,
"(write-sexpr FILENAME LISPOBJECT)\n\
Writes the given LISPOBJECT to FILENAME. This function is intended\n\
for internal debugging use only.")
{
LObject *obj;
char *filename;
LDECLARE(("write-sexpr", LBEGIN,
LSTRING, &filename,
LHOLD, LLOBJECT, &obj,
LEND));
LWriteFile(filename, obj);
return Lt;
}
LDEFINE(geomview_version, LSTRING,
"(geomview-version)\n\
Returns a string representing the version of geomview that is\n\
running.")
{
char *s;
LDECLARE(("geomview-version", LBEGIN,
LEND));
s = strdup(GEOMVIEW_VERSION);
return LNew( LSTRING, &s );
}
int boolval(char *s, int keyword)
{
switch (keyword) {
case YES_KEYWORD:
case ON_KEYWORD:
case ONE_KEYWORD:
return 1;
case NO_KEYWORD:
case OFF_KEYWORD:
case ZERO_KEYWORD:
return 0;
default:
fprintf(stderr, "%s: %s is not a boolean keyword; assuming \"no\"\n",
s, keywordname(keyword));
return 0;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.