"Fossies" - the Fresh Open Source Software Archive

Member "namefix.pl/libs/dir.pm" (12 Sep 2009, 6607 Bytes) of package /linux/privat/old/namefix.pl_4.0.2.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "dir.pm" see the Fossies "Dox" file reference documentation.

    1 # =============================================================================================================
    2 # directory listing related functions
    3 # =============================================================================================================
    4 
    5 use strict;
    6 use warnings;
    7 
    8 #--------------------------------------------------------------------------------------------------------------
    9 # List Directory
   10 #--------------------------------------------------------------------------------------------------------------
   11 
   12 sub ls_dir 
   13 {
   14     &plog(3, "sub ls_dir");
   15     &prep_globals;
   16     &hlist_clear;
   17     
   18     if($main::LISTING)
   19     {
   20         &plog(0, "sub ls_dir: Allready preforming a list, aborting new list attempt");
   21         return 0;
   22     }
   23 
   24     $main::STOP = 0;
   25     $main::LISTING = 1;
   26     chdir $main::dir;   # shift directory, not just list ;)
   27     $main::dir = cwd(); 
   28 
   29         my @file_list = ();
   30         my @dirlist = &dir_filtered($main::dir);
   31 
   32     &ls_dir_print("..");
   33 
   34         if($main::recr) 
   35         {
   36         &plog(4, "sub ls_dir: recursive mode");
   37         @main::find_arr = ();
   38             find(\&find_fix, "$main::dir");
   39         &ls_dir_find_fix;
   40                 $main::LISTING = 0;
   41                 $main::FIRST_DIR_LISTED = 0;
   42             return;
   43         }
   44         else 
   45         {
   46         &plog(4, "sub ls_dir: non recursive mode");
   47             for(@dirlist) 
   48             {
   49             if($_ eq "..")
   50             {
   51                 next;
   52             }
   53                     if(-d $_) 
   54                     {
   55                         &ls_dir_print($_);  # print directorys 1st
   56                         }
   57                         else 
   58                         {
   59                             push @file_list, $_;    # push files to array
   60                         }
   61                 }
   62                 for(@file_list) 
   63                 {
   64                     if($main::STOP == 1)
   65             {
   66                 return 0;
   67             }
   68                     &ls_dir_print($_);      # then print the file array after all dirs have been printed
   69                 }
   70                 $main::LISTING = 0;
   71                 $main::FIRST_DIR_LISTED = 0;
   72                 return;
   73         }
   74 }
   75 
   76 #--------------------------------------------------------------------------------------------------------------
   77 # ls_dir_print
   78 #--------------------------------------------------------------------------------------------------------------
   79 
   80 sub ls_dir_find_fix
   81 {
   82     # this sub should recieve an array of files from find_fix
   83 
   84     my @list = @main::find_arr;
   85     my $d = cwd();
   86     my $file = "";
   87     my $dir = "";
   88 
   89     &plog(3, "sub ls_dir_find_fix:");
   90 
   91     for $file(@main::find_arr)
   92     {
   93         &plog(4, "sub ls_dir_find_fix: list line \"$file\"");
   94         $file =~ m/^(.*)\/(.*?)$/;
   95         $dir = $1;
   96         $file = $2;
   97         &plog(4, "sub ls_dir_find_fix: dir = \"$dir\"");
   98         &plog(4, "sub ls_dir_find_fix: file = \"$file\"");
   99 
  100         chdir $dir; # change to dir containing file
  101         &ls_dir_print($file);
  102         chdir $d;   # change back to dir sub started in
  103     }
  104     &plog(3, "sub find_fix_process: done");
  105     return 1;
  106 }
  107 
  108 
  109 # this function is only called from ls_dir & ls_dir_find_fix
  110 
  111 sub ls_dir_print
  112 {
  113     my $file = shift;
  114 
  115     if($main::STOP == 1)
  116     {
  117         &plog(4, "sub ls_dir_print: \$main::STOP = \"$main::STOP\" - not printing");
  118         return 0;
  119     }
  120     &plog(3, "sub ls_dir_print: \"$file\"");
  121     
  122     $main::hlist_cwd = cwd;
  123     
  124         my $tag = "";
  125         my $art = "";
  126         my $tit = "";
  127         my $tra = "";
  128         my $alb = "";
  129         my $com = "";
  130         my $gen = "";
  131         my $year = "";
  132     my $d = cwd();
  133 
  134         if(!$file || $file eq "" || $file eq ".")
  135         {
  136         &plog(4, "sub ls_dir_print: \$file = \"$file\" not printing");
  137             return;
  138         }
  139 
  140     if($file eq "..")
  141     {
  142         &nf_print("..", "..");
  143         return;
  144     }
  145 
  146     # recursive padding
  147 
  148     # when doing recursive, pad new dir with a blank line
  149     # since when doing recursive we step through each directory while listing, 
  150     # we simply print cwd for a full dir path.
  151 
  152     if(-d $file && $main::recr)     
  153     {
  154         &nf_print(" ", "<MSG>");
  155         &nf_print("$d/$file", "$d/$file");
  156         return;
  157     }
  158 
  159     # if is mp3 & id3_mode enabled then grab id3 tags
  160     if($file =~ /.*\.mp3$/i && $main::id3_mode == 1) 
  161     {
  162         &plog(4, "sub ls_dir_print: if is mp3 & id3_mode enabled then grab id3 tags");
  163         ($tag, $art, $tit, $tra, $alb, $gen, $year, $com) = &get_tags($file);
  164 
  165             if ($tag eq "id3v1") 
  166             {
  167             &plog(4, "sub ls_dir_print: got id3 tags, printing");
  168             &nf_print($file, $file, $art, $tit, $tra, $alb, $com, $gen, $year);
  169             return;
  170         }
  171     }
  172 
  173     &plog(4, "sub ls_dir_print: doesnt meet any special conditions, just print it");
  174     &nf_print($file, $file);
  175 }
  176 
  177 #--------------------------------------------------------------------------------------------------------------
  178 # Dir Dialog
  179 #--------------------------------------------------------------------------------------------------------------
  180 
  181 sub dir_dialog 
  182 {
  183     &plog(3, "sub dir_dialog");
  184     my $old_dir = $main::dir;
  185 
  186     my $dd_dir = $main::mw->chooseDirectory
  187     (
  188         -initialdir=>$main::dir,
  189         -title=>"Choose a directory"
  190     );
  191 
  192     if($dd_dir) 
  193     {
  194         $main::dir = $dd_dir;
  195                 chdir $main::dir;
  196         &ls_dir;
  197     }
  198     else 
  199     {
  200         $main::dir = $old_dir;
  201     }
  202 }
  203 
  204 #--------------------------------------------------------------------------------------------------------------
  205 # fn_readdir, also removes . and .. from listing which nf needs
  206 #--------------------------------------------------------------------------------------------------------------
  207 
  208 sub fn_readdir
  209 {
  210     &plog(3, "sub fn_readdir");
  211     my $dir = shift;
  212     my @dirlist = ();
  213     my @dirlist_clean = ();
  214     my @d = ();
  215 
  216     opendir(DIR, "$dir") or die "can't open dir \"$dir\": $!";
  217     @dirlist = CORE::readdir(DIR);
  218     closedir DIR;
  219 
  220     # -- make sure we dont have . and .. in array --
  221     for my $item(@dirlist)
  222     {
  223         if($item eq "." || $item eq "..")
  224         {
  225             next;
  226         }
  227         push @dirlist_clean, $item;
  228     }
  229 
  230     @dirlist = &ci_sort(@dirlist);  # sort array
  231     return @dirlist;
  232 }
  233 
  234 sub dir_filtered
  235 {
  236     my $dir = shift;
  237     my @d = ();
  238     my @dirlist = &fn_readdir($dir);
  239 
  240     &plog(3, "sub dir_filtered \"$dir\"");  
  241 
  242     for my $i(@dirlist)
  243     {
  244         if(-d $i && (!$main::LISTING && !$main::proc_dirs)) # ta tibbsy for help
  245         {
  246             &plog(4, "sub dir_filtered: $i is dir, didnt pass");
  247             next;
  248         }
  249         if($main::FILTER)
  250         {
  251             if(&match_filter($i) == 1)  # apply listing filter
  252             {   
  253                 &plog(4, "sub dir_filtered: $i passed");
  254                 push @d, $i;
  255                 next;
  256             }
  257             else
  258             {
  259                 &plog(4, "sub dir_filtered: $i didnt pass");
  260                 next;
  261             }
  262         }
  263         else
  264         {
  265             push @d, $i;
  266             next;
  267         }
  268     }
  269     return @d;
  270 }
  271 
  272 1;