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 >
C/C++ Source or Header  |  1996-05-22  |  10KB  |  405 lines

  1. /*
  2.  *        システムライブラリ
  3.  *
  4.  *        Copyright T.Kobayashi    1994.7.9
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <io.h>
  12. #include <assert.h>
  13.  
  14. #include "input.h"
  15. #include "ml.h"
  16. #include "matclass.h"
  17. #include "strclass.h"
  18. #include "model.h"
  19.  
  20. static    int        Quit( int, int, DataStruct* );
  21. static    int        VersionString( int, int, DataStruct* );
  22. static    int        EnvString( int, int, DataStruct* );
  23. static    int        Child( int, int, DataStruct* );
  24. static    int        FuncWaitEvent( int, int, DataStruct* );
  25. static    int        FuncInputMode( int, int, DataStruct* );
  26. static    int        FuncMessage( int, int, DataStruct* );
  27. static    int        FuncWarning( int, int, DataStruct* );
  28. static    int        FuncWriteFrame( int, int, DataStruct* );
  29. static    int        FuncGetArg( int, int, DataStruct* );
  30. static    int        FuncUpdateAll( int, int, DataStruct* );
  31. static    int        Modelrc( int, int, DataStruct* );
  32. static    int        FuncControlEvent( int, int, DataStruct* );
  33. static    int        FuncAttrEvent( int, int, DataStruct* );
  34. static    int        FuncObjEvent( int, int, DataStruct* );
  35. static    int        FuncCanCloseEvent( int, int, DataStruct* );
  36. static    int        FuncStatusBar( int, int, DataStruct* );
  37. static    int        FuncStatusBarWidth( int, int, DataStruct* );
  38. static    int        FuncRendParameter( int, int, DataStruct* );
  39.  
  40. static        int        StringClassID, MatrixClassID ;
  41.  
  42. int IdentCanClose;
  43.  
  44. void    SysLibInit()
  45. {
  46.     int i;
  47.  
  48.     StringClassID = ClassName( "String" );
  49.     MatrixClassID = ClassName( "Matrix" );
  50.  
  51.     NewFunction( 0,                "Version", VersionString );
  52.     NewFunction( 0,                "Environ", EnvString );
  53.     NewFunction( 0,                "Quit", Quit );
  54.     NewFunction( StringClassID, "Child", Child );
  55.     NewFunction( 0,                "WaitEvent", FuncWaitEvent );
  56.     NewFunction( 0,                "InputMode", FuncInputMode );
  57.     NewFunction( StringClassID, "Message", FuncMessage );
  58.     NewFunction( 0,                "Warning", FuncWarning );
  59.     NewFunction( MatrixClassID, "WriteFrame", FuncWriteFrame );
  60.     NewFunction( 0,                "GetArg", FuncGetArg );
  61.     NewFunction( 0,                "UpdateAll", FuncUpdateAll );
  62.     NewFunction( StringClassID,    "Modelrc", Modelrc );
  63.     NewFunction( 0,                "ControlEvent", FuncControlEvent );
  64.     NewFunction( 0,                "AttrEvent", FuncAttrEvent );
  65.     NewFunction( 0,                "ObjEvent", FuncObjEvent );
  66.     NewFunction( 0,                "CanCloseEvent", FuncCanCloseEvent);
  67.     NewFunction( StringClassID,    "StatusBar", FuncStatusBar );
  68.     NewFunction( 0,                "StatusBarWidth", FuncStatusBarWidth );
  69.     NewFunction( 0,                "RendParameter", FuncRendParameter);
  70.  
  71.     IdentControl = IdentAttrSelect = IdentObjSelect = IdentCanClose = -1;
  72.  
  73.     for (i = 0; i < MAXSTATUS; i++) {
  74.         StatusWidth[i] = 0;
  75.         StatusText[i][0] = '\0';
  76.     }
  77. }
  78.  
  79. /*    終了    */
  80. static    int        Quit( ident, args, buf )
  81. int        ident ;
  82. int        args ;
  83. DataStruct    *buf ;
  84. {
  85.     QuitFlag = TRUE ;
  86.  
  87.     return RETURN_VOID ;
  88. }
  89.  
  90. /*    バージョン文字列の取得    */
  91. static    int        VersionString( ident, args, buf )
  92. int        ident ;
  93. int        args ;
  94. DataStruct    *buf ;
  95. {
  96.     extern    char    *Version ;
  97.  
  98.     buf = StackAlloc( 1 );
  99.     StringToObject( buf, Version );
  100.  
  101.     return RETURN_RETURN ;
  102. }
  103.  
  104. /*    動作環境文字列の取得    */
  105. static    int        EnvString( ident, args, buf )
  106. int        ident ;
  107. int        args ;
  108. DataStruct    *buf ;
  109. {
  110.     extern    char    *Environment ;
  111.  
  112.     buf = StackAlloc( 1 );
  113.     StringToObject( buf, Environment );
  114.  
  115.     return RETURN_RETURN ;
  116. }
  117.  
  118. /*    コマンド呼び出し    */
  119. static    int        Child( ident, args, buf )
  120. int        ident ;
  121. int        args ;
  122. DataStruct    *buf ;
  123. {
  124.     int waitflag = FALSE;
  125.     int iconify = FALSE;
  126.     if (args == 1) {
  127.         ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_NOASN );
  128.     } else if (args == 2) {
  129.         ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
  130.         waitflag = buf[1].ld.l;
  131.     } else {
  132.         ArgCheck( "Child", args, buf, TYPE_OBJECT, TYPE_INT|TYPE_BOOLEAN, TYPE_INT|TYPE_BOOLEAN, TYPE_NOASN );
  133.         waitflag = buf[1].ld.l;
  134.         iconify = buf[2].ld.l;
  135.     }
  136.  
  137.     ChildExec( ((StringClass*)buf[0].od.ptr)->str, waitflag, iconify );
  138.  
  139.     return RETURN_VOID ;
  140. }
  141.  
  142. /*    キー入力待ち    */
  143. static    int        FuncWaitEvent( ident, args, buf )
  144. int        ident ;
  145. int        args ;
  146. DataStruct    *buf ;
  147. {
  148.     StackPushBoolean( WaitEvent() );
  149.     return RETURN_RETURN ;
  150. }
  151.  
  152. /*    入力モード設定    */
  153. static    int        FuncInputMode( ident, args, buf )
  154. int        ident ;
  155. int        args ;
  156. DataStruct    *buf ;
  157. {
  158.     ArgCheck( "InputMode", args, buf, TYPE_INT, TYPE_INT, TYPE_NOASN );
  159.  
  160.     InputKey = buf[0].id.i ;
  161.     CursorMoveKey = buf[1].id.i ;
  162.     return RETURN_VOID ;
  163. }
  164.  
  165. /*    メッセージ表示    */
  166. static    int        FuncMessage( ident, args, buf )
  167. int        ident ;
  168. int        args ;
  169. DataStruct    *buf ;
  170. {
  171.     ArgCheck( "Message", args, buf, TYPE_OBJECT, TYPE_NOASN );
  172.  
  173.     Message( ((StringClass*)buf[0].od.ptr)->str );
  174.     return RETURN_VOID ;
  175. }
  176.  
  177. /*    警告音    */
  178. static    int        FuncWarning( ident, args, buf )
  179. int        ident ;
  180. int        args ;
  181. DataStruct    *buf ;
  182. {
  183.     Warning();
  184.     return RETURN_VOID ;
  185. }
  186.  
  187. /*    フレームファイル出力    */
  188. static    int        FuncWriteFrame( ident, args, buf )
  189. int        ident ;
  190. int        args ;
  191. DataStruct    *buf ;
  192. {
  193.     Vector back;
  194.     if (args <= 3) {
  195.         ArgCheck( "WriteFrame", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
  196.         back.x = back.y = back.z = 0.0;
  197.     } else {
  198.         ArgCheck( "WriteFrame", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
  199.         if (ObjectCheck( &buf[3], VectorClassID) == FALSE) {
  200.             ExecError( "%d番目の引数の型不正です(WriteFrame)", 4 );
  201.         }
  202.         back = ((VectorClass*)(buf[3].od.ptr))->vec;
  203.     }
  204.     if ( ObjectCheck( &buf[1], StringClassID ) == FALSE )
  205.         ExecError( "%d番目の引数の型不正です(WriteFrame)", 2 );
  206.     if ( ObjectCheck( &buf[2], StringClassID ) == FALSE )
  207.         ExecError( "%d番目の引数の型不正です(WriteFrame)", 3 );
  208.  
  209.     WriteFrame( ((MatrixClass*)buf[0].od.ptr)->mat,
  210.             ((StringClass*)buf[1].od.ptr)->str,
  211.             ((StringClass*)buf[2].od.ptr)->str,
  212.             &back);
  213.     return RETURN_VOID ;
  214. }
  215.  
  216. /*
  217.  *        GetArg( n )
  218.  */
  219. static    int        FuncGetArg( ident, args, buf )
  220. int        ident ;
  221. int        args ;
  222. DataStruct    *buf ;
  223. {
  224.     char    *str ;
  225.     extern    int        Argc ;
  226.     extern    char    **Argv ;
  227.  
  228.     ArgCheck( "GetArg", args, buf, TYPE_INT, TYPE_NOASN );
  229.  
  230.     if ( buf[0].id.i < Argc )
  231.         str = Argv[buf[0].id.i] ;
  232.     else
  233.         str = "" ;
  234.  
  235.     buf = StackAlloc( 1 );
  236.     StringToObject( buf, str );
  237.     return RETURN_RETURN ;
  238. }
  239.  
  240. /*    再描画    */
  241. static    int        FuncUpdateAll( ident, args, buf )
  242. int        ident ;
  243. int        args ;
  244. DataStruct    *buf ;
  245. {
  246.     ViewFrame();
  247.     ViewLineAll( 0, 0, DISPLAY_X, DISPLAY_Y, TRUE );
  248.     DrawTitleBar();
  249.     DrawUserButtonAll();
  250.     DrawControlPanel();
  251.  
  252.     return RETURN_VOID ;
  253. }
  254.  
  255. /*    model.rc の内容の確保    */
  256. static    int        Modelrc( ident, args, buf )
  257. int        ident ;
  258. int        args ;
  259. DataStruct    *buf ;
  260. {
  261.     int        i ;
  262.     char    *name, *value ;
  263.  
  264.     if (args > 1) {
  265.         ArgCheck( "Modelrc", args, buf, TYPE_OBJECT, TYPE_OBJECT, TYPE_NOASN );
  266.         if (ObjectCheck( &buf[1], StringClassID) == FALSE) {
  267.             ExecError( "2番目の引数の型不正です(Modelrc)");
  268.         }
  269.         name = ((StringClass*)buf[0].od.ptr)->str;
  270.         value = ((StringClass*)buf[1].od.ptr)->str;
  271.         WriteModelrc(name, value);
  272.         return RETURN_VOID;
  273.     } else {
  274.         ArgCheck( "Modelrc", args, buf, TYPE_OBJECT, TYPE_NOASN );
  275.  
  276.         name = ((StringClass*)buf[0].od.ptr)->str ;
  277.  
  278.         value = "" ;
  279.         for( i = 0 ; ModelrcName[i] != NULL ; i++ )
  280.         {
  281.             if ( strcmp( name, ModelrcName[i] ) == 0 )
  282.             {
  283.                 value = ModelrcValue[i] ;
  284.                 break ;
  285.             }
  286.         }
  287.  
  288.         buf = StackAlloc( 1 );
  289.         StringToObject( buf, value );
  290.         return RETURN_RETURN ;
  291.     }
  292. }
  293.  
  294.  
  295. /*    Control Panel 操作イベント関数設定    */
  296. static    int        FuncControlEvent( ident, args, buf )
  297. int        ident ;
  298. int        args ;
  299. DataStruct    *buf ;
  300. {
  301.     ArgCheck( "ControlEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
  302.  
  303.     IdentControl = buf[0].funcd.ident;
  304.  
  305.     return RETURN_VOID ;
  306. }
  307.  
  308. /*    アトリビュート選択イベント関数設定    */
  309. static    int        FuncAttrEvent( ident, args, buf )
  310. int        ident ;
  311. int        args ;
  312. DataStruct    *buf ;
  313. {
  314.     ArgCheck( "AttrEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
  315.  
  316.     IdentAttrSelect = buf[0].funcd.ident;
  317.  
  318.     return RETURN_VOID ;
  319. }
  320.  
  321. /*    オブジェクト選択イベント関数設定    */
  322. static    int        FuncObjEvent( ident, args, buf )
  323. int        ident ;
  324. int        args ;
  325. DataStruct    *buf ;
  326. {
  327.     ArgCheck( "ObjEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
  328.  
  329.     IdentObjSelect = buf[0].funcd.ident;
  330.  
  331.     return RETURN_VOID ;
  332. }
  333.  
  334. /*    終了要求イベント関数設定    */
  335. static    int        FuncCanCloseEvent( ident, args, buf )
  336. int        ident ;
  337. int        args ;
  338. DataStruct    *buf ;
  339. {
  340.     ArgCheck( "CanCloseEvent", args, buf, TYPE_FUNC, TYPE_NOASN );
  341.  
  342.     IdentCanClose= buf[0].funcd.ident;
  343.  
  344.     return RETURN_VOID ;
  345. }
  346.  
  347. /*    ステータスバー設定    */
  348. static    int        FuncStatusBar( ident, args, buf )
  349. int        ident ;
  350. int        args ;
  351. DataStruct    *buf ;
  352. {
  353.     int pos;
  354.     if (args == 1) {
  355.         ArgCheck( "StatusBar", args, buf, TYPE_OBJECT, TYPE_NOASN );
  356.         pos = 0;
  357.     } else {
  358.         ArgCheck( "StatusBar", args, buf, TYPE_OBJECT, TYPE_INT, TYPE_NOASN );
  359.         pos = buf[1].id.i;
  360.     }
  361.     if (0 <= pos && pos < MAXSTATUS) {
  362.         strncpy(StatusText[pos], ((StringClass*)buf[0].od.ptr)->str, STATUSTEXTLENGTH);
  363.         StatusText[pos][STATUSTEXTLENGTH] = '\0';
  364.         DrawStatusBar(pos);
  365.     }
  366.     return RETURN_VOID ;
  367. }
  368.  
  369. /*    ステータスバー設定    */
  370. static    int        FuncStatusBarWidth( ident, args, buf )
  371. int        ident ;
  372. int        args ;
  373. DataStruct    *buf ;
  374. {
  375.     ArgCheck( "StatusBar", args, buf, TYPE_INT, TYPE_INT, TYPE_NOASN );
  376.  
  377.     if (buf[0].id.i >= 0 && buf[0].id.i < MAXSTATUS) {
  378.         StatusWidth[buf[0].id.i] = buf[1].id.i;
  379.     }
  380.     DrawStatusBar(-1);
  381.     return RETURN_VOID ;
  382. }
  383.  
  384. static    int        FuncRendParameter( ident, args, buf )
  385. int        ident ;
  386. int        args ;
  387. DataStruct    *buf ;
  388. {
  389. #ifdef WINDOWS
  390.     char param[256];
  391.     StringClass *ret;
  392.     GetDCParameter(param);
  393.     ret = StringAlloc(strlen(param));
  394.     strcpy(ret->str, param);
  395.     buf = StackAlloc( 1 );
  396.     buf->type = TYPE_OBJECT ;
  397.     buf->od.ptr = (Object*)ret ;
  398.  
  399.     return RETURN_RETURN ;
  400. #else
  401.     return RETURN_VOID;
  402. #endif
  403. }
  404.  
  405.