-static int vg_dir_open( vg_dir *dir, const char *name ){
-#ifdef _WIN32
- char q_buf[4096];
- vg_str q;
- vg_strnull( &q, q_buf, 4096 );
- vg_strcat( &q, name );
- vg_strcat( &q, "/*" );
- if( !vg_strgood(&q) ) return 0;
-
- vg_info( "FindFirstFile( '%s' )\n", q.buffer );
- dir->h = FindFirstFile( q.buffer, &dir->data );
- if( dir->h == INVALID_HANDLE_VALUE ){
- if( GetLastError() == ERROR_FILE_NOT_FOUND ){
- dir->index = 0;
- return 1;
- }
- else return 0;
- }
-#else
- dir->h = opendir( name );
- if( !dir->h ) return 0;
-#endif
- dir->index = 1;
- return 1;
-}
-
-static const char *vg_dir_entry_name( vg_dir *dir ){
-#ifdef _WIN32
- return dir->data.cFileName;
-#else
- return dir->data->d_name;
-#endif
-}
-
-static int vg_dirskip( vg_dir *dir ){
- const char *s = vg_dir_entry_name(dir);
-#ifdef _WIN32
- if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) return 1;
-#endif
- if( s[0] == '.' ){
- if( s[1] == '\0' ) return 1;
- else if( s[1] == '.' ){
- if( s[2] == '\0' ) return 1;
- }
- }
- return 0;
-}
-
-static int vg_dir_next_entry( vg_dir *dir ){
-#ifdef _WIN32
- if( dir->index == 0 ) return 0;
- if( dir->index > 1 ) {
- dir->index ++;
- if( !FindNextFile( dir->h, &dir->data ) ) return 0;
- }
- while( vg_dirskip(dir) ){
- dir->index ++;
- if( !FindNextFile( dir->h, &dir->data ) ) return 0;
- }
- if( dir->index == 1 ) dir->index ++;
- return 1;
-#else
- while( (dir->data = readdir(dir->h)) ){
- dir->index ++;
- if( !vg_dirskip(dir) ) break;
- }
- if( dir->data ) return 1;
- else return 0;
-#endif
-}
-
-static enum vg_entry_type vg_dir_entry_type( vg_dir *dir ){
-#ifdef _WIN32
- if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
- return k_vg_entry_type_dir;
- return k_vg_entry_type_file; /* sketchy? */
-#else
- if( dir->data->d_type == DT_DIR ) return k_vg_entry_type_dir;
- if( dir->data->d_type == DT_REG ) return k_vg_entry_type_file;
-#endif
- return 0;
-}
-
-static void vg_dir_close( vg_dir *dir ){
-#ifdef _WIN32
- if( dir->index ) FindClose( dir->h );
- dir->h = INVALID_HANDLE_VALUE;
-#else
- closedir( dir->h );
- dir->h = NULL;
- dir->data = NULL;
-#endif
- dir->index = 0;
-}
+int vg_dir_open( vg_dir *dir, const char *name );
+const char *vg_dir_entry_name( vg_dir *dir );
+int vg_dirskip( vg_dir *dir );
+int vg_dir_next_entry( vg_dir *dir );
+enum vg_entry_type vg_dir_entry_type( vg_dir *dir );
+void vg_dir_close( vg_dir *dir );
+void vg_file_print_invalid( FILE *fp );