home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
SYSLIB.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-22
|
10KB
|
405 lines
/*
* システムライブラリ
*
* Copyright T.Kobayashi 1994.7.9
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <io.h>
#include <assert.h>
#include "input.h"
#include "ml.h"
#include "matclass.h"
#include "strclass.h"
#include "model.h"
static int Quit( int, int, DataStruct* );
static int VersionString( int, int, DataStruct* );
static int EnvString( int, int, DataStruct* );
static int Child( int, int, DataStruct* );
static int FuncWaitEvent( int, int, DataStruct* );
static int FuncInputMode( int, int, DataStruct* );
static int FuncMessage( int, int, DataStruct* );
static int FuncWarning( int, int, DataStruct* );
static int FuncWriteFrame( int, int, DataStruct* );
static int FuncGetArg( int, int, DataStruct* );
static int FuncUpdateAll( int, int, DataStruct* );
static int Modelrc( int, int, DataStruct* );
static int FuncControlEvent( int, int, DataStruct* );
static int FuncAttrEvent( int, int, DataStruct* );
static int FuncObjEvent( int, int, DataStruct* );
static int FuncCanCloseEvent( int, int, DataStruct* );
static int FuncStatusBar( int, int, DataStruct* );
static int FuncStatusBarWidth( int, int, DataStruct* );
static int FuncRendParameter( int, int, DataStruct* );
static int StringClassID, MatrixClassID ;
int IdentCanClose;
void SysLibInit()
{
int i;
StringClassID = ClassName( "String" );
MatrixClassID = ClassName( "Matrix" );
NewFunction( 0, "Version", VersionString );
NewFunction( 0, "Environ", EnvString );
NewFunction( 0, "Quit", Quit );
NewFunction( StringClassID, "Child", Child );
NewFunction( 0, "WaitEvent", FuncWaitEvent );
NewFunction( 0, "InputMode", FuncInputMode );
NewFunction( StringClassID, "Message", FuncMessage );
NewFunction( 0, "Warning", FuncWarning );
NewFunction( MatrixClassID, "WriteFrame", FuncWriteFrame );
NewFunction( 0, "GetArg", FuncGetArg );
NewFunction( 0, "UpdateAll", FuncUpdateAll );
NewFunction( StringClassID, "Modelrc", Modelrc );
NewFunction( 0, "ControlEvent", FuncControlEvent );
NewFunction( 0, "AttrEvent", FuncAttrEvent );
NewFunction( 0, "ObjEvent", FuncObjEvent );
NewFunction( 0, "CanCloseEvent", FuncCanCloseEvent);
NewFunction( StringClassID, "StatusBar", FuncStatusBar );
NewFunction( 0, "StatusBarWidth", FuncStatusBarWidth );
NewFunction( 0, "RendParameter", FuncRendParameter);
IdentControl = IdentAttrSelect = IdentObjSelect = IdentCanClose = -1;
for (i = 0; i < MAXSTATUS; i++) {
StatusWidth[i] = 0;
StatusText[i][0] = '\0';
}
}
/* 終了 */
static int Quit( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
QuitFlag = TRUE ;
return RETURN_VOID ;
}
/* バージョン文字列の取得 */
static int VersionString( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
extern char *Version ;
buf = StackAlloc( 1 );
StringToObject( buf, Version );
return RETURN_RETURN ;
}
/* 動作環境文字列の取得 */
static int EnvString( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
extern char *Environment ;
buf = StackAlloc( 1 );
StringToObject( buf, Environment );
return RETURN_RETURN ;
}
/* コマンド呼び出し */
static int Child( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int waitflag = FALSE;
int iconify = FALSE;
if (args == 1) {
ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_NOASN );
} else if (args == 2) {
ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
waitflag = buf[1].ld.l;
} else {
ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_INT|TYPE_BOOLEAN, TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
waitflag = buf[1].ld.l;
iconify = buf[2].ld.l;
}
ChildExec( ((StringClass*)buf[0].od.ptr)->str, waitflag, iconify );
return RETURN_VOID ;
}
/* キー入力待ち */
static int FuncWaitEvent( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
StackPushBoolean( WaitEvent() );
return RETURN_RETURN ;
}
/* 入力モード設定 */
static int FuncInputMode( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "InputMode", args, buf, TYPE_INT, TYPE_INT, TYPE_NOASN );
InputKey = buf[0].id.i ;
CursorMoveKey = buf[1].id.i ;
return RETURN_VOID ;
}
/* メッセージ表示 */
static int FuncMessage( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "Message", args, buf, TYPE_OBJECT, TYPE_NOASN );
Message( ((StringClass*)buf[0].od.ptr)->str );
return RETURN_VOID ;
}
/* 警告音 */
static int FuncWarning( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
Warning();
return RETURN_VOID ;
}
/* フレームファイル出力 */
static int FuncWriteFrame( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
Vector back;
if (args <= 3) {
ArgCheck( "WriteFrame", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
back.x = back.y = back.z = 0.0;
} else {
ArgCheck( "WriteFrame", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
if (ObjectCheck( &buf[3], VectorClassID) == FALSE) {
ExecError( "%d番目の引数の型不正です(WriteFrame)", 4 );
}
back = ((VectorClass*)(buf[3].od.ptr))->vec;
}
if ( ObjectCheck( &buf[1], StringClassID ) == FALSE )
ExecError( "%d番目の引数の型不正です(WriteFrame)", 2 );
if ( ObjectCheck( &buf[2], StringClassID ) == FALSE )
ExecError( "%d番目の引数の型不正です(WriteFrame)", 3 );
WriteFrame( ((MatrixClass*)buf[0].od.ptr)->mat,
((StringClass*)buf[1].od.ptr)->str,
((StringClass*)buf[2].od.ptr)->str,
&back);
return RETURN_VOID ;
}
/*
* GetArg( n )
*/
static int FuncGetArg( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
char *str ;
extern int Argc ;
extern char **Argv ;
ArgCheck( "GetArg", args, buf, TYPE_INT, TYPE_NOASN );
if ( buf[0].id.i < Argc )
str = Argv[buf[0].id.i] ;
else
str = "" ;
buf = StackAlloc( 1 );
StringToObject( buf, str );
return RETURN_RETURN ;
}
/* 再描画 */
static int FuncUpdateAll( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ViewFrame();
ViewLineAll( 0, 0, DISPLAY_X, DISPLAY_Y, TRUE );
DrawTitleBar();
DrawUserButtonAll();
DrawControlPanel();
return RETURN_VOID ;
}
/* model.rc の内容の確保 */
static int Modelrc( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int i ;
char *name, *value ;
if (args > 1) {
ArgCheck( "Modelrc", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
if (ObjectCheck( &buf[1], StringClassID) == FALSE) {
ExecError( "2番目の引数の型不正です(Modelrc)");
}
name = ((StringClass*)buf[0].od.ptr)->str;
value = ((StringClass*)buf[1].od.ptr)->str;
WriteModelrc(name, value);
return RETURN_VOID;
} else {
ArgCheck( "Modelrc", args, buf, TYPE_OBJECT, TYPE_NOASN );
name = ((StringClass*)buf[0].od.ptr)->str ;
value = "" ;
for( i = 0 ; ModelrcName[i] != NULL ; i++ )
{
if ( strcmp( name, ModelrcName[i] ) == 0 )
{
value = ModelrcValue[i] ;
break ;
}
}
buf = StackAlloc( 1 );
StringToObject( buf, value );
return RETURN_RETURN ;
}
}
/* Control Panel 操作イベント関数設定 */
static int FuncControlEvent( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "ControlEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
IdentControl = buf[0].funcd.ident;
return RETURN_VOID ;
}
/* アトリビュート選択イベント関数設定 */
static int FuncAttrEvent( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "AttrEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
IdentAttrSelect = buf[0].funcd.ident;
return RETURN_VOID ;
}
/* オブジェクト選択イベント関数設定 */
static int FuncObjEvent( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "ObjEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
IdentObjSelect = buf[0].funcd.ident;
return RETURN_VOID ;
}
/* 終了要求イベント関数設定 */
static int FuncCanCloseEvent( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "CanCloseEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
IdentCanClose= buf[0].funcd.ident;
return RETURN_VOID ;
}
/* ステータスバー設定 */
static int FuncStatusBar( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int pos;
if (args == 1) {
ArgCheck( "StatusBar", args, buf, TYPE_OBJECT, TYPE_NOASN );
pos = 0;
} else {
ArgCheck( "StatusBar", args, buf, TYPE_OBJECT, TYPE_INT, TYPE_NOASN );
pos = buf[1].id.i;
}
if (0 <= pos && pos < MAXSTATUS) {
strncpy(StatusText[pos], ((StringClass*)buf[0].od.ptr)->str, STATUSTEXTLENGTH);
StatusText[pos][STATUSTEXTLENGTH] = '\0';
DrawStatusBar(pos);
}
return RETURN_VOID ;
}
/* ステータスバー設定 */
static int FuncStatusBarWidth( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "StatusBar", args, buf, TYPE_INT, TYPE_INT, TYPE_NOASN );
if (buf[0].id.i >= 0 && buf[0].id.i < MAXSTATUS) {
StatusWidth[buf[0].id.i] = buf[1].id.i;
}
DrawStatusBar(-1);
return RETURN_VOID ;
}
static int FuncRendParameter( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
#ifdef WINDOWS
char param[256];
StringClass *ret;
GetDCParameter(param);
ret = StringAlloc(strlen(param));
strcpy(ret->str, param);
buf = StackAlloc( 1 );
buf->type = TYPE_OBJECT ;
buf->od.ptr = (Object*)ret ;
return RETURN_RETURN ;
#else
return RETURN_VOID;
#endif
}