int main( int argc, char *[] ) { if( argc < 2 || argc > 3 ) { HCWarning( USAGE ); return( -1 ); } // Parse the command line. char cmdline[80]; char *pfilename, *temp; int quiet = 0; getcmd( cmdline ); temp = cmdline; pfilename = NULL; while( *temp != '\0' && isspace( *temp ) ) { temp++; } if( *temp == '-' || *temp == '/' ) { temp++; if( (*temp != 'q' && *temp != 'Q') || !isspace( *(temp+1) ) ) { HCWarning( USAGE ); return( -1 ); } else { quiet = 1; temp++; while( *temp != '\0' && isspace( *temp ) ) { temp++; } if( *temp == '\0' ) { HCWarning( USAGE ); return( -1 ); } else { pfilename = temp; } } } else if( *temp != '\0' ) { pfilename = temp++; while( *temp != '\0' && *temp != '/' && *temp != '-' ) { temp++; } if( *temp != '\0' ) { *temp = '\0'; temp++; if( *temp != 'q' && *temp != 'Q' ) { HCWarning( USAGE ); return( -1 ); } else { temp++; while( *temp != '\0' && isspace( *temp ) ) { temp++; } if( *temp != '\0' ){ HCWarning( USAGE ); return( -1 ); } else { quiet = 1; } } } } SetQuiet( quiet ); // Parse the given filename. char path[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _fullpath( path, pfilename, _MAX_PATH ); _splitpath( path, drive, dir, fname, ext ); if( stricmp( ext, PhExt ) == 0 || stricmp( ext, HlpExt ) == 0 ) { HCWarning( BAD_EXT ); return( -1 ); } if( ext[0] == '\0' ){ _makepath( path, drive, dir, fname, HpjExt ); } char destpath[_MAX_PATH]; _makepath( destpath, drive, dir, fname, HlpExt ); InFile input( path ); if( input.bad() ) { HCWarning( FILE_ERR, pfilename ); return( -1 ); } // Set up and start the help compiler. try { HFSDirectory helpfile( destpath ); HFFont fontfile( &helpfile ); HFContext contfile( &helpfile ); HFSystem sysfile( &helpfile, &contfile ); HFCtxomap ctxfile( &helpfile, &contfile ); HFTtlbtree ttlfile( &helpfile ); HFKwbtree keyfile( &helpfile ); HFBitmaps bitfiles( &helpfile ); Pointers my_files = { NULL, NULL, &sysfile, &fontfile, &contfile, &ctxfile, &keyfile, &ttlfile, &bitfiles, }; if( stricmp( ext, RtfExt ) == 0 ) { my_files._topFile = new HFTopic( &helpfile ); RTFparser rtfhandler( &my_files, &input ); rtfhandler.Go(); } else { HPJReader projfile( &helpfile, &my_files, &input ); projfile.parseFile(); } helpfile.dump(); if( my_files._topFile != NULL ) { delete my_files._topFile; } if( my_files._phrFile != NULL ) { delete my_files._phrFile; } } catch( HCException ) { HCWarning( PROGRAM_STOPPED ); return( -1 ); } return( 0 ); }
void HPJReader::parseFile() { HCStartFile( _scanner.name() ); int length = _scanner.getLine(); // Get the first line. char section[15]; int i; while( length != 0 ){ // The first line had better be the beginning of a section. if( _scanner[0] != '[' ){ HCWarning( HPJ_NOTSECTION, _scanner.lineNum(), _scanner.name() ); length = skipSection(); continue; } // Read in the name of the section. for( i=1; i < length ; i++ ){ if( _scanner[i] == ']' ) break; section[i-1] = (char) toupper( _scanner[i] ); } // If the section name wasn't terminated properly, skip the section. if( i == length ){ HCWarning( HPJ_BADSECTION, _scanner.lineNum(), _scanner.name() ); length = skipSection(); continue; } section[i-1] = '\0'; // Pass control to the appropriate "section handler". if( strcmp( section, SBaggage ) == 0 ){ length = handleBaggage(); } else if( strcmp( section, SOptions ) == 0 ){ length = handleOptions(); } else if( strcmp( section, SConfig ) == 0 ){ length = handleConfig(); } else if( strcmp( section, SFiles ) == 0 ){ length = handleFiles(); } else if( strcmp( section, SMap ) == 0 ){ length = handleMap(); } else if( strcmp( section, SBitmaps ) == 0 ){ length = handleBitmaps(); } else if( strcmp( section, SWindows ) == 0 ){ length = handleWindows(); } else { HCWarning( HPJ_BADSECTION, _scanner.lineNum(), _scanner.name() ); length = skipSection(); } } if( _rtfFiles == NULL ){ HCError( HPJ_NOFILES ); } // Now parse individual RTF files. StrNode *curfile = _rtfFiles; StrNode *curdir; InFile source; // First, implement phrase replacement if desired. if( _theFiles->_sysFile->isCompressed() ){ _topFile = _rtfFiles; _firstDir = _root; _startDir = _homeDir; _theFiles->_phrFile = new HFPhrases( _dir, &firstFile, &nextFile ); char full_path[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _fullpath( full_path, _scanner.name(), _MAX_PATH ); _splitpath( full_path, drive, dir, fname, ext ); _makepath( full_path, drive, dir, fname, PhExt ); if( !_oldPhrases || !_theFiles->_phrFile->oldTable(full_path) ){ _theFiles->_phrFile->readPhrases(); _theFiles->_phrFile->createQueue( full_path ); } } _theFiles->_topFile = new HFTopic( _dir, _theFiles->_phrFile ); // For each file, search the ROOT path, and create a RTFparser // to deal with it. curfile = _rtfFiles; while( curfile != NULL ){ curdir = _root; if( curdir == NULL ){ source.open( curfile->_name ); } else while( curdir != NULL ){ chdir( curdir->_name ); source.open( curfile->_name ); chdir( _homeDir ); if( !source.bad() ) break; curdir = curdir->_next; } if( source.bad() ){ HCWarning( FILE_ERR, curfile->_name ); } else { RTFparser rtfhandler( _theFiles, &source ); rtfhandler.Go(); source.close(); } curfile = curfile->_next; } }