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 >
Wrap
C/C++ Source or Header
|
1996-07-24
|
6KB
|
290 lines
/*
アトリビュートファイル入力関数
Copyright T.Kobayashi
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include "reader.h"
#include "word.h"
#define OLD_FASION 1
#define NOT_FOUND 11
#define BAD_EXIST 12
#define ALREADY_EXIST 13
#define WRONG_MAP_DATA 14
#define UNEXPECTED_EOF 21
#define NOT_ATR_FILE 22
static void get_atr_data( Atr* );
static void getmapdata( Float[2][2] );
static void atrerror( int, char* );
static Pointer(Atr*) top ;
static char atrfiledir[256];
static int atrfilepoint = 0;
/* アトリビュートファイルのリード */
Pointer(Atr*) atrread( filename, p )
char *filename ;
Pointer(Atr*) p ;
{
Atr *atr, a ;
char *np;
errlevel = 0 ;
if ( fileopen( filename ) == 0 )
return( NULL );
strcpy(atrfiledir, filename);
if ((np = strrchr(atrfiledir, '\\')) == NULL && (np = strrchr(atrfiledir, '/')) == NULL) {
if (atrfiledir[1] == ':') {
atrfilepoint = 2;
} else {
atrfilepoint = 0;
}
} else {
atrfilepoint = (int)(np - atrfiledir) + 1;
}
if ( wordid != WORD_ATR )
atrerror( NOT_ATR_FILE, "" );
top = p ;
/* アトリビュートのリード */
while( ! end_of_file )
{
get_atr_data( &a );
if ( errlevel < 10 )
{
p = dataalloc( sizeof( Atr ) );
atr = pointer( p );
*atr = a ;
atr->next = top ;
top = p ;
}
}
fileclose() ;
if ( errlevel < 10 )
return( top );
else
return( NULL ) ;
}
/* アトリビュートデータの読み込み */
static void get_atr_data( a )
Atr *a ;
{
Pointer(Atr*) p ;
Atr *atr ;
Float w ;
int i, id ;
int mapflag ;
int rgbflag ;
FILE *fp;
if ( wordid != WORD_ATR )
{
atrerror( NOT_FOUND, "atr" );
get() ;
}
get() ;
if ( wordid == WORD_SUF )
{
atrerror( OLD_FASION, "suf が存在する。" );
get();
}
getname( a->name );
for( p = top ; p != NULL ; p = atr->next )
{
atr = pointer( p );
if ( strcmpi( atr->name, a->name ) == 0 )
atrerror( ALREADY_EXIST, a->name ) ;
}
if ( wordid != WORD_OPEN2 )
atrerror( NOT_FOUND, "{" );
get();
a->col[0] = a->col[1] = a->col[2] = 0L ;
c_copy( a->amb, a->col );
c_copy( a->dif, a->col );
c_copy( a->spc, a->col );
c_copy( a->size, a->col );
c_copy( a->ref, a->col );
c_copy( a->tra, a->col );
c_copy( a->rfr, a->col );
c_copy( a->att, a->col );
a->h = 0L ;
a->maptype = NO_MAP ;
rgbflag = FALSE ;
mapflag = 0 ;
while( wordid != WORD_CLOSE2 )
{
id = wordid ;
isopen1() ;
switch( id )
{
case WORD_COL :
getcolor( a->col );
break ;
case WORD_AMB :
if ( getcolor( a->amb ) )
rgbflag = TRUE ;
break ;
case WORD_DIF :
if ( getcolor( a->dif ) )
rgbflag = TRUE ;
break ;
case WORD_SPC :
if ( getcolor( a->spc ) || getcolor( a->size ) )
rgbflag = TRUE ;
for( i = 0 ; i < 3 ; ++i )
a->size[i] = a->size[i] * 100 / COLOR_POINT ;
w = getFloat();
a->h = (long)( w * (Float)COLOR_POINT );
break ;
case WORD_REF :
if ( getcolor( a->ref ) )
rgbflag = TRUE ;
break ;
case WORD_TRA :
if ( getcolor( a->tra ) )
rgbflag = TRUE ;
break ;
case WORD_RFR :
if ( getcolor( a->rfr ) )
rgbflag = TRUE ;
break ;
case WORD_ATT :
if ( getcolor( a->att ) )
rgbflag = TRUE ;
break ;
case WORD_MAPWIND :
mapflag |= 1 ;
getmapdata( a->mapwind );
break ;
case WORD_MAPVIEW :
mapflag |= 2 ;
getmapdata( a->mapview );
break ;
case WORD_MAPSIZE :
mapflag |= 4 ;
getmapdata( a->mapsize );
break ;
case WORD_COLORMAP :
a->maptype = COLOR_MAP ;
mapflag |= 8 ;
getfilename( a->filename );
strcpy(atrfiledir+atrfilepoint, a->filename);
if ((fp = fopen(a->filename, "r")) == NULL) {
if ((fp = fopen(atrfiledir, "r")) != NULL) {
strcpy(a->filename, atrfiledir);
fclose(fp);
}
} else {
fclose(fp);
}
break ;
case WORD_BUMPMAP :
a->maptype = BUMP_MAP ;
mapflag |= 8 ;
getfilename( a->filename );
strcpy(atrfiledir+atrfilepoint, a->filename);
if ((fp = fopen(a->filename, "r")) == NULL) {
if ((fp = fopen(atrfiledir, "r")) != NULL) {
strcpy(a->filename, atrfiledir);
fclose(fp);
}
} else {
fclose(fp);
}
break ;
default :
atrerror( BAD_EXIST, nextword );
}
isclose1() ;
}
if ( 1 <= mapflag && mapflag <= 14 )
atrerror( WRONG_MAP_DATA, NULL );
a->rgbflag = rgbflag ;
get() ;
}
static void getmapdata( p )
Float p[2][2] ;
{
int i, j ;
for( i = 0 ; i < 2 ; ++i )
{
for( j = 0 ; j < 2 ; ++j )
p[i][j] = getFloat();
}
}
static void atrerror( n, arg )
int n ;
char *arg ;
{
char *msg ;
int level ;
switch( n )
{
case OLD_FASION :
msg = "警告:古い規格の書式です。:%s" ;
level = 1 ;
break ;
case NOT_FOUND :
msg = " %s がありません。" ;
level = 10 ;
break ;
case BAD_EXIST :
msg = " %s が存在します。" ;
level = 10 ;
break ;
case ALREADY_EXIST :
msg = "アトリビュート名 %s が二度宣言されています。" ;
#if 0
level = 10 ;
#else
level = 1;
#endif
break ;
case WRONG_MAP_DATA :
msg = "マッピングデータがおかしい。" ;
level = 10 ;
break ;
case UNEXPECTED_EOF :
msg = "エンドオブファイルになりました" ;
level = 20 ;
break ;
case NOT_ATR_FILE :
msg = "アトリビュートファイルではありません。" ;
level = 20 ;
break ;
default :
msg = "エラーコードの誤り。( atrread.c )" ;
level = 20 ;
break ;
}
errormessage( level, msg, arg );
}