1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 25 #include <syshelp.hxx> 26 27 28 // NOT FULLY DEFINED SERVICES 29 #include <string.h> 30 #include "sistr.hxx" 31 #include "list.hxx" 32 33 #ifdef WNT 34 #include <io.h> 35 #elif defined(UNX) || defined(OS2) 36 #include <sys/types.h> 37 #include <sys/stat.h> 38 #include <dirent.h> 39 #define stricmp strcasecmp 40 #else 41 #error Must run under unix or windows, please define UNX or WNT. 42 #endif 43 44 45 char C_sSpaceInName[] = " "; 46 47 void 48 WriteName( std::ostream & o_rFile, 49 const Simstr & i_rIdlDocuBaseDir, 50 const Simstr & i_rName, 51 E_LinkType i_eLinkType ) 52 { 53 if (i_rName.l() == 0) 54 return; 55 56 57 const char * pNameEnd = strstr( i_rName.str(), " in " ); 58 59 // No link: 60 if ( i_eLinkType == lt_nolink ) 61 { 62 if ( pNameEnd != 0 ) 63 { 64 const char * pStart = i_rName.str(); 65 o_rFile.write( pStart, pNameEnd - pStart ); 66 WriteStr( o_rFile, C_sSpaceInName ); 67 WriteStr( o_rFile, pNameEnd ); 68 } 69 else 70 { 71 WriteStr( o_rFile, i_rName ); 72 } 73 return; 74 } 75 76 if ( i_eLinkType == lt_idl ) 77 { 78 Simstr sPath(i_rName); 79 sPath.replace_all('.','/'); 80 int nNameEnd = sPath.pos_first(' '); 81 int nPathStart = sPath.pos_last(' '); 82 WriteStr( o_rFile, "<A HREF=\"" ); 83 84 if ( nNameEnd > -1 ) 85 { 86 WriteStr( o_rFile, "file:///" ); 87 WriteStr( o_rFile, i_rIdlDocuBaseDir ); 88 WriteStr( o_rFile, "/" ); 89 WriteStr( o_rFile, sPath.str() + 1 + nPathStart ); 90 WriteStr( o_rFile, "/" ); 91 o_rFile.write( sPath.str(), nNameEnd ); 92 WriteStr( o_rFile, ".html\">" ); 93 } 94 else 95 { // Should not be reached: 96 WriteStr(o_rFile, i_rName); 97 return; 98 } 99 } 100 else if ( i_eLinkType == lt_html ) 101 { 102 int nKomma = i_rName.pos_first(','); 103 int nEnd = i_rName.pos_first(' '); 104 if ( nKomma > -1 ) 105 { 106 o_rFile.write( i_rName.str(), nKomma ); 107 WriteStr( o_rFile, ": " ); 108 109 WriteStr( o_rFile, "<A HREF=\"" ); 110 111 o_rFile.write( i_rName.str(), nKomma ); 112 WriteStr( o_rFile, ".html#" ); 113 if ( nEnd > -1 ) 114 o_rFile.write( i_rName.str() + nKomma + 1, nEnd - nKomma ); 115 else 116 WriteStr( o_rFile, i_rName.str() + nKomma + 1 ); 117 WriteStr( o_rFile, "\">" ); 118 119 o_rFile.write( i_rName.str() + nKomma + 1, nEnd - nKomma ); 120 } 121 else 122 { 123 WriteStr( o_rFile, "<A HREF=\"" ); 124 WriteStr( o_rFile, i_rName ); 125 WriteStr( o_rFile, ".html\">" ); 126 127 WriteStr( o_rFile, i_rName ); 128 } 129 WriteStr( o_rFile, "</A>" ); 130 return; 131 } 132 133 if ( pNameEnd != 0 ) 134 { 135 const char * pStart = i_rName.str(); 136 if ( pNameEnd > pStart ) 137 o_rFile.write( pStart, pNameEnd - pStart ); 138 WriteStr( o_rFile, "</A>" ); 139 140 WriteStr( o_rFile, C_sSpaceInName ); 141 WriteStr( o_rFile, pNameEnd ); 142 } 143 else 144 { 145 WriteStr( o_rFile, i_rName ); 146 WriteStr( o_rFile, "</A>" ); 147 } 148 } 149 150 151 void 152 WriteStr( std::ostream & o_rFile, 153 const char * i_sStr ) 154 { 155 o_rFile.write( i_sStr, (int) strlen(i_sStr) ); 156 } 157 158 void 159 WriteStr( std::ostream & o_rFile, 160 const Simstr & i_sStr ) 161 { 162 o_rFile.write( i_sStr.str(), i_sStr.l() ); 163 } 164 165 166 const char C_sXML_END[] = "\\*.xml"; 167 168 void 169 GatherFileNames( List<Simstr> & o_sFiles, 170 const char * i_sSrcDirectory ) 171 { 172 static int nAliveCounter = 0; 173 174 char * sNextDir = 0; 175 Simstr sNew = 0; 176 177 #ifdef WNT 178 struct _finddata_t aEntry; 179 long hFile = 0; 180 int bFindMore = 0; 181 char * sFilter = new char[ strlen(i_sSrcDirectory) + sizeof C_sXML_END ]; 182 183 // Stayingalive sign 184 if (++nAliveCounter % 100 == 1) 185 std::cout << "." << std::flush; 186 187 strcpy(sFilter, i_sSrcDirectory); // STRCPY SAFE HERE 188 strcat(sFilter,C_sXML_END); // STRCAT SAFE HERE 189 190 hFile = _findfirst( sFilter, &aEntry ); 191 for ( bFindMore = hFile == -1; 192 bFindMore == 0; 193 bFindMore = _findnext( hFile, &aEntry ) ) 194 { 195 sNew = i_sSrcDirectory; 196 sNew += "\\"; 197 sNew += aEntry.name; 198 o_sFiles.push_back(sNew); 199 } // end for 200 201 _findclose(hFile); 202 delete [] sFilter; 203 #elif defined(UNX) || defined(OS2) 204 DIR * pDir = opendir( i_sSrcDirectory ); 205 dirent * pEntry = 0; 206 char * sEnding; 207 208 // Stayingalive sign 209 if (++nAliveCounter % 100 == 1) 210 std::cout << "." << std::flush; 211 212 while ( (pEntry = readdir(pDir)) != 0 ) 213 { 214 sEnding = strrchr(pEntry->d_name,'.'); 215 if (sEnding != 0 ? stricmp(sEnding,".xml") == 0 : 0 ) 216 { 217 sNew = i_sSrcDirectory; 218 sNew += "/"; 219 sNew += pEntry->d_name; 220 o_sFiles.push_back(sNew); 221 } 222 } // end while 223 224 closedir( pDir ); 225 #else 226 #error Must run on unix or windows, please define UNX or WNT. 227 #endif 228 229 // gathering from subdirectories: 230 List<Simstr> aSubDirectories; 231 GatherSubDirectories( aSubDirectories, i_sSrcDirectory ); 232 233 unsigned d_max = aSubDirectories.size(); 234 for ( unsigned d = 0; d < d_max; ++d ) 235 { 236 sNextDir = new char[ strlen(i_sSrcDirectory) + 2 + aSubDirectories[d].l() ]; 237 238 strcpy(sNextDir, i_sSrcDirectory); 239 strcat(sNextDir, C_sSLASH); 240 strcat(sNextDir, aSubDirectories[d].str()); 241 GatherFileNames(o_sFiles, sNextDir); 242 243 delete [] sNextDir; 244 } 245 } 246 247 248 const char * C_sANYDIR = "\\*.*"; 249 250 void 251 GatherSubDirectories( List<Simstr> & o_sSubDirectories, 252 const char * i_sParentdDirectory ) 253 { 254 Simstr sNew; 255 256 #ifdef WNT 257 struct _finddata_t aEntry; 258 long hFile = 0; 259 int bFindMore = 0; 260 char * sFilter = new char[strlen(i_sParentdDirectory) + sizeof C_sANYDIR]; 261 262 strcpy(sFilter, i_sParentdDirectory); 263 strcat(sFilter,C_sANYDIR); 264 265 hFile = _findfirst( sFilter, &aEntry ); 266 for ( bFindMore = hFile == -1; 267 bFindMore == 0; 268 bFindMore = _findnext( hFile, &aEntry ) ) 269 { 270 if (aEntry.attrib == _A_SUBDIR) 271 { 272 // Do not gather . .. and outputtree directories 273 if ( strchr(aEntry.name,'.') == 0 274 && strncmp(aEntry.name, "wnt", 3) != 0 275 && strncmp(aEntry.name, "unx", 3) != 0 ) 276 { 277 sNew = aEntry.name; 278 o_sSubDirectories.push_back(sNew); 279 } 280 } // endif (aEntry.attrib == _A_SUBDIR) 281 } // end for 282 _findclose(hFile); 283 delete [] sFilter; 284 285 #elif defined(UNX) || defined(OS2) 286 DIR * pDir = opendir( i_sParentdDirectory ); 287 dirent * pEntry = 0; 288 struct stat aEntryStatus; 289 290 while ( ( pEntry = readdir(pDir) ) != 0 ) 291 { 292 stat(pEntry->d_name, &aEntryStatus); 293 if ( ( aEntryStatus.st_mode & S_IFDIR ) == S_IFDIR ) 294 { 295 // Do not gather . .. and outputtree directories 296 if ( strchr(pEntry->d_name,'.') == 0 297 && strncmp(pEntry->d_name, "wnt", 3) != 0 298 && strncmp(pEntry->d_name, "unx", 3) != 0 ) 299 { 300 sNew = pEntry->d_name; 301 o_sSubDirectories.push_back(sNew); 302 } 303 } // endif (aEntry.attrib == _A_SUBDIR) 304 } // end while 305 closedir( pDir ); 306 #else 307 #error Must run on unix or windows, please define UNX or WNT. 308 #endif 309 } 310 311