home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / READER / FRAMREAD.C < prev    next >
C/C++ Source or Header  |  1995-11-07  |  14KB  |  745 lines

  1. /*
  2.         フレームファイル入力関数
  3.  
  4.         Copyright T.Kobayashi
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <math.h>
  10.  
  11. #include "reader.h"
  12. #include "word.h"
  13. #ifdef V70
  14. #define RAD 0.0174532925199
  15. #else
  16. #define RAD (3.14159265358979/180.0)
  17. #endif
  18. #define OLD_FASION        1
  19.  
  20. #define NOT_FOUND        11
  21. #define BAD_EXIST        12
  22. #define NOT_IMPLIMENTED 13
  23. #define OBJ_NOT_FOUND    14
  24. #define GRAD_TOO_LONG    15
  25. #define TOO_MANY        16
  26. #define BAD_MATRIX        17
  27.  
  28. #define UNEXPECTED_EOF    21
  29. #define NOT_FRAME_FILE    22
  30.  
  31. static    Environ env ;                /*    環境                        */
  32. static    Frame    frame ;                /*    フレーム                    */
  33. static    Pointer(Object*)    objtop ;            /*    オブジェクトリストの先頭    */
  34. static    int     eyestat ;            /*    視点の使用フラグ            */
  35. static    int     targetstat ;        /*    ターゲットの使用フラグ        */
  36. static    Point    target ;            /*    ターゲットの位置            */
  37.  
  38. #if 1 /* 1995.08.08 */
  39. #define MAXOBJNAMEBUF 10000
  40. #define MAXOBJNAMES    1000
  41. static char  objnamebuf[ MAXOBJNAMEBUF ];
  42. static char *objnames[ MAXOBJNAMES ];
  43. static char *curobjnamebuf ;
  44. static int   nobjnames;
  45. #endif
  46.  
  47. /*
  48.     proto -s framread.c > temp
  49. */
  50. static    void    getenviron( void );
  51. static    void    getframe( Matrix );
  52. static    void    getobj( Matrix );
  53. static    void    geteye( Matrix );
  54. static    void    getlight( Matrix );
  55. static    void    envclear( void );
  56. static    void    frameerror( int, char* );
  57. #if 1 /* 1995.08.08 */
  58. static    void    getframe2( Matrix );
  59. static    void    getobj2( Matrix );
  60. #endif
  61.  
  62. /*
  63.     フレームファイルのオープン
  64.         戻り値    1:正常
  65.                 0:エラー
  66. */
  67. int        frameopen( framefile )
  68. char    *framefile ;
  69. {
  70.     errlevel = 0 ;
  71.  
  72.     if ( fileopen( framefile ) == 0 )
  73.         return( 0 );
  74.  
  75.     if ( wordid != WORD_ENV && wordid != WORD_FRAM )
  76.     {
  77.         frameerror( NOT_FRAME_FILE, "" );
  78.         fileclose() ;
  79.         return( 0 );
  80.     }
  81.  
  82.     envclear() ;
  83.  
  84. #if 1 /* 1995.08.09 */
  85.     curobjnamebuf = objnamebuf;
  86.     nobjnames = 0;
  87.     objnamebuf[0] = '\0';
  88. #endif
  89.     return( 1 );
  90. }
  91.  
  92. /*    フレームファイルのクローズ    */
  93. void    frameclose()
  94. {
  95.     fileclose();
  96. }
  97.  
  98. /*
  99.     フレームデータのスキップ
  100.     戻り値    0 : エラー
  101.             1 : 正常終了
  102. */
  103. int        frameskip()
  104. {
  105.     errlevel = 0 ;
  106.  
  107.     /*    環境のリード    */
  108.     if ( wordid == WORD_ENV )
  109.         getenviron() ;
  110.  
  111.     /*    fram のリード    */
  112.     if ( wordid != WORD_FRAM )
  113.         frameerror( NOT_FOUND, "fram" );
  114.     get() ;
  115.  
  116.     /*    fram までスキップ    */
  117.     while( wordid != WORD_FRAM    &&    wordid != WORD_ENV )
  118.         get() ;
  119.     if ( errlevel >= 10 )
  120.         return( 0 );
  121.     return( 1 );
  122. }
  123.  
  124. #if 1 /* 1995.08.09 */
  125. /*    フレームファイルのリード    */
  126. Frame    *frameread2( nnames, names )
  127. int *nnames;
  128. char ***names;
  129. {
  130.     Matrix    mat, dmy ;
  131.     int     i ;
  132.     Vector    vx, vz, e ;
  133.  
  134.     objtop = NULL ;
  135.     errlevel = 0 ;
  136.  
  137.     /*    環境のリード    */
  138.     if ( wordid == WORD_ENV )
  139.         getenviron() ;
  140.  
  141.     /*    fram のリード    */
  142.     if ( wordid != WORD_FRAM )
  143.         frameerror( NOT_FOUND, "fram" );
  144.     get() ;
  145.  
  146.     /*    { のリード    */
  147.     if ( wordid != WORD_OPEN2 )
  148.     {
  149.         frameerror( NOT_FOUND, "{" );
  150.         skip( "{" );
  151.     }
  152.     else
  153.         get() ;
  154.  
  155.  
  156.     /*    frame の初期化    */
  157.     frame.env = env ;
  158.     frame.lightnum = 0 ;
  159.     frame.objpos = NULL ;
  160.     m_unit( mat );
  161.     eyestat = 0 ;
  162.     targetstat = 0 ;
  163.  
  164.     /*    フレーム本体のリード    */
  165.     getframe2( mat ) ;
  166.  
  167.     /*    視点、ターゲットの処理    */
  168.     if ( eyestat == 0 )
  169.         frameerror( NOT_FOUND, "視点指定" );
  170.     if ( targetstat == 1 )
  171.     {
  172.         /*    視点の位置        */
  173.         v_copy( e, frame.eye.mat[3] );
  174.         /*    視線方向のベクトル    */
  175.         for( i = 0 ; i < 3 ; ++i )
  176.             vx[i] = target[i] - e[i] ;
  177.  
  178.         /*    視線上方向のベクトル    */
  179.         v_copy( vz, frame.eye.mat[2] );
  180.  
  181.         /*    変換行列の変更    */
  182.         m_vec( frame.eye.mat, vx, vz );
  183.         v_copy( frame.eye.mat[3], e );
  184.  
  185.         /*    エラーチェック        */
  186.         if ( m_inv( dmy, frame.eye.mat ) == 0 )
  187.             frameerror( BAD_MATRIX, "" );
  188.     }
  189.  
  190.     /*    リターン処理    */
  191.     if ( errlevel < 10 ) 
  192.     {
  193.         *nnames = nobjnames;
  194.         *names = objnames;
  195.         return( &frame );
  196.     }
  197.     return( NULL );
  198. }
  199. #endif
  200.  
  201. /*    フレームファイルのリード    */
  202. Frame    *frameread( pobj )
  203. Pointer(Object*)    pobj ;        /*    オブジェクトリスト    */
  204. {
  205.     Matrix    mat, dmy ;
  206.     int     i ;
  207.     Vector    vx, vz, e ;
  208.  
  209.     objtop = pobj ;
  210.     errlevel = 0 ;
  211.  
  212.     /*    環境のリード    */
  213.     if ( wordid == WORD_ENV )
  214.         getenviron() ;
  215.  
  216.     /*    fram のリード    */
  217.     if ( wordid != WORD_FRAM )
  218.         frameerror( NOT_FOUND, "fram" );
  219.     get() ;
  220.  
  221.     /*    { のリード    */
  222.     if ( wordid != WORD_OPEN2 )
  223.     {
  224.         frameerror( NOT_FOUND, "{" );
  225.         skip( "{" );
  226.     }
  227.     else
  228.         get() ;
  229.  
  230.  
  231.     /*    frame の初期化    */
  232.     frame.env = env ;
  233.     frame.lightnum = 0 ;
  234.     frame.objpos = NULL ;
  235.     m_unit( mat );
  236.     eyestat = 0 ;
  237.     targetstat = 0 ;
  238.  
  239.     /*    フレーム本体のリード    */
  240.     getframe( mat ) ;
  241.  
  242.     /*    視点、ターゲットの処理    */
  243.     if ( eyestat == 0 )
  244.         frameerror( NOT_FOUND, "視点指定" );
  245.     if ( targetstat == 1 )
  246.     {
  247.         /*    視点の位置        */
  248.         v_copy( e, frame.eye.mat[3] );
  249.         /*    視線方向のベクトル    */
  250.         for( i = 0 ; i < 3 ; ++i )
  251.             vx[i] = target[i] - e[i] ;
  252.  
  253.         /*    視線上方向のベクトル    */
  254.         v_copy( vz, frame.eye.mat[2] );
  255.  
  256.         /*    変換行列の変更    */
  257.         m_vec( frame.eye.mat, vx, vz );
  258.         v_copy( frame.eye.mat[3], e );
  259.  
  260.         /*    エラーチェック        */
  261.         if ( m_inv( dmy, frame.eye.mat ) == 0 )
  262.             frameerror( BAD_MATRIX, "" );
  263.     }
  264.  
  265.     /*    リターン処理    */
  266.     if ( errlevel < 10 )
  267.         return( &frame );
  268.     return( NULL );
  269. }
  270.  
  271. static    void    getenviron()
  272. {
  273.     int        i ;
  274.  
  275.     /*  環境の初期化  */
  276.     memset( &env, 0, sizeof( Environ ) );
  277.  
  278.     get() ;
  279.     /*    { のリード    */
  280.     if ( wordid != WORD_OPEN2 )
  281.     {
  282.         frameerror( NOT_FOUND, "{" );
  283.         skip( "{" );
  284.     }
  285.     else
  286.         get() ;
  287.  
  288.     while( wordid != WORD_CLOSE2 )
  289.     {
  290.         switch( wordid )
  291.         {
  292.             case WORD_BACK :
  293.                 isopen1() ;
  294.                 getcolor( env.back ) ;
  295.                 break ;
  296.             case WORD_STAR :
  297.                 isopen1() ;
  298.                 env.star = (int )getFloat() ;
  299.                 break ;
  300.             case WORD_GLAD :
  301.                 isopen1() ;
  302.                 env.grad.gradtype = 1 ;
  303.                 getvector( env.grad.vec );
  304.                 i = 0 ;
  305.                 do
  306.                 {
  307.                     getcolor( env.grad.col[i] );
  308.                     env.grad.degree[i] = getFloat() ;
  309.                     ++i ;
  310.                     if ( i == MAXGRAD )
  311.                     {
  312.                         frameerror( GRAD_TOO_LONG, "" );
  313.                         skip( ")" );
  314.                         break ;
  315.                     }
  316.                 }
  317.                 while( wordid != WORD_CLOSE1 ) ;
  318.                 env.grad.colnum = i ;
  319.                 break ;
  320.             case WORD_DEPTH :
  321.                 isopen1() ;
  322.                 env.depth = getFloat() ;
  323.                 getcolor( env.depthcol ) ;
  324.                 break ;
  325.             case WORD_MAP :
  326.                 isopen1() ;
  327.                 strcpy( env.map, nextword );
  328.                 get() ;
  329.                 break ;
  330.             default :
  331.                 frameerror( BAD_EXIST, nextword );
  332.                 get() ;
  333.         }
  334.         isclose1() ;
  335.     }
  336.     get();
  337. }
  338.  
  339. #if 1 /* 1995.08.09 */
  340. static    void    getframe2( mat )
  341. Matrix mat;
  342. {
  343.     Matrix    c_mat, m ;
  344.  
  345.     m_copy( c_mat, mat );
  346.  
  347.     while( wordid != WORD_CLOSE2 )
  348.     {
  349.         switch( wordid )
  350.         {
  351.             case WORD_OBJ :
  352.                 get() ;
  353.                 getobj2( c_mat ) ;
  354.                 break ;
  355.             case WORD_EYE :
  356.                 get() ;
  357.                 geteye( c_mat ) ;
  358.                 break ;
  359.             case WORD_LIGHT :
  360.                 get() ;
  361.                 getlight( c_mat ) ;
  362.                 break ;
  363.             case WORD_TARGET :
  364.                 get() ;
  365.                 if ( targetstat == 1 )
  366.                     frameerror( TOO_MANY, "ターゲット指定" );
  367.                 targetstat = 1 ;
  368.                 v_copy( target, c_mat[3] );
  369.                 break ;
  370.             case WORD_OPEN2 :
  371.                 get() ;
  372.                 getframe2( c_mat );
  373.                 break ;
  374.             default :
  375.                 getmat( m );
  376.                 m_mult( c_mat, m, c_mat ) ;
  377.                 break ;
  378.         }
  379.     }
  380.     get() ;
  381. }
  382. #endif
  383.  
  384. static    void    getframe( mat )
  385. Matrix    mat ;
  386. {
  387.     Matrix    c_mat, m ;
  388.  
  389.     m_copy( c_mat, mat );
  390.  
  391.     while( wordid != WORD_CLOSE2 )
  392.     {
  393.         switch( wordid )
  394.         {
  395.             case WORD_OBJ :
  396.                 get() ;
  397.                 getobj( c_mat ) ;
  398.                 break ;
  399.             case WORD_EYE :
  400.                 get() ;
  401.                 geteye( c_mat ) ;
  402.                 break ;
  403.             case WORD_LIGHT :
  404.                 get() ;
  405.                 getlight( c_mat ) ;
  406.                 break ;
  407.             case WORD_TARGET :
  408.                 get() ;
  409.                 if ( targetstat == 1 )
  410.                     frameerror( TOO_MANY, "ターゲット指定" );
  411.                 targetstat = 1 ;
  412.                 v_copy( target, c_mat[3] );
  413.                 break ;
  414.             case WORD_OPEN2 :
  415.                 get() ;
  416.                 getframe( c_mat );
  417.                 break ;
  418.             default :
  419.                 getmat( m );
  420.                 m_mult( c_mat, m, c_mat ) ;
  421.                 break ;
  422.         }
  423.     }
  424.     get() ;
  425. }
  426.  
  427. #if 1
  428. /* 1995.08.08 */
  429. static void add_to_objnamebuf( char *name )
  430. {
  431.     int i;
  432.     int len;
  433.  
  434.     for ( i=0 ; i<nobjnames ; i++ )
  435.     {
  436.     if ( strcmpi( objnames[i], name ) == 0 )
  437.         break;
  438.     }
  439.     if ( i < nobjnames )
  440.     return;
  441.     if ( nobjnames >= MAXOBJNAMES )
  442.     return;
  443.  
  444.     len = strlen(name) + 1;
  445.     if ( curobjnamebuf + len >= objnamebuf + MAXOBJNAMEBUF )
  446.     return;
  447.     strcpy( curobjnamebuf, name );
  448.     objnames[ nobjnames++ ] = curobjnamebuf;
  449.     curobjnamebuf += len;
  450.     return;
  451. }
  452.  
  453.  
  454. /* 1995.08.11 */
  455. static    void    getobj2( c_mat )
  456. Matrix    c_mat ;
  457. {
  458.     ObjPos    *objpos ;
  459.     Object    *obj ;
  460.     Pointer(ObjPos*) p;
  461.     Pointer(Object*) pobj ;
  462.     char    name[MAXWORD] ;
  463.     int    lockid ;
  464.  
  465.     /*    オブジェクト名    */
  466.     getname( name );
  467.  
  468.     /*    オブジェクトリストの確保    */
  469.     p = dataalloc( sizeof( ObjPos ) );
  470.     objpos = pointer( p );
  471.     lockid = datalock();
  472.     m_copy( objpos->mat, c_mat );
  473.  
  474.     /*      オブジェクト名の登録1          */
  475.     add_to_objnamebuf( name );
  476.  
  477.     /*      オブジェクト名の登録2          */
  478.     for ( pobj=objtop ; pobj!=NULL ; pobj=obj->next )
  479.     {
  480.         obj = pointer( pobj );
  481.         if ( strcmpi( obj->name, name ) == 0 )
  482.         break;
  483.     }
  484.     if ( pobj == NULL ) 
  485.     {
  486.         pobj = dataalloc( sizeof( Object ) );
  487.         obj = pointer( pobj );
  488.         strcpy( obj->name, name );
  489.         obj->next = objtop;
  490.         objtop = obj;
  491.     }
  492.     objpos->obj = pobj ;
  493.  
  494.     /*    リストの結合    */
  495.     objpos->next = frame.objpos ;
  496.     frame.objpos = p ;
  497.  
  498.     dataunlock( lockid );
  499. }
  500.  
  501. #endif
  502.  
  503. static    void    getobj( c_mat )
  504. Matrix    c_mat ;
  505. {
  506.     ObjPos    *objpos ;
  507.     Object    *obj ;
  508.     Pointer(ObjPos*)    p;
  509.     Pointer(Object*) pobj ;
  510.     char    name[MAXWORD] ;
  511.     int        lockid ;
  512.  
  513.     /*    オブジェクト名    */
  514.     getname( name );
  515.     if ( objtop == NULL )
  516.         return ;
  517.  
  518.     /*    オブジェクトリストの確保    */
  519.     p = dataalloc( sizeof( ObjPos ) );
  520.     objpos = pointer( p );
  521.     lockid = datalock();
  522.     m_copy( objpos->mat, c_mat );
  523.  
  524.     /*    オブジェクト名の照合        */
  525.     for( pobj = objtop ; pobj != NULL ; pobj = obj->next )
  526.     {
  527.         obj = pointer( pobj );
  528.         if ( strcmpi( obj->name, name ) == 0 )
  529.             break ;
  530.     }
  531.     if ( pobj == NULL )
  532.         frameerror( OBJ_NOT_FOUND, name );
  533.     objpos->obj = pobj ;
  534.  
  535.     /*    リストの結合    */
  536.     objpos->next = frame.objpos ;
  537.     frame.objpos = p ;
  538.  
  539.     dataunlock( lockid );
  540. }
  541.  
  542. static    void    geteye( c_mat )
  543. Matrix    c_mat ;
  544. {
  545.     Float    dist, size, deg ;
  546.  
  547.     /*    視点指定の回数チェック    */
  548.     if ( eyestat == 1 )
  549.         frameerror( TOO_MANY, "視点指定" );
  550.     eyestat = 1 ;
  551.  
  552.     /*    ( のチェック    */
  553.     m_copy( frame.eye.mat, c_mat ) ;
  554.  
  555.     if ( wordid == WORD_OPEN1 )
  556.     {
  557.         frameerror( OLD_FASION, "( の位置が違います。" );
  558.         get() ;
  559.     }
  560.  
  561.     switch( wordid )
  562.     {
  563.         case WORD_DEG :
  564.             get();
  565.             if ( wordid == WORD_OPEN1 )
  566.                 get() ;
  567.             deg = getFloat() ;
  568.             frame.eye.dist = 0.5 / tan( deg * RAD / 2.0 ) ;
  569.             break ;
  570.         case WORD_SCR :
  571.             get();
  572.             if ( wordid == WORD_OPEN1 )
  573.                 get() ;
  574.             dist = getFloat() ;
  575.             size = getFloat() ;
  576.             frame.eye.dist = dist / size ;
  577.             break ;
  578.         default :
  579.             frameerror( BAD_EXIST, nextword );
  580.             skip( ")" );
  581.             return ;
  582.     }
  583.  
  584.     /*    ) のチェック    */
  585.     if ( wordid != WORD_CLOSE1 )
  586.         frameerror( NOT_FOUND, ")" ) ;
  587.     else
  588.         get() ;
  589. }
  590.  
  591. static    void    getlight( c_mat )
  592. Matrix    c_mat ;
  593. {
  594.     int        n ;
  595.     Matrix    mit ;
  596.     Vector    lvec ;
  597.  
  598.     n = frame.lightnum ;
  599.     m_inv( mit, c_mat );
  600.     m_trans( mit, mit );
  601.  
  602.     /*    光源の最大値チェック    */
  603.     if ( frame.lightnum < MAXLIGHT )
  604.         frame.lightnum ++ ;
  605.     else
  606.         frameerror( TOO_MANY, "光源指定" );
  607.  
  608.     /*    ( のチェック    */
  609.     if ( wordid == WORD_OPEN1 )
  610.     {
  611.         frameerror( OLD_FASION, "( の位置が違います。" );
  612.         get() ;
  613.     }
  614.  
  615.     switch( wordid )
  616.     {
  617.         case WORD_POINT :
  618.             get();
  619.             frame.light[n].type = LIGHT_POINT ;
  620.             v_copy( frame.light[n].point, c_mat[3] );
  621.             if ( wordid == WORD_OPEN1 )
  622.                 get() ;
  623.             getcolor( frame.light[n].col );
  624.             frame.light[n].dist = getFloat() ;
  625.             break ;
  626.         case WORD_PAL :
  627.             get();
  628.             frame.light[n].type = LIGHT_PAL ;
  629.             if ( wordid == WORD_OPEN1 )
  630.                 get() ;
  631.             getcolor( frame.light[n].col );
  632.             getvector( lvec );
  633.             vec_mult_mat( (Vector*)lvec, (Vector*)lvec, mit, 1, 0 );
  634.             v_unit( frame.light[n].vec, lvec );
  635.             break ;
  636.         case WORD_SPOT :
  637.             get();
  638.             frame.light[n].type = LIGHT_SPOT ;
  639.             v_copy( frame.light[n].point, c_mat[3] );
  640.             if ( wordid == WORD_OPEN1 )
  641.                 get() ;
  642.             getcolor( frame.light[n].col );
  643.             getvector( lvec );
  644.             vec_mult_mat( (Vector*)lvec, (Vector*)lvec, mit, 1, 0 );
  645.             v_unit( frame.light[n].vec, lvec );
  646.             frame.light[n].size = getFloat() ;
  647.             if (wordid != WORD_CLOSE1) {
  648.                 frame.light[n].dist = getFloat() ;
  649.             } else {
  650.                 frame.light[n].dist = 0.0;
  651.             }
  652.             break ;
  653.         case WORD_OBJ :
  654.             frameerror( NOT_IMPLIMENTED, "物体光源" );
  655.             get();
  656.             frame.light[n].type = LIGHT_OBJ ;
  657.             v_copy( frame.light[n].point, c_mat[3] );
  658.             if ( wordid == WORD_OPEN1 )
  659.                 get() ;
  660.             getname( frame.light[n].name );
  661.             getcolor( frame.light[n].col );
  662.             frame.light[n].dist = getFloat() ;
  663.             break ;
  664.         default :
  665.             skip( ")" );
  666.             return ;
  667.     }
  668.  
  669.     /*    ) のチェック    */
  670.     if ( wordid != WORD_CLOSE1 )
  671.         frameerror( NOT_FOUND, ")" ) ;
  672.     else
  673.         get() ;
  674. }
  675.  
  676.  
  677. static    void    envclear()
  678. {
  679.     env.back[0] = env.back[1] = env.back[2] = 0L ;
  680.     env.star = 0 ;
  681.     env.grad.gradtype = 0 ;
  682.     env.depth = 0.0 ;
  683.     strcpy( env.map, "" );
  684. }
  685.  
  686.  
  687. static    void    frameerror( n, arg )
  688. int n ;
  689. char    *arg ;
  690. {
  691.     char    *msg ;
  692.     int level ;
  693.  
  694.     switch( n )
  695.     {
  696.         case OLD_FASION :
  697.             msg = "警告:古い規格の書式です。:%s" ;
  698.             level = 1 ;
  699.             break ;
  700.         case NOT_FOUND :
  701.             msg = " %s がありません。" ;
  702.             level = 10 ;
  703.             break ;
  704.         case BAD_EXIST :
  705.             msg = " %s が存在します。" ;
  706.             level = 10 ;
  707.             break ;
  708.         case NOT_IMPLIMENTED :
  709.             msg = " %s はサポートしていません。" ;
  710.             level = 10 ;
  711.             break ;
  712.         case OBJ_NOT_FOUND :
  713.             msg = "オブジェクト名 %s は登録されていません。" ;
  714.             level = 10 ;
  715.             break ;
  716.         case GRAD_TOO_LONG :
  717.             msg = "グラデーションの色データが多すぎます。" ;
  718.             level = 10 ;
  719.             break ;
  720.         case TOO_MANY :
  721.             msg = "%sが多すぎます。" ;
  722.             level = 10 ;
  723.             break ;
  724.         case BAD_MATRIX :
  725.             msg = "ターゲット指定がおかしい。" ;
  726.             level = 10 ;
  727.             break ;
  728.         case UNEXPECTED_EOF :
  729.             msg = "エンドオブファイルになりました" ;
  730.             level = 20 ;
  731.             break ;
  732.         case NOT_FRAME_FILE :
  733.             msg = "フレームファイルではありません。" ;
  734.             level = 20 ;
  735.             break ;
  736.         default :
  737.             msg = "エラーコードの誤り。( framread.c )" ;
  738.             level = 20 ;
  739.             break ;
  740.     }
  741.  
  742.     errormessage( level, msg, arg );
  743. }
  744.  
  745.