00001
00002
00003
00004
00005
00006
00007
00033
00034
00035
00036
00037 #include <stdio.h>
00038 #include <string.h>
00039
00040 #include "prmio.h"
00041 #include "prm.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00067 static int prmioNextLabel( FILE *fd, char *label )
00068 {
00069 int c;
00070
00071 while( ( c = fgetc( fd ) ) != '%' )
00072 {
00073 if( c == EOF )
00074 return( 0 );
00075 }
00076 if( fscanf( fd, "%s", label ) != 1 )
00077 return( 0 );
00078 else
00079 return( 1 );
00080 }
00081
00082
00083
00092 static long int prmioGetColorCode( char *color_label )
00093 {
00094 long int color = PRM_BLACK;
00095
00096 if( strcmp( color_label, "WHITE" ) == 0 )
00097 color = PRM_WHITE;
00098 else if( strcmp( color_label, "GRAY" ) == 0 )
00099 color = PRM_GRAY;
00100 else if( strcmp( color_label, "DARK_GRAY" ) == 0 )
00101 color = PRM_DARK_GRAY;
00102 else if( strcmp( color_label, "BLACK" ) == 0 )
00103 color = PRM_BLACK;
00104 else if( strcmp( color_label, "RED" ) == 0 )
00105 color = PRM_RED;
00106 else if( strcmp( color_label, "DARK_RED" ) == 0 )
00107 color = PRM_DARK_RED;
00108 else if( strcmp( color_label, "GREEN" ) == 0 )
00109 color = PRM_GREEN;
00110 else if( strcmp( color_label, "DARK_GREEN" ) == 0 )
00111 color = PRM_DARK_GREEN;
00112 else if( strcmp( color_label, "BLUE" ) == 0 )
00113 color = PRM_BLUE;
00114 else if( strcmp( color_label, "DARK_BLUE" ) == 0 )
00115 color = PRM_DARK_BLUE;
00116 else if( strcmp( color_label, "YELLOW" ) == 0 )
00117 color = PRM_YELLOW;
00118 else if( strcmp( color_label, "DARK_YELLOW" ) == 0 )
00119 color = PRM_DARK_YELLOW;
00120 else if( strcmp( color_label, "MAGENTA" ) == 0 )
00121 color = PRM_MAGENTA;
00122 else if( strcmp( color_label, "DARK_MAGENTA" ) == 0 )
00123 color = PRM_DARK_MAGENTA;
00124 else if( strcmp( color_label, "CYAN" ) == 0 )
00125 color = PRM_CYAN;
00126 else if( strcmp( color_label, "DARK_CYAN" ) == 0 )
00127 color = PRM_DARK_CYAN;
00128
00129 return( color );
00130 }
00131
00132
00133
00140 static void prmioGetColorLabel( long int color, char *color_label )
00141 {
00142 switch( color )
00143 {
00144 case PRM_WHITE:
00145 sprintf( color_label, "WHITE" );
00146 break;
00147 case PRM_GRAY:
00148 sprintf( color_label, "GRAY" );
00149 break;
00150 case PRM_DARK_GRAY:
00151 sprintf( color_label, "DARK_GRAY" );
00152 break;
00153 case PRM_BLACK:
00154 default:
00155 sprintf( color_label, "BLACK" );
00156 break;
00157 case PRM_RED:
00158 sprintf( color_label, "RED" );
00159 break;
00160 case PRM_DARK_RED:
00161 sprintf( color_label, "DARK_RED" );
00162 break;
00163 case PRM_GREEN:
00164 sprintf( color_label, "GREEN" );
00165 break;
00166 case PRM_DARK_GREEN:
00167 sprintf( color_label, "DARK_GREEN" );
00168 break;
00169 case PRM_BLUE:
00170 sprintf( color_label, "BLUE" );
00171 break;
00172 case PRM_DARK_BLUE:
00173 sprintf( color_label, "DARK_BLUE" );
00174 break;
00175 case PRM_YELLOW:
00176 sprintf( color_label, "YELLOW" );
00177 break;
00178 case PRM_DARK_YELLOW:
00179 sprintf( color_label, "DARK_YELLOW" );
00180 break;
00181 case PRM_MAGENTA:
00182 sprintf( color_label, "MAGENTA" );
00183 break;
00184 case PRM_DARK_MAGENTA:
00185 sprintf( color_label, "DARK_MAGENTA" );
00186 break;
00187 case PRM_CYAN:
00188 sprintf( color_label, "CYAN" );
00189 break;
00190 case PRM_DARK_CYAN:
00191 sprintf( color_label, "DARK_CYAN" );
00192 break;
00193 }
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203 int prmioInterpret( FILE *fd )
00204 {
00205 static char label[80];
00206 Prm *prm = NULL;
00207
00208 while( 1 )
00209 {
00210 if( prmioNextLabel( fd, label ) == 0 )
00211 {
00212 printf( "\n Invalid primitive file or label END doesn't exist.\n\n" );
00213 return( 0 );
00214 }
00215 else if( strcmp( label, "CREATE.FRONT" ) == 0 )
00216 {
00217 int type;
00218 fscanf( fd, "%d", &type );
00219 prm = prmCreateFront( (PrmType)type );
00220 }
00221 else if( strcmp( label, "CREATE.BACK" ) == 0 )
00222 {
00223 int type;
00224 fscanf( fd, "%d", &type );
00225 prm = prmCreateBack( (PrmType)type );
00226 }
00227 else if( strcmp( label, "MOVE.FRONT" ) == 0 )
00228 {
00229 if( prm == NULL )
00230 return( 0 );
00231 prmMoveFront( prm );
00232 }
00233 else if( strcmp( label, "MOVE.BACK" ) == 0 )
00234 {
00235 if( prm == NULL )
00236 return( 0 );
00237 prmMoveBack( prm );
00238 }
00239 else if( strcmp( label, "SET.GEOM" ) == 0 )
00240 {
00241 if( prm == NULL )
00242 return( 0 );
00243 prmRead( prm, fd );
00244 }
00245 else if( strcmp( label, "SET.COLOR" ) == 0 )
00246 {
00247 char color_label[32];
00248 if( prm == NULL )
00249 return( 0 );
00250 fscanf( fd, "%s", color_label );
00251 prmSetColor( prm, prmioGetColorCode( color_label ) );
00252 }
00253 else if( strcmp( label, "SET.HEIGHT" ) == 0 )
00254 {
00255 double height;
00256 if( prm == NULL )
00257 return( 0 );
00258 fscanf( fd, "%lg", &height );
00259 prmSetHeight( prm, height );
00260 }
00261 else if( strcmp( label, "TRANSLATE" ) == 0 )
00262 {
00263 double dx, dy;
00264 if( prm == NULL )
00265 return( 0 );
00266 fscanf( fd, "%lg %lg", &dx, &dy );
00267 prmTranslate( prm, dx, dy );
00268 }
00269 else if( strcmp( label, "TRANSLATE.VERTEX" ) == 0 )
00270 {
00271 int id;
00272 double dx, dy;
00273 if( prm == NULL )
00274 return( 0 );
00275 fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00276 prmTranslateVertex( prm, id, dx, dy );
00277 }
00278 else if( strcmp( label, "TRANSLATE.SIDE" ) == 0 )
00279 {
00280 int id;
00281 double dx, dy;
00282 if( prm == NULL )
00283 return( 0 );
00284 fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00285 prmTranslateSide( prm, id, dx, dy );
00286 }
00287 else if( strcmp( label, "END" ) == 0 )
00288 break;
00289 else
00290 continue;
00291 }
00292
00293 return( 1 );
00294 }
00295
00296
00297
00298 void prmioWriteList( FILE *fd )
00299 {
00300 Prm *prm;
00301 char color_label[32];
00302
00303 fprintf( fd, "%%HEADER.TITLE\n'List of primitives.'\n" );
00304
00305 for( prm = prmFirst( ); prm != NULL; prm = prmNext( prm ) )
00306 {
00307 fprintf( fd, "\n%%CREATE.BACK " );
00308 fprintf( fd, "%d\n", prmGetType( prm ) );
00309
00310 fprintf( fd, "\n%%SET.GEOM\n" );
00311 prmWrite( prm, fd );
00312
00313 fprintf( fd, "\n%%SET.COLOR" );
00314 prmioGetColorLabel( prmGetColor( prm ), color_label );
00315 fprintf( fd, "\n%s\n", color_label );
00316
00317 fprintf( fd, "\n%%SET.HEIGHT " );
00318 fprintf( fd, "%g\n", prmGetHeight( prm ) );
00319 }
00320
00321 fprintf ( fd, "\n%%END\n" );
00322 }
00323
00325 f( fd, "\n%%SET.GEOM\n" );
00326 prmWrite( prm, fd );
00327
00328 fprintf( fd, "\n%%SET.COLOR" );
00329 prmioGetColorLabel( prmGetColor( prm ), color_label );
00330 fprintf( fd, "\n%s\n", color_label );
00331
00332 fprintf( fd, "\n%%SET.HEIGHT " );
00333 fprintf( fd, "%g\n", prmGetHeight( prm ) );
00334 }
00335
00336 fprintf ( fd, "\n%%END\n" );
00337 }
00338