|
rllib
1
|
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
1.7.5.1