Example #1
0
// reads all pak files from a dir
void vfsInitDirectory(const char *path)
{
	char            filename[PATH_MAX];
	char           *dirlist;
	GDir           *dir;

	if(g_numDirs == (VFS_MAXDIRS - 1))
		return;

	Sys_Printf("VFS Init: %s\n", path);

	strcpy(g_strDirs[g_numDirs], path);
	vfsFixDOSName(g_strDirs[g_numDirs]);
	vfsAddSlash(g_strDirs[g_numDirs]);
	g_numDirs++;

	if(g_bUsePak)
	{
		dir = g_dir_open(path, 0, NULL);

		if(dir != NULL)
		{
			while(1)
			{
				const char     *name = g_dir_read_name(dir);

				if(name == NULL)
					break;

				dirlist = g_strdup(name);

				{
					char           *ext = strrchr(dirlist, '.');

					if(ext && !Q_stricmp(ext, ".pk3dir")) 
					{
						if(g_numDirs == VFS_MAXDIRS)
							continue;
						//snprintf(g_strDirs[g_numDirs], PATH_MAX, "%s/%s", path, name);
						sprintf(g_strDirs[g_numDirs], "%s/%s", path, name);
						Sys_Printf("VFS Init: %s (pk3dir)\n", g_strDirs[g_numDirs]);
						g_strDirs[g_numDirs][PATH_MAX] = '\0';
						vfsFixDOSName (g_strDirs[g_numDirs]);
						vfsAddSlash (g_strDirs[g_numDirs]);
						++g_numDirs;
					}

					if((ext == NULL) || (Q_stricmp(ext, ".pk3") != 0))
						continue;
				}

				sprintf(filename, "%s/%s", path, dirlist);
				vfsInitPakFile(filename);

				g_free(dirlist);
			}
			g_dir_close(dir);
		}
	}
}
Example #2
0
void vfsInitDirectory (const char *path)
{
  char filename[PATH_MAX];
  //struct dirent *direntry;
  GDir *dir;
  GSList *dirlist = NULL;

  if (g_numDirs == (VFS_MAXDIRS-1))
    return;

  strcpy (g_strDirs[g_numDirs], path);
  vfsFixDOSName (g_strDirs[g_numDirs]);
  vfsAddSlash (g_strDirs[g_numDirs]);
  g_numDirs++;

  if (g_bUsePak)
  {
    dir = g_dir_open (path, 0, NULL);
    if (dir != NULL)
    {
      g_FuncTable.m_pfnSysPrintf("vfs directory: %s\n", path);

	  for(;;)
      {
        const char* name = g_dir_read_name(dir);
        if(name == NULL)
          break;

        char *ext = strrchr (name, '.');
        if ((ext == NULL) || (strcasecmp (ext, ".pak") != 0))
          continue;

        char* direntry = g_strdup(name);
		dirlist = g_slist_append (dirlist, direntry);
      }

      g_dir_close (dir);


      // sort them
      dirlist = g_slist_sort (dirlist, vfsPakSort);

      // add the entries to the vfs and free the list
      while (dirlist)
      {
        GSList *cur = dirlist;
        char* name = (char*)cur->data;

        sprintf (filename, "%s/%s", path, name);
        vfsInitPakFile (filename);

        g_free (name);
        dirlist = g_slist_remove (cur, name);
      }
    } else
          g_FuncTable.m_pfnSysFPrintf(SYS_WRN, "vfs directory not found: %s\n", path);

  }
}
Example #3
0
// reads all pak files from a dir
void vfsInitDirectory( const char *path ){
	char filename[PATH_MAX];

	if ( g_numDirs == ( VFS_MAXDIRS - 1 ) ) {
		return;
	}

	strcpy( g_strDirs[g_numDirs], path );
	vfsFixDOSName( g_strDirs[g_numDirs] );
	vfsAddSlash( g_strDirs[g_numDirs] );
	g_numDirs++;

//  if (g_PrefsDlg.m_bPAK)
	// TODO: can't read prefs from a module, bah..
	if ( 1 ) {
		GDir* dir = g_dir_open( path, 0, NULL );
		if ( dir != NULL ) {
			g_FuncTable.m_pfnSysPrintf( "vfs directory: %s\n", path );
			while ( 1 )
			{
				const char* name = g_dir_read_name( dir );
				if ( name == NULL ) {
					break;
				}

				const char *ext = strrchr( name, '.' );
				if ( ( ext == NULL ) || ( strcmp( ext, ".wad" ) != 0 ) ) {
					continue;
				}

				sprintf( filename, "%s/%s", path, name );
				vfsInitPakFile( filename );
			}
			g_dir_close( dir );
		}
		else{
			g_FuncTable.m_pfnSysFPrintf( SYS_WRN, "vfs directory not found: %s\n", path );
		}
	}
}
Example #4
0
/*!
   The gamemode hacks in here will do undefined things with files called zz_*.
   This is simple to fix by cleaning up the hacks, but may be better left alone
   if the engine code does the same thing.
 */
void vfsInitDirectory( const char *path ){
	char filename[PATH_MAX];
	GDir *dir;
	GSList *dirlist = NULL;
	int iGameMode; // 0: no filtering 1: SP 2: MP

	if ( g_numDirs == ( VFS_MAXDIRS - 1 ) ) {
		return;
	}

	// See if we are in "sp" or "mp" mapping mode
	const char* gamemode = g_FuncTable.m_pfnReadProjectKey( "gamemode" );

	if ( gamemode ) {
		if ( strcmp( gamemode, "sp" ) == 0 ) {
			iGameMode = 1;
		}
		else if ( strcmp( gamemode, "mp" ) == 0 ) {
			iGameMode = 2;
		}
		else{
			iGameMode = 0;
		}
	}
	else{
		iGameMode = 0;
	}

	strcpy( g_strDirs[g_numDirs], path );
	vfsFixDOSName( g_strDirs[g_numDirs] );
	vfsAddSlash( g_strDirs[g_numDirs] );
	g_numDirs++;

	if ( g_bUsePak ) {
		dir = g_dir_open( path, 0, NULL );

		if ( dir != NULL ) {
			g_FuncTable.m_pfnSysPrintf( "vfs directory: %s\n", path );

			for (;; )
			{
				const char* name = g_dir_read_name( dir );
				if ( name == NULL ) {
					break;
				}

				char *ext = (char*)strrchr( name, '.' );
				if ( ( ext == NULL ) || ( strcasecmp( ext, ".pk3" ) != 0 ) ) {
					continue;
				}

				char* direntry = g_strdup( name );

				// using the same kludge as in engine to ensure consistency
				switch ( iGameMode )
				{
				case 1: // SP
					if ( strncmp( direntry,"sp_",3 ) == 0 ) {
						memcpy( direntry,"zz",2 );
					}
					break;
				case 2: // MP
					if ( strncmp( direntry,"mp_",3 ) == 0 ) {
						memcpy( direntry,"zz",2 );
					}
					break;
				}

				dirlist = g_slist_append( dirlist, direntry );
			}

			g_dir_close( dir );

			// sort them
			dirlist = g_slist_sort( dirlist, vfsPakSort );

			// add the entries to the vfs and free the list
			while ( dirlist )
			{
				GSList *cur = dirlist;
				char* name = (char*)cur->data;

				switch ( iGameMode )
				{
				case 1: // SP
					if ( strncmp( name,"mp_",3 ) == 0 ) {
						g_free( name );
						dirlist = g_slist_remove( cur, name );
						continue;
					}
					else if ( strncmp( name,"zz_",3 ) == 0 ) {
						memcpy( name,"sp",2 );
					}
					break;
				case 2: // MP
					if ( strncmp( name,"sp_",3 ) == 0 ) {
						g_free( name );
						dirlist = g_slist_remove( cur, name );
						continue;
					}
					else if ( strncmp( name,"zz_",3 ) == 0 ) {
						memcpy( name,"mp",2 );
					}
					break;
				}

				sprintf( filename, "%s/%s", path, name );
				vfsInitPakFile( filename );

				g_free( name );
				dirlist = g_slist_remove( cur, name );
			}
		}
		else{
			g_FuncTable.m_pfnSysFPrintf( SYS_WRN, "vfs directory not found: %s\n", path );
		}
	}
}
Example #5
0
static GSList* vfsGetListInternal( const char *refdir, const char *ext, bool directories ){
	GSList *lst, *lst_aux, *files = NULL;
	char dirname[NAME_MAX], extension[NAME_MAX], filename[NAME_MAX];
	char basedir[NAME_MAX];
	int dirlen;
	char *ptr;
	char *dirlist;
	struct stat st;
	GDir *diskdir;
	int i;

	if ( refdir != NULL ) {
		strcpy( dirname, refdir );
		strlwr( dirname );
		vfsFixDOSName( dirname );
		vfsAddSlash( dirname );
	}
	else{
		dirname[0] = '\0';
	}
	dirlen = strlen( dirname );

	if ( ext != NULL ) {
		strcpy( extension, ext );
	}
	else{
		extension[0] = '\0';
	}
	strlwr( extension );

	for ( lst = g_pakFiles; lst != NULL; lst = g_slist_next( lst ) )
	{
		VFS_PAKFILE* file = (VFS_PAKFILE*)lst->data;
		gboolean found = FALSE;
		ptr = file->name;

		// check that the file name begins with dirname
		for ( i = 0; ( *ptr && i < dirlen ); i++, ptr++ )
			if ( *ptr != dirname[i] ) {
				break;
			}

		if ( i != dirlen ) {
			continue;
		}

		if ( directories ) {
			char *sep = strchr( ptr, '/' );
			if ( sep == NULL ) {
				continue;
			}

			i = sep - ptr;

			// check for duplicates
			for ( lst_aux = files; lst_aux; lst_aux = g_slist_next( lst_aux ) )
				if ( strncmp( (char*)lst_aux->data, ptr, i ) == 0 ) {
					found = TRUE;
					break;
				}

			if ( !found ) {
				char *name = g_strndup( ptr, i + 1 );
				name[i] = '\0';
				files = g_slist_append( files, name );
			}
		}
		else
		{
			// check extension
			char *ptr_ext = strrchr( ptr, '.' );
			if ( ( ext != NULL ) && ( ( ptr_ext == NULL ) || ( strcmp( ptr_ext + 1, extension ) != 0 ) ) ) {
				continue;
			}

			// check for duplicates
			for ( lst_aux = files; lst_aux; lst_aux = g_slist_next( lst_aux ) )
				if ( strcmp( (char*)lst_aux->data, ptr ) == 0 ) {
					found = TRUE;
					break;
				}

			if ( !found ) {
				files = g_slist_append( files, g_strdup( ptr ) );
			}
		}
	}

	for ( i = 0; i < g_numDirs; i++ )
	{
		strcpy( basedir, g_strDirs[i] );
		strcat( basedir, dirname );

		diskdir = g_dir_open( basedir, 0, NULL );

		if ( diskdir != NULL ) {
			while ( 1 )
			{
				const char* name = g_dir_read_name( diskdir );
				if ( name == NULL ) {
					break;
				}

				if ( directories && ( name[0] == '.' ) ) {
					continue;
				}

				sprintf( filename, "%s%s", basedir, name );
				stat( filename, &st );

				if ( ( S_ISDIR( st.st_mode ) != 0 ) != directories ) {
					continue;
				}

				gboolean found = FALSE;

				dirlist = g_strdup( name );

				strlwr( dirlist );

				char *ptr_ext = strrchr( dirlist, '.' );
				if ( ext == NULL
					 || ( ext != NULL && ptr_ext != NULL && ptr_ext[0] != '\0' && strcmp( ptr_ext + 1, extension ) == 0 ) ) {

					// check for duplicates
					for ( lst_aux = files; lst_aux; lst_aux = g_slist_next( lst_aux ) )
						if ( strcmp( (char*)lst_aux->data, dirlist ) == 0 ) {
							found = TRUE;
							break;
						}

					if ( !found ) {
						files = g_slist_append( files, g_strdup( dirlist ) );
					}
				}

				g_free( dirlist );
			}
			g_dir_close( diskdir );
		}
	}

	return files;
}