home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / READER / ATRREAD.C < prev    next >
C/C++ Source or Header  |  1996-07-24  |  6KB  |  290 lines

  1. /*
  2.         アトリビュートファイル入力関数
  3.  
  4.         Copyright T.Kobayashi
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10. #include <math.h>
  11.  
  12. #include "reader.h"
  13. #include "word.h"
  14.  
  15. #define OLD_FASION    1
  16.  
  17. #define NOT_FOUND        11
  18. #define BAD_EXIST        12
  19. #define ALREADY_EXIST    13
  20. #define WRONG_MAP_DATA    14
  21.  
  22. #define UNEXPECTED_EOF    21
  23. #define NOT_ATR_FILE    22
  24.  
  25. static    void    get_atr_data( Atr* );
  26. static    void    getmapdata( Float[2][2] );
  27. static    void    atrerror( int, char* );
  28.  
  29. static    Pointer(Atr*)    top ;
  30. static    char    atrfiledir[256];
  31. static    int        atrfilepoint = 0;
  32.  
  33. /*    アトリビュートファイルのリード    */
  34. Pointer(Atr*)    atrread( filename, p )
  35. char    *filename ;
  36. Pointer(Atr*)    p ;
  37. {
  38.     Atr        *atr, a ;
  39.     char *np;
  40.  
  41.     errlevel = 0 ;
  42.  
  43.     if ( fileopen( filename ) == 0 )
  44.         return( NULL );
  45.  
  46.     strcpy(atrfiledir, filename);
  47.     if ((np = strrchr(atrfiledir, '\\')) == NULL && (np = strrchr(atrfiledir, '/')) == NULL) {
  48.         if (atrfiledir[1] == ':') {
  49.             atrfilepoint = 2;
  50.         } else {
  51.             atrfilepoint = 0;
  52.         }
  53.     } else {
  54.         atrfilepoint = (int)(np - atrfiledir) + 1;
  55.     }
  56.  
  57.     if ( wordid != WORD_ATR )
  58.         atrerror( NOT_ATR_FILE, "" );
  59.  
  60.     top = p ;
  61.  
  62.     /*    アトリビュートのリード    */
  63.     while( ! end_of_file )
  64.     {
  65.         get_atr_data( &a );
  66.         if ( errlevel < 10 )
  67.         {
  68.             p = dataalloc( sizeof( Atr ) );
  69.             atr = pointer( p );
  70.             *atr = a ;
  71.             atr->next = top ;
  72.             top = p ;
  73.         }
  74.     }
  75.     fileclose() ;
  76.  
  77.     if ( errlevel < 10 )
  78.         return( top );
  79.     else
  80.         return( NULL ) ;
  81. }
  82.  
  83. /*    アトリビュートデータの読み込み    */
  84. static    void    get_atr_data( a )
  85. Atr        *a ;
  86. {
  87.     Pointer(Atr*)    p ;
  88.     Atr        *atr ;
  89.     Float    w ;
  90.     int        i, id ;
  91.     int        mapflag ;
  92.     int        rgbflag ;
  93.  
  94.     FILE *fp;
  95.  
  96.     if ( wordid != WORD_ATR )
  97.     {
  98.         atrerror( NOT_FOUND, "atr" );
  99.         get() ;
  100.     }
  101.     get() ;
  102.  
  103.     if ( wordid == WORD_SUF )
  104.     {
  105.         atrerror( OLD_FASION, "suf が存在する。" );
  106.         get();
  107.     }
  108.  
  109.     getname( a->name );
  110.     for( p = top ; p != NULL ; p = atr->next     )
  111.     {
  112.         atr = pointer( p );
  113.         if ( strcmpi( atr->name, a->name ) == 0 )
  114.             atrerror( ALREADY_EXIST, a->name ) ;
  115.     }
  116.  
  117.     if ( wordid != WORD_OPEN2 )
  118.         atrerror( NOT_FOUND, "{" );
  119.     get();
  120.  
  121.     a->col[0] = a->col[1] = a->col[2] = 0L ;
  122.     c_copy( a->amb, a->col );
  123.     c_copy( a->dif, a->col );
  124.     c_copy( a->spc, a->col );
  125.     c_copy( a->size, a->col );
  126.     c_copy( a->ref, a->col );
  127.     c_copy( a->tra, a->col );
  128.     c_copy( a->rfr, a->col );
  129.     c_copy( a->att, a->col );
  130.     a->h = 0L ;
  131.     a->maptype = NO_MAP ;
  132.     rgbflag = FALSE ;
  133.     mapflag = 0 ;
  134.  
  135.     while( wordid != WORD_CLOSE2 )
  136.     {
  137.         id = wordid ;
  138.         isopen1() ;
  139.         switch( id )
  140.         {
  141.             case WORD_COL :
  142.                 getcolor( a->col );
  143.                 break ;
  144.             case WORD_AMB :
  145.                 if ( getcolor( a->amb ) )
  146.                     rgbflag = TRUE ;
  147.                 break ;
  148.             case WORD_DIF :
  149.                 if ( getcolor( a->dif ) )
  150.                     rgbflag = TRUE ;
  151.                 break ;
  152.             case WORD_SPC :
  153.                 if ( getcolor( a->spc ) || getcolor( a->size ) )
  154.                     rgbflag = TRUE ;
  155.                 for( i = 0 ; i < 3 ; ++i )
  156.                     a->size[i] = a->size[i] * 100 / COLOR_POINT ;
  157.                 w = getFloat();
  158.                 a->h = (long)( w * (Float)COLOR_POINT );
  159.                 break ;
  160.             case WORD_REF :
  161.                 if ( getcolor( a->ref ) )
  162.                     rgbflag = TRUE ;
  163.                 break ;
  164.             case WORD_TRA :
  165.                 if ( getcolor( a->tra ) )
  166.                     rgbflag = TRUE ;
  167.                 break ;
  168.             case WORD_RFR :
  169.                 if ( getcolor( a->rfr ) )
  170.                     rgbflag = TRUE ;
  171.                 break ;
  172.             case WORD_ATT :
  173.                 if ( getcolor( a->att ) )
  174.                     rgbflag = TRUE ;
  175.                 break ;
  176.             case WORD_MAPWIND :
  177.                 mapflag |= 1 ;
  178.                 getmapdata( a->mapwind );
  179.                 break ;
  180.             case WORD_MAPVIEW :
  181.                 mapflag |= 2 ;
  182.                 getmapdata( a->mapview );
  183.                 break ;
  184.             case WORD_MAPSIZE :
  185.                 mapflag |= 4 ;
  186.                 getmapdata( a->mapsize );
  187.                 break ;
  188.             case WORD_COLORMAP :
  189.                 a->maptype = COLOR_MAP ;
  190.                 mapflag |= 8 ;
  191.                 getfilename( a->filename );
  192.                 strcpy(atrfiledir+atrfilepoint, a->filename);
  193.                 if ((fp = fopen(a->filename, "r")) == NULL) {
  194.                     if ((fp = fopen(atrfiledir, "r")) != NULL) {
  195.                         strcpy(a->filename, atrfiledir);
  196.                         fclose(fp);
  197.                     }
  198.                 } else {
  199.                     fclose(fp);
  200.                 }
  201.                 break ;
  202.             case WORD_BUMPMAP :
  203.                 a->maptype = BUMP_MAP ;
  204.                 mapflag |= 8 ;
  205.                 getfilename( a->filename );
  206.                 strcpy(atrfiledir+atrfilepoint, a->filename);
  207.                 if ((fp = fopen(a->filename, "r")) == NULL) {
  208.                     if ((fp = fopen(atrfiledir, "r")) != NULL) {
  209.                         strcpy(a->filename, atrfiledir);
  210.                         fclose(fp);
  211.                     }
  212.                 } else {
  213.                     fclose(fp);
  214.                 }
  215.                 break ;
  216.             default :
  217.                 atrerror( BAD_EXIST, nextword );
  218.         }
  219.         isclose1() ;
  220.     }
  221.     if ( 1 <= mapflag && mapflag <= 14 )
  222.         atrerror( WRONG_MAP_DATA, NULL );
  223.     a->rgbflag = rgbflag ;
  224.     get() ;
  225. }
  226.  
  227. static    void    getmapdata( p )
  228. Float    p[2][2] ;
  229. {
  230.     int        i, j ;
  231.  
  232.     for( i = 0 ; i < 2 ; ++i )
  233.     {
  234.         for( j = 0 ; j < 2 ; ++j )
  235.             p[i][j] = getFloat();
  236.     }
  237. }
  238.  
  239. static    void    atrerror( n, arg )
  240. int n ;
  241. char    *arg ;
  242. {
  243.     char    *msg ;
  244.     int level ;
  245.  
  246.     switch( n )
  247.     {
  248.         case OLD_FASION :
  249.             msg = "警告:古い規格の書式です。:%s" ;
  250.             level = 1 ;
  251.             break ;
  252.         case NOT_FOUND :
  253.             msg = " %s がありません。" ;
  254.             level = 10 ;
  255.             break ;
  256.         case BAD_EXIST :
  257.             msg = " %s が存在します。" ;
  258.             level = 10 ;
  259.             break ;
  260.         case ALREADY_EXIST :
  261.             msg = "アトリビュート名 %s が二度宣言されています。" ;
  262. #if 0
  263.             level = 10 ;
  264. #else
  265.             level = 1;
  266. #endif
  267.             break ;
  268.         case WRONG_MAP_DATA :
  269.             msg = "マッピングデータがおかしい。" ;
  270.             level = 10 ;
  271.             break ;
  272.         case UNEXPECTED_EOF :
  273.             msg = "エンドオブファイルになりました" ;
  274.             level = 20 ;
  275.             break ;
  276.         case NOT_ATR_FILE :
  277.             msg = "アトリビュートファイルではありません。" ;
  278.             level = 20 ;
  279.             break ;
  280.         default :
  281.             msg = "エラーコードの誤り。( atrread.c )" ;
  282.             level = 20 ;
  283.             break ;
  284.     }
  285.  
  286.     errormessage( level, msg, arg );
  287.  
  288. }
  289.  
  290.