rllib  1
rlsvgcat.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                           rlsvgcat.cpp  -  description
00003                              -------------------
00004     begin                : Tue Apr 09 2006
00005     copyright            : (C) 2006 by Rainer Lehrig
00006     email                : lehrig@t-online.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This library is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as        *
00013  *   published by the Free Software Foundation                             *
00014  *                                                                         *
00015  ***************************************************************************/
00016 #include "rlsvgcat.h"
00017 #include <stdio.h>
00018 #include <string.h>
00019 #include <ctype.h>
00020 
00021 rlSvgCat::rlSvgCat()
00022 {
00023   fin = fout = 0;
00024   s = -1;
00025 }
00026 
00027 rlSvgCat::~rlSvgCat()
00028 {
00029   close();
00030 }
00031 
00032 void rlSvgCat::close()
00033 {
00034   if(s == -1)
00035   {
00036     if(fout != 0 && fout != stdout) fclose((FILE *) fout);
00037   }
00038   else
00039   {
00040     fflush((FILE *) fout);
00041   }
00042   if(fin != 0) fclose((FILE *) fin);
00043   fin = fout = 0;
00044 }
00045 
00046 int rlSvgCat::open(const char *infile, const char *outfile)
00047 {
00048   fin = fout = NULL;
00049   fin = (void *) fopen(infile,"r");
00050   if(fin == 0)
00051   {
00052     printf("could not open %s\n",infile);
00053     return -1;
00054   }
00055   if(outfile != 0)
00056   {
00057     fout = (void *) fopen(outfile,"w");
00058     if(fout == 0)
00059     {
00060       printf("could not write %s\n",outfile);
00061       return -1;
00062     }
00063   }
00064   else
00065   {
00066     fout = (void *) stdout;
00067   }
00068   return 0;
00069 }
00070 
00071 int rlSvgCat::reopenSocket(const char *infile, int socket)
00072 {
00073   s = socket;
00074   if(s < 0)
00075   {
00076     s = -1;
00077     return -1;
00078   }
00079   fin = fout = NULL;
00080   fin = (void *) fopen(infile,"r");
00081   if(fin == 0)
00082   {
00083     printf("could not open %s\n",infile);
00084     return -1;
00085   }
00086   fout = fdopen(s,"w");
00087   if(fout == NULL)
00088   {
00089     s = -1;
00090     return -1;
00091   }
00092   return 0;
00093 }
00094 
00095 void rlSvgCat::cat()
00096 {
00097   while(fgets(line,sizeof(line)-1,(FILE *) fin) != 0)
00098   {
00099     catline();
00100   }
00101 }
00102 
00103 int rlSvgCat::outUntil(int i, const char *tag)
00104 {
00105   FILE *out = (FILE *) fout;
00106   int len = strlen(tag);
00107   while(line[i] != '\0' && line[i] != '\n')
00108   {
00109     if(strncmp(&line[i],tag,len) == 0)
00110     {
00111       for(int it=0; it<len; it++)
00112       {
00113         fputc(line[i++],out);
00114       }
00115       if(line[i] == '<') i--;
00116       break;
00117     }
00118     else
00119     {
00120       fputc(line[i++],out);
00121     }
00122   }
00123   return i;
00124 }
00125 
00126 int rlSvgCat::outUntilEnd(int i)
00127 {
00128   FILE *out = (FILE *) fout;
00129   while(line[i] != '\0' && line[i] != '\n')
00130   {
00131     if(line[i] == '>')
00132     {
00133       //xlehrig fputc(line[i++],out);
00134       fputc(line[i],out);
00135       break;
00136     }
00137     if(line[i] == ' ' || line[i] == '\t')
00138     {
00139       break;
00140     }
00141     else
00142     {
00143       fputc(line[i++],out);
00144     }
00145   }
00146   fputc('\n',out);
00147   return i;
00148 }
00149 
00150 int rlSvgCat::outValue(int i)
00151 {
00152   //printf("outValue=%s",&line[i]);
00153   FILE *out = (FILE *) fout;
00154   while(line[i] != '\0' && line[i] != '\n')
00155   {
00156     if(line[i] == '<')
00157     {
00158       i--;
00159       break;
00160     }
00161     else if(line[i] == '>')
00162     {
00163       fputc('\n',out);
00164       fputc(line[i],out);
00165       break;
00166     }
00167     else if(line[i] == '/' && line[i+1] == '>')
00168     {
00169       fputc('\n',out);
00170       fputc(line[i++],out);
00171       fputc(line[i],out);
00172       break;
00173     }
00174     else
00175     {
00176       fputc(line[i++],out);
00177     }
00178   }
00179   return i;
00180 }
00181 
00182 void rlSvgCat::catline()
00183 {
00184   int i = 0;
00185   FILE *out = (FILE *) fout;
00186 
00187   while(line[i] != '\0' && line[i] != '\n')
00188   {
00189     while(line[i] == ' ' || line[i] == '\t' ) i++; // eliminate leading spaces
00190     // compare tags
00191     if     (strncmp(&line[i],"<?",2) == 0)
00192     {
00193       fputc(line[i++],out);
00194       fputc(line[i++],out);
00195       i = outUntil(i,"?>");
00196       fputc('\n',out);
00197     }
00198     else if(strncmp(&line[i],"<!",2) == 0) // comment
00199     {
00200       fprintf(out,"%s",&line[i]);
00201       if(strstr(&line[i],">") != NULL) return;
00202       while(fgets(line,sizeof(line)-1,(FILE *) fin) != 0)
00203       {
00204         fprintf(out,"%s",line);
00205         if(strstr(line,">") != NULL) return;
00206       }
00207       return;
00208     }
00209     else if(strncmp(&line[i],"<desc",5) == 0)
00210     {
00211       fprintf(out,"%s",&line[i]);
00212       return;
00213     }
00214     else if(strncmp(&line[i],"</",2) == 0)
00215     {
00216       if(strncmp(&line[i],"</svg>",6) == 0)
00217       {
00218         fprintf(out,"</svg>");
00219         return;
00220       }
00221       if(strncmp(&line[i],"</SVG>",6) == 0)
00222       {
00223         fprintf(out,"</SVG>");
00224         return;
00225       }
00226       fputc(line[i++],out);
00227       fputc(line[i++],out);
00228       i = outUntil(i,">");
00229       fputc('\n',out);
00230     }
00231     else if(strncmp(&line[i],"<",1) == 0)
00232     {
00233       fputc(line[i++],out);
00234       i = outUntilEnd(i);
00235     }
00236     else if(strncmp(&line[i],"/>",2) == 0)
00237     {
00238       fputc(line[i++],out);
00239       fputc(line[i++],out);
00240       fputc('\n',out);
00241     }
00242     else if(strncmp(&line[i],">",1) == 0)
00243     {
00244       fputc(line[i++],out);
00245       fputc('\n',out);
00246     }
00247     else
00248     {
00249       i = outValue(i);
00250       fputc('\n',out);
00251     }
00252     i++;
00253   }
00254 }
00255 
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines