예제 #1
0
char *COM_FindFile(const char *Filename, int* FileLength)
{
    if (!Filename)
        return NULL;

    searchpath_t *Jogger;

    for (Jogger = COM_Searchpaths; Jogger != NULL; Jogger = Jogger->Next)
    {
        pack_t *CurrentPak = Jogger->Pack;

        for (int i = 0; i < CurrentPak->NumberOfFiles; i++)
        {
            if (!strcmp(Filename, CurrentPak->PakFiles[i].FileName))
            {
                Sys_FileSeek(CurrentPak->PackHandle, CurrentPak->PakFiles[i].FilePosition);
                
                char *FileData = (char *)malloc(CurrentPak->PakFiles[i].FileLength);
                Sys_FileRead(CurrentPak->PackHandle, FileData, CurrentPak->PakFiles[i].FileLength);

                if (FileLength)
                    *FileLength = CurrentPak->PakFiles[i].FileLength;
                return (char*)FileData;
            }
        }
    }

    return NULL;
}
예제 #2
0
pack_t *COM_LoadPackFile(char *PakFile)
{
    int PakSize;
    int PakHandle = Sys_FileOpenRead(PakFile, &PakSize);

    if (PakHandle == -1)
    {
        return NULL;
    }

    dpackheader_t PakHeader;

    Sys_FileRead(PakHandle, &PakHeader, sizeof(PakHeader));

    if (PakHeader.Magic[0] != 'P' || PakHeader.Magic[1] != 'A' || PakHeader.Magic[2] != 'C' || PakHeader.Magic[3] != 'K')
    {
        return NULL;
    }

    int NumPackFiles = PakHeader.DirectoryLength / sizeof(dpackfile_t);

    packfile_t* FilesInMemory = malloc(NumPackFiles * sizeof(packfile_t));

    Sys_FileSeek(PakHandle, PakHeader.DirectoryOffset);

    dpackfile_t TempPackFile[MAX_FILES_IN_PACK];
    Sys_FileRead(PakHandle, (void *)TempPackFile, PakHeader.DirectoryLength);

    for (int i = 0; i < NumPackFiles; i++)
    {
        strcpy_s(FilesInMemory[i].FileName, 56, TempPackFile[i].FileName);
        FilesInMemory[i].FileLength = TempPackFile[i].FileLength;
        FilesInMemory[i].FilePosition = TempPackFile[i].FilePosition;
    }

    pack_t  *Pak0 = (void*)malloc(sizeof(pack_t));
    strcpy_s(Pak0->PackName, 64, PakFile);
    Pak0->PackHandle = PakHandle;
    Pak0->NumberOfFiles = NumPackFiles;
    Pak0->PakFiles = FilesInMemory;


    return Pak0;
}
예제 #3
0
파일: model_common.c 프로젝트: Blzut3/Engoo
int Mod_FindExternalVIS (loadedfile_t *brush_fileinfo)
{
	char	visfilename[1024];
	int		fhandle;
	int		len, i, pos;
	searchpath_t	*s_vis;
	vispatch_t	header;
	char	mapname[VISPATCH_MAPNAME_LENGTH+5];	// + ".vis" + EoS

	fhandle = -1;

	if (external_vis->value)
	{
		// check for a .VIS file
		strcpy(visfilename, loadmodel->name);
		COM_StripExtension(visfilename, visfilename);
		strcat(visfilename, ".vis");

		len = COM_OpenFile (visfilename, &fhandle, &s_vis);
		if (fhandle == -1)	// check for a .VIS file with map's directory name (e.g. ID1.VIS)
		{
			strcpy(visfilename, "maps/");
			strcat(visfilename, COM_SkipPath(brush_fileinfo->path->filename));
			strcat(visfilename, ".vis");
			len = COM_OpenFile (visfilename, &fhandle, &s_vis);
		}

		if (fhandle >= 0)
		{
			// check file for size
			if (len <= 0)
			{
				COM_CloseFile(fhandle);
				fhandle = -1;
			}
		}

		if (fhandle >= 0)
		{
			// search map in visfile
			strncpy(mapname, loadname, VISPATCH_MAPNAME_LENGTH);
			mapname[VISPATCH_MAPNAME_LENGTH] = 0;
			strcat(mapname, ".bsp");

			pos = 0;
			while ((i = Sys_FileRead (fhandle, &header, sizeof(struct vispatch_s))) == sizeof(struct vispatch_s))
			{
				header.filelen = LittleLong(header.filelen);

				pos += i;

				if (!Q_strncasecmp (header.mapname, mapname, VISPATCH_MAPNAME_LENGTH))	// found
				{
					break;
				}

				pos += header.filelen;

				Sys_FileSeek(fhandle, pos);
			}

			if (i != sizeof(struct vispatch_s))
			{
				COM_CloseFile(fhandle);
				fhandle = -1;
			}
		}

		if (fhandle >= 0)
		{
			Con_DPrintf("%s for %s loaded from %s\n", visfilename, mapname, s_vis->pack ? s_vis->pack->filename : s_vis->filename);
		}
	}

	return fhandle;
}