//--------------------------------------------------------------------------- void extract_resource(const char *fname) { if ( !initPtrs(fname) ) return; store(NULL, 0); // zero-resource header bool wrerr = false; bool res = extractDirectory(0, 0); if ( !res ) { msg("Can't extract resource (possible it is invalid)\n"); } else { qflush(fr); if ( ferror(fr) || feof(fr) ) wrerr = true; } if ( qfclose(fr) ) wrerr = true; if ( res && wrerr ) msg("Error writing resource file\n"); if ( !res || wrerr ) unlink(fname); else msg("Resources have been extracted and stored in '%s'\n", fname); }
DString FileTools::changeFileExtension(const DString & in_strPath, const DString & in_strExt, char in_cDelimiter) { DString tmp_strFilename = extractFilename(in_strPath, in_cDelimiter); return extractDirectory(in_strPath, in_cDelimiter) + tmp_strFilename.substr(0, tmp_strFilename.find_last_of('.')) + in_strExt; }
int main(int args, char* argv[]) { /* parameter switches */ const char * STRING_KEY = "-string"; const char * OPERATION_KEY = "-operation"; const char * DIRECTORY_LEVEL_KEY = "-directorylevel"; /* argument variables */ char *string, *operation, *directory_level; int level = -2; string = argv[1]; printf("%s", extractDirectory(string, level)); /* iterator variable(s) */ //int i; /* iterate through the arguments and assign parameter values */ /* for (i=0; i<args; i++) { if (strcmp(STRING_KEY,argv[i]) == 0) { string = argv[++i]; } else if (strcmp(OPERATION_KEY,argv[i]) == 0) { operation = argv[++i]; } else if (strcmp(DIRECTORY_LEVEL_KEY,argv[i]) == 0) { directory_level = argv[++i]; } } */ /* perform string manipulation based on argument values */ /*if (strcmp(operation, "extract_directory_path") == 0) { printf("%s", extractDirectory(string, stringToInt(directory_level))); } */ /* debug */ //printf("%d", stringToInt(directory_level)); }
void PackageDialog::extractPackage() { QString s = QFileDialog::getOpenFileName( lastDir.isEmpty() ? QString(".") : lastDir, tr("Qucs Packages")+" (*.qucs);;"+ tr("Any File")+" (*)", this, 0, tr("Enter a Package File Name")); if(s.isEmpty()) { reject(); return; } QFileInfo Info(s); lastDir = Info.dirPath(true); // remember last directory QFile PkgFile(s); if(!PkgFile.open(QIODevice::ReadOnly)) { if(Info.extension().isEmpty()) s += ".qucs"; PkgFile.setName(s); if(!PkgFile.open(QIODevice::ReadOnly)) { MsgText->append(tr("ERROR: Cannot open package!")); ButtClose->setDisabled(false); return; } } QDataStream Stream(&PkgFile); QDir currDir = QucsSettings.QucsHomeDir; QString Version; Q_UINT16 Checksum; Q_UINT32 Code, Length; // First read and check header. QByteArray Content = PkgFile.readAll(); if(strncmp(Content.data(), "Qucs package ", 13) != 0) { MsgText->append(tr("ERROR: File contains wrong header!")); goto ErrorEnd; } Version = QString(Content.data()+13); if(!checkVersion(Version)) { MsgText->append(tr("ERROR: Wrong version number!")); goto ErrorEnd; } // checksum correct ? PkgFile.at(HEADER_LENGTH-2); Stream >> Checksum; *((Q_UINT16*)(Content.data()+HEADER_LENGTH-2)) = 0; if(Checksum != qChecksum(Content.data(), Content.size())) { MsgText->append(tr("ERROR: Checksum mismatch!")); goto ErrorEnd; } Content.resize(0); // dispose memory // work on all files and directories in the package for(;;) { if(PkgFile.atEnd()) break; Stream >> Code >> Length; switch(Code) { case CODE_DIR: if(extractDirectory(PkgFile, Length, currDir) > 0) break; goto ErrorEnd; case CODE_DIR_END: MsgText->append(tr("Leave directory \"%1\"").arg(currDir.absPath())); currDir.cdUp(); break; case CODE_FILE: if(extractFile(PkgFile, Length, currDir) > 0) break; goto ErrorEnd; case CODE_LIBRARY: if(extractLibrary(PkgFile, Length) > 0) break; goto ErrorEnd; default: MsgText->append(tr("ERROR: Package is corrupt!")); goto ErrorEnd; } } MsgText->append(" "); MsgText->append(tr("Successfully extracted package!")); ErrorEnd: MsgText->append(" "); ButtClose->setDisabled(false); PkgFile.close(); }
static bool extractEntry(uint32 off, int level, bool named) { IMAGE_RESOURCE_DIRECTORY_ENTRY rde; if ( off + sizeof(rde) >= ResTop ) return false; if ( !get_many_bytes(ResBase + off, &rde, sizeof(rde)) ) return false; if ( (bool)rde.NameIsString != named ) return false; if ( (bool)rde.DataIsDirectory != (level != 2) ) return false; off += sizeof(rde); if ( !named ) { Names[level].Id = rde.Id; } else { ea_t npos = rde.NameOffset; if( npos < off || npos + 2 >= ResTop ) return false; uint32 nlen = get_word(npos + ResBase)*sizeof(wchar_t); if ( !nlen || npos + nlen > ResTop ) return false; wchar_t *p = (wchar_t *)qalloc(nlen + sizeof(wchar_t)); if ( p == NULL ) { msg("Not enough memory for resource names\n"); return false; } if ( !get_many_bytes(npos + sizeof(uint16) + ResBase, p, nlen) ) { bad_name: qfree(p); return false; } p[nlen/sizeof(wchar_t)] = 0; size_t wlen = wcslen(p); if ( !wlen || wlen < nlen/2-1 ) goto bad_name; Names[level].name = p; Names[level].len = uint32((wlen+1)*sizeof(wchar_t)); } if ( level != 2 ) { bool res = false; if ( rde.OffsetToDirectory >= off ) res = extractDirectory(rde.OffsetToDirectory, level+1); if ( Names[level].len ) qfree(Names[level].name); Names[level].name = NULL; Names[level].len = 0; return res; } if ( rde.OffsetToData < off ) return false; return extractData(rde.OffsetToData); }