1NAME
2    Config::IniFiles - A module for reading .ini-style configuration files.
3
4SYNOPSIS
5      use Config::IniFiles;
6      my $cfg = new Config::IniFiles( -file => "/path/configfile.ini" );
7      print "We have parm " . $cfg->val( 'Section', 'Parameter' ) . "."
8            if $cfg->val( 'Section', 'Parameter' );
9
10DESCRIPTION
11    Config::IniFiles provides a way to have readable configuration files
12    outside your Perl script. Configurations can be imported (inherited,
13    stacked,...), sections can be grouped, and settings can be accessed from
14    a tied hash.
15
16FILE FORMAT
17    INI files consist of a number of sections, each preceded with the
18    section name in square brackets. The first non-blank character of the
19    line indicating a section must be a left bracket and the last nonblank
20    character of a line indicating a section must be a right bracket. The
21    characters making up the section name can be any symbols at all. However
22    section names must be unique.
23
24    Parameters are specified in each section as Name=Value. Any spaces
25    around the equals sign will be ignored, and the value extends to the end
26    of the line. Parameter names are localized to the namespace of the
27    section, but must be unique within a section.
28
29      [section]
30      Parameter=Value
31
32    Both the hash mark (#) and the semicolon (;) are comment characters. by
33    default (this can be changed by configuration) Lines that begin with
34    either of these characters will be ignored. Any amount of whitespace may
35    preceed the comment character.
36
37    Multiline or multi-valued parameters may also be defined ala UNIX "here
38    document" syntax:
39
40      Parameter=<<EOT
41      value/line 1
42      value/line 2
43      EOT
44
45    You may use any string you want in place of "EOT". Note that what
46    follows the "<<" and what appears at the end of the text MUST match
47    exactly, including any trailing whitespace.
48
49    As a configuration option (default is off), continuation lines can be
50    allowed:
51
52      [Section]
53      Parameter=this paramater \
54        spreads across \
55        a few lines
56
57USAGE -- Object Interface
58    Get a new Config::IniFiles object with the *new* method:
59
60      $cfg = Config::IniFiles->new( -file => "/path/configfile.ini" );
61      $cfg = new Config::IniFiles -file => "/path/configfile.ini";
62
63    Optional named parameters may be specified after the configuration file
64    name. See the *new* in the METHODS section, below.
65
66    Values from the config file are fetched with the val method:
67
68      $value = $cfg->val('Section', 'Parameter');
69
70    If you want a multi-line/value field returned as an array, just specify
71    an array as the receiver:
72
73      @values = $cfg->val('Section', 'Parameter');
74
75METHODS
76  new ( [-option=>value ...] )
77
78    Returns a new configuration object (or "undef" if the configuration file
79    has an error). One Config::IniFiles object is required per configuration
80    file. The following named parameters are available:
81
82    *-file* filename
83              Specifies a file to load the parameters from. This 'file' may
84              actually be any of the following things:
85
86                1) a simple filehandle, such as STDIN
87                2) a filehandle glob, such as *CONFIG
88                3) a reference to a glob, such as \*CONFIG
89                4) an IO::File object
90                5) the pathname of a file
91
92              If this option is not specified, (i.e. you are creating a
93              config file from scratch) you must specify a target file using
94              SetFileName in order to save the parameters.
95
96    *-default* section
97              Specifies a section to be used for default values. For
98              example, if you look up the "permissions" parameter in the
99              "users" section, but there is none, Config::IniFiles will look
100              to your default section for a "permissions" value before
101              returning undef.
102
103    *-reloadwarn* 0|1
104              Set -reloadwarn => 1 to enable a warning message (output to
105              STDERR) whenever the config file is reloaded. The reload
106              message is of the form:
107
108                PID <PID> reloading config file <file> at YYYY.MM.DD HH:MM:SS
109
110              Default behavior is to not warn (i.e. -reloadwarn => 0).
111
112    *-nocase* 0|1
113              Set -nocase => 1 to handle the config file in a
114              case-insensitive manner (case in values is preserved,
115              however). By default, config files are case-sensitive (i.e., a
116              section named 'Test' is not the same as a section named
117              'test'). Note that there is an added overhead for turning off
118              case sensitivity.
119
120    *-allowcontinue* 0|1
121              Set -allowcontinue => 1 to enable continuation lines in the
122              config file. i.e. if a line ends with a backslash "\", then
123              the following line is appended to the parameter value,
124              dropping the backslash and the newline character(s).
125
126              Default behavior is to keep a trailing backslash "\" as a
127              parameter value. Note that continuation cannot be mixed with
128              the "here" value syntax.
129
130    *-import* object
131              This allows you to import or inherit existing setting from
132              another Config::IniFiles object. When importing settings from
133              another object, sections with the same name will be merged and
134              parameters that are defined in both the imported object and
135              the *-file* will take the value of given in the *-file*.
136
137              If a *-default* section is also given on this call, and it
138              does not coincide with the default of the imported object, the
139              new default section will be used instead. If no *-default*
140              section is given, then the default of the imported object will
141              be used.
142
143    *-commentchar* 'char'
144              The default comment character is "#". You may change this by
145              specifying this option to an arbitrary character, except
146              alphanumeric characters and square brackets and the "equal"
147              sign.
148
149    *-allowedcommentchars* 'chars'
150              Allowed default comment characters are "#" and ";". By
151              specifying this option you may enlarge or narrow this range to
152              a set of characters (concatenating them to a string). Note
153              that the character specified by -commentchar (see above) is
154              always part of the allowed comment characters. Note: The given
155              string is evaluated as a character class (ie: like
156              "/[chars]/").
157
158  val ($section, $parameter)
159
160    Returns the value of the specified parameter ("$parameter") in section
161    "$section", returns undef if no section or no parameter for the given
162    section section exists.
163
164    If you want a multi-line/value field returned as an array, just specify
165    an array as the receiver:
166
167      @values = $cfg->val('Section', 'Parameter');
168
169    A multi-line/value field that is returned in a scalar context will be
170    joined using $/ (input record separator, default is \n) if defined,
171    otherwise the values will be joined using \n.
172
173  setval ($section, $parameter, $value, [ $value2, ... ])
174
175    Sets the value of parameter "$parameter" in section "$section" to
176    "$value" (or to a set of values). See below for methods to write the new
177    configuration back out to a file.
178
179    You may not set a parameter that didn't exist in the original
180    configuration file. setval will return *undef* if this is attempted. See
181    newval below to do this. Otherwise, it returns 1.
182
183  newval($section, $parameter, $value [, $value2, ...])
184
185    Assignes a new value, "$value" (or set of values) to the parameter
186    "$parameter" in section "$section" in the configuration file.
187
188  delval($section, $parameter)
189
190    Deletes the specified parameter from the configuration file
191
192  ReadConfig
193
194    Forces the configuration file to be re-read. Returns undef if the file
195    can not be opened, no filename was defined (with the "-file" option)
196    when the object was constructed, or an error occurred while reading.
197
198    If an error occurs while parsinf the INI file the
199    @Config::IniFiles::errors array will contain messages that might help
200    you figure out where the problem is in the file.
201
202  Sections
203
204    Returns an array containing section names in the configuration file. If
205    the *nocase* option was turned on when the config object was created,
206    the section names will be returned in lowercase.
207
208  SectionExists ( $sect_name )
209
210    Returns 1 if the specified section exists in the INI file, 0 otherwise
211    (undefined if section_name is not defined).
212
213  AddSection ( $sect_name )
214
215    Ensures that the named section exists in the INI file. If the section
216    already exists, nothing is done. In this case, the "new" section will
217    possibly contain data already.
218
219    If you really need to have a new section with no parameters in it, check
220    that the name that you're adding isn't in the list of sections already.
221
222  DeleteSection ( $sect_name )
223
224    Completely removes the entire section from the configuration.
225
226  Parameters ($sect_name)
227
228    Returns an array containing the parameters contained in the specified
229    section.
230
231  Groups
232
233    Returns an array containing the names of available groups.
234
235    Groups are specified in the config file as new sections of the form
236
237      [GroupName MemberName]
238
239    This is useful for building up lists. Note that parameters within a
240    "member" section are referenced normally (i.e., the section name is
241    still "Groupname Membername", including the space) - the concept of
242    Groups is to aid people building more complex configuration files.
243
244  SetGroupMember ( $sect )
245
246    Makes sure that the specified section is a member of the appropriate
247    group.
248
249    Only intended for use in newval.
250
251  RemoveGroupMember ( $sect )
252
253    Makes sure that the specified section is no longer a member of the
254    appropriate group. Only intended for use in DeleteSection.
255
256  GroupMembers ($group)
257
258    Returns an array containing the members of specified $group. Each
259    element of the array is a section name. For example, given the sections
260
261      [Group Element 1]
262      ...
263
264      [Group Element 2]
265      ...
266
267    GroupMembers would return ("Group Element 1", "Group Element 2").
268
269  WriteConfig ($filename)
270
271    Writes out a new copy of the configuration file. A temporary file
272    (ending in .new) is written out and then renamed to the specified
273    filename. Also see BUGS below.
274
275  RewriteConfig
276
277    Same as WriteConfig, but specifies that the original configuration file
278    should be rewritten.
279
280  SetFileName ($filename)
281
282    If you created the Config::IniFiles object without initialising from a
283    file, or if you just want to change the name of the file to use for
284    ReadConfig/RewriteConfig from now on, use this method.
285
286    Returns $filename if that was a valid name, undef otherwise.
287
288  SetSectionComment($section, @comment)
289
290    Sets the comment for section $section to the lines contained in
291    @comment.
292
293    Each comment line will be prepended with the comment charcter (default
294    is "#") if it doesn't already have a comment character (ie: if the line
295    does not start with whitespace followed by an allowed comment character,
296    default is "#" and ";").
297
298    To clear a section comment, use DeleteSectionComment ($section)
299
300  GetSectionComment ($section)
301
302    Returns a list of lines, being the comment attached to section $section.
303    In scalar context, returns a string containing the lines of the comment
304    separated by newlines.
305
306    The lines are presented as-is, with whatever comment character was
307    originally used on that line.
308
309  DeleteSectionComment ($section)
310
311    Removes the comment for the specified section.
312
313  SetParameterComment ($section, $parameter, @comment)
314
315    Sets the comment attached to a particular parameter.
316
317    Any line of @comment that does not have a comment character will be
318    prepended with one. See the SetSectionComment($section, @comment) entry
319    elsewhere in this document above
320
321  GetParameterComment ($sect, $parm)
322
323    Gets the comment attached to a parameter.
324
325  DeleteParameterComment ($sect, $parm)
326
327    Deletes the comment attached to a parameter.
328
329  GetParameterEOT ($section, $parameter)
330
331    Accessor method for the EOT text (in fact, style) of the specified
332    parameter. If any text is used as an EOT mark, this will be returned. If
333    the parameter was not recorded using HERE style multiple lines,
334    GetParameterEOT returns undef.
335
336  SetParameterEOT ($section, $EOT)
337
338    Accessor method for the EOT text for the specified parameter. Sets the
339    HERE style marker text to the value $EOT. Once the EOT text is set, that
340    parameter will be saved in HERE style.
341
342    To un-set the EOT text, use DeleteParameterEOT ($section, $parameter).
343
344  DeleteParameterEOT ($sect, $parm)
345
346    Removes the EOT marker for the given section and parameter. When writing
347    a configuration file, if no EOT marker is defined then "EOT" is used.
348
349  Delete
350
351    Deletes the entire configuration file in memory.
352
353USAGE -- Tied Hash
354  tie $ini, 'Config::IniFiles', (-file=>$filename, [-option=>value ...] )
355
356    Using "tie", you can tie a hash to a Config::IniFiles object. This
357    creates a new object which you can access through your hash, so you use
358    this instead of the new method. This actually creates a hash of hashes
359    to access the values in the INI file. The options you provide through
360    "tie" are the same as given for the new method, above.
361
362    Here's an example:
363
364      use Config::IniFiles;
365
366      my %ini
367      tie %ini, 'Config::IniFiles', ( -file => "/path/configfile.ini" );
368
369      print "We have $ini{Section}{Parameter}." if $ini{Section}{Parameter};
370
371    Accessing and using the hash works just like accessing a regular hash
372    and many of the object methods are made available through the hash
373    interface.
374
375    For those methods that do not coincide with the hash paradigm, you can
376    use the Perl "tied" function to get at the underlying object tied to the
377    hash and call methods on that object. For example, to write the hash out
378    to a new ini file, you would do something like this:
379
380      tied( %ini )->WriteConfig( "/newpath/newconfig.ini" ) ||
381        die "Could not write settings to new file.";
382
383  $val = $ini{$section}{$parameter}
384
385    Returns the value of $parameter in $section.
386
387    Because of limitations in Perl's tie implementation, multiline values
388    accessed through a hash will *always* be returned as a single value with
389    each line joined by the default line separator ($\). To break them apart
390    you can simple do this:
391
392      @lines = split( "$\", $ini{section}{multi_line_parameter} );
393
394  $ini{$section}{$parameter} = $value;
395
396    Sets the value of "$parameter" in "$section" to "$value".
397
398    To set a multiline or multiv-alue parameter just assign an array
399    reference to the hash entry, like this:
400
401     $ini{$section}{$parameter} = [$value1, $value2, ...];
402
403    If the parameter did not exist in the original file, it will be created.
404    However, Perl does not seem to extend autovivification to tied hashes.
405    That means that if you try to say
406
407      $ini{new_section}{new_paramters} = $val;
408
409    and the section 'new_section' does not exist, then Perl won't properly
410    create it. In order to work around this you will need to create a hash
411    reference in that section and then assign the parameter value. Something
412    like this should do nicely:
413
414      $ini{new_section} = {};
415      $ini{new_section}{new_paramters} = $val;
416
417  %hash = %{$ini{$section}}
418
419    Using the tie interface, you can copy whole sections of the ini file
420    into another hash. Note that this makes a copy of the entire section.
421    The new hash in no longer tied to the ini file, In particular, this
422    means -default and -nocase settings will not apply to "%hash".
423
424  $ini{$section} = {}; %{$ini{$section}} = %parameters;
425
426    Through the hash interface, you have the ability to replace the entire
427    section with a new set of parameters. This call will fail, however, if
428    the argument passed in NOT a hash reference. You must use both lines, as
429    shown above so that Perl recognizes the section as a hash reference
430    context before COPYing over the values from your "%parameters" hash.
431
432  delete $ini{$section}{$parameter}
433
434    When tied to a hash, you can use the Perl "delete" function to
435    completely remove a parameter from a section.
436
437  delete $ini{$section}
438
439    The tied interface also allows you to delete an entire section from the
440    ini file using the Perl "delete" function.
441
442  %ini = ();
443
444    If you really want to delete all the items in the ini file, this will do
445    it. Of course, the changes won't be written to the actual file unless
446    you call RewriteConfig on the object tied to the hash.
447
448  Parameter names
449
450    my @keys = keys %{$ini{$section}}
451    while (($k, $v) = each %{$ini{$section}}) {...}
452    if( exists %{$ini{$section}}, $parameter ) {...}
453    When tied to a hash, you use the Perl "keys" and "each" functions to
454    iteratively list the parameters ("keys") or parameters and their values
455    ("each") in a given section.
456
457    You can also use the Perl "exists" function to see if a parameter is
458    defined in a given section.
459
460    Note that none of these will return parameter names that are part if the
461    default section (if set), although accessing an unknown parameter in the
462    specified section will return a value from the default section if there
463    is one.
464
465  Section names
466
467    foreach( keys %ini ) {...}
468    while (($k, $v) = each %ini) {...}
469    if( exists %ini, $section ) {...}
470    When tied to a hash, you use the Perl "keys" and "each" functions to
471    iteratively list the sections in the ini file.
472
473    You can also use the Perl "exists" function to see if a section is
474    defined in the file.
475
476DIAGNOSTICS
477  @Config::IniFiles::errors
478
479    Contains a list of errors encountered while parsing the configuration
480    file. If the *new* method returns undef, check the value of this to find
481    out what's wrong. This value is reset each time a config file is read.
482
483BUGS
484    *  The output from [Re]WriteConfig/OutputConfig might not be as pretty
485       as it can be. Comments are tied to whatever was immediately below
486       them. And case is not preserved for Section and Parameter names if
487       the -nocase option was used.
488
489    *  No locking is done by [Re]WriteConfig. When writing servers, take
490       care that only the parent ever calls this, and consider making your
491       own backup.
492
493Data Structure
494    Note that this is only a reference for the package maintainers - one of
495    the upcoming revisions to this package will include a total clean up of
496    the data structure.
497
498      $iniconf->{cf} = "config_file_name"
499              ->{startup_settings} = \%orginal_object_parameters
500              ->{firstload} = 0
501              ->{nocase} = 0
502              ->{reloadwarn} = 0
503              ->{sects} = \@sections
504              ->{sCMT}{$sect} = \@comment_lines
505              ->{group}{$group} = \@group_members
506              ->{parms}{$sect} = \@section_parms
507              ->{EOT}{$sect}{$parm} = "end of text string"
508              ->{pCMT}{$sect}{$parm} = \@comment_lines
509              ->{v}{$sect}{$parm} = $value   OR  \@values
510
511AUTHOR and ACKNOWLEDGEMENTS
512    The original code was written by Scott Hutton. Then handled for a time
513    by Rich Bowen (thanks!), It is now managed by Jeremy Wadsack, with many
514    contributions from various other people.
515
516    In particular, special thanks go to (in roughly chronological order):
517
518    Bernie Cosell, Alan Young, Alex Satrapa, Mike Blazer, Wilbert van de
519    Pieterman, Steve Campbell, Robert Konigsberg, Scott Dellinger, R.
520    Bernstein, Daniel Winkelmann, Pires Claudio, Adrian Phillips, Marek
521    Rouchal, Luc St Louis, Adam Fischler, Kay R�pke, Matt Wilson, Raviraj
522    Murdeshwar and Slaven Rezic.
523
524    Geez, that's a lot of people. And apologies to the folks who were
525    missed.
526
527    If you want someone to bug about this, that would be:
528
529            Jeremy Wadsack <dgsupport at wadsack-allen dot com>
530
531    If you want more information, or want to participate, go to:
532
533            http://sourceforge.net/projects/config-inifiles/
534
535    Please send bug reports to config-inifiles-bugs@lists.sourceforge.net
536
537    Development discussion occurs on the mailing list
538    config-inifiles-dev@lists.sourceforge.net, which you can subscribe to by
539    going to the project web site (link above).
540
541    This program is free software; you can redistribute it and/or modify it
542    under the same terms as Perl itself.
543
544Change log
545         $Log: README,v $
546         Revision 1.1  2002/12/06 02:04:50  russ
547         *** empty log message ***
548
549         Revision 1.15  2002/10/15 18:52:56  wadg
550         Updated with changelog
551
552         Revision 2.30  2002/10/15 18:51:07  wadg
553         Patched to stopwarnings about utf8 usage.
554
555         Revision 2.29  2002/08/15 21:33:58  wadg
556         - Support for UTF Byte-Order-Mark (Raviraj Murdeshwar)
557         - Made tests portable to Mac (p. kent)
558         - Made file parsing portable for s390/EBCDIC, etc. (Adam Fischler)
559         - Fixed import bug with Perl 5.8.0 (Marek Rouchal)
560         - Fixed precedence bug in WriteConfig (Luc St Louis)
561         - Fixed broken group detection in SetGroupMember and RemoveGroupMember (Kay R�pke)
562         - Added line continuation character (/) support (Marek Rouchal)
563         - Added configurable comment character support (Marek Rouchal)
564
565         Revision 2.28  2002/07/04 03:56:05  grail
566         Changes for resolving bug 447532 - _section::FETCH should return array ref for multiline values.
567
568         Revision 2.27  2001/12/20 16:03:49  wadg
569         - Fixed bug introduced in new valid file check where ';' comments in first lines were not considered valid
570         - Rearranged some tests to put them in the proper files (case and -default)
571         - Added more comment test to cover more cases
572         - Fixed first two comments tests which weren't doing anything
573
574         Revision 2.26  2001/12/19 22:20:50  wadg
575         #481513 Recognize badly formatted files
576
577         Revision 2.25  2001/12/12 20:44:48  wadg
578         Update to bring CVS version in synch
579
580         Revision 2.24  2001/12/07 10:03:06  wadg
581         222444 Ability to load from arbitrary source
582
583         Revision 2.23  2001/12/07 09:35:06  wadg
584         Forgot to include updates t/test.ini
585
586         Revision 2.22  2001/12/06 16:52:39  wadg
587         Fixed bugs 482353,233372. Updated doc for new mgr.
588
589         Revision 2.21  2001/08/14 01:49:06  wadg
590         Bug fix: multiple blank lines counted as one
591         Patched README change log to include recent updates
592
593         Revision 2.20  2001/06/07 02:49:52  grail
594          - Added checks for method parameters being defined
595          - fixed some regexes to make them stricter
596          - Fixed greps to make them consistent through the code (also a vain
597            attempt to help my editors do syntax colouring properly)
598          - Added AddSection method, replaced chunk of ReadConfig with AddSection
599          - Added case handling stuff to more methods
600          - Added RemoveGroupMember
601          - Made variable names more consistent through OO methods
602          - Restored Unix EOLs
603
604         Revision 2.19  2001/04/04 23:33:40  wadg
605         Fixed case sensitivity bug
606
607         Revision 2.18  2001/03/30 04:41:08  rbowen
608         Small documentation change in IniFiles.pm - pod2* was choking on misplaces
609         =item tags. And I regenerated the README
610         The main reason for this release is that the MANIFEST in the 2.17 version was
611         missing one of the new test suite files, and that is included in this
612         re-release.
613
614         Revision 2.17  2001/03/21 21:05:12  wadg
615         Documentation edits
616
617         Revision 2.16  2001/03/21 19:59:09 wadg
618         410327 -default not in original; 233255 substring parameters
619
620         Revision 2.15  2001/01/30 11:46:48  rbowen
621         Very minor documentation bug fixed.
622
623         Revision 2.14  2001/01/08 18:02:32  wadg
624         [Bug #127325] Fixed proken import; changelog; moved
625
626         Revision 2.13  2000/12/18 07:14:41  wadg
627         [Bugs# 122441,122437] Alien EOLs and OO delete method
628
629         Revision 2.12  2000/12/18 04:59:37  wadg
630         [Bug #125524] Writing multiline of 2 with tied hash
631
632         Revision 2.11  2000/12/16 12:53:13  grail
633         [BUG #122455] Problem with File Permissions
634
635         Revision 2.10  2000/12/13 17:40:18  rbowen
636         Updated version number so that CPAN will stop being angry with us.
637
638         Revision 1.18  2000/12/08 00:45:35  grail
639         Change as requested by Jeremy Wadsack, for Bug 123146
640
641         Revision 1.17  2000/12/07 15:32:36  grail
642         Further patch to duplicate sections bug, and replacement of repeated values handling code.
643
644         Revision 1.14  2000/11/29 11:26:03  grail
645         Updates for task 22401 (no more reloadsig) and 22402 (Group and GroupMember doco)
646
647         Revision 1.13  2000/11/28 12:41:42  grail
648         Added test for being able to add sections with wierd names like section|version2
649
650         Revision 1.11  2000/11/24 21:20:11  rbowen
651         Resolved SourceForge bug #122445 - a parameter should be split from its value on the first = sign encountered, not on the last one. Added test suite to test this, and put test case in test.ini
652
653         Revision 1.10  2000/11/24 20:40:58  rbowen
654         Updated MANIFEST to have file list of new files in t/
655         Updated IniFiles.pm to have mention of sourceforge addresses, rather than rcbowen.com addresses
656         Regenerated README from IniFiles.pm
657
658         Revision 1.9  2000/11/23 05:08:08  grail
659         Fixed documentation for bug 122443 - Check that INI files can be created from scratch.
660
661         Revision 1.1.1.1  2000/11/10 03:04:01  rbowen
662         Initial checkin of the Config::IniFiles source to SourceForge
663
664         Revision 1.8  2000/10/17 01:52:55  rbowen
665         Patch from Jeremy. Fixed "defined" warnings.
666
667         Revision 1.7  2000/09/21 11:19:17  rbowen
668         Mostly documentation changes. I moved the change log into the POD rather
669         than having it in a separate Changes file. This allows people to see the
670         changes in the Readme before they download the module. Now I just
671         need to make sure I remember to regenerate the Readme every time I do
672         a commit.
673
674         1.6 September 19, 2000 by JW, AS
675         * Applied several patches submitted to me by Jeremy and Alex.
676         * Changed version number to the CVS version number, so that I won't
677         have to think about changing it ever again. Big version change
678         should not be taken as a huge leap forward.
679
680         0.12 September 13, 2000 by JW/WADG
681         * Added documentation to clarify autovivification issues when
682         creating new sections
683         * Fixed version number (Oops!)
684
685         0.11 September 13, 2000 by JW/WADG
686         * Applied patch to Group and GroupMembers functions to return empty
687         list when no groups are present (submitted by John Bass, Sep 13)
688
689         0.10 September 13, 2000 by JW/WADG
690         * Fixed reference in POD to ReWriteFile. changes to RewriteConfig
691         * Applied patch for failed open bug submitted by Mordechai T. Abzug Aug 18
692         * Doc'd behavior of failed open
693         * Removed planned SIG testing from test.pl as SIGs have been removed
694         * Applied patch from Thibault Deflers to fix bug in parameter list
695         when a parameter value is undef
696
697         0.09
698         Hey! Where's the change log for 0.09?
699
700         0.08
701         2000-07-30  Adrian Phillips  <adrianp@powertech.no>
702
703         * test.pl: Fixed some tests which use $\, and made those that try
704         to check a non existant val check against ! defined.
705
706         * IniFiles.pm: hopefully fixed use of $\ when this is unset
707         (problems found when running tests with -w).  Similar problem with
708         $/ which can be undefined and trying to return a val which does
709         not exist. Modified val docs section to indicate a undef return
710         when this occurs.
711
712         0.07
713         Looks like we missed a change log for 0.07. Bummer.
714
715         0.06 Sun Jun 25, 2000 by Daniel Winkelmann
716         * Patch for uninitialized value bug in newval and setval
717
718         0.05 Sun Jun 18, 2000 by RBOW
719         * Added something to shut up -w on VERSIONS
720         * Removed unused variables
721
722         0.04 Thu Jun 15 - Fri Jun 16, 2000 by JW/WADG
723         * Added support for -import option on ->new
724         * Added support for tying a hash
725         * Edited POD for grammer, clarity and updates
726         * Updated test.pl file
727         * Fixed bug in multiline/single line output
728         * Fixed bug in default handling with tie interface
729         * Added bugs to test.pl for regression
730         * Fixed bug in {group} vs. {groups} property (first is valid)
731         * Fixed return value for empty {sects} or {parms}{$sect} in
732         Sections and Parameters methods
733
734         0.03 Thu Jun 15, 2000 by RBOW
735         * Modifications to permit 'use strict', and to get 'make test' working
736         again.
737
738         0.02 Tue Jun 13, 2000 by RBOW
739         * Fixed bug reported by Bernie Cosell - Sections, Parameters,
740         and GroupMembers return undef if there are no sections,
741         parameters, or group members. These functions now return
742         () if the particular value is undefined.
743         * Added some contributed documentation, from Alex Satrapa, explaining
744         how the internal data structure works.
745         * Set up a project on SourceForge. (Not a change, but worth
746         noting).
747         * Added Groups method to return a list of section groups.
748
749         0.01  Mon Jun 12, 2000 by RBOW
750         Some general code cleanup, in preparation for changes to
751         come. Put up Majordomo mailing list and sent invitation to
752         various people to join it.
753
754