bool ImuseChannel::handleSubTags(int32 &offset) { if (_tbufferSize - offset >= 8) { uint32 type = READ_BE_UINT32(_tbuffer + offset); uint32 size = READ_BE_UINT32(_tbuffer + offset + 4); uint32 available_size = _tbufferSize - offset; switch (type) { case MKTAG('M','A','P',' '): _inData = false; if (available_size >= (size + 8)) { handleMap((byte *)_tbuffer + offset); } break; case MKTAG('D','A','T','A'): _inData = true; _dataSize = size; offset += 8; { int reqsize = 1; if (_channels == 2) reqsize *= 2; if (_bitsize == 16) reqsize *= 2; else if (_bitsize == 12) { if (reqsize > 1) reqsize = reqsize * 3 / 2; else reqsize = 3; } if ((size % reqsize) != 0) { debugC(DEBUG_SMUSH, "Invalid iMUS sound data size : (%d %% %d) != 0, correcting...", size, reqsize); size += 3 - (size % reqsize); } } return false; default: error("unknown Chunk in iMUS track : %s ", tag2str(type)); } offset += size + 8; return true; } return false; }
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; } }