예제 #1
0
//---------------------------------------------------------------------------
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);
}
예제 #2
0
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;
}
예제 #3
0
파일: stringmanip.c 프로젝트: pfeilbr/repo
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));
}
예제 #4
0
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();
}
예제 #5
0
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);
}