home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MODEL
/
DLOGLIB.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-11
|
9KB
|
320 lines
/*
* ダイヤログボックス制御
*
* Copyright T.Kobayashi 1994.7.24
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "ml.h"
#include "strclass.h"
#include "dlog.h"
static int FuncDlogOpen( int, int, DataStruct* );
static int FuncDlogMessage( int, int, DataStruct* );
static int FuncDlogString( int, int, DataStruct* );
static int FuncDlogToggle( int, int, DataStruct* );
static int FuncDlogSelect( int, int, DataStruct* );
static int FuncDlogSlider( int, int, DataStruct* );
static int FuncDlogWait( int, int, DataStruct* );
static int FuncDlogAnswer( int, int, DataStruct* );
static int FuncDlogFileOpen( int, int, DataStruct* );
static int StringClassID ;
void DlogLibInit()
{
StringClassID = ClassName( "String" );
NewFunction( StringClassID, "DlogOpen", FuncDlogOpen );
NewFunction( 0, "DlogMessage", FuncDlogMessage );
NewFunction( 0, "DlogString", FuncDlogString );
NewFunction( 0, "DlogToggle", FuncDlogToggle );
NewFunction( 0, "DlogSelect", FuncDlogSelect );
NewFunction( 0, "DlogSlider", FuncDlogSlider );
NewFunction( 0, "DlogWait", FuncDlogWait );
NewFunction( 0, "DlogAnswer", FuncDlogAnswer );
NewFunction( StringClassID, "DlogFileOpen", FuncDlogFileOpen );
}
static int FuncDlogOpen( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
static char *button_okcan[3] = {"中止", "決定", NULL};
static char *button_ok[2] = {"確認", NULL};
if ( args <= 2 ) {
ArgCheck( "DlogOpen", args, buf, TYPE_OBJECT, TYPE_INT, TYPE_NOASN );
DlogOpen( ((StringClass*)buf[0].od.ptr)->str, buf[1].id.i, button_okcan );
} else if (ObjectCheck(&buf[2], StringClassID) == FALSE) {
ArgCheck( "DlogOpen", args, buf, TYPE_OBJECT, TYPE_INT,
TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
if (buf[2].id.i) {
DlogOpen( ((StringClass*)buf[0].od.ptr)->str, buf[1].id.i, button_okcan );
} else {
DlogOpen( ((StringClass*)buf[0].od.ptr)->str, buf[1].id.i, button_ok );
}
} else {
char *button[DLOG_MAX_BUTTON];
int i;
if (ObjectCheck(&buf[0], StringClassID) == FALSE || buf[1].type != TYPE_INT) {
ExecError("DlogOpen: 引数の型が異なります。");
}
for (i = 0; i+2 < args && i < DLOG_MAX_BUTTON-1; i++) {
if (ObjectCheck(&buf[i+2], StringClassID) == FALSE) {
ExecError("DlogOpen: 引数の型が異なります。");
}
button[i] = ((StringClass*)buf[i+2].od.ptr)->str;
}
button[i] = NULL;
DlogOpen( ((StringClass*)buf[0].od.ptr)->str, buf[1].id.i, button );
}
return RETURN_VOID ;
}
static int FuncDlogMessage( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "DlogMessage", args, buf, TYPE_INT, TYPE_OBJECT, TYPE_NOASN );
DlogMessage( buf[0].id.i, ((StringClass*)buf[1].od.ptr)->str );
return RETURN_VOID ;
}
static int FuncDlogString( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int i, j;
char *p, wild[256];
if (args <= 4) {
ArgCheck( "DlogString", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_OBJECT, TYPE_INT, TYPE_NOASN );
if (ObjectCheck(&buf[1], StringClassID) == FALSE
|| ObjectCheck(&buf[2], StringClassID) == FALSE) {
ExecError("DlogString: 引数の型が異なります。");
}
wild[0] = '\0';
} else {
/*
ArgCheck( "DlogString", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_OBJECT, TYPE_INT, TYPE_OBJECT, TYPE_NOASN );
*/
if (buf[0].type != TYPE_INT || buf[3].type != TYPE_INT
|| ObjectCheck(&buf[1], StringClassID) == FALSE
|| ObjectCheck(&buf[2], StringClassID) == FALSE
|| ObjectCheck(&buf[4], StringClassID) == FALSE) {
ExecError("DlogString: 引数の型が異なります。");
}
p = ((StringClass*)buf[4].od.ptr)->str;
j = strlen(p);
if (j > 7 && p[j-7] == '(' && p[j-6] == '*' && p[j-5] == '.' && p[j-1] == ')') {
wild[0] = p[j-4];
wild[1] = p[j-3];
wild[2] = p[j-2];
wild[3] = ' ';
strcpy(wild+4, p);
strcat(wild, "|");
strcat(wild, p+j-6);
wild[strlen(wild)-1] = '|';
}
for (i = 5; i < args; ++i) {
if (ObjectCheck(&buf[i], StringClassID) == FALSE) {
ExecError("DlogString: 引数の型が異なります。");
}
p = ((StringClass*)buf[i].od.ptr)->str;
j = strlen(p);
if (j > 7 && p[j-7] == '(' && p[j-6] == '*' && p[j-5] == '.' && p[j-1] == ')') {
strcat(wild, p);
strcat(wild, "|");
strcat(wild, p+j-6);
wild[strlen(wild)-1] = '|';
}
}
}
DlogString( buf[0].id.i,
((StringClass*)buf[1].od.ptr)->str,
((StringClass*)buf[2].od.ptr)->str,
buf[3].id.i, wild );
return RETURN_VOID ;
}
static int FuncDlogToggle( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
ArgCheck( "DlogToggle", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_OBJECT, TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
DlogToggle( buf[0].id.i,
((StringClass*)buf[1].od.ptr)->str,
((StringClass*)buf[2].od.ptr)->str,
buf[3].id.i );
return RETURN_VOID ;
}
static int FuncDlogSelect( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int i, field, size, stat ;
char *str, *item[40] ;
DataStruct *ary ;
ArgCheck( "DlogSelect", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_ARRAY, TYPE_INT, TYPE_NOASN );
field = buf[0].id.i ;
str = ((StringClass*)buf[1].od.ptr)->str ;
ary = buf[2].ad.ary ;
size = buf[2].ad.size ;
stat = buf[3].id.i ;
for( i = 0 ; i < size ; i++ )
{
if ( ary[i].type != TYPE_OBJECT )
ExecError( "引数配列の型が不正です(DlogSelect)" );
item[i] = ((StringClass*)ary[i].od.ptr)->str ;
if ( strcmp( item[i], "" ) == 0 )
break ;
}
item[i] = NULL ;
DlogSelect( field, str, item, stat );
return RETURN_VOID ;
}
static int FuncDlogSlider( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
if (args == 5) {
ArgCheck( "DlogSlider", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_INT, TYPE_INT, TYPE_FUNC, TYPE_NOASN );
if (ObjectCheck(&buf[1], StringClassID) == FALSE) {
ExecError("2番目の引数の型が違います。(DlogSlider)");
}
DlogSlider( buf[0].id.i,
((StringClass*)buf[1].od.ptr)->str,
buf[2].id.i, buf[2].id.i, buf[3].id.i, buf[4].funcd.ident );
} else {
ArgCheck( "DlogSlider", args, buf,
TYPE_INT, TYPE_OBJECT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_FUNC, TYPE_NOASN );
if (ObjectCheck(&buf[1], StringClassID) == FALSE) {
ExecError("2番目の引数の型が違います。(DlogSlider)");
}
DlogSlider( buf[0].id.i,
((StringClass*)buf[1].od.ptr)->str,
buf[2].id.i, buf[3].id.i, buf[4].id.i, buf[5].funcd.ident );
}
return RETURN_VOID ;
}
static int FuncDlogWait( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
StackPushInt( DlogWait() );
return RETURN_RETURN ;
}
static int FuncDlogAnswer( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int n, type ;
char str[1024] ;
ArgCheck( "DlogAnswer", args, buf, TYPE_INT, TYPE_NOASN );
type = DlogAnswer( buf[0].id.i, str, &n );
switch( type )
{
case DLOG_STRING:
buf = StackAlloc( 1 );
StringToObject( buf, str );
break ;
case DLOG_TOGGLE:
StackPushBoolean( n );
break ;
break ;
case DLOG_SELECT:
StackPushInt( n );
break ;
case DLOG_SLIDER:
StackPushInt( n );
break ;
default:
assert( FALSE );
}
return RETURN_RETURN ;
}
static int FuncDlogFileOpen( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
#ifdef WINDOWS
int i, j;
char *title, *def;
char *p, ext[4], wild[256], filename[512];
if (ObjectCheck(&buf[0], StringClassID) == FALSE
|| ObjectCheck(&buf[1], StringClassID) == FALSE
|| ObjectCheck(&buf[2], StringClassID) == FALSE) {
ExecError("DlogString: 引数の型が異なります。");
}
title = ((StringClass*)buf[0].od.ptr)->str;
def = ((StringClass*)buf[1].od.ptr)->str;
p = ((StringClass*)buf[2].od.ptr)->str;
j = strlen(p);
if (j > 7 && p[j-7] == '(' && p[j-6] == '*' && p[j-5] == '.' && p[j-1] == ')') {
ext[0] = p[j-4];
ext[1] = p[j-3];
ext[2] = p[j-2];
ext[3] = '\0';
strcpy(wild, p);
strcat(wild, "|");
strcat(wild, p+j-6);
wild[strlen(wild)-1] = '|';
} else {
ext[0] = '\0';
wild[0] = '\0';
}
for (i = 3; i < args; ++i) {
if (ObjectCheck(&buf[i], StringClassID) == FALSE) {
ExecError("DlogString: 引数の型が異なります。");
}
p = ((StringClass*)buf[i].od.ptr)->str;
j = strlen(p);
if (j > 7 && p[j-7] == '(' && p[j-6] == '*' && p[j-5] == '.' && p[j-1] == ')') {
strcat(wild, p);
strcat(wild, "|");
strcat(wild, p+j-6);
wild[strlen(wild)-1] = '|';
}
}
if (DlogFileOpen(filename, 512, title, def, ext, wild) == FALSE) {
filename[0] = '\0';
}
buf = StackAlloc( 1 );
StringToObject( buf, filename );
return RETURN_RETURN ;
#else
ExecError("DlogFileOpenは使えません");
return RETURN_VOID;
#endif
}