rllib  1
Public Member Functions | Private Member Functions | Private Attributes
rlSvgCat Class Reference

#include <rlsvgcat.h>

List of all members.

Public Member Functions

 rlSvgCat ()
virtual ~rlSvgCat ()
int open (const char *infile, const char *outfile=0)
int reopenSocket (const char *infile, int s)
void cat ()
void close ()

Private Member Functions

int outUntil (int i, const char *tag)
int outUntilEnd (int i)
int outValue (int i)
void catline ()

Private Attributes

void * fin
void * fout
int s
char line [256 *256]

Detailed Description

This class will normalize SVG XML files so that

  • lines are left justified
  • 1 tag per line

Definition at line 26 of file rlsvgcat.h.


Constructor & Destructor Documentation

rlSvgCat::rlSvgCat ( )

Definition at line 21 of file rlsvgcat.cpp.

{
  fin = fout = 0;
  s = -1;
}
rlSvgCat::~rlSvgCat ( ) [virtual]

Definition at line 27 of file rlsvgcat.cpp.

{
  close();
}

Member Function Documentation

void rlSvgCat::cat ( )

Definition at line 95 of file rlsvgcat.cpp.

{
  while(fgets(line,sizeof(line)-1,(FILE *) fin) != 0)
  {
    catline();
  }
}
void rlSvgCat::catline ( ) [private]

Definition at line 182 of file rlsvgcat.cpp.

{
  int i = 0;
  FILE *out = (FILE *) fout;

  while(line[i] != '\0' && line[i] != '\n')
  {
    while(line[i] == ' ' || line[i] == '\t' ) i++; // eliminate leading spaces
    // compare tags
    if     (strncmp(&line[i],"<?",2) == 0)
    {
      fputc(line[i++],out);
      fputc(line[i++],out);
      i = outUntil(i,"?>");
      fputc('\n',out);
    }
    else if(strncmp(&line[i],"<!",2) == 0) // comment
    {
      fprintf(out,"%s",&line[i]);
      if(strstr(&line[i],">") != NULL) return;
      while(fgets(line,sizeof(line)-1,(FILE *) fin) != 0)
      {
        fprintf(out,"%s",line);
        if(strstr(line,">") != NULL) return;
      }
      return;
    }
    else if(strncmp(&line[i],"<desc",5) == 0)
    {
      fprintf(out,"%s",&line[i]);
      return;
    }
    else if(strncmp(&line[i],"</",2) == 0)
    {
      if(strncmp(&line[i],"</svg>",6) == 0)
      {
        fprintf(out,"</svg>");
        return;
      }
      if(strncmp(&line[i],"</SVG>",6) == 0)
      {
        fprintf(out,"</SVG>");
        return;
      }
      fputc(line[i++],out);
      fputc(line[i++],out);
      i = outUntil(i,">");
      fputc('\n',out);
    }
    else if(strncmp(&line[i],"<",1) == 0)
    {
      fputc(line[i++],out);
      i = outUntilEnd(i);
    }
    else if(strncmp(&line[i],"/>",2) == 0)
    {
      fputc(line[i++],out);
      fputc(line[i++],out);
      fputc('\n',out);
    }
    else if(strncmp(&line[i],">",1) == 0)
    {
      fputc(line[i++],out);
      fputc('\n',out);
    }
    else
    {
      i = outValue(i);
      fputc('\n',out);
    }
    i++;
  }
}
void rlSvgCat::close ( )

Definition at line 32 of file rlsvgcat.cpp.

{
  if(s == -1)
  {
    if(fout != 0 && fout != stdout) fclose((FILE *) fout);
  }
  else
  {
    fflush((FILE *) fout);
  }
  if(fin != 0) fclose((FILE *) fin);
  fin = fout = 0;
}
int rlSvgCat::open ( const char *  infile,
const char *  outfile = 0 
)

Definition at line 46 of file rlsvgcat.cpp.

{
  fin = fout = NULL;
  fin = (void *) fopen(infile,"r");
  if(fin == 0)
  {
    printf("could not open %s\n",infile);
    return -1;
  }
  if(outfile != 0)
  {
    fout = (void *) fopen(outfile,"w");
    if(fout == 0)
    {
      printf("could not write %s\n",outfile);
      return -1;
    }
  }
  else
  {
    fout = (void *) stdout;
  }
  return 0;
}
int rlSvgCat::outUntil ( int  i,
const char *  tag 
) [private]

Definition at line 103 of file rlsvgcat.cpp.

{
  FILE *out = (FILE *) fout;
  int len = strlen(tag);
  while(line[i] != '\0' && line[i] != '\n')
  {
    if(strncmp(&line[i],tag,len) == 0)
    {
      for(int it=0; it<len; it++)
      {
        fputc(line[i++],out);
      }
      if(line[i] == '<') i--;
      break;
    }
    else
    {
      fputc(line[i++],out);
    }
  }
  return i;
}
int rlSvgCat::outUntilEnd ( int  i) [private]

Definition at line 126 of file rlsvgcat.cpp.

{
  FILE *out = (FILE *) fout;
  while(line[i] != '\0' && line[i] != '\n')
  {
    if(line[i] == '>')
    {
      //xlehrig fputc(line[i++],out);
      fputc(line[i],out);
      break;
    }
    if(line[i] == ' ' || line[i] == '\t')
    {
      break;
    }
    else
    {
      fputc(line[i++],out);
    }
  }
  fputc('\n',out);
  return i;
}
int rlSvgCat::outValue ( int  i) [private]

Definition at line 150 of file rlsvgcat.cpp.

{
  //printf("outValue=%s",&line[i]);
  FILE *out = (FILE *) fout;
  while(line[i] != '\0' && line[i] != '\n')
  {
    if(line[i] == '<')
    {
      i--;
      break;
    }
    else if(line[i] == '>')
    {
      fputc('\n',out);
      fputc(line[i],out);
      break;
    }
    else if(line[i] == '/' && line[i+1] == '>')
    {
      fputc('\n',out);
      fputc(line[i++],out);
      fputc(line[i],out);
      break;
    }
    else
    {
      fputc(line[i++],out);
    }
  }
  return i;
}
int rlSvgCat::reopenSocket ( const char *  infile,
int  s 
)

Definition at line 71 of file rlsvgcat.cpp.

{
  s = socket;
  if(s < 0)
  {
    s = -1;
    return -1;
  }
  fin = fout = NULL;
  fin = (void *) fopen(infile,"r");
  if(fin == 0)
  {
    printf("could not open %s\n",infile);
    return -1;
  }
  fout = fdopen(s,"w");
  if(fout == NULL)
  {
    s = -1;
    return -1;
  }
  return 0;
}

Member Data Documentation

void* rlSvgCat::fin [private]

Definition at line 40 of file rlsvgcat.h.

void * rlSvgCat::fout [private]

Definition at line 40 of file rlsvgcat.h.

char rlSvgCat::line[256 *256] [private]

Definition at line 42 of file rlsvgcat.h.

int rlSvgCat::s [private]

Definition at line 41 of file rlsvgcat.h.


The documentation for this class was generated from the following files: