"Fossies" - the Fresh Open Source Software Archive 
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;