Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

prmio.cpp

Go to the documentation of this file.
00001 /*
00002 ** ----------------------------------------------------------------
00003 ** prmio.cpp  -  Primitive input/output class.
00004 **
00005 ** ----------------------------------------------------------------
00006 */
00007 
00029 /*
00030 ** ---------------------------------------------------------------
00031 ** Global variables and symbols:
00032 */
00033 #include <stdio.h>
00034 #include <string.h>
00035 
00036 #include "prm.h"
00037 #include "quad.h"
00038 #include "circ.h"
00039 #include "prmio.h"
00040 
00041 /*
00042 ** ---------------------------------------------------------------
00043 ** Private class functions:
00044 */
00045 
00046 /*======================  PrmIO::NextLabel  ======================*/
00047 
00048 int PrmIO::NextLabel( FILE* fd, char* label )
00049 {
00050  int c;
00051 
00052  while( ( c = fgetc( fd ) ) != '%' )           /* finds next % */
00053  {
00054   if( c == EOF )
00055   return( 0 );
00056  }
00057  if( fscanf( fd, "%s", label ) != 1 )          /* scan label string */
00058   return( 0 );
00059  else
00060   return( 1 );
00061 }
00062 
00063 /*=====================  PrmIO::GetColorCode  ====================*/
00064 
00065 long int PrmIO::GetColorCode( char* color_label )
00066 {
00067  long int color = Prm::BLACK;
00068 
00069  if( strcmp( color_label, "WHITE" ) == 0 )
00070   color = Prm::WHITE;
00071  else if( strcmp( color_label, "GRAY" ) == 0 )
00072   color = Prm::GRAY;
00073  else if( strcmp( color_label, "DARK_GRAY" ) == 0 )
00074   color = Prm::DARK_GRAY;
00075  else if( strcmp( color_label, "BLACK" ) == 0 )
00076   color = Prm::BLACK;
00077  else if( strcmp( color_label, "RED" ) == 0 )
00078   color = Prm::RED;
00079  else if( strcmp( color_label, "DARK_RED" ) == 0 )
00080   color = Prm::DARK_RED;
00081  else if( strcmp( color_label, "GREEN" ) == 0 )
00082   color = Prm::GREEN;
00083  else if( strcmp( color_label, "DARK_GREEN" ) == 0 )
00084   color = Prm::DARK_GREEN;
00085  else if( strcmp( color_label, "BLUE" ) == 0 )
00086   color = Prm::BLUE;
00087  else if( strcmp( color_label, "DARK_BLUE" ) == 0 )
00088   color = Prm::DARK_BLUE;
00089  else if( strcmp( color_label, "YELLOW" ) == 0 )
00090   color = Prm::YELLOW;
00091  else if( strcmp( color_label, "DARK_YELLOW" ) == 0 )
00092   color = Prm::DARK_YELLOW;
00093  else if( strcmp( color_label, "MAGENTA" ) == 0 )
00094   color = Prm::MAGENTA;
00095  else if( strcmp( color_label, "DARK_MAGENTA" ) == 0 )
00096   color = Prm::DARK_MAGENTA;
00097  else if( strcmp( color_label, "CYAN" ) == 0 )
00098   color = Prm::CYAN;
00099  else if( strcmp( color_label, "DARK_CYAN" ) == 0 )
00100   color = Prm::DARK_CYAN;
00101 
00102  return( color );
00103 }
00104 
00105 /*====================  PrmIO::GetColorLabel  ====================*/
00106 
00107 void PrmIO::GetColorLabel( long int color, char* color_label )
00108 {
00109  switch( color )
00110  {
00111   case Prm::WHITE:
00112    sprintf( color_label, "WHITE" );
00113    break;
00114   case Prm::GRAY:
00115    sprintf( color_label, "GRAY" );
00116    break;
00117   case Prm::DARK_GRAY:
00118    sprintf( color_label, "DARK_GRAY" );
00119    break;
00120   case Prm::BLACK:
00121   default:
00122    sprintf( color_label, "BLACK" );
00123    break;
00124   case Prm::RED:
00125    sprintf( color_label, "RED" );
00126    break;
00127   case Prm::DARK_RED:
00128    sprintf( color_label, "DARK_RED" );
00129    break;
00130   case Prm::GREEN:
00131    sprintf( color_label, "GREEN" );
00132    break;
00133   case Prm::DARK_GREEN:
00134    sprintf( color_label, "DARK_GREEN" );
00135    break;
00136   case Prm::BLUE:
00137    sprintf( color_label, "BLUE" );
00138    break;
00139   case Prm::DARK_BLUE:
00140    sprintf( color_label, "DARK_BLUE" );
00141    break;
00142   case Prm::YELLOW:
00143    sprintf( color_label, "YELLOW" );
00144    break;
00145   case Prm::DARK_YELLOW:
00146    sprintf( color_label, "DARK_YELLOW" );
00147    break;
00148   case Prm::MAGENTA:
00149    sprintf( color_label, "MAGENTA" );
00150    break;
00151   case Prm::DARK_MAGENTA:
00152    sprintf( color_label, "DARK_MAGENTA" );
00153    break;
00154   case Prm::CYAN:
00155    sprintf( color_label, "CYAN" );
00156    break;
00157   case Prm::DARK_CYAN:
00158    sprintf( color_label, "DARK_CYAN" );
00159    break;
00160  }
00161 }
00162 
00163 /*
00164 ** ---------------------------------------------------------------
00165 ** Public class functions:
00166 */
00167 
00168 /*======================  PrmIO::Interpret  ======================*/
00169 
00170 int PrmIO::Interpret( FILE* fd )
00171 {
00172  static char label[80]; /* command label */
00173  Prm* prm = NULL;    /* pointer to current primitive being created */
00174 
00175  while( 1 )
00176  {
00177   if( NextLabel( fd, label ) == 0 )
00178   {
00179    printf( "\n Invalid primitive file or label END doesn't exist.\n\n" );
00180    return( 0 );
00181   }
00182   else if( strcmp( label, "CREATE.FRONT" ) == 0 )
00183   {
00184    int type;
00185    fscanf( fd, "%d", &type );
00186    switch( type )
00187    {
00188     case Prm::PRM_QUAD:
00189      prm = new Quad( );
00190      break;
00191     case Prm::PRM_CIRC:
00192      prm = new Circ( );
00193      break;
00194     default:
00195      return( 0 );
00196    }
00197   }
00198   else if( strcmp( label, "CREATE.BACK" ) == 0 )
00199   {
00200    int type;
00201    fscanf( fd, "%d", &type );
00202    switch( type )
00203    {
00204     case Prm::PRM_QUAD:
00205      prm = new Quad( 1 );
00206      break;
00207     case Prm::PRM_CIRC:
00208      prm = new Circ( 1 );
00209      break;
00210     default:
00211      return( 0 );
00212    }
00213   }
00214   else if( strcmp( label, "MOVE.FRONT" ) == 0 )
00215   {
00216    if( prm == NULL )
00217     return( 0 );
00218    prm->MoveFront( );
00219   }
00220   else if( strcmp( label, "MOVE.BACK" ) == 0 )
00221   {
00222    if( prm == NULL )
00223     return( 0 );
00224    prm->MoveBack( );
00225   }
00226   else if( strcmp( label, "SET.GEOM" ) == 0 )
00227   {
00228    if( prm == NULL )
00229     return( 0 );
00230    prm->Read( fd );
00231   }
00232   else if( strcmp( label, "SET.COLOR" ) == 0 )
00233   {
00234    char color_label[32];
00235    if( prm == NULL )
00236     return( 0 );
00237    fscanf( fd, "%s", color_label );
00238    prm->SetColor( GetColorCode( color_label ) );
00239   }
00240   else if( strcmp( label, "SET.HEIGHT" ) == 0 )
00241   {
00242    double height;
00243    if( prm == NULL )
00244     return( 0 );
00245    fscanf( fd, "%lg", &height );
00246    prm->SetHeight( height );
00247   }
00248   else if( strcmp( label, "TRANSLATE" ) == 0 )
00249   {
00250    double dx, dy;
00251    if( prm == NULL )
00252     return( 0 );
00253    fscanf( fd, "%lg %lg", &dx, &dy );
00254    prm->Translate( dx, dy );
00255   }
00256   else if( strcmp( label, "TRANSLATE.VERTEX" ) == 0 )
00257   {
00258    int    id;
00259    double dx, dy;
00260    if( prm == NULL )
00261     return( 0 );
00262    fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00263    prm->TranslateVertex( id, dx, dy );
00264   }
00265   else if( strcmp( label, "TRANSLATE.SIDE" ) == 0 )
00266   {
00267    int    id;
00268    double dx, dy;
00269    if( prm == NULL )
00270     return( 0 );
00271    fscanf( fd, "%d %lg %lg", &id, &dx, &dy );
00272    prm->TranslateSide( id, dx, dy );
00273   }
00274   else if( strcmp( label, "END" ) == 0 )
00275    break;
00276   else             /* not a target label */
00277    continue;
00278  }
00279 
00280  return( 1 );
00281 }
00282 
00283 /*======================  PrmIO::WriteList  ======================*/
00284 
00285 void PrmIO::WriteList( FILE* fd )
00286 {
00287  Prm*   prm;                 /* pointer to current primitive in list */
00288  char   color_label[32];     /* primitive color label */
00289 
00290  fprintf( fd, "%%HEADER.TITLE\n'List of primitives.'\n" );
00291 
00292  for( prm = Prm::First( ); prm != NULL; prm = prm->Next( ) )
00293  {
00294   fprintf( fd, "\n%%CREATE.BACK " );
00295   fprintf( fd, "%d\n", prm->GetType( ) );
00296 
00297   fprintf( fd, "\n%%SET.GEOM\n" );
00298   prm->Write( fd );
00299 
00300   fprintf( fd, "\n%%SET.COLOR" );
00301   GetColorLabel( prm->GetColor( ), color_label );
00302   fprintf( fd, "\n%s\n", color_label );
00303 
00304   fprintf( fd, "\n%%SET.HEIGHT " );
00305   fprintf( fd, "%g\n", prm->GetHeight( ) );
00306  }
00307 
00308  fprintf ( fd, "\n%%END\n" );
00309 }
00310 

Generated on Mon Jun 21 12:45:12 2010 for Trab4 by  doxygen 1.4.2-20050421