Esempio n. 1
0
void CFileContainerArc::List(CFileList &list, const char *mask, unsigned flags)
{
	TString<256> Path; Path = mask;
	char *name = Path.rchr('/');
	FDirInfo *Dir;
	if (name)
	{
		*name++ = 0;
		Dir = FindDir(Path);
		if (!Dir) return;			// directory not found
	}
	else
	{
		name = Path;
		Dir  = &Root;
	}
	// list directories and files
#if FS_DIR != FS_FILE<<1
#error Check FS_DIR / FS_FILE relationship
#endif
	for (unsigned Flag = FS_FILE; Flag <= FS_DIR; Flag <<= 1)
	{
		if (!(flags & Flag)) continue;

		CListIterator it;
		if (Flag == FS_FILE)		// cannot write this as "it = (Flag == FS_FILE) ? ..."
			it = Dir->Files;
		else
			it = Dir->Dirs;

		for ( ; it; ++it)
		{
			if (!appMatchWildcard(it->name, name)) continue;

			TString<256> Name; Name = it->name;
			// process NOEXT
			if (flags & FS_NOEXT)
			{
				char *s = Name.rchr('.');
				if (s) *s = 0;
			}

			CFileItem *item, *place;
			if (!(item = list.Find(Name, &place)))
			{
				item = new (Name, &list) CFileItem;
				// here: item->flags=0
				list.InsertAfter(item, place);
			}
			item->flags |= containFlags|Flag;
		}
	}
}
Esempio n. 2
0
CFileContainerArc::FFileInfo *CFileContainerArc::FindFile(const char *filename)
{
	TString<256> Path; Path = filename;
	char *name = Path.rchr('/');
	FDirInfo *Dir;
	if (name)
	{
		*name++ = 0;				// cut filename from path
		Dir = FindDir(Path);
		if (!Dir) return NULL;		// directory not found - file does not exists too
	}
	else
	{
		name = const_cast<char*>(filename);
		Dir = &Root;
	}

	return Dir->Files.Find(name);
}
Esempio n. 3
0
void noAnimal::StandardWalking()
{
    // neuen Weg suchen
    unsigned char dir = FindDir();
    if( dir == 0xFF)
    {
        // Sterben, weil kein Weg mehr gefunden wurde
        Die();
        // Jäger ggf. Bescheid sagen (falls der es nicht mehr rechtzeitig schafft, bis ich verwest bin)
        if(hunter)
        {
            hunter->AnimalLost();
            hunter = 0;
        }
    }
    else
    {
        // weiterlaufen
        StartWalking(dir);
    }
}
Esempio n. 4
0
farfile_t FAR_GetFile(far_t hArc, const char* path)
{
	FARobj_t* pArc = F(hArc);
	if (*path == '/') path ++;

	FARentry_t* entArr = pArc->entries;
	int entNum = pArc->ntopentries;

	for (;;)
	{
		char* endPos = strchr(path, '/');
		if (endPos)
		{
			// Directory
			int z = endPos - path;
			char buf[z + 1];
			memcpy(buf, path, z); buf[z] = 0;
			FARentry_t* eDir = FindDir(pArc, entArr, entNum, buf);
			if (!eDir) return NULL;
			entArr = (FARentry_t*)((byte_t*)pArc->entries + eDir->dataoff - sizeof(FARheader_t));
			entNum = eDir->size;
			path = endPos + 1;
			continue;
		}

		FARentry_t* eFile = FindFile(pArc, entArr, entNum, path);
		if (!eFile) return NULL;

		FARfileobj_t* pFile = new_FF();
		if (!pFile) return NULL;

		pFile->a = pArc;
		pFile->size = eFile->size;
		pFile->base = eFile->dataoff;
		pFile->pos = 0;
		return pFile;
	}
}
Esempio n. 5
0
void Tempfile::MakeTemp()
{
  if ((fd = mkstemp(file)) < 0) {
    f = NULL;
    goto error;    
  }

  if (this->useFopen) {
    if ((f = fdopen(fd, "w+b")) == NULL)
      goto error;
  }
  
  fchmod(fd, S_IRUSR | S_IWUSR);

  error = 0;
  return;

error:
  putlog(LOG_ERRORS, "*", "Couldn't create temporary file '%s': %s", file, strerror(errno));
  error = 1;
  /* Since we failed to create a file in the given tempdir, let's try finding a new one */
  if (!looking) {
    /* ... Not finding a new tempdir is fatal. */
    if (FindDir() == ERROR) {
      delete[] file;
      file = NULL;
      return;
    }
    /* ... If we found one, let's try all over! */
    else {
      error = 0;
      delete[] file;
      file = NULL;
      AllocTempfile();
    }
  }
}