1#**************************************************************
2#
3#  Licensed to the Apache Software Foundation (ASF) under one
4#  or more contributor license agreements.  See the NOTICE file
5#  distributed with this work for additional information
6#  regarding copyright ownership.  The ASF licenses this file
7#  to you under the Apache License, Version 2.0 (the
8#  "License"); you may not use this file except in compliance
9#  with the License.  You may obtain a copy of the License at
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
12#
13#  Unless required by applicable law or agreed to in writing,
14#  software distributed under the License is distributed on an
15#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16#  KIND, either express or implied.  See the License for the
17#  specific language governing permissions and limitations
18#  under the License.
19#
20#**************************************************************
21
22
23
24package installer::converter;
25
26use installer::globals;
27
28#############################
29# Converter
30#############################
31
32sub convert_array_to_hash
33{
34	my ($arrayref) = @_;
35
36	my %newhash = ();
37
38	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
39	{
40		my $line = ${$arrayref}[$i];
41
42		if ( $line =~ /^\s*([\w-]+?)\s+(.*?)\s*$/ )
43		{
44			my $key = $1;
45			my $value = $2;
46			$newhash{$key} = $value;
47		}
48	}
49
50	return \%newhash;
51}
52
53sub convert_hash_into_array
54{
55	my ($hashref) = @_;
56
57	my @array = ();
58	my $key;
59
60	foreach $key (keys %{$hashref})
61	{
62		my $value = $hashref->{$key};
63		my $input = "$key = $value\n";
64		push(@array ,$input);
65	}
66
67	return \@array
68}
69
70#############################################################################
71# Converting a string list with separator $listseparator
72# into an array
73#############################################################################
74
75sub convert_stringlist_into_array_without_linebreak_and_quotes
76{
77	my ( $includestringref, $listseparator ) = @_;
78
79	my @newarray = ();
80	my $first;
81	my $last = ${$includestringref};
82
83	while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/)	# "$" for minimal matching
84	{
85		$first = $1;
86		$last = $2;
87		$first =~ s/\"//g;
88		push(@newarray, $first);
89	}
90
91	$last =~ s/\"//g;
92	push(@newarray, $last);
93
94	return \@newarray;
95}
96
97#############################################################################
98# Converting a string list with separator $listseparator
99# into an array
100#############################################################################
101
102sub convert_stringlist_into_array
103{
104	my ( $includestringref, $listseparator ) = @_;
105
106	my @newarray = ();
107	my $first;
108	my $last = ${$includestringref};
109
110	while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/)	# "$" for minimal matching
111	{
112		$first = $1;
113		$last = $2;
114		# Problem with two directly following listseparators. For example a path with two ";;" directly behind each other
115		$first =~ s/^$listseparator//;
116		push(@newarray, "$first\n");
117	}
118
119	push(@newarray, "$last\n");
120
121	return \@newarray;
122}
123
124#############################################################################
125# Converting a string list with separator $listseparator
126# into an array
127#############################################################################
128
129sub convert_stringlist_into_array_without_newline
130{
131	my ( $includestringref, $listseparator ) = @_;
132
133	my @newarray = ();
134	my $first;
135	my $last = ${$includestringref};
136
137	while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/)	# "$" for minimal matching
138	{
139		$first = $1;
140		$last = $2;
141		push(@newarray, "$first");
142	}
143
144	push(@newarray, "$last");
145
146	return \@newarray;
147}
148
149#############################################################################
150# Converting a string list with separator $listseparator
151# into a hash with values 1.
152#############################################################################
153
154sub convert_stringlist_into_hash
155{
156	my ( $includestringref, $listseparator ) = @_;
157
158	my %newhash = ();
159	my $first;
160	my $last = ${$includestringref};
161
162	while ( $last =~ /^\s*(.+?)\Q$listseparator\E(.+)\s*$/)	# "$" for minimal matching
163	{
164		$first = $1;
165		$last = $2;
166		$newhash{$first} = 1;
167	}
168
169	$newhash{$last} = 1;
170
171	return \%newhash;
172}
173
174#############################################################################
175# Converting a string list with separator $listseparator
176# into an array
177#############################################################################
178
179sub convert_whitespace_stringlist_into_array
180{
181	my ( $includestringref ) = @_;
182
183	my @newarray = ();
184	my $first;
185	my $last = ${$includestringref};
186
187	while ( $last =~ /^\s*(\S+?)\s+(\S+)\s*$/)	# "$" for minimal matching
188	{
189		$first = $1;
190		$last = $2;
191		push(@newarray, "$first\n");
192	}
193
194	push(@newarray, "$last\n");
195
196	return \@newarray;
197}
198
199#############################################################################
200# Converting an array into a comma separated string
201#############################################################################
202
203sub convert_array_to_comma_separated_string
204{
205	my ( $arrayref ) = @_;
206
207	my $newstring = "";
208
209	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
210	{
211		my $arrayentry = ${$arrayref}[$i];
212		$arrayentry =~ s/\s*$//;
213		$newstring = $newstring . $arrayentry . ",";
214	}
215
216	$newstring =~ s/\,\s*$//;
217
218	return $newstring;
219}
220
221#############################################################################
222# Converting an array into a space separated string
223#############################################################################
224
225sub convert_array_to_space_separated_string
226{
227	my ( $arrayref ) = @_;
228
229	my $newstring = "";
230
231	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
232	{
233		my $arrayentry = ${$arrayref}[$i];
234		$arrayentry =~ s/\s*$//;
235		$newstring = $newstring . $arrayentry . " ";
236	}
237
238	$newstring =~ s/\s*$//;
239
240	return $newstring;
241}
242
243#############################################################################
244# The file name contains for some files "/". If this programs runs on
245# a windows platform, this has to be converted to "\".
246#############################################################################
247
248sub convert_slash_to_backslash
249{
250	my ($filesarrayref) = @_;
251
252	for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
253	{
254		my $onefile = ${$filesarrayref}[$i];
255		if ( $onefile->{'Name'} ) { $onefile->{'Name'} =~ s/\//\\/g; }
256	}
257}
258
259############################################################################
260# Creating a copy of an existing file object
261# No converter
262############################################################################
263
264sub copy_item_object
265{
266	my ($olditemhashref, $newitemhashref) = @_;
267
268	foreach $key (keys %{$olditemhashref})
269	{
270		my $value = $olditemhashref->{$key};
271		$newitemhashref->{$key} = $value;
272	}
273}
274
275#################################################################
276# Windows pathes must not contain the following structure:
277# c:\dirA\dirB\..\dirC
278# This has to be exchanged to
279# c:\dirA\dirC
280#################################################################
281
282sub make_path_conform
283{
284	my ( $path ) = @_;
285
286	my $oldpath = $path;
287
288	while ( $path =~ /(^.*)(\Q$installer::globals::separator\E.*?[^\.])(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ )
289	{
290		my $part1 = $1;
291		my $part2 = $4;
292
293		# $2 must not end with a "." ! Problem with "..\.."
294
295		$path = $part1 . $part2;
296	}
297
298	return $path;
299}
300
301#################################################################
302# Copying an item collector
303# A reference to an array consisting of references to hashes.
304#################################################################
305
306sub copy_collector
307{
308	my ($oldcollector) = @_;
309
310	my @newcollector = ();
311
312	foreach my $oldhash (@$oldcollector)
313	{
314		my %newhash = ();
315
316		while (my ($key, $value) = each %$oldhash)
317		{
318			$newhash{$key} = $value;
319		}
320
321		push(@newcollector, \%newhash);
322	}
323
324	return \@newcollector;
325}
326
327#################################################################
328# Copying an array
329#################################################################
330
331sub copy_array_from_references
332{
333	my ( $arrayref ) = @_;
334
335	my @newarray = ();
336
337	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
338	{
339		push(@newarray, ${$arrayref}[$i]);
340	}
341
342	return \@newarray;
343}
344
345###########################################################
346# Copying a hash
347###########################################################
348
349sub copy_hash_from_references
350{
351	my ($hashref) = @_;
352
353	my %newhash = ();
354	my $key;
355
356	foreach $key (keys %{$hashref})
357	{
358		$newhash{$key} = $hashref->{$key};
359	}
360
361	return \%newhash;
362}
363
364#################################################################
365# Combining two arrays, first wins
366#################################################################
367
368sub combine_arrays_from_references_first_win
369{
370	my ( $arrayref1, $arrayref2 ) = @_;
371
372	my $hashref1 = convert_array_to_hash($arrayref1);
373	my $hashref2 = convert_array_to_hash($arrayref2);
374	my %commonhash = ();
375	my @newarray = ();
376
377	# starting with second hash
378	foreach my $key ( keys %{$hashref2} ) { $commonhash{$key} = $hashref2->{$key}; }
379	# overwriting with first hash
380	foreach my $key ( keys %{$hashref1} ) { $commonhash{$key} = $hashref1->{$key}; }
381
382	# Creating the new array
383	foreach my $key ( keys %commonhash ) { push(@newarray, "$key $commonhash{$key}\n"); }
384
385	return \@newarray;
386}
387
388#################################################################
389# Combining two arrays
390#################################################################
391
392sub combine_arrays_from_references
393{
394	my ( $arrayref1, $arrayref2 ) = @_;
395
396	my @newarray = ();
397
398	for ( my $i = 0; $i <= $#{$arrayref1}; $i++ )
399	{
400		push(@newarray, ${$arrayref1}[$i]);
401	}
402
403	for ( my $i = 0; $i <= $#{$arrayref2}; $i++ )
404	{
405		push(@newarray, ${$arrayref2}[$i]);
406	}
407
408	return \@newarray;
409}
410
411#################################################################
412# Returning the current ending number of a directory
413#################################################################
414
415sub get_number_from_directory
416{
417	my ( $directory ) = @_;
418
419	my $number = 0;
420
421	if ( $directory =~ /\_(\d+)\s*$/ )
422	{
423		$number = $1;
424	}
425
426	return $number;
427}
428
429#################################################################
430# Replacing separators, that are included into quotes
431#################################################################
432
433sub replace_masked_separator
434{
435	my ($string, $separator, $replacementstring) = @_;
436
437	$string =~ s/\\\Q$separator\E/$replacementstring/g;
438
439	return $string;
440}
441
442#################################################################
443# Resolving separators, that were replaced
444# in function mask_separator_in_quotes
445#################################################################
446
447sub resolve_masked_separator
448{
449	my ($arrayref, $separator, $replacementstring) = @_;
450
451	for ( my $i = 0; $i <= $#{$arrayref}; $i++ )
452	{
453		${$arrayref}[$i] =~ s/$replacementstring/$separator/g
454	}
455}
456
4571;
458