ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/bin/geomview/common/lang.c

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.