aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Eckels <eckels@google.com>2012-08-06 15:12:54 -0700
committerLucas Eckels <eckels@google.com>2012-08-08 09:29:05 -0700
commit8a58cac9f8db5ed55b02b3ac24156d628af923d1 (patch)
tree3960df276069aefab2103e778cc52e89253b12ef
parent2f9cfa4836e5e572c0e5688bec15515355b709a1 (diff)
downloadid3lib-8a58cac9f8db5ed55b02b3ac24156d628af923d1.tar.gz
Add id3lib 3.8.3 source.
Change-Id: Ic723712b360a1760b4c081b1f6a77939bb2969a9
-rw-r--r--.gitignore33
-rw-r--r--AUTHORS5
-rw-r--r--COPYING482
-rw-r--r--ChangeLog10601
-rw-r--r--HISTORY315
-rw-r--r--INSTALL179
-rw-r--r--Makefile.am87
-rw-r--r--Makefile.in539
-rw-r--r--NEWS325
-rw-r--r--README98
-rw-r--r--THANKS122
-rw-r--r--TODO42
-rw-r--r--acconfig.h105
-rw-r--r--aclocal.m44598
-rwxr-xr-xconfig.guess1388
-rwxr-xr-xconfig.h.in217
-rwxr-xr-xconfig.h.win32181
-rwxr-xr-xconfig.h.win32.in181
-rwxr-xr-xconfig.sub1489
-rwxr-xr-xconfig_Linux32.h218
-rwxr-xr-xconfigure13092
-rwxr-xr-xconfigure.in319
-rw-r--r--depcomp411
-rw-r--r--doc/3d-logo.gifbin0 -> 45835 bytes
-rw-r--r--doc/Doxyfile723
-rw-r--r--doc/Doxyfile.in723
-rw-r--r--doc/Makefile.am51
-rw-r--r--doc/Makefile.in289
-rw-r--r--doc/attilas_id3logo.jpgbin0 -> 3682 bytes
-rw-r--r--doc/fillpx.gifbin0 -> 43 bytes
-rw-r--r--doc/id3guide.html636
-rw-r--r--doc/id3lib-manual.php1029
-rw-r--r--doc/id3lib.css28
-rw-r--r--doc/id3v2.3.0.html2257
-rw-r--r--doc/id3v2.3.0.txt2025
-rw-r--r--doc/id3v2.gifbin0 -> 45835 bytes
-rw-r--r--doc/id3v2.icobin0 -> 8422 bytes
-rw-r--r--doc/id3v2.pngbin0 -> 2662 bytes
-rw-r--r--doc/index.html450
-rw-r--r--doc/index.html.in450
-rw-r--r--doc/musicmatch.txt529
-rw-r--r--examples/221-compressed.tagbin0 -> 166 bytes
-rw-r--r--examples/230-compressed.tagbin0 -> 185 bytes
-rw-r--r--examples/230-picture.tagbin0 -> 8583 bytes
-rw-r--r--examples/230-syncedlyrics.tagbin0 -> 945 bytes
-rw-r--r--examples/230-unicode.tagbin0 -> 165 bytes
-rw-r--r--examples/Makefile.am98
-rw-r--r--examples/Makefile.in986
-rw-r--r--examples/Mp3test.sln49
-rw-r--r--examples/Mp3test.vcproj211
-rw-r--r--examples/composer.jpgbin0 -> 8156 bytes
-rw-r--r--examples/crc53865.mp3bin0 -> 731 bytes
-rw-r--r--examples/demo_convert.cpp163
-rw-r--r--examples/demo_convert_options.c174
-rw-r--r--examples/demo_convert_options.h38
-rw-r--r--examples/demo_copy.cpp143
-rw-r--r--examples/demo_copy_options.c164
-rw-r--r--examples/demo_copy_options.h47
-rw-r--r--examples/demo_info.cpp401
-rw-r--r--examples/demo_info_options.c155
-rw-r--r--examples/demo_info_options.h45
-rw-r--r--examples/demo_main.cpp135
-rw-r--r--examples/demo_simple.cpp104
-rw-r--r--examples/demo_tag.cpp199
-rw-r--r--examples/demo_tag_options.c316
-rw-r--r--examples/demo_tag_options.h52
-rw-r--r--examples/findeng.cpp37
-rw-r--r--examples/findstr.cpp41
-rw-r--r--examples/get_pic.cpp40
-rw-r--r--examples/getopt.c736
-rw-r--r--examples/getopt.h129
-rw-r--r--examples/getopt1.c176
-rw-r--r--examples/ozzy.tagbin0 -> 3211 bytes
-rw-r--r--examples/test_compression.cpp35
-rw-r--r--examples/test_io.cpp207
-rw-r--r--examples/test_pic.cpp71
-rw-r--r--examples/test_remove.cpp118
-rw-r--r--examples/test_unicode.cpp31
-rw-r--r--examples/thatspot.tagbin0 -> 24482 bytes
-rw-r--r--id3com/EnumFields.cpp111
-rw-r--r--id3com/EnumFields.h70
-rw-r--r--id3com/ID3COM.def9
-rw-r--r--id3com/ID3COM.rc137
-rw-r--r--id3com/ID3COMps.def11
-rw-r--r--id3com/ID3COMps.mk16
-rw-r--r--id3com/ID3Field.cpp270
-rw-r--r--id3com/ID3Field.h94
-rw-r--r--id3com/ID3Field.rgs26
-rw-r--r--id3com/ID3Frame.cpp202
-rw-r--r--id3com/ID3Frame.h90
-rw-r--r--id3com/ID3Frame.rgs26
-rw-r--r--id3com/ID3Tag.cpp905
-rw-r--r--id3com/ID3Tag.h121
-rw-r--r--id3com/ID3Tag.rgs26
-rw-r--r--id3com/Makefile.am37
-rw-r--r--id3com/Makefile.in396
-rw-r--r--id3com/Sample/ID3Test.vbp32
-rw-r--r--id3com/Sample/ID3Test.vbw1
-rw-r--r--id3com/Sample/Makefile.am15
-rw-r--r--id3com/Sample/Makefile.in252
-rw-r--r--id3com/Sample/frmID3Test.frm179
-rw-r--r--id3com/StdAfx.cpp48
-rw-r--r--id3com/StdAfx.h70
-rw-r--r--id3com/dlldata.c42
-rw-r--r--id3com/id3com.cpp109
-rw-r--r--id3com/id3com.dsp226
-rw-r--r--id3com/id3com.dsw59
-rw-r--r--id3com/id3com.idl323
-rw-r--r--id3com/resource.h26
-rw-r--r--id3com/win32.readme.first.txt75
-rw-r--r--id3lib.spec192
-rw-r--r--id3lib.spec.in192
-rw-r--r--include/Makefile.am16
-rw-r--r--include/Makefile.in396
-rw-r--r--include/id3.h133
-rw-r--r--include/id3/Makefile.am36
-rw-r--r--include/id3/Makefile.in333
-rw-r--r--include/id3/field.h119
-rw-r--r--include/id3/globals.h748
-rw-r--r--include/id3/helpers.h109
-rw-r--r--include/id3/id3lib_bitset1066
-rw-r--r--include/id3/id3lib_frame.h105
-rw-r--r--include/id3/id3lib_streams.h43
-rw-r--r--include/id3/id3lib_strings.h204
-rw-r--r--include/id3/io_decorators.h218
-rw-r--r--include/id3/io_helpers.h82
-rw-r--r--include/id3/io_strings.h238
-rw-r--r--include/id3/misc_support.h140
-rw-r--r--include/id3/reader.h129
-rw-r--r--include/id3/readers.h161
-rw-r--r--include/id3/sized_types.h87
-rw-r--r--include/id3/tag.h164
-rw-r--r--include/id3/utils.h110
-rw-r--r--include/id3/writer.h99
-rw-r--r--include/id3/writers.h193
-rw-r--r--install-sh251
-rw-r--r--libprj/Makefile69
-rw-r--r--libprj/Makefile.am14
-rw-r--r--libprj/Makefile.in250
-rw-r--r--libprj/id3lib.mcpbin0 -> 67914 bytes
-rw-r--r--libprj/id3lib.sln20
-rw-r--r--libprj/id3lib.vcproj1029
-rw-r--r--libprj/id3lib.xcodeproj/project.pbxproj462
-rw-r--r--libprj/win32.readme.first.txt75
-rw-r--r--ltconfig3017
-rwxr-xr-xltmain.sh5009
-rw-r--r--m4/Makefile.am17
-rw-r--r--m4/Makefile.in256
-rw-r--r--m4/id3_cxx.m4134
-rw-r--r--m4/id3_debug.m445
-rw-r--r--m4/id3_unicode.m453
-rw-r--r--makefile.win32148
-rwxr-xr-xmakewin32.bat35
-rw-r--r--missing283
-rw-r--r--mkinstalldirs40
-rw-r--r--prj/Makefile.am15
-rw-r--r--prj/Makefile.in250
-rw-r--r--prj/id3lib.def66
-rw-r--r--prj/id3lib.mak721
-rw-r--r--prj/id3lib.sln39
-rw-r--r--prj/id3lib.vcproj1117
-rw-r--r--prj/macosx/Makefile.am16
-rwxr-xr-xprj/macosx/config.h222
-rw-r--r--prj/macosx/id3lib-Info.plist20
-rw-r--r--prj/macosx/id3lib.xcodeproj/Makefile.am14
-rw-r--r--prj/macosx/id3lib.xcodeproj/project.pbxproj717
-rw-r--r--prj/version.rc41
-rw-r--r--prj/win32.readme.first.txt75
-rw-r--r--reconf27
-rw-r--r--src/Makefile.am82
-rw-r--r--src/Makefile.in509
-rw-r--r--src/c_wrapper.cpp722
-rw-r--r--src/field.cpp1327
-rw-r--r--src/field_binary.cpp217
-rw-r--r--src/field_def.h46
-rw-r--r--src/field_impl.h154
-rw-r--r--src/field_integer.cpp109
-rw-r--r--src/field_string_ascii.cpp287
-rw-r--r--src/field_string_unicode.cpp253
-rw-r--r--src/flags.h56
-rw-r--r--src/frame.cpp327
-rw-r--r--src/frame_def.h47
-rw-r--r--src/frame_impl.cpp269
-rw-r--r--src/frame_impl.h138
-rw-r--r--src/frame_parse.cpp186
-rw-r--r--src/frame_render.cpp161
-rw-r--r--src/globals.cpp50
-rw-r--r--src/header.cpp63
-rw-r--r--src/header.h110
-rw-r--r--src/header_frame.cpp307
-rw-r--r--src/header_frame.h91
-rw-r--r--src/header_tag.cpp224
-rw-r--r--src/header_tag.h113
-rw-r--r--src/helpers.cpp518
-rw-r--r--src/io.cpp36
-rw-r--r--src/io_decorators.cpp298
-rw-r--r--src/io_helpers.cpp404
-rw-r--r--src/misc_support.cpp1240
-rw-r--r--src/mp3_header.h120
-rw-r--r--src/mp3_parse.cpp571
-rw-r--r--src/readers.cpp40
-rw-r--r--src/spec.cpp109
-rw-r--r--src/spec.h38
-rw-r--r--src/tag.cpp1141
-rw-r--r--src/tag_file.cpp480
-rw-r--r--src/tag_find.cpp189
-rw-r--r--src/tag_impl.cpp331
-rw-r--r--src/tag_impl.h199
-rw-r--r--src/tag_parse.cpp503
-rw-r--r--src/tag_parse_lyrics3.cpp370
-rw-r--r--src/tag_parse_musicmatch.cpp353
-rw-r--r--src/tag_parse_v1.cpp169
-rw-r--r--src/tag_render.cpp228
-rw-r--r--src/utils.cpp540
-rw-r--r--src/writers.cpp45
-rw-r--r--unicode.org/ConvertUTF.c549
-rw-r--r--unicode.org/ConvertUTF.h149
-rw-r--r--unicode.org/readme.txt44
218 files changed, 87694 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eb1fea3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+/build
+/source/build
+*.mode1v3
+*.pbxuser
+*.pbxindex/
+!user.pbxuser
+/*.log
+*.user
+*.ncb
+*.suo
+*.pdb
+*.pdf
+*.html
+*.idb
+*.o
+*.lo
+*.a
+*.so
+*.so.0
+*.la
+.deps
+.libs
+*.pyc
+.DS_Store
+# Emacs and other editor backup files
+*~
+
+# builds on Windows
+Debug/
+Release/
+release/
+
+/config.h \ No newline at end of file
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..da117bb
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,5 @@
+t1mpy: Thijmen Klok <thijmen@id3lib.org>
+/*
+ * Only for questions if Thijmen seems to be dead:
+ * shadrack: Cedric Tefft <cedric@earthling.net>
+*/
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..bf50f20
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,482 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..9499356
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,10601 @@
+2003-03-02 Sunday 17:38 Thijmen Klok <thijmen@id3lib.org>
+
+ * THANKS (1.20): added more people
+
+2003-03-02 Sunday 17:37 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.25), config.h.win32.in (1.13), configure
+ (1.79), configure.in (1.68), macconfig.h (1.12): changes to reflect
+ new version
+
+2003-03-02 Sunday 17:19 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.sub (1.3), config.guess (1.3): update from
+ ftp://ftp.gnu.org/pub/gnu/config/ timestamp 2003-02-22
+
+2003-03-02 Sunday 16:17 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/: demo_main.cpp (1.4), test_io.cpp (1.6),
+ test_remove.cpp (1.13): added cerr cout and endl where needed
+
+2003-03-02 Sunday 15:39 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_find.cpp (1.28): Fixes a bug where a string is tried to
+ be made from NULL
+
+2003-03-02 Sunday 15:30 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/header_tag.cpp (1.25): adds a check on _info for NULL
+
+2003-03-02 Sunday 15:23 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: field_string_ascii.cpp (1.29), field_string_unicode.cpp
+ (1.33), field_binary.cpp (1.27): added a check for NULL in Set()
+
+2003-03-02 Sunday 15:14 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_file.cpp (1.43): fixes left open file
+
+2003-03-02 Sunday 14:56 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/id3lib_strings.h (1.4): fix for undefined wchar_t
+ template
+
+2003-03-02 Sunday 14:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag.cpp (1.55), include/id3/tag.h (1.63): fix because
+ GetFileName need to return a pointer which keeps to be valid
+
+2003-02-21 Friday 04:47 slackorama
+
+ * include/id3/globals.h (1.54): added a missing const to remove
+ warning when compiling with -Wwrite-strings (as is done in KDE and
+ many other projects)
+
+2002-11-24 Sunday 20:39 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.138): added all entries for 3.8.2 release
+
+2002-11-24 Sunday 20:34 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/id3com.dsp (1.20): added link32 to zlib
+
+2002-11-24 Sunday 18:33 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse.cpp (1.47): fixed a bug which caused v1 tags to be
+ ignored after a lyrics v2 tag
+
+2002-11-24 Sunday 17:31 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse.cpp (1.46): fixed a stupid bug of mine, affecting
+ wrong handling of id3v1 tags
+
+2002-11-03 Sunday 01:41 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/field.cpp (1.47): fixes access to invalid framedefs
+
+2002-11-02 Saturday 23:28 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/win32.readme.first.txt (1.4),
+ libprj/win32.readme.first.txt (1.4), prj/win32.readme.first.txt
+ (1.4): improved comment on delphi
+
+2002-11-02 Saturday 22:02 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_file.cpp (1.42): fixed a bug in RenderV2ToFile, file was
+ not cleared and thus eof mark was still set
+
+2002-11-02 Saturday 19:10 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.137): added todays work
+
+2002-11-02 Saturday 19:07 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.24), configure (1.78), configure.in (1.67),
+ macconfig.h (1.11): bumped version up to 3.8.1
+
+2002-11-02 Saturday 19:03 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3lib.spec.in (1.27): added a line on mp3 headers
+
+2002-11-02 Saturday 18:49 Thijmen Klok <thijmen@id3lib.org>
+
+ * THANKS (1.19): added latest help
+
+2002-11-02 Saturday 18:48 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/globals.h (1.53), src/mp3_header.h (1.4),
+ src/mp3_parse.cpp (1.6): added vbr support
+
+2002-11-02 Saturday 18:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/tag.h (1.62), src/tag.cpp (1.54), src/tag_file.cpp
+ (1.41), src/tag_impl.h (1.10), src/tag_parse.cpp (1.45): added
+ streaming support
+
+2002-11-02 Saturday 18:03 Thijmen Klok <thijmen@id3lib.org>
+
+ * libprj/win32.readme.first.txt (1.3),
+ id3com/win32.readme.first.txt (1.3), prj/win32.readme.first.txt
+ (1.3): added comment about id3lib.pas
+
+2002-11-02 Saturday 17:56 Thijmen Klok <thijmen@id3lib.org>
+
+ * delphi/Id3lib.pas (1.1): added delphi interface to id3lib
+
+2002-11-02 Saturday 13:45 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/: ID3Tag.cpp (1.14), id3com.dsp (1.19), id3com.idl (1.13):
+ Updated id3com in line with latest id3lib
+
+2002-10-04 Friday 10:57 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.136): added latest entries
+
+2002-10-04 Friday 10:52 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_lyrics3.cpp (1.35): cleaning source
+
+2002-09-23 Monday 23:32 slackorama
+
+ * src/tag_parse_lyrics3.cpp (1.34): Fixed a "version priority"
+ issue in the ID3 lyrics tagging stuff. Posted patch on id3lib-devel
+ first.
+
+2002-09-21 Saturday 19:23 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3.h (1.21), include/id3/tag.h (1.61), src/c_wrapper.cpp
+ (1.22, rel-3-7-10), src/helpers.cpp (1.12), src/tag.cpp (1.53),
+ src/tag_impl.cpp (1.13), src/tag_impl.h (1.9): added boolean return
+ for AttachFrame
+
+2002-09-21 Saturday 18:04 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_impl.cpp (1.12): initializing _mp3_info to NULL
+
+2002-09-19 Thursday 12:20 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/misc_support.cpp (1.39), include/id3/misc_support.h (1.29):
+ fixed prototpyes ID3_GetSyncLyrics
+
+2002-08-13 Tuesday 18:10 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/id3lib_strings.h (1.3): fixed compile for gcc 3.2
+
+2002-08-11 Sunday 12:58 Thijmen Klok <thijmen@id3lib.org>
+
+ * cvs2cl.pl (1.2): changed command for use of ssh
+
+2002-08-10 Saturday 22:39 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32.in (1.12): updated for version info on dll
+
+2002-08-10 Saturday 22:13 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.135): updated changelog for latest changes before
+ final
+
+2002-08-10 Saturday 22:02 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/getopt.c (1.3): fixed stupid gcc warning from external
+ code
+
+2002-08-10 Saturday 19:40 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/globals.h (1.52), include/id3/misc_support.h (1.28),
+ src/misc_support.cpp (1.38): added routines to misc_support
+
+2002-08-10 Saturday 18:33 Thijmen Klok <thijmen@id3lib.org>
+
+ * THANKS (1.18): added two busy developers
+
+2002-08-10 Saturday 15:27 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.134): added notes until final version
+
+2002-08-10 Saturday 15:13 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/win32.readme.first.txt (1.2),
+ libprj/win32.readme.first.txt (1.2), prj/win32.readme.first.txt
+ (1.2): updated for MFC instructions
+
+2002-08-10 Saturday 13:51 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.23), configure (1.77), configure.in (1.66),
+ macconfig.h (1.10, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ updated for final version 3.8.0
+
+2002-08-10 Saturday 13:49 Thijmen Klok <thijmen@id3lib.org>
+
+ * makefile.win32 (1.3): updated to include new link option and
+ mp3_parse.cpp
+
+2002-08-10 Saturday 13:47 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/id3com.dsp (1.18), include/id3.h (1.20),
+ include/id3/globals.h (1.51), libprj/id3lib.dsp (1.16),
+ prj/id3lib.dsp (1.18), src/c_wrapper.cpp (1.21): updated to include
+ CCONV definition and use the new linkoption
+
+2002-08-10 Saturday 12:50 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/frame_impl.h (1.6): Added copyright
+
+2002-08-10 Saturday 12:42 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/Makefile.am (1.23), include/id3/Makefile.in (1.59),
+ include/id3/tag.h (1.60), src/c_wrapper.cpp (1.20), src/frame.cpp
+ (1.35), src/frame_impl.h (1.4), src/frame_impl.h (1.5),
+ include/id3/id3lib_frame.h (1.1), include/id3/frame.h (1.43):
+ Renamed frame.h to avoid conflict with windows and gcc header
+
+2002-08-10 Saturday 12:17 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/tag.h (1.59), src/tag.cpp (1.52), src/tag_impl.h
+ (1.8): changed HasTagType from uint16 to ID3_TagType for c_wrapper
+
+2002-08-08 Thursday 23:28 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.22), prj/version.rc (1.2): made dll versioning
+ automated
+
+2002-08-08 Thursday 17:41 Thijmen Klok <thijmen@id3lib.org>
+
+ * prj/: version.rc (1.1), Makefile.am (1.6), Makefile.in (1.5),
+ id3lib.def (1.1), id3lib.dsp (1.17): added version.rc and
+ id3lib.def
+
+2002-07-31 Wednesday 18:41 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse.cpp (1.44): fixed padding empty files
+
+2002-07-31 Wednesday 16:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_lyrics3.cpp (1.33): added brackets for win32
+ compilation
+
+2002-07-31 Wednesday 16:17 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.21), configure (1.76), configure.in (1.65),
+ macconfig.h (1.9, rel-3-7-9): getting ready for pre3.3
+
+2002-07-31 Wednesday 16:16 Thijmen Klok <thijmen@id3lib.org>
+
+ * libtool (1.15): these are generated
+
+2002-07-31 Wednesday 16:02 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.win32 (1.9): is obsolete
+
+2002-07-31 Wednesday 15:59 Thijmen Klok <thijmen@id3lib.org>
+
+ * AUTHORS (1.13, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ added a desciption for Cedrics involment
+
+2002-07-31 Wednesday 15:45 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: field.cpp (1.46), frame_render.cpp (1.27), misc_support.cpp
+ (1.37), tag.cpp (1.51), tag_file.cpp (1.40), tag_parse_lyrics3.cpp
+ (1.32), tag_parse_v1.cpp (1.27): cosmetic changes
+
+2002-07-31 Wednesday 15:20 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: header.cpp (1.11), header.h (1.3), header_tag.cpp (1.24),
+ header_tag.h (1.2), spec.cpp (1.2), tag_impl.cpp (1.11), tag_impl.h
+ (1.7), tag_parse.cpp (1.43), tag_render.cpp (1.44): better support
+ for extended headers
+
+2002-07-31 Wednesday 14:47 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: mp3_header.h (1.3), mp3_parse.cpp (1.5), tag_impl.h (1.6):
+ making Mp3HeaderInfo read-only
+
+2002-07-28 Sunday 23:53 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/demo_info.cpp (1.32), include/id3/tag.h (1.58),
+ src/tag.cpp (1.50): making Mp3HeaderInfo read-only
+
+2002-07-28 Sunday 23:13 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_v1.cpp (1.26): real fix for garbage after comment
+
+2002-07-28 Sunday 22:05 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_v1.cpp (1.25): fix for garbage after comment
+
+2002-07-27 Saturday 18:06 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/: Makefile.am (1.22), Makefile.in (1.58): included
+ id3lib_strings.h and id3lib_streams.h to installed headers
+
+2002-07-27 Saturday 17:44 Thijmen Klok <thijmen@id3lib.org>
+
+ * libprj/id3lib.dsp (1.15), prj/id3lib.dsp (1.16): fixed header
+ location
+
+2002-07-27 Saturday 16:16 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.133): added past week
+
+2002-07-27 Saturday 15:03 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/mp3_parse.cpp (1.4): change of reading in uint16 number to
+ use existing routines
+
+2002-07-26 Friday 13:09 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure (1.75), Makefile.in (1.59), configure.in (1.64),
+ doc/Makefile.in (1.18), examples/Makefile.in (1.25),
+ id3com/Makefile.in (1.2), id3com/Sample/Makefile.in (1.2),
+ include/Makefile.in (1.13), include/id3/Makefile.in (1.57),
+ libprj/Makefile.in (1.4), m4/Makefile.in (1.18), prj/Makefile.in
+ (1.4), src/Makefile.in (1.57): made -liconv to work
+
+2002-07-25 Thursday 15:51 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_impl.cpp (1.10): fixed setting _mp3_info to NULL
+
+2002-07-25 Thursday 14:33 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/mp3_parse.cpp (1.3): changed routine so 0 bitrate mp3s could
+ also be crc checked
+
+2002-07-23 Tuesday 22:06 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.20), configure (1.74, rel-3-7-8), configure.in
+ (1.63), macconfig.h (1.8): yet another devel release upgrade of
+ version nr
+
+2002-07-23 Tuesday 21:55 Thijmen Klok <thijmen@id3lib.org>
+
+ * prj/id3lib.dsp (1.15), libprj/id3lib.dsp (1.14): included
+ mp3_parse.cpp and mp3_header.h
+
+2002-07-23 Tuesday 18:28 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/sized_types.h (1.7): added a better desciption on
+ what to send on error
+
+2002-07-23 Tuesday 16:15 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.19), configure (1.73), configure.in (1.62),
+ macconfig.h (1.7), ChangeLog (1.132): higher version because of
+ devel release
+
+2002-07-23 Tuesday 15:57 Thijmen Klok <thijmen@id3lib.org>
+
+ * NEWS (1.27, rel-3-7-10): added url for latest news
+
+2002-07-23 Tuesday 15:47 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/: Makefile.am (1.22), Makefile.in (1.24),
+ demo_simple.cpp (1.1): renamed demo_simple.c to demo_simple.cpp
+
+2002-07-23 Tuesday 15:22 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/: Makefile.am (1.21), Makefile.in (1.23), crc53865.mp3
+ (1.1): added crc53865.mp3 for new routine GetMp3HeaderInfo
+
+2002-07-23 Tuesday 15:20 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/globals.h (1.50), examples/demo_info.cpp (1.31),
+ include/id3/tag.h (1.57), src/mp3_header.h (1.2), src/mp3_parse.cpp
+ (1.2), src/tag.cpp (1.49), src/tag_impl.h (1.5): changed name of
+ GetMp3Header and Mp3_Header
+
+2002-07-22 Monday 20:28 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.131): added mp3 header info additions
+
+2002-07-22 Monday 19:56 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/globals.h (1.49), include/id3/tag.h (1.56),
+ src/Makefile.am (1.27), src/Makefile.in (1.56), src/tag.cpp (1.48),
+ src/tag_impl.h (1.4), src/tag_parse.cpp (1.42), src/mp3_header.h
+ (1.1), src/mp3_parse.cpp (1.1): Added mp3 header info
+
+2002-07-17 Wednesday 18:40 Thijmen Klok <thijmen@id3lib.org>
+
+ * Makefile.am (1.28), include/Makefile.am (1.6),
+ include/id3/Makefile.am (1.21), libprj/Makefile.am (1.6),
+ m4/Makefile.am (1.9), prj/Makefile.am (1.5, rel-3-7-13,
+ rel-3-7-12), src/Makefile.am (1.26): added copyright
+
+2002-07-17 Wednesday 18:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * Makefile.in (1.58), configure.in (1.61), doc/Makefile.in (1.17),
+ examples/Makefile.in (1.22), id3com/Makefile.in (1.1),
+ id3com/Sample/Makefile.in (1.1), include/Makefile.in (1.12),
+ include/id3/Makefile.in (1.56), libprj/Makefile.in (1.3),
+ m4/Makefile.in (1.17), prj/Makefile.in (1.3), src/Makefile.in
+ (1.55), aclocal.m4 (1.18), configure (1.72, rel-3-7-7): regenerated
+
+2002-07-17 Wednesday 17:42 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure.in (1.60): changed AC_PROG_LIBTOOL to AM_PROG_LIBTOOL
+
+2002-07-17 Wednesday 17:16 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/Sample/Makefile.am (1.1): initial file
+
+2002-07-17 Wednesday 17:14 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/Makefile.am (1.9): changed to reflect dir contents
+
+2002-07-17 Wednesday 17:03 Thijmen Klok <thijmen@id3lib.org>
+
+ * m4/Makefile.am (1.8): added id3_unicode.m4
+
+2002-07-16 Tuesday 17:32 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/: Makefile.am (1.20), Makefile.in (1.55): added
+ id3lib_bitset
+
+2002-07-08 Monday 20:27 Thijmen Klok <thijmen@id3lib.org>
+
+ * prj/Makefile.am (1.4), prj/Makefile.in (1.2), libprj/Makefile.am
+ (1.5), libprj/Makefile.in (1.2): added win32.readme
+
+2002-07-06 Saturday 23:31 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.130): added last two days
+
+2002-07-06 Saturday 23:28 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_v1.cpp (1.24): fixed setting field when previous
+ field was existing but empty
+
+2002-07-06 Saturday 19:04 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse_v1.cpp (1.23): fixed setting genre when previous
+ genre was existing but empty
+
+2002-07-06 Saturday 15:52 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: frame_render.cpp (1.26), frame_parse.cpp (1.34): fixed
+ empty frame bugs
+
+2002-07-05 Friday 18:12 Thijmen Klok <thijmen@id3lib.org>
+
+ * AUTHORS (1.12): Readded Cedric, welcome back :-)
+
+2002-07-05 Friday 14:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.129): added last few days
+
+2002-07-05 Friday 14:33 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_parse.cpp (1.41): cleanup of internal variable file added
+
+2002-07-05 Friday 14:31 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/: header_frame.h (1.2), frame_render.cpp (1.25): Fixed bug
+ unknown frames corrupting tag
+
+2002-07-03 Wednesday 22:36 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag_file.cpp (1.39): Fixed deleted MP3 after update
+
+2002-07-03 Wednesday 00:27 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.128): added last two days
+
+2002-07-03 Wednesday 00:10 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/field.h (1.47), include/id3/frame.h (1.42),
+ include/id3/globals.h (1.48), include/id3/helpers.h (1.9),
+ include/id3/io_decorators.h (1.5), include/id3/reader.h (1.13),
+ include/id3/utils.h (1.22), include/id3/writer.h (1.8),
+ include/id3/writers.h (1.11), include/id3.h (1.19),
+ src/c_wrapper.cpp (1.19), src/field.cpp (1.45),
+ src/field_binary.cpp (1.26), src/field_def.h (1.2),
+ src/field_integer.cpp (1.21), src/field_string_ascii.cpp (1.28),
+ src/field_string_unicode.cpp (1.32), src/frame_def.h (1.2),
+ src/frame_impl.cpp (1.9), src/frame_parse.cpp (1.33),
+ src/frame_render.cpp (1.24), src/globals.cpp (1.6), src/header.h
+ (1.2), src/header_frame.cpp (1.22), src/header_tag.cpp (1.23),
+ src/helpers.cpp (1.11), src/io_decorators.cpp (1.4),
+ src/io_helpers.cpp (1.13), src/misc_support.cpp (1.36),
+ src/readers.cpp (1.7), src/spec.h (1.2), src/tag.cpp (1.47),
+ src/tag_file.cpp (1.38), src/tag_find.cpp (1.27), src/tag_impl.cpp
+ (1.9), src/tag_impl.h (1.3), src/tag_parse.cpp (1.40),
+ src/tag_parse_lyrics3.cpp (1.31), src/tag_parse_musicmatch.cpp
+ (1.19), src/tag_parse_v1.cpp (1.22), src/tag_render.cpp (1.43):
+ cleaned header includes
+
+2002-07-03 Wednesday 00:04 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/utils.cpp (1.26): Added safeguard for failed iconv calls
+
+2002-07-02 Tuesday 14:22 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/utils.cpp (1.25): added prevention of going to unnecesary
+ code when empty
+
+2002-07-01 Monday 16:44 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.127): added last two days
+
+2002-07-01 Monday 16:03 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/utils.cpp (1.24): Fix for iconv
+
+2002-07-01 Monday 15:20 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/get_local_codeset.c (1.1): added for unicode debugging
+
+2002-07-01 Monday 14:24 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/win-xp.mp3 (1.1): added for issue 547255
+
+2002-07-01 Monday 02:13 Thijmen Klok <thijmen@id3lib.org>
+
+ * aclocal.m4 (1.17), m4/id3_unicode.m4 (1.2): Fix for iconv
+
+2002-06-30 Sunday 19:37 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/globals.h (1.47): removed unnessesary defines which
+ gave warnings one some compilers
+
+2002-06-30 Sunday 18:24 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure.in (1.59), config.h.in (1.23, rel-3-7-9, rel-3-7-13),
+ configure (1.71), config.h.win32.in (1.11), config.h.win32 (1.18),
+ macconfig.h (1.6): Fix for iconv
+
+2002-06-29 Saturday 22:49 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.126): added past few days
+
+2002-06-29 Saturday 22:45 Thijmen Klok <thijmen@id3lib.org>
+
+ * macconfig.h (1.5): Added Define for NetBSD and MacOS X
+
+2002-06-29 Saturday 22:24 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure.in (1.58), configure (1.70): Fixed horribly wrong file
+
+2002-06-29 Saturday 21:48 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.win32 (1.16), config.h.win32.in (1.10, rel-3-7-13),
+ config.h.win32 (1.17), config.h.in (1.22), configure.in (1.57),
+ configure (1.69), src/frame_impl.h (1.3): change for new define
+ HAVE_BITSET for NetBSD and MacOS X
+
+2002-06-29 Saturday 21:16 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/id3lib_bitset (1.1): Added for NetBSD and MacOs X
+
+2002-06-29 Saturday 19:35 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/field_integer.cpp (1.20), src/frame.cpp (1.34),
+ src/frame_parse.cpp (1.32), src/frame_render.cpp (1.23),
+ src/globals.cpp (1.5), src/header.cpp (1.10), src/header_frame.cpp
+ (1.21), src/header_tag.cpp (1.22), src/io.cpp (1.2),
+ src/io_decorators.cpp (1.3), src/io_helpers.cpp (1.12),
+ src/readers.cpp (1.6), src/tag.cpp (1.46), src/tag_file.cpp (1.37),
+ src/tag_parse.cpp (1.39), src/tag_parse_lyrics3.cpp (1.30),
+ src/tag_parse_musicmatch.cpp (1.18), src/tag_parse_v1.cpp (1.21),
+ src/tag_render.cpp (1.42), src/utils.cpp (1.23),
+ src/writer_decorators.cpp (1.2), src/writers.cpp (1.2),
+ include/id3/field.h (1.46), include/id3/frame.h (1.41),
+ include/id3/globals.h (1.46), include/id3/helpers.h (1.8),
+ include/id3/id3lib_strings.h (1.2), include/id3/io_decorators.h
+ (1.4), include/id3/io_helpers.h (1.7), include/id3/io_strings.h
+ (1.6), include/id3/misc_support.h (1.27), include/id3/reader.h
+ (1.12), include/id3/readers.h (1.12), include/id3/tag.h (1.55),
+ include/id3/utils.h (1.21), include/id3/writer.h (1.7),
+ include/id3/writers.h (1.10): added trailing newline to prevent
+ compiler warning
+
+2002-06-29 Saturday 19:18 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/: demo_tag.cpp (1.15), demo_info.cpp (1.30),
+ demo_copy.cpp (1.11), findeng.cpp (1.6), findstr.cpp (1.6),
+ get_pic.cpp (1.8), test_compression.cpp (1.9), test_io.cpp (1.5),
+ test_pic.cpp (1.10), test_remove.cpp (1.12), test_unicode.cpp
+ (1.8): added trailing linefeed
+
+2002-06-29 Saturday 19:11 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/utils.cpp (1.22): quickfixed compiling on Solaris regarding
+ iconv, still looking into a more elegant solution
+
+2002-06-29 Saturday 16:43 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/field_string_unicode.cpp (1.31): fixes compile on some
+ solarises + fix for unicode typo
+
+2002-06-29 Saturday 16:41 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/dami/lyr3.h (1.3), include/dami/lyr3_impl.h (1.3),
+ include/id3.h (1.18), include/id3/field.h (1.45),
+ include/id3/frame.h (1.40), include/id3/helpers.h (1.7),
+ include/id3/tag.h (1.54), src/c_wrapper.cpp (1.18, rel-3-7-9),
+ src/field.cpp (1.44), src/field_impl.h (1.4),
+ src/field_string_ascii.cpp (1.27), src/frame.cpp (1.33),
+ src/helpers.cpp (1.10), src/io_helpers.cpp (1.11), src/tag.cpp
+ (1.45), src/utils.cpp (1.21), include/id3/globals.h (1.45): fixes
+ compile on some solarises
+
+2002-06-28 Friday 14:36 Thijmen Klok <thijmen@id3lib.org>
+
+ * src/tag.cpp (1.44): corrected type in comment
+
+2002-06-28 Friday 13:59 Thijmen Klok <thijmen@id3lib.org>
+
+ * zlib/: include/deflate.h (1.4), include/infblock.h (1.4),
+ include/infcodes.h (1.4), include/inffast.h (1.4),
+ include/inftrees.h (1.4), include/infutil.h (1.4), include/zconf.h
+ (1.5, rel-3-7-13, rel-3-7-12), include/zlib.h (1.5),
+ include/zutil.h (1.5), src/adler32.c (1.4, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9), src/compress.c (1.4), src/crc32.c (1.4),
+ src/deflate.c (1.4), src/gzio.c (1.5), src/infblock.c (1.4),
+ src/infcodes.c (1.4), src/inffast.c (1.4), src/inflate.c (1.4),
+ src/inftrees.c (1.4), src/infutil.c (1.4), src/trees.c (1.4),
+ src/uncompr.c (1.4), src/zutil.c (1.5): removed carriage return
+
+2002-06-28 Friday 10:32 Thijmen Klok <thijmen@id3lib.org>
+
+ * libtool (1.14): hardly any changes
+
+2002-06-28 Friday 10:29 Thijmen Klok <thijmen@id3lib.org>
+
+ * ChangeLog (1.125): Added the changes since i started working on
+ this
+
+2002-06-28 Friday 10:26 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure.in (1.56), configure (1.68): added url for missing
+ headers
+
+2002-06-27 Thursday 15:02 Thijmen Klok <thijmen@id3lib.org>
+
+ * examples/demo_copy.cpp (1.10): corrected a typo
+
+2002-06-27 Thursday 14:51 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/strings.h (1.5): replaced by id3lib_strings.h for
+ compile on NetBSD
+
+2002-06-27 Thursday 14:41 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure (1.67), src/io_helpers.cpp (1.10), libtool (1.13),
+ src/misc_support.cpp (1.35), src/utils.cpp (1.20), src/tag_file.cpp
+ (1.36), examples/demo_info.cpp (1.29), configure.in (1.55),
+ examples/demo_convert.cpp (1.15), include/id3/writers.h (1.9),
+ include/id3/readers.h (1.11), examples/test_unicode.cpp (1.7),
+ examples/findeng.cpp (1.5), examples/demo_tag.cpp (1.14),
+ examples/demo_main.cpp (1.3), examples/test_compression.cpp (1.8),
+ examples/get_pic.cpp (1.7), examples/findstr.cpp (1.5),
+ examples/test_pic.cpp (1.9), examples/test_remove.cpp (1.11),
+ src/tag.cpp (1.43), include/id3/utils.h (1.20),
+ include/id3/io_strings.h (1.5), include/id3/io_decorators.h (1.3),
+ include/id3/helpers.h (1.6), src/field_impl.h (1.3), src/tag_impl.h
+ (1.2), include/dami/v1.h (1.2), include/dami/mm.h (1.2),
+ include/dami/lyr3_impl.h (1.2), include/dami/lyr3.h (1.2),
+ include/id3/io_helpers.h (1.6), prj/id3lib.dsp (1.14),
+ libprj/id3lib.dsp (1.13), include/id3/Makefile.in (1.54),
+ include/id3/Makefile.am (1.19), examples/demo_copy.cpp (1.9): Fix
+ for compile with gcc 3.x, and compile on NetBSD and alpha
+
+2002-06-27 Thursday 14:00 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/id3lib_strings.h (1.1): Added as fix for compile
+ errors on NetBSD
+
+2002-06-27 Thursday 13:59 Thijmen Klok <thijmen@id3lib.org>
+
+ * include/id3/id3lib_streams.h (1.1): Added as fix for gcc 3.x
+ compile errors
+
+2002-06-27 Thursday 13:50 Thijmen Klok <thijmen@id3lib.org>
+
+ * THANKS (1.17): added thanx for email alias
+
+2002-06-27 Thursday 13:48 Thijmen Klok <thijmen@id3lib.org>
+
+ * AUTHORS (1.11, rel-3-7-9, rel-3-7-8, rel-3-7-7): Changing email,
+ added an 'old' entry
+
+2002-06-27 Thursday 12:09 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.h.in (1.21): fixes a bug in autoconf, checking for
+ booleans in gcc while g++ is used for compiling
+
+2002-06-27 Thursday 12:05 Thijmen Klok <thijmen@id3lib.org>
+
+ * prj/win32.readme.first.txt (1.1), libprj/win32.readme.first.txt
+ (1.1): Added as clarification on directories
+
+2002-06-27 Thursday 11:55 Thijmen Klok <thijmen@id3lib.org>
+
+ * id3com/: Sample/frmID3Test.frm (1.8), Sample/ID3Test.vbp (1.8),
+ Sample/ID3Test.vbw (1.9), dlldata.c (1.6), EnumFields.cpp (1.7),
+ EnumFields.h (1.7), id3com.cpp (1.9), ID3COM.def (1.6), id3com.dsp
+ (1.17), id3com.dsw (1.7), id3com.idl (1.12), ID3COMps.def (1.6),
+ ID3COMps.mk (1.6), ID3COM.rc (1.7), ID3Field.cpp (1.8), ID3Field.h
+ (1.10), ID3Field.rgs (1.7), ID3Frame.cpp (1.11), ID3Frame.h (1.10),
+ ID3Frame.rgs (1.7), ID3Tag.cpp (1.13), ID3Tag.h (1.10), ID3Tag.rgs
+ (1.7), Makefile.am (1.8), resource.h (1.7), StdAfx.cpp (1.8),
+ StdAfx.h (1.8), win32.readme.first.txt (1.1): Re-Added as service
+
+2002-06-21 Friday 00:18 Thijmen Klok <thijmen@id3lib.org>
+
+ * configure (1.66), zlib/configure (1.3): updated from autoconf
+ 1.53a
+
+2002-06-20 Thursday 04:02 Thijmen Klok <thijmen@id3lib.org>
+
+ * zlib/: include/deflate.h (1.3), include/infblock.h (1.3),
+ include/infcodes.h (1.3), include/inffast.h (1.3),
+ include/inftrees.h (1.3), include/infutil.h (1.3), include/zconf.h
+ (1.4), include/zlib.h (1.4), include/zutil.h (1.4), src/adler32.c
+ (1.3), src/compress.c (1.3), src/crc32.c (1.3), src/deflate.c
+ (1.3), src/gzio.c (1.4), src/infblock.c (1.3), src/infcodes.c
+ (1.3), src/inffast.c (1.3), src/inflate.c (1.3), src/inftrees.c
+ (1.3), src/infutil.c (1.3), src/trees.c (1.3), src/uncompr.c (1.3),
+ src/zutil.c (1.4): updated to zlib version 1.1.4
+
+2002-06-19 Wednesday 20:21 Thijmen Klok <thijmen@id3lib.org>
+
+ * THANKS (1.16): Added Simon Ferrett for the id3lib.org domain
+ "link"
+
+2002-06-19 Wednesday 19:59 Thijmen Klok <thijmen@id3lib.org>
+
+ * config.sub (1.2), config.guess (1.2): update from
+ ftp://ftp.gnu.org/pub/gnu/config/ timestamp 2002-05-28
+
+2002-06-19 Wednesday 17:45 Thijmen Klok <thijmen@id3lib.org>
+
+ * AUTHORS (1.10): added t1mpy as author
+
+2002-03-20 Wednesday 11:32 slackorama
+
+ * include/id3/misc_support.h (1.26, rel-3-7-10): This is the other
+ half of the commit for adding text based genres.
+
+2002-03-20 Wednesday 11:32 slackorama
+
+ * src/misc_support.cpp (1.34): Added a method for adding text based
+ genres.
+
+2002-03-03 Sunday 21:04 slackorama
+
+ * src/tag_file.cpp (1.35): This should fix a long standing bug on
+ UNIX systems. When a temp file is created in tag_file.cpp it always
+ used 0600 permissions. Now, when that file is moved over the file
+ being edited, the permissions will be restored to the original.
+
+2002-02-19 Tuesday 02:54 slackorama
+
+ * src/io_helpers.cpp (1.9): changed line 306 in
+ io::writeTrailingSpaces() (io_helpers.cpp) from writer.writeChar('
+ '); to writer.writeChar('\0');
+ This pads id3v1 tags will null characters instead of spaces.
+
+2002-01-22 Tuesday 22:06 slackorama
+
+ * src/: tag_parse_v1.cpp (1.20), tag_render.cpp (1.41): I added
+ Florian Heidenreich's fixes for the computation of padding size in
+ tag_render.cpp ID3_TagImpl::PaddingSize() and made change to
+ tag_parse_v1.cpp so that it doesn't return an undefined value for
+ the track number when parsing a file with just an id3v1.0 tag (and
+ no v2 or v1.1). || was changed to && on line 115.
+
+2001-12-18 Tuesday 10:12 shadrack
+
+ * depcomp (1.1), src/.cvsignore (1.15), zlib/.cvsignore (1.7): Add
+ depcomp file needed for configure script
+
+2001-12-18 Tuesday 09:57 shadrack
+
+ * libtool (1.12), src/tag_render.cpp (1.40), zlib/config.h (1.2),
+ zlib/libtool (1.3): Applied Florian Heidenreich's padding fix
+
+2001-12-17 Monday 18:40 shadrack
+
+ * zlib/prj/: zlib.dsp (1.6), zlib.dsw (1.3), zlib.mak (1.3):
+ Switched EOL conventions to DOS in zlib VC++ project files
+
+2001-12-17 Monday 18:34 shadrack
+
+ * reconf (1.4): More build tool updates
+
+2001-12-17 Monday 18:24 shadrack
+
+ * libprj/Makefile.in (1.1), prj/Makefile.in (1.1): Makefile
+ templates for Visual C++ build directories
+
+2001-12-17 Monday 18:20 shadrack
+
+ * Makefile.am (1.27), Makefile.in (1.57), aclocal.m4 (1.16),
+ config.h.in (1.20), configure (1.65), configure.in (1.54),
+ id3lib.spec.in (1.26), ltmain.sh (1.2), missing (1.2),
+ doc/Makefile.in (1.16), examples/Makefile.in (1.21),
+ include/Makefile.in (1.11), include/id3/Makefile.in (1.53),
+ libprj/Makefile.am (1.4), m4/Makefile.in (1.16), src/Makefile.in
+ (1.54), zlib/Makefile.in (1.3), zlib/aclocal.m4 (1.2),
+ zlib/config.h.in (1.2), zlib/configure (1.2), zlib/configure.in
+ (1.2), zlib/include/Makefile.in (1.3, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7),
+ zlib/lib/Makefile.in (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7), zlib/prj/Makefile.in
+ (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7), zlib/src/Makefile.in (1.6):
+ Updated build files for current versions of automake and the like.
+
+2001-12-16 Sunday 12:44 shadrack
+
+ * config.h.in (1.19), config.h.win32 (1.15), config.win32 (1.8),
+ configure (1.64), configure.in (1.53), macconfig.h (1.4, rel-3-7-8,
+ rel-3-7-7), src/tag_parse_v1.cpp (1.19): V1 parsing fix
+
+2001-12-16 Sunday 12:11 shadrack
+
+ * config.h.win32 (1.14), config.win32 (1.7), configure (1.63),
+ macconfig.h (1.3), makefile.win32 (1.2), makewin32.bat (1.2):
+ Cosmetic fixups to reflect 2001-12-16 snapshot
+
+2001-12-16 Sunday 11:32 shadrack
+
+ * makefile.win32 (1.1), makewin32.bat (1.1): Added Win32
+ command-line build files
+
+2001-12-16 Sunday 10:56 shadrack
+
+ * src/tag_render.cpp (1.39): Applied fixes for bug 469112
+
+2001-12-16 Sunday 10:40 shadrack
+
+ * src/tag_file.cpp (1.34): Fixed overwrite bug in tag_file.cpp
+
+2001-12-16 Sunday 10:25 shadrack
+
+ * src/tag.cpp (1.42): Applied fix from bug #232172 (overflow crash
+ under Win32)
+
+2001-12-16 Sunday 10:10 shadrack
+
+ * src/tag_file.cpp (1.33): Daniel Hazelbaker's patch to fix ID3V1
+ appending when only ID3V2 tag was read
+
+2001-12-16 Sunday 09:46 shadrack
+
+ * libprj/id3lib.dsp (1.12), libprj/id3lib.dsw (1.7), prj/id3lib.dsp
+ (1.13), prj/id3lib.dsw (1.6): Fixed Visual C++ Workspace files
+
+2001-11-05 Monday 10:55 shadrack
+
+ * include/id3/helpers.h (1.5), src/helpers.cpp (1.9),
+ src/misc_support.cpp (1.33), src/tag_parse_v1.cpp (1.18): Applied
+ Scott Wheeler's version priority bug fix
+
+2001-09-09 Sunday 01:53 shadrack
+
+ * AUTHORS (1.9), ChangeLog (1.124), Makefile.in (1.56), NEWS
+ (1.26), config.h.win32 (1.13), config.win32 (1.6), configure
+ (1.62), configure.in (1.52, rel-3-7-4), id3lib.spec.in (1.25),
+ macconfig.h (1.2), src/field.cpp (1.43): Bumped version up to
+ 3.8.0pre2 for release
+
+2001-09-08 Saturday 23:33 shadrack
+
+ * src/field.cpp (1.42): Implemented Matt Mueller's FrameInfo fixes
+
+2001-09-08 Saturday 23:19 shadrack
+
+ * include/id3/io_strings.h (1.4), src/io_helpers.cpp (1.8): Back
+ out Mac port typecasts for compatibility reasons
+
+2001-09-08 Saturday 04:33 shadrack
+
+ * include/id3.h (1.17), src/c_wrapper.cpp (1.17), src/tag.cpp
+ (1.41): Added ID3Tag_LinkWithFlags() function export
+
+2001-08-27 Monday 01:33 dmazzoni
+
+ * src/field_binary.cpp (1.25), libprj/id3lib.mcp (1.1),
+ src/io_helpers.cpp (1.7), include/id3/io_strings.h (1.3),
+ macconfig.h (1.1), src/readers.cpp (1.5), include/id3/readers.h
+ (1.10), src/tag_file.cpp (1.32), src/tag_parse_musicmatch.cpp
+ (1.17), src/utils.cpp (1.19), include/id3/writers.h (1.8),
+ zlib/prj/zlib.mcp (1.1): Ported to MacOS and added Mac project
+ files (id3lib.mcp and zlib.mcp).
+
+2001-08-07 Tuesday 13:58 shadrack
+
+ * Makefile.in (1.55, rel-3-7-5), doc/Makefile.in (1.15),
+ examples/Makefile.in (1.20), include/Makefile.in (1.10),
+ include/id3.h (1.16), include/id3/Makefile.in (1.52),
+ include/id3/field.h (1.44), include/id3/globals.h (1.44),
+ m4/Makefile.in (1.15), src/Makefile.in (1.53), src/field.cpp
+ (1.41), src/field_impl.h (1.2), src/tag.cpp (1.40): Added FrameInfo
+ class
+
+2001-08-05 Sunday 23:21 abscess
+
+ * src/tag_parse_lyrics3.cpp (1.29): album parsing typo fix
+ (courtesy of J.P. Bergamin)
+
+2001-08-05 Sunday 23:18 abscess
+
+ * src/frame_parse.cpp (1.31): zero-length frame fix (courtesy of
+ J.P. Bergamin)
+
+2001-08-05 Sunday 23:16 abscess
+
+ * examples/demo_simple.c (1.4): displays artist and album
+
+2001-08-04 Saturday 02:05 thefrogprince
+
+ * src/tag.cpp (1.39): Minor documentation fixes
+
+2001-07-30 Monday 20:22 abscess
+
+ * include/id3/field.h (1.43), include/id3/frame.h (1.39),
+ include/id3/globals.h (1.43), include/id3/helpers.h (1.4),
+ include/id3/io_decorators.h (1.2), include/id3/io_helpers.h (1.5),
+ include/id3/io_strings.h (1.2), include/id3/misc_support.h (1.25),
+ include/id3/reader.h (1.11), include/id3/readers.h (1.9),
+ include/id3/tag.h (1.53), include/id3/utils.h (1.19),
+ include/id3/writer.h (1.6), include/id3/writers.h (1.7),
+ src/misc_support.cpp (1.32): applied changes made to repository
+ while stored temporarily on millweed.com
+
+2001-07-25 Wednesday 05:50 thefrogprince
+
+ * src/tag.cpp (1.38): Fix ID3_Tag::HasTagType() bug
+
+2001-07-24 Tuesday 10:12 thefrogprince
+
+ * libtool (1.11), examples/demo_convert.cpp (1.14),
+ examples/demo_copy.cpp (1.8), examples/demo_copy_options.c (1.5),
+ examples/demo_copy_options.h (1.2), examples/demo_info_options.c
+ (1.5), examples/demo_info_options.h (1.2), src/utils.cpp (1.18),
+ zlib/libtool (1.2): Fix compiler errors
+
+2000-11-20 Monday 10:17 eldamitri
+
+ * src/utils.cpp (1.17): Minor namespace bugfix
+
+2000-11-20 Monday 10:06 eldamitri
+
+ * NEWS (1.25), id3lib.spec.in (1.24): Updated for new release
+
+2000-11-20 Monday 09:30 eldamitri
+
+ * id3com/: .cvsignore (1.6), BSTRCollection.h (1.2, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7), EnumFields.cpp (1.6), EnumFields.h (1.6),
+ ID3COM.def (1.5), ID3COM.rc (1.6), ID3COMps.def (1.5), ID3COMps.mk
+ (1.5), ID3Field.cpp (1.7), ID3Field.h (1.9), ID3Field.rgs (1.6),
+ ID3Frame.cpp (1.10), ID3Frame.h (1.9), ID3Frame.rgs (1.6),
+ ID3Tag.cpp (1.12), ID3Tag.h (1.9), ID3Tag.rgs (1.6), Makefile.am
+ (1.7), MimeTypes.cpp (1.2), MimeTypes.h (1.2), StdAfx.cpp (1.7),
+ StdAfx.h (1.7), TextCollection.cpp (1.2), TextCollection.h (1.2),
+ TextCollection.rgs (1.2), dlldata.c (1.5), frmID3Test.frm (1.5),
+ id3com.cpp (1.8), id3com.dsp (1.16), id3com.dsw (1.6), id3com.idl
+ (1.11), mssccprj.scc (1.5), resource.h (1.6), vssver.scc (1.2),
+ Sample/.cvsignore (1.2), Sample/ID3Test.vbp (1.7),
+ Sample/ID3Test.vbw (1.8), Sample/MSSCCPRJ.SCC (1.5),
+ Sample/frmID3Test.frm (1.7): Now has its own project at sourceforge
+
+2000-11-20 Monday 09:19 eldamitri
+
+ * doc/Doxyfile.in (1.7): Updated list of input files
+
+2000-11-20 Monday 09:18 eldamitri
+
+ * src/tag.cpp (1.37): Updated tutorial docs
+
+2000-11-07 Tuesday 10:44 eldamitri
+
+ * examples/: demo_convert_options.ggo (1.2), demo_copy_options.ggo
+ (1.2), demo_info_options.ggo (1.2), demo_tag_options.ggo (1.2):
+ Rely on automake's VERSION macro for assigning apps' version
+
+2000-11-07 Tuesday 10:40 eldamitri
+
+ * examples/: Makefile.am (1.20), Makefile.in (1.19): Removed rule
+ for generating ggo file
+
+2000-11-07 Tuesday 10:39 eldamitri
+
+ * examples/: demo_convert_options.ggo (1.1), demo_copy_options.ggo
+ (1.1), demo_info_options.ggo (1.1), demo_tag_options.ggo (1.1):
+ Initial release
+
+2000-11-07 Tuesday 10:27 eldamitri
+
+ * configure (1.61), configure.in (1.51): Removed AC_PROG_RANLIB
+
+ (deprecated)
+
+2000-11-07 Tuesday 10:19 eldamitri
+
+ * src/utils.cpp (1.16): Removed "using namespace std"
+
+2000-11-07 Tuesday 10:18 eldamitri
+
+ * src/frame_impl.h (1.2): Made iterator and const_iterator typedefs
+ public
+
+2000-11-07 Tuesday 10:17 eldamitri
+
+ * src/Makefile.am (1.25): Add tag_impl.h to list of distributed
+ header files
+
+2000-11-07 Tuesday 10:17 eldamitri
+
+ * config.h.win32 (1.11), config.h.win32.in (1.9): Brought up to
+ speed with current config.h
+
+2000-11-04 Saturday 03:56 eldamitri
+
+ * examples/: demo_convert_options.ggo.in (1.2),
+ demo_copy_options.ggo.in (1.2), demo_info_options.ggo.in (1.2),
+ demo_tag_options.ggo.in (1.2): not needed
+
+2000-10-29 Sunday 09:15 eldamitri
+
+ * configure.in (1.50), include/id3/globals.h (1.42),
+ include/id3/io_helpers.h (1.4), include/id3/utils.h (1.18),
+ src/field.cpp (1.40), src/io_helpers.cpp (1.6), src/utils.cpp
+ (1.15): Improved unicode support for systems that support iconv
+
+2000-10-29 Sunday 09:14 eldamitri
+
+ * examples/test_io.cpp (1.4): Added tests for unicode transcoding
+
+2000-10-29 Sunday 09:14 eldamitri
+
+ * m4/id3_unicode.m4 (1.1): Initial release
+
+2000-10-29 Sunday 02:39 eldamitri
+
+ * m4/id3_debug.m4 (1.1): Initial release
+
+2000-10-29 Sunday 02:37 eldamitri
+
+ * configure.in (1.49), examples/demo_convert.cpp (1.13),
+ examples/demo_convert_options.c (1.3), examples/demo_copy.cpp
+ (1.7), examples/demo_copy_options.c (1.3), examples/demo_info.cpp
+ (1.28), examples/demo_info_options.c (1.3), examples/demo_tag.cpp
+ (1.13), examples/demo_tag_options.c (1.3), examples/findeng.cpp
+ (1.4), examples/findstr.cpp (1.4), examples/get_pic.cpp (1.6),
+ examples/test_compression.cpp (1.7), examples/test_io.cpp (1.3),
+ examples/test_pic.cpp (1.8), examples/test_remove.cpp (1.10),
+ examples/test_unicode.cpp (1.6), include/id3/Makefile.am (1.18),
+ m4/Makefile.am (1.7), src/Makefile.am (1.24), src/field.cpp (1.39),
+ src/field_binary.cpp (1.24), src/field_integer.cpp (1.19),
+ src/field_string_ascii.cpp (1.26), src/field_string_unicode.cpp
+ (1.30), src/frame_parse.cpp (1.30), src/frame_render.cpp (1.22),
+ src/header_frame.cpp (1.20), src/header_tag.cpp (1.21),
+ src/helpers.cpp (1.8), src/io_decorators.cpp (1.2),
+ src/io_helpers.cpp (1.5), src/misc_support.cpp (1.31),
+ src/readers.cpp (1.4), src/tag.cpp (1.36), src/tag_file.cpp (1.31),
+ src/tag_find.cpp (1.26), src/tag_impl.cpp (1.8), src/tag_parse.cpp
+ (1.38), src/tag_parse_lyrics3.cpp (1.28),
+ src/tag_parse_musicmatch.cpp (1.16), src/tag_parse_v1.cpp (1.17),
+ src/tag_render.cpp (1.38), src/utils.cpp (1.14):
+ - Moved debug.h functionality to configure script
+ - Removed file debug.h and all its inclusion's
+
+2000-10-29 Sunday 02:18 eldamitri
+
+ * src/debug.h (1.2): Moved functionality in configure.in
+
+2000-10-24 Tuesday 18:12 eldamitri
+
+ * include/id3/field_def.h (1.5), src/field_def.h (1.1),
+ include/id3/field_impl.h (1.11), src/field_impl.h (1.1),
+ include/id3/frame_def.h (1.5), src/frame_def.h (1.1),
+ include/id3/frame_impl.h (1.5), src/frame_impl.h (1.1),
+ include/id3/header.h (1.22), src/header.h (1.1),
+ include/id3/header_frame.h (1.21), src/header_frame.h (1.1),
+ include/id3/header_tag.h (1.18), src/header_tag.h (1.1),
+ include/id3/spec.h (1.6), src/spec.h (1.1), include/id3/tag_impl.h
+ (1.9), src/tag_impl.h (1.1), include/id3/debug.h (1.6), src/debug.h
+ (1.1), include/id3/flags.h (1.5), src/flags.h (1.1): Moved from
+ include/id3/ to src/
+
+2000-10-24 Tuesday 09:00 eldamitri
+
+ * include/id3.h (1.15), include/id3/frame.h (1.38),
+ include/id3/frame_impl.h (1.4), include/id3/tag.h (1.52),
+ include/id3/tag_impl.h (1.8), src/c_wrapper.cpp (1.16),
+ src/frame.cpp (1.32), src/frame_impl.cpp (1.8), src/frame_parse.cpp
+ (1.29), src/frame_render.cpp (1.21), src/tag.cpp (1.35),
+ src/tag_find.cpp (1.25), src/tag_impl.cpp (1.7): Added
+ ID3_Frame::Iterator and ID3_Frame::ConstIterator to traverse an
+ ID3_Frame's fields. Dynamically created with
+ ID3_Frame::CreateIterator(), the iterator is to be used instead of
+ ID3_Frame::NumFields() and ID3_Tag::GetFieldNum() for efficiency.
+
+2000-10-24 Tuesday 07:55 eldamitri
+
+ * examples/demo_info.cpp (1.27), examples/demo_simple.c (1.3),
+ include/id3.h (1.14), include/id3/tag.h (1.51),
+ include/id3/tag_impl.h (1.7), src/c_wrapper.cpp (1.15),
+ src/helpers.cpp (1.7), src/misc_support.cpp (1.30), src/tag.cpp
+ (1.34), src/tag_render.cpp (1.37): Added ID3_Tag::Iterator and
+ ID3_Tag::ConstIterator to traverse an ID3_Tag's frames. Dynamically
+ created with ID3_Tag::CreateIterator(), the iterator is to be used
+ instead of ID3_Tag::NumFrames() and ID3_Tag::GetFrameNum() for
+ efficiency.
+
+2000-10-23 Monday 10:20 eldamitri
+
+ * include/: id3.h (1.13), id3/field.h (1.42), id3/frame.h (1.37),
+ id3/globals.h (1.41), id3/misc_support.h (1.24), id3/reader.h
+ (1.10), id3/readers.h (1.8), id3/tag.h (1.50), id3/writer.h (1.5),
+ id3/writers.h (1.6): Included id3lib files are now in brackets
+
+2000-10-23 Monday 09:48 eldamitri
+
+ * src/frame_render.cpp (1.20): Moved renderFields into unnamed
+ namespace
+
+2000-10-23 Monday 09:45 eldamitri
+
+ * src/frame_parse.cpp (1.28): Moved parseFields into unnamed
+ namespace
+
+2000-10-23 Monday 09:42 eldamitri
+
+ * doc/Doxyfile.in (1.6, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7), include/id3/frame.h
+ (1.36), include/id3/globals.h (1.40), include/id3/tag.h (1.49),
+ src/field.cpp (1.38), src/frame.cpp (1.31), src/frame_impl.cpp
+ (1.7), src/frame_parse.cpp (1.27), src/frame_render.cpp (1.19),
+ src/tag.cpp (1.33): Updated documentation
+
+2000-10-23 Monday 09:41 eldamitri
+
+ * include/dami/: dom.idl (1.1), io_base.h (1.1): Initial release
+
+2000-10-23 Monday 08:15 eldamitri
+
+ * include/: dami/lyr3.h (1.1), id3/lyr3.h (1.3), dami/lyr3_impl.h
+ (1.1), id3/lyr3_impl.h (1.3), dami/v1.h (1.1), id3/v1.h (1.3),
+ dami/v1_impl.h (1.1), id3/v1_impl.h (1.3): Moved from include/id3
+ to include/dami
+
+2000-10-23 Monday 08:09 eldamitri
+
+ * include/: dami/mm_impl.h (1.1), id3/mm_impl.h (1.3): Moved
+ mm_impl.h from include/id3 to include/dami
+
+2000-10-23 Monday 08:09 eldamitri
+
+ * include/: dami/mm.h (1.1), id3/mm.h (1.3): Moved mm.h from
+ include/id3 to include/dami
+
+2000-10-23 Monday 08:04 eldamitri
+
+ * include/: dami/dami.idl (1.1), id3/dami.idl (1.2): Moved dami.idl
+ from include/id3 to include/dami
+
+2000-10-23 Monday 06:34 eldamitri
+
+ * doc/Doxyfile.in (1.5): Updated to Doxygen configuration 1.2.2
+
+2000-10-23 Monday 06:32 eldamitri
+
+ * include/id3/: debug.h (1.5), field_def.h (1.4), flags.h (1.4),
+ frame.h (1.35), frame_def.h (1.4), globals.h (1.39), header_frame.h
+ (1.20), helpers.h (1.3), lyr3.h (1.2), lyr3_impl.h (1.2),
+ misc_support.h (1.23), mm.h (1.2), mm_impl.h (1.2), reader.h (1.9),
+ readers.h (1.7), sized_types.h (1.6), spec.h (1.5), strings.h
+ (1.4), utils.h (1.17), v1.h (1.2), v1_impl.h (1.2), writer.h (1.4),
+ writers.h (1.5): Added comment to indicate the file is a C++ header
+
+2000-10-22 Sunday 00:37 eldamitri
+
+ * examples/test_remove.cpp (1.9):
+ (RemoveFrame): Use GetRawText rather than GetText
+
+2000-10-22 Sunday 00:36 eldamitri
+
+ * examples/demo_info.cpp (1.26):
+ (PrintInformation): Use GetRawBinary rather than GetBinary
+
+2000-10-22 Sunday 00:33 eldamitri
+
+ * src/utils.cpp (1.13):
+ - Removed all of the ucs* functions except ucslen
+ - Added mbstoucs(String) and ucstombs(String)
+ - All of the file util functions now take in a String for file name
+
+2000-10-22 Sunday 00:30 eldamitri
+
+ * src/tag_parse.cpp (1.37):
+ (parseFrames): Use GetRawBinary rather than GetBinary
+
+2000-10-22 Sunday 00:28 eldamitri
+
+ * src/tag_impl.cpp (1.6): Constructor initializer and destructor
+ for member _file_name updated to reflect use of String object for
+ type
+
+2000-10-22 Sunday 00:26 eldamitri
+
+ * src/tag_find.cpp (1.24):
+ (Find): Use GetRawText rather than GetText
+ (GetFrameNum): Count upwards when searching for numbered frame,
+ rather than in reverse
+
+2000-10-22 Sunday 00:24 eldamitri
+
+ * src/tag_file.cpp (1.30):
+ - Added 'using namespace dami' so 'dami' doesn't have to be used
+ explicitely
+ (Link): Uses String's assignment operator rathern than function
+ strcpy
+ (RenderV2ToFile): Use String objects rather than char*'s
+
+2000-10-22 Sunday 00:20 eldamitri
+
+ * src/tag.cpp (1.32):
+ (GetFileName): Added call to c_str() on return value of TagImpl's
+ method GetFileName
+
+2000-10-22 Sunday 00:18 eldamitri
+
+ * src/misc_support.cpp (1.29):
+ (ID3_GetSyncLyrics): Use GetRawBinary rather than GetBinary
+
+2000-10-22 Sunday 00:17 eldamitri
+
+ * src/io_helpers.cpp (1.4):
+ - Move handling of unicode BOM's from field_string_unicode.cpp for
+ methods readUnicodeString, readUnicodeText
+ - Added methods writeString, writeText, writeUnicodeString,
+ writeUnicodeText
+
+2000-10-22 Sunday 00:10 eldamitri
+
+ * src/helpers.cpp (1.6):
+ (getString): Use GetRawText rather than GetText
+ (getStringAtIndex): Use GetRawTextItem rather than GetTextItem
+
+2000-10-21 Saturday 17:46 eldamitri
+
+ * src/frame_parse.cpp (1.26):
+ (parseFields): Added debug warning
+
+2000-10-21 Saturday 17:44 eldamitri
+
+ * src/frame_impl.cpp (1.6):
+ - Updated constructor initialization for new members
+ - Removed methods _InitFieldBits
+ - Simplified destructor, method _ClearFields, _InitFields
+ - Use iterators to traverse field list
+
+2000-10-21 Saturday 17:41 eldamitri
+
+ * src/: field_string_ascii.cpp (1.25), field_string_unicode.cpp
+ (1.29): Completely new implementations of all methods using new
+ String member variable _text. Both ASCII and unicode encodings
+ represented with the member, so many methods that were separate for
+ the two encodings are now handled with single methods
+
+2000-10-21 Saturday 17:35 eldamitri
+
+ * src/field_integer.cpp (1.18): Added methods SetInteger,
+ GetInteger
+
+2000-10-21 Saturday 17:33 eldamitri
+
+ * src/field_binary.cpp (1.23):
+ - Added implementation of SetBinary, GetBinary, GetRawBinary
+ - New implementation of Set, Get, Parse, Render using SetBinary,
+ GetBinary
+
+2000-10-21 Saturday 09:22 eldamitri
+
+ * src/field.cpp (1.37):
+ - Updated constructor initialization for new members
+ - Using String and BString for text and binary members allows
+ simplified initialization, destruction
+ - methods Clear, BinSize, Parse, Render, SetEncoding updated for new
+ members, methods
+
+2000-10-21 Saturday 09:09 eldamitri
+
+ * include/id3/utils.h (1.16):
+ - Added checks to make sure min and max weren't defined as macros
+ - Removed all of the ucs functions except ucslen
+ - Added mbstoucs(String) and ucstombs(String)
+ - All of the file util functions now take in a String for file name
+
+2000-10-21 Saturday 09:07 eldamitri
+
+ * include/id3/tag_impl.h (1.6): (class ID3_TagImpl): file name is
+ now a String
+
+2000-10-21 Saturday 09:06 eldamitri
+
+ * include/id3/io_helpers.h (1.3): Added new write helper functions
+
+2000-10-21 Saturday 09:05 eldamitri
+
+ * include/id3/globals.h (1.38): Removed bitset code
+
+2000-10-21 Saturday 08:19 eldamitri
+
+ * include/id3/frame_impl.h (1.3): (class ID3_FrameImpl): Use
+ std::vector and std::bitset
+
+2000-10-21 Saturday 08:14 eldamitri
+
+ * include/id3/field_impl.h (1.10): (class ID3_FieldImpl):
+ - Changed function names GetText() GetRawText()
+ GetTextItem() GetRawTextItem() GetUnicodeText()
+ GetRawUnicodeText() GetUnicodeTextItem() GetRawUnicodeTextItem()
+ GetBinary() GetRawBinary()
+ - Added new methods that accept or return dami::String's GetText()
+ SetText() GetTextItem() AddText() GetBinary()
+ SetBinary()
+
+2000-10-21 Saturday 05:51 eldamitri
+
+ * include/id3/field_def.h (1.3): (struct ID3_FieldDef): Changed
+ name of _fixed_length to _fixed_size
+
+2000-10-21 Saturday 05:50 eldamitri
+
+ * include/id3/field.h (1.41): (class ID3_Field): Changed function
+ names GetText() GetRawText() GetTextItem()
+ GetRawTextItem() GetUnicodeText() GetRawUnicodeText()
+ GetUnicodeTextItem() GetRawUnicodeTextItem() GetBinary()
+ GetRawBinary()
+
+2000-10-16 Monday 10:59 eldamitri
+
+ * src/tag_render.cpp (1.36):
+ (Size): Now use iterators to access the frames in the tag rather
+ than a pointer to an ID3_Elem
+
+2000-10-16 Monday 10:55 eldamitri
+
+ * src/tag_find.cpp (1.23): Updated Find method to use iterators
+ rather than ID3_Elem's, String's rather than const char*'s
+
+2000-10-16 Monday 10:50 eldamitri
+
+ * src/: field_string_ascii.cpp (1.24), field_string_unicode.cpp
+ (1.28), header_tag.cpp (1.20), helpers.cpp (1.5), misc_support.cpp
+ (1.28), tag.cpp (1.31): Minor bugfixes
+
+2000-10-16 Monday 10:46 eldamitri
+
+ * include/id3/utils.h (1.15), src/utils.cpp (1.12): Added method
+ toWString(const unicode_t[], size_t)
+
+2000-10-16 Monday 10:45 eldamitri
+
+ * include/id3/tag_impl.h (1.5), src/tag_impl.cpp (1.5): Now use a
+ std::list, instead of ID3_Elem, to store the frames Find methods now
+ accept dame::String and dami::WString rather than const char* and
+ const unicode_t*
+
+2000-10-16 Monday 10:43 eldamitri
+
+ * include/id3/header.h (1.21): Minor bugfix
+
+2000-10-16 Monday 10:42 eldamitri
+
+ * examples/: findeng.cpp (1.3), findstr.cpp (1.3): Enabled
+ debugging output, minor bugfixes
+
+2000-10-16 Monday 09:01 eldamitri
+
+ * include/id3/spec.h (1.4): Removed interface ID3_Speccable
+
+2000-10-16 Monday 09:00 eldamitri
+
+ * src/: tag.cpp (1.30), tag_find.cpp (1.22): Updated
+ comments/documentation
+
+2000-10-16 Monday 08:59 eldamitri
+
+ * include/id3/tag_impl.h (1.4): class ID3_TagImpl no longer
+ inherits from ID3_Speccable
+
+2000-10-16 Monday 08:59 eldamitri
+
+ * include/id3/tag.h (1.48): class ID3_Tag no longer inherits from
+ ID3_Speccable
+
+2000-10-16 Monday 08:58 eldamitri
+
+ * include/id3/header.h (1.20): class ID3_Header no longer inherits
+ from ID3_Speccable
+
+2000-10-16 Monday 08:58 eldamitri
+
+ * include/id3/frame.h (1.34): class ID3_Frame no longer inherits
+ from ID3_Speccable
+
+2000-10-16 Monday 08:55 eldamitri
+
+ * include/id3/Makefile.am (1.17):
+ (the_headers): Moved spec.h to noinst
+
+2000-10-15 Sunday 18:37 eldamitri
+
+ * AUTHORS (1.8), NEWS (1.24), id3lib.spec.in (1.23), reconf (1.3),
+ doc/index.html.in (1.10, rel-3-7-13), examples/demo_info.cpp
+ (1.25), include/id3/globals.h (1.37), zlib/reconf (1.2): Changed
+ name from "Scott Haug" to "Scott Thomas Haug"
+
+2000-10-15 Sunday 18:09 eldamitri
+
+ * src/tag_parse.cpp (1.36):
+ (parse): Added buffering for use with unsynced reader
+
+2000-10-15 Sunday 18:08 eldamitri
+
+ * config.h.win32.in (1.7, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-13): Removed
+ ID3LIB_DATE
+
+2000-10-15 Sunday 18:04 eldamitri
+
+ * Makefile.am (1.26), doc/Makefile.am (1.14), examples/Makefile.am
+ (1.19), id3com/Makefile.am (1.6), include/Makefile.am (1.5),
+ include/id3/Makefile.am (1.16), libprj/Makefile.am (1.3),
+ m4/Makefile.am (1.6), prj/Makefile.am (1.3, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), src/Makefile.am (1.23), zlib/Makefile.am (1.3,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7), zlib/include/Makefile.am (1.2,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0,
+ rel-3-6-2, rel-3-6-0), zlib/lib/Makefile.am (1.2, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0), zlib/prj/Makefile.am (1.2, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0),
+ zlib/src/Makefile.am (1.6): Updated email address to scott@id3.org
+
+2000-10-15 Sunday 09:06 eldamitri
+
+ * src/tag_render.cpp (1.35):
+ (render): Minor bugfix
+
+2000-10-15 Sunday 09:05 eldamitri
+
+ * src/globals.cpp (1.4): Removed ID3LIB_DATE
+
+2000-10-15 Sunday 09:04 eldamitri
+
+ * src/io.cpp (1.1): Initial release
+
+2000-10-15 Sunday 09:02 eldamitri
+
+ * configure.in (1.48, rel-3-7-3): Removed ID3LIB_DATE (and its
+ children)
+
+2000-10-15 Sunday 08:40 eldamitri
+
+ * src/Makefile.am (1.22):
+ (id3lib_sources): Added io.cpp
+
+2000-10-15 Sunday 08:39 eldamitri
+
+ * examples/demo_info.cpp (1.24), examples/getopt.c (1.2),
+ include/id3/field_impl.h (1.9), include/id3/frame_def.h (1.3),
+ include/id3/header_frame.h (1.19), include/id3/reader.h (1.8),
+ include/id3/readers.h (1.6), include/id3/writer.h (1.3),
+ include/id3/writers.h (1.4), libprj/id3lib.dsp (1.11),
+ libprj/id3lib.dsw (1.6), prj/id3lib.dsp (1.12), src/field.cpp
+ (1.36), src/field_string_ascii.cpp (1.23),
+ src/field_string_unicode.cpp (1.27), src/frame.cpp (1.30),
+ src/frame_impl.cpp (1.5), src/io_helpers.cpp (1.3), src/readers.cpp
+ (1.3), src/tag_find.cpp (1.21), src/tag_parse.cpp (1.35),
+ src/tag_parse_lyrics3.cpp (1.27), src/tag_parse_musicmatch.cpp
+ (1.15), src/tag_render.cpp (1.34): Various bugfixes so code will
+ compile under Windows w/o warning
+
+2000-10-15 Sunday 07:44 eldamitri
+
+ * src/misc_support.cpp (1.27): Added include for utils.h
+
+2000-10-15 Sunday 07:44 eldamitri
+
+ * src/field_binary.cpp (1.22): Minor include adjustment
+
+2000-10-15 Sunday 07:43 eldamitri
+
+ * include/id3/Makefile.am (1.15):
+ (the_headers): Added helpers.h and tag_impl.h
+
+2000-10-15 Sunday 07:42 eldamitri
+
+ * examples/: findeng.cpp (1.2), findstr.cpp (1.2): Added include
+ for iostream.h
+
+2000-10-15 Sunday 01:29 eldamitri
+
+ * src/c_wrapper.cpp (1.14), src/tag_file.cpp (1.29),
+ zlib/include/zconf.h (1.3), zlib/include/zlib.h (1.3),
+ zlib/include/zutil.h (1.3), zlib/src/gzio.c (1.3), zlib/src/zutil.c
+ (1.3): Updates to allow functionality for WinCE
+
+2000-10-14 Saturday 23:26 eldamitri
+
+ * include/id3/uint28.h (1.9), src/uint28.cpp (1.11): Removed; now
+ use functions readUInt28 and writeUInt28
+
+2000-10-14 Saturday 23:23 eldamitri
+
+ * include/id3/Makefile.am (1.14), include/id3/io_helpers.h (1.2),
+ src/Makefile.am (1.21), src/header_tag.cpp (1.19),
+ src/io_helpers.cpp (1.2), src/tag_impl.cpp (1.4), src/tag_parse.cpp
+ (1.34): Replaced class uint28 with functions
+ readUInt28(ID3_Reader&) and writeUInt28(ID3_Writer&, uint32)
+
+2000-10-14 Saturday 22:50 eldamitri
+
+ * include/id3/error.h (1.15), src/error.cpp (1.11): Removed; id3lib
+ no longer uses exception handling
+
+2000-10-14 Saturday 22:46 eldamitri
+
+ * examples/demo_convert.cpp (1.12), examples/demo_copy.cpp (1.6),
+ examples/demo_info.cpp (1.23), examples/demo_tag.cpp (1.12),
+ examples/get_pic.cpp (1.5), examples/test_compression.cpp (1.6),
+ examples/test_pic.cpp (1.7), examples/test_remove.cpp (1.8),
+ examples/test_unicode.cpp (1.5), include/id3/debug.h (1.4),
+ include/id3/field_impl.h (1.8), include/id3/globals.h (1.36),
+ src/c_wrapper.cpp (1.13, rel-3-7-8), src/header_frame.cpp (1.19),
+ src/misc_support.cpp (1.26): Removed references to error.h and
+ ID3_Error, as id3lib no longer uses exception handling
+
+2000-10-14 Saturday 22:45 eldamitri
+
+ * src/Makefile.am (1.20):
+ (id3lib_sources): Removed error.cpp; no longer need exception
+ handling
+
+2000-10-14 Saturday 22:44 eldamitri
+
+ * include/id3/Makefile.am (1.13):
+ (noinst_HEADERS): Removed error.h; no longer need exception handling
+
+2000-10-14 Saturday 22:43 eldamitri
+
+ * id3lib.spec.in (1.22): Removed explicit architecture detection,
+ since we no longer need to build with exceptions
+
+2000-10-14 Saturday 22:03 eldamitri
+
+ * include/id3/: readers_compressed.h (1.4), writers_compressed.h
+ (1.3): No longer needed. Moved to io_decorators.h
+
+2000-10-14 Saturday 21:24 eldamitri
+
+ * examples/demo_info.cpp (1.22), examples/test_io.cpp (1.2),
+ src/field_binary.cpp (1.21), src/field_integer.cpp (1.17),
+ src/field_string_ascii.cpp (1.22), src/field_string_unicode.cpp
+ (1.26), src/frame_parse.cpp (1.25), src/frame_render.cpp (1.18),
+ src/header_frame.cpp (1.18), src/header_tag.cpp (1.18),
+ src/helpers.cpp (1.4), src/misc_support.cpp (1.25), src/tag.cpp
+ (1.29), src/tag_file.cpp (1.28), src/tag_impl.cpp (1.3),
+ src/tag_parse.cpp (1.33), src/tag_parse_lyrics3.cpp (1.26),
+ src/tag_parse_musicmatch.cpp (1.14), src/tag_parse_v1.cpp (1.16),
+ src/tag_render.cpp (1.33), src/uint28.cpp (1.10):
+ - Replaced some io decorators in favor of io helper functions
+ (better efficiency) BinaryReader -> readBinary,
+ readAllBinary TextReader -> readString, readUnicodeString,
+ readText, readUnicodeText BinaryNumberReader -> readBENumber
+ TrailingSpacesReader -> readTrailingSpaces TrailingSpacesWriter ->
+ writeTrailingSpaces BinaryNumberWriter -> writeBENumber
+ - replaced MIN and MAX macros with min and max template functions
+
+2000-10-14 Saturday 21:17 eldamitri
+
+ * include/id3/writers.h (1.3): (class ID3_IOStreamWriter, class
+ ID3_OStreamWriter): only writes char* buffers to streams
+
+2000-10-14 Saturday 21:13 eldamitri
+
+ * include/id3/writer.h (1.2): Minor code changes
+
+2000-10-14 Saturday 21:13 eldamitri
+
+ * include/id3/reader.h (1.7): Renamed remainingChars to
+ remainingBytes, minor code changes
+
+2000-10-14 Saturday 21:03 eldamitri
+
+ * include/id3/strings.h (1.3): BString is "unsigned char" again
+
+2000-10-14 Saturday 20:58 eldamitri
+
+ * include/id3/globals.h (1.35): Removed MAX, MIN, ABS, and CLAMP
+ macros
+
+2000-10-14 Saturday 20:53 eldamitri
+
+ * src/Makefile.am (1.19):
+ (id3lib_sources): Added io_decorators.cpp, io_helpers.cpp; removed
+ reader_decorators.cpp, writer_decorators.cpp
+
+2000-10-14 Saturday 20:48 eldamitri
+
+ * include/id3/Makefile.am (1.12):
+ (noinst_HEADERS): Added io_decorators, io_helpers, io_strings;
+ removed reader_decorators.h, readers_compressed.h,
+ writer_decorators.h, writers_compressed.h
+
+2000-10-14 Saturday 20:45 eldamitri
+
+ * include/id3/io_decorators.h (1.1), include/id3/io_helpers.h
+ (1.1), include/id3/io_strings.h (1.1), src/io_decorators.cpp (1.1),
+ src/io_helpers.cpp (1.1): Initial release
+
+2000-10-14 Saturday 20:15 eldamitri
+
+ * include/id3/reader_decorators.h (1.8),
+ include/id3/writer_decorators.h (1.3), src/reader_decorators.cpp
+ (1.2): No longer needed. Replaced by io_helpers, io_decorators,
+ and io_strings
+
+2000-10-13 Friday 20:29 eldamitri
+
+ * examples/demo_simple.c (1.2):
+ (main): Minor bugfixes to prevent compiler warnings
+
+2000-10-13 Friday 20:25 eldamitri
+
+ * examples/: demo_convert.cpp (1.11), demo_copy.cpp (1.5),
+ demo_info.cpp (1.21), demo_tag.cpp (1.11):
+ (main): Bugfix with checking for warning, notice, v1tag, v2tag
+
+2000-10-13 Friday 20:22 eldamitri
+
+ * src/uint28.cpp (1.9): Minor bugfix with placement of include for
+ config.h
+
+2000-10-13 Friday 20:21 eldamitri
+
+ * src/tag_parse.cpp (1.32):
+ (parse): Bug fix for parsing tags with specs other than most current
+
+2000-10-13 Friday 20:20 eldamitri
+
+ * src/header_frame.cpp (1.17):
+ (Parse): More debugging output, minor bugfix
+
+2000-10-13 Friday 20:19 eldamitri
+
+ * include/id3/reader_decorators.h (1.7): (class
+ BinaryNumberReader): Fixed bug with masking
+
+2000-10-13 Friday 20:17 eldamitri
+
+ * include/id3/debug.h (1.3): Removed debugging output
+
+2000-10-13 Friday 20:12 eldamitri
+
+ * configure.in (1.47): Moved the version to 3.8.0pre1, added some
+ new checks, removed some redendant ones
+
+2000-10-13 Friday 00:36 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.13):
+ (parse): Fixed signed/unsigned bug
+
+2000-10-13 Friday 00:35 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.25):
+ (findText): Fixed =/== bug
+
+2000-10-13 Friday 00:35 eldamitri
+
+ * src/tag_parse.cpp (1.31):
+ (parseFrames): Now returns true on successful parse
+
+2000-10-13 Friday 00:34 eldamitri
+
+ * src/tag_file.cpp (1.27): Moved around some file includes
+
+2000-10-13 Friday 00:34 eldamitri
+
+ * src/tag.cpp (1.28):
+ (Link): Fixed minor bug with not returning a value
+
+2000-10-13 Friday 00:33 eldamitri
+
+ * src/helpers.cpp (1.3):
+ (getString): Now uses methods ID3_Field::GetText() to build new
+ string
+ (getStringAtIndex): Now uses methods ID3_Field::GetTextItem() to
+ build new string
+ (removeFrames): Minor fix to prevent compiler warning
+ (removeArtists): Minor fix to prevent compiler warning
+
+2000-10-13 Friday 00:30 eldamitri
+
+ * src/frame_parse.cpp (1.24):
+ (parseFields): Now returns true on successful parse
+
+2000-10-13 Friday 00:30 eldamitri
+
+ * src/frame_impl.cpp (1.4): (operator=): Now returns *this
+
+2000-10-13 Friday 00:30 eldamitri
+
+ * src/field_string_unicode.cpp (1.25): Added method
+ GetTextItem(index_t)
+
+2000-10-13 Friday 00:30 eldamitri
+
+ * src/field_string_ascii.cpp (1.21): Added method
+ GetUnicodeTextItem(index_t)
+
+2000-10-13 Friday 00:29 eldamitri
+
+ * include/id3/: reader.h (1.6), reader_decorators.h (1.6),
+ readers.h (1.5), readers_compressed.h (1.3), writer_decorators.h
+ (1.2), writers.h (1.2), writers_compressed.h (1.2): Minor code
+ changes, fixed ansi-compliance problems that gave compiler warnings
+
+2000-10-13 Friday 00:29 eldamitri
+
+ * include/id3/tag_impl.h (1.3): (class ID3_TagImpl): method
+ SetChanged(bool) is now void
+
+2000-10-13 Friday 00:28 eldamitri
+
+ * include/id3/: field.h (1.40), field_impl.h (1.7): (class
+ ID3_Field): Added methods GetTextItem(size_t) and
+ GetUnicodeTextItem(index_t)
+
+2000-10-12 Thursday 10:15 eldamitri
+
+ * m4/Makefile.am (1.5): Now only have a single m4 file
+
+2000-10-12 Thursday 10:14 eldamitri
+
+ * m4/id3_cxx.m4 (1.1): Initial release
+
+2000-10-12 Thursday 10:13 eldamitri
+
+ * m4/: lf_bash.m4 (1.2), lf_cc.m4 (1.2), lf_cxx_convenience.m4
+ (1.2), lf_fortran.m4 (1.2), lf_host_type.m4 (1.2), lf_lisp.m4
+ (1.2), lf_nm.m4 (1.2), lf_texidoc.m4 (1.2), lf_txtc.m4 (1.2),
+ lf_warnings.m4 (1.2), lf_x11.m4 (1.2): Removed. Unused.
+
+2000-10-10 Tuesday 06:16 eldamitri
+
+ * include/id3/utils.h (1.14):
+ (mid): Added function; returns mid if it is between lo and hi,
+ otherwise returns lo or hi (whichever is closest to mid)
+
+2000-10-10 Tuesday 06:15 eldamitri
+
+ * examples/: demo_convert.cpp (1.10), demo_copy.cpp (1.4),
+ demo_info.cpp (1.20), demo_tag.cpp (1.10):
+ - Removed everything assicatiated with popt
+ - Now uses files generated from gengetopt input files to parse args
+ - Left in function PrintUsage(), even though it isn't used, in case
+ gengetopt supports app descriptions eventually
+
+2000-10-10 Tuesday 06:09 eldamitri
+
+ * examples/Makefile.am (1.18):
+ - Removed everything assicatiated with popt
+ - Added getopt object files to LDADD, if needed
+ - Added new getopt source files for demo apps
+
+2000-10-10 Tuesday 06:03 eldamitri
+
+ * examples/: demo_convert_options.c (1.1),
+ demo_convert_options.ggo.in (1.1), demo_convert_options.h (1.1),
+ demo_copy_options.c (1.1), demo_copy_options.ggo.in (1.1),
+ demo_copy_options.h (1.1), demo_info_options.c (1.1),
+ demo_info_options.ggo.in (1.1), demo_info_options.h (1.1),
+ demo_tag_options.c (1.1), demo_tag_options.ggo.in (1.1),
+ demo_tag_options.h (1.1): Initial release
+
+2000-10-10 Tuesday 05:57 eldamitri
+
+ * configure.in (1.46):
+ - Added AC_PROG_CC for initializing the C compiler
+ - Added AC_EXEEXT for determining any executable extension
+ - Removed everything assicatiated with popt
+ - Added check, conditional for getopt_long
+
+2000-10-10 Tuesday 05:54 eldamitri
+
+ * Makefile.am (1.25): Removed everything associated with popt
+
+2000-10-09 Monday 06:40 eldamitri
+
+ * popt/: .cvsignore (1.2), CHANGES (1.2), COPYING (1.2), Doxyfile
+ (1.2), Doxyfile.in (1.2), Makefile (1.2), Makefile.am (1.2),
+ Makefile.in (1.2), README (1.2), acconfig.h (1.2), aclocal.m4
+ (1.2), autogen.sh (1.2), config.guess (1.2), config.h (1.2),
+ config.h.in (1.2), config.log (1.5), config.status (1.8,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), config.sub (1.2), configure (1.2), configure.in (1.2),
+ findme.c (1.2), findme.h (1.2), install-sh (1.2), libtool (1.2),
+ ltconfig (1.2), ltmain.sh (1.2), missing (1.2), mkinstalldirs
+ (1.2), popt.3 (1.2), popt.c (1.2), popt.h (1.2), popt.ps (1.2),
+ popt.spec (1.2), poptconfig.c (1.2), popthelp.c (1.2), poptint.h
+ (1.2), poptparse.c (1.2), stamp-h (1.2), stamp-h.in (1.2), system.h
+ (1.2), test-poptrc (1.2), test1.c (1.2), test2.c (1.2), testit.sh
+ (1.2), intl/ChangeLog (1.2), intl/Makefile (1.2), intl/Makefile.in
+ (1.2), intl/VERSION (1.2), intl/bindtextdom.c (1.2),
+ intl/cat-compat.c (1.2), intl/dcgettext.c (1.2), intl/dgettext.c
+ (1.2), intl/explodename.c (1.2), intl/finddomain.c (1.2),
+ intl/gettext.c (1.2), intl/gettext.h (1.2), intl/gettextP.h (1.2),
+ intl/hash-string.h (1.2), intl/intl-compat.c (1.2),
+ intl/l10nflist.c (1.2), intl/libgettext.h (1.2), intl/linux-msg.sed
+ (1.2), intl/loadinfo.h (1.2), intl/loadmsgcat.c (1.2),
+ intl/localealias.c (1.2), intl/po2tbl.sed (1.2), intl/po2tbl.sed.in
+ (1.2), intl/textdomain.c (1.2), intl/xopen-msg.sed (1.2),
+ po/Makefile (1.2), po/Makefile.in (1.2), po/Makefile.in.in (1.2),
+ po/POTFILES (1.2), po/POTFILES.in (1.2), po/cat-id-tbl.c (1.2),
+ po/popt.pot (1.2), po/ro.gmo (1.2), po/ro.po (1.2), po/sk.gmo
+ (1.2), po/sk.po (1.2), po/stamp-cat-id (1.2): Not needed; moved
+ back to getopt_long (now using in conjunction with gengetopt)
+
+2000-10-09 Monday 06:34 eldamitri
+
+ * examples/: getopt.c (1.1), getopt.h (1.1), getopt1.c (1.1):
+ Initial release
+
+2000-10-09 Monday 06:33 eldamitri
+
+ * src/utils.cpp (1.11): Removed the following functions
+ (functionality in Readers/Writers):
+ - size_t timeToSeconds(const char*, size_t);
+ - bool isCRLF(const char*, const char*);
+ - size_t CRLFtoLF(char *, size_t);
+ - void removeTrailingSpaces(char*, size_t);
+ - String removeTrailingSpaces(String);
+ - uint32 parseNumber(const uchar*, size_t);
+ - size_t getUnSyncSize(uchar *, size_t);
+ - void unsync(uchar *, size_t, const uchar *, size_t);
+ - size_t resync(uchar *, size_t);
+
+2000-10-09 Monday 06:32 eldamitri
+
+ * src/uint28.cpp (1.8):
+ - Added inclusion of files readers.h, reader_decorators.h, writers.h
+ - Removed constructor uint28(const uchar*)
+ - Removed methods Parse(const uchar*), Parse(const char*),
+ Render(uchar*) and Render(char*)
+ - Added methods Parse(ID3_Reader&) and Render(ID3_Writer&)
+ - Reimplemented operator<< and operator>> to use Readers, Writers
+
+2000-10-09 Monday 06:31 eldamitri
+
+ * src/tag_render.cpp (1.32):
+ - Added inclusion of files writers.h and writer_decorators.h
+ - Moved docs to tag.cpp
+ - Added method id3::v1::render(ID3_Writer&, const ID3_TagImpl&)
+ - Added method id3::v2::renderFrames(ID3_Writer&, const
+ ID3_TagImpl&)
+ - Added method id3::v2::render(ID3_Writer&, const ID3_TagImpl&)
+ - Removed method Render(uchar*, ID3_TagType)
+ - Minor code cleanups
+
+2000-10-09 Monday 06:31 eldamitri
+
+ * src/tag_parse_v1.cpp (1.15):
+ (parse):
+ - Moved declaration to tag_impl.h
+ - Fixed bug when detecting if there's enough data to parse
+ - Better use of Reader classes
+ - Checks to ensure empty text frames aren't added
+
+2000-10-09 Monday 06:30 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.12):
+ (readTextFrame): Converted from TextFrameReader class
+ (mm::parse):
+ - Fixed bug when detecting if there's enough data to parse
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+
+2000-10-09 Monday 06:30 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.24):
+ - Updated debugging output
+ (lyr3::v1::parse):
+ - Fixed bug when detecting if there's enough data to parse
+ - Better use of Reader classes
+ - Minor code cleanup
+
+2000-10-09 Monday 06:30 eldamitri
+
+ * src/tag_parse.cpp (1.30):
+ - Moved declarations to tag_impl.h
+ - Better use of new Reader classes
+ - More debugging output
+ - Minor code changes
+
+2000-10-09 Monday 06:29 eldamitri
+
+ * src/tag_impl.cpp (1.2):
+ - Moved docs to tag.cpp
+ (IsV2Tag):Implemented to use new Reader classes
+ (AddFrames): Removed
+ (SetExtended): Renamed from SetExtendedHeader
+ (SetExperimental, GetUnsync, GetExtended, GetExperimental): Added
+
+2000-10-09 Monday 06:29 eldamitri
+
+ * src/tag_find.cpp (1.20):
+ (Find):
+ - Moved docs to tag.cpp
+ - Reimplementation using new methods in TagImpl
+
+2000-10-09 Monday 06:29 eldamitri
+
+ * src/tag_file.cpp (1.26):
+ - Added inclusion of files writers.h and writer_decorators.h
+ (RenderV1ToFile): reimplemented for use with a Writer
+ (RenderV2ToFile): reimplemented for use with a Writer
+
+2000-10-09 Monday 06:29 eldamitri
+
+ * src/tag.cpp (1.27):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Added documentation
+ - Added methods SetExperimental(bool), GetExperimental()
+ - Added implementation for Render(ID3_Writer&, ID3_TagType)
+
+2000-10-09 Monday 06:28 eldamitri
+
+ * src/readers.cpp (1.2):
+ (readChars): Replaced types streamsize and streamoff with size_type
+ and pos_type, respectively
+
+2000-10-09 Monday 06:28 eldamitri
+
+ * src/misc_support.cpp (1.24):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Minor code changes
+
+2000-10-09 Monday 06:28 eldamitri
+
+ * src/helpers.cpp (1.2):
+ (getV1Comment): Added
+ (getComment): Cleaned up implementation
+
+2000-10-09 Monday 06:28 eldamitri
+
+ * src/header_tag.cpp (1.17):
+ - Added inclusion of file writer_decorators.h
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+ - Reimplemented Parse(ID3_Reader&) to better make use of reader
+ functionality
+
+2000-10-09 Monday 06:27 eldamitri
+
+ * src/header_frame.cpp (1.16):
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+ - Added additional debuggin output
+ - Minor code changes
+
+2000-10-09 Monday 06:27 eldamitri
+
+ * src/frame_render.cpp (1.17):
+ - Removed inclusion of file error.h
+ - Added inclusion of files wirter_decorators.h and
+ writers_compressed.h
+ - Removed irrelevant documentation
+ - Added function renderFields(ID3_Writer& writer, const
+ ID3_FrameImpl&)
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+
+2000-10-09 Monday 06:27 eldamitri
+
+ * src/frame_parse.cpp (1.23):
+ - Removed inclusin of zlib.h
+ - Minor code changes
+
+2000-10-09 Monday 06:26 eldamitri
+
+ * src/frame_impl.cpp (1.3):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Removed implementation of Field(ID3_FieldID)
+ - Renamed method GetNumFields() to NumFields()
+ - Renamed method GetFieldAt() to GetFieldNum()
+ - Updated documentation
+
+2000-10-09 Monday 06:26 eldamitri
+
+ * src/frame.cpp (1.29):
+ - Renamed method GetNumFields() to NumFields()
+ - Renamed method GetFieldAt() to GetFieldNum()
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+ (Field): Implemented in terms of method GetField(()
+
+2000-10-09 Monday 06:26 eldamitri
+
+ * src/field_string_unicode.cpp (1.24):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+
+2000-10-09 Monday 06:26 eldamitri
+
+ * src/field_string_ascii.cpp (1.20):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Replaced method RenderString(uchar*) with method
+ RenderString(ID3_Writer&)
+
+2000-10-09 Monday 06:25 eldamitri
+
+ * src/field_integer.cpp (1.16):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Replaced method RenderInteger(uchar*) with method
+ RenderInteger(ID3_Writer&)
+
+2000-10-09 Monday 06:25 eldamitri
+
+ * src/field_binary.cpp (1.20):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Replaced method RenderBinary(uchar*) with method
+ RenderBinary(ID3_Writer&)
+
+2000-10-09 Monday 06:25 eldamitri
+
+ * src/field.cpp (1.35):
+ - Changed all calls to method ID3_Frame::Field() to be calls to
+ method ID3_Frame::GetField()
+ - Removed implementation of method Parse(const uchar*, size_t)
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+
+2000-10-09 Monday 06:25 eldamitri
+
+ * src/c_wrapper.cpp (1.12):
+ (ID3Frame_GetField): Changed call to method ID3_Frame::Field() to
+ method ID3_Frame::GetField()
+
+2000-10-09 Monday 03:59 eldamitri
+
+ * include/id3/utils.h (1.13): Removed the following methods
+ (funcitonality in Readers/Writers):
+ - size_t timeToSeconds(const char*, size_t);
+ - bool isCRLF(const char*, const char*);
+ - size_t CRLFtoLF(char *, size_t);
+ - void removeTrailingSpaces(char*, size_t);
+ - String removeTrailingSpaces(String);
+ - uint32 parseNumber(const uchar*, size_t);
+ - size_t getUnSyncSize(uchar *, size_t);
+ - void unsync(uchar *, size_t, const uchar *, size_t);
+ - size_t resync(uchar *, size_t);
+
+2000-10-09 Monday 03:57 eldamitri
+
+ * include/id3/uint28.h (1.8):
+ - Added forward declarations for ID3_Reader, ID3_Writer (class
+
+ uint28):
+ - Removed constructor uint28(const uchar*)
+ - Removed methods operator=(const uchar*), operator=(const char*),
+ Parse(const uchar*), Parse(const char*), Render(uchar*) and
+ Render(char*)
+ - Added methods Parse(ID3_Reader&) and Render(ID3_Writer&)
+
+2000-10-09 Monday 03:56 eldamitri
+
+ * include/id3/tag_impl.h (1.2):
+ - Added inclusion of file error.h
+ - Added forward decl for ID3_Writer
+ - Removed definition of constant STR_V1_COMMENT_DESC (moved to
+ globals.h)
+ - Added declarations for the following functions in namespace
+
+ 'dami':
+ - id3::v1::parse(ID3_TagImpl&, ID3_Reader&)
+ - id3::v1::render(ID3_Writer&, ID3_TagImpl&)
+ - id3::v2::parse(ID3_TagImpl&, ID3_Reader&)
+ - id3::v2::render(ID3_Writer&, ID3_TagImpl&)
+ - lyr3::v1::parse(ID3_TagImpl&, ID3_Reader&)
+ - lyr3::v2::parse(ID3_TagImpl&, ID3_Reader&)
+ - mm::parse(ID3_TagImpl&, ID3_Reader&) (class ID3_TagImpl):
+ - Added methods SetChanged(bool), GetUnsync(), GetExtendedHeader(),
+ GetExperimental()
+ - Removed methods Parse(ID3_Reader&), Parse(const uchar*, size_t),
+ Parse(const ucharp[, const uchar*)
+ - Made PaddingSize(size_t) public
+
+2000-10-09 Monday 03:56 eldamitri
+
+ * include/id3/tag.h (1.47):
+ - Added forward declaration for ID3_Writer
+ - Added methods GetUnsync(), GetExtendedHeader(), GetExperimental()
+ - Added method Render(ID3_Writer&, ID3_TagType)
+
+2000-10-09 Monday 03:56 eldamitri
+
+ * include/id3/readers_compressed.h (1.2): (class
+ CompressedMemoryReader): Removed (class CompressedStreamReader):
+ - Renamed from CompressedMemoryReader
+ - Replaced types streamsize and streamoff with size_type and
+ pos_type, respectively
+ - Replaced type char with char_type
+
+2000-10-09 Monday 03:56 eldamitri
+
+ * include/id3/readers.h (1.4):
+ - Replaced types streamsize and streamoff with size_type and
+ pos_type, respectively
+ - Replaced type char with char_type (class ID3_MemoryReader): Added
+ constructor for signed chars
+
+2000-10-09 Monday 03:55 eldamitri
+
+ * include/id3/reader_decorators.h (1.5):
+ - Replaced types streamsize and streamoff with size_type and
+ pos_type, respectively
+ - Added more debugging output
+ - Removed references to 'dami' namespace (class WindowedReader):
+ Added method atEnd() (class TrailingSpacesReader): Added (class
+
+ BinaryNumberReader):
+ - Renamed from NumberReader
+ - Replaced call to function parseNumber with new code (class
+ BinaryReader): renamed method getBinary() to readBinary() (class
+ StringReader): Added
+
+2000-10-09 Monday 03:55 eldamitri
+
+ * include/id3/reader.h (1.5): (class ID3_Reader):
+ - Updated typedefs to be more explicit with size
+ - Removed typedefs for streamsize and streamoff (use size_type and
+ pos_type instead)
+
+2000-10-09 Monday 03:55 eldamitri
+
+ * include/id3/helpers.h (1.2): Added function getV1Comment(const
+ ID3_TagImpl&)
+
+2000-10-09 Monday 03:55 eldamitri
+
+ * include/id3/header_tag.h (1.17): (class ID3_FrameRender):
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+ - Added methods SetExperimental(bool), GetExperimental()
+
+2000-10-09 Monday 03:54 eldamitri
+
+ * include/id3/header_frame.h (1.18): (class ID3_FrameHeader):
+ Replaced method Render(uchar*) with method Render(ID3_Writer&)
+
+2000-10-09 Monday 03:54 eldamitri
+
+ * include/id3/header.h (1.19):
+ - Removed include of file 'reader.h' (not needed)
+ - Added forward declaration for ID3_Writer
+ - Removed methods Render(uchar*) and Parse(const uchar*, size_t)
+ - Added method Render(ID3_Writer&)
+
+2000-10-09 Monday 03:54 eldamitri
+
+ * include/id3/globals.h (1.34): Added macro STR_V1_COMMENT_DESC
+
+2000-10-09 Monday 03:53 eldamitri
+
+ * include/id3/frame_impl.h (1.2): (class ID3_FrameImpl):
+ - Renamed method GetNumFields() to NumFields() to be consistent with
+ ID3_Tag
+ - Renamed method GetFieldAt() to GetFieldNum() to be consistent with
+ ID3_Tag
+ - Replaced method Render(uchar*) with method Render(ID3_Writer&)
+ - Removed deprecated method Field(ID3_FieldID)
+
+2000-10-09 Monday 03:53 eldamitri
+
+ * include/id3/frame.h (1.33):
+ - Added forward declaration for ID3_Writer (class ID3_Frame):
+ - Renamed method GetNumFields() to NumFields() to be consistent with
+ ID3_Tag
+ - Renamed method GetFieldAt() to GetFieldNum() to be consistent with
+ ID3_Tag
+ - Replaced method Render(uchar*) with metod Render(ID3_Writer&)
+
+2000-10-08 Sunday 23:36 eldamitri
+
+ * include/id3/field_impl.h (1.6): (class ID3_FieldImpl):
+ - Removed methods Render(uchar*) and Parse(const uchar*, size_t)
+ - Added method Render(ID3_Writer&)
+ - Replaced methods renderInteger(uchar*), RenderString(uchar*), and
+ RenderBinary(uchar*) with ID3_Writer equivalents
+
+2000-10-08 Sunday 23:31 eldamitri
+
+ * include/id3/field.h (1.39):
+ - Forward declaration for ID3_Writer
+ - Removed methods Render(uchar*) and Parse(const uchar*, size_t)
+ - Added method Render(ID3_Writer&)
+
+2000-10-08 Sunday 23:29 eldamitri
+
+ * examples/test_unicode.cpp (1.4):
+ - Added include for file id3/error.h
+ - Changed all calls to method ID3_Frame::Field calls to be calls to
+ method ID3_Frame::GetField
+
+2000-10-08 Sunday 23:28 eldamitri
+
+ * examples/test_remove.cpp (1.7):
+ - Added includes for files id3/error.h, id3/strings.h
+ - Changed all calls to method ID3_Frame::Field calls to be calls to
+ method ID3_Frame::GetField
+ - Minor formatting changes
+
+2000-10-08 Sunday 23:28 eldamitri
+
+ * examples/get_pic.cpp (1.4): Added include for id3/error.h
+
+2000-10-08 Sunday 23:27 eldamitri
+
+ * examples/: test_compression.cpp (1.5), test_pic.cpp (1.6):
+ - Added includes for files config.h, id3/debug.h, id3/error.h
+ - Added debugging output
+ - Changed all calls to method ID3_Frame::Field calls to be calls to
+ method ID3_Frame::GetField
+
+2000-10-08 Sunday 23:13 eldamitri
+
+ * examples/demo_tag.cpp (1.9):
+ - Added include for file config.h
+ - Added debugging options
+ - Fixed a bug for parsing track numbers '08' and '09' with popt
+ (thanks Matt Sottek <sottek@quiknet.com>)
+
+2000-10-08 Sunday 23:10 eldamitri
+
+ * examples/demo_info.cpp (1.19):
+ (PrintInformation): When printing synced lyrics info, now uses a
+ MemoryReader, BinaryNumberReader, and TextReader to extract the
+ infromation from the binary field. This is a cheat, since these
+ classes aren't normally exposed to folks using the library.
+ Hopefully they will be exposed soon enough for the next major
+ release.
+
+2000-10-08 Sunday 23:05 eldamitri
+
+ * src/tag_sync.cpp (1.9): Removed. No longer used. Reader/writer
+ decorators provide same functionality.
+
+2000-10-08 Sunday 23:03 eldamitri
+
+ * src/Makefile.am (1.18):
+ (id3lib_sources): Added reader_decorators.cpp, writers.cpp, and
+ writer_decorators.cpp. Removed tag_sync.cpp
+
+2000-10-08 Sunday 23:01 eldamitri
+
+ * include/id3/Makefile.am (1.11):
+ (the_headers): Added writer.h and writers.h
+ (noinst_HEADERS): Added writer_decorators.h and writers_compressed.h
+
+2000-10-08 Sunday 22:59 eldamitri
+
+ * examples/Makefile.am (1.17): Removed testreader, added testio
+
+2000-10-08 Sunday 22:38 eldamitri
+
+ * src/reader_decorators.cpp (1.1), src/writer_decorators.cpp (1.1),
+ src/writers.cpp (1.1), include/id3/writer.h (1.1),
+ include/id3/writer_decorators.h (1.1), include/id3/writers.h (1.1),
+ include/id3/writers_compressed.h (1.1): Initial release.
+
+2000-10-08 Sunday 22:32 eldamitri
+
+ * examples/test_io.cpp (1.1): Added for testing io classes in
+ id3lib
+
+2000-10-08 Sunday 22:30 eldamitri
+
+ * examples/test_reader.cpp (1.2): Removed. Replaced with
+ test_io.cpp
+
+2000-10-03 Tuesday 06:53 eldamitri
+
+ * examples/demo_info.cpp (1.18):
+ - Use GetField() method rather than Field()
+ - Adjusted for changes in namespace
+
+2000-10-03 Tuesday 06:51 eldamitri
+
+ * src/: tag_file.cpp (1.25), tag_find.cpp (1.19), tag_parse.cpp
+ (1.29), tag_parse_lyrics3.cpp (1.23), tag_parse_musicmatch.cpp
+ (1.11), tag_parse_v1.cpp (1.14), tag_render.cpp (1.31),
+ tag_sync.cpp (1.8):
+ - Adjusted for changes in namespace
+ - Implementation for methods of class ID3_TagImpl rather than class
+ ID3_Tag
+ - Removed calls to ID3_THROW
+
+2000-10-03 Tuesday 06:38 eldamitri
+
+ * src/: field.cpp (1.34), field_binary.cpp (1.19),
+ field_integer.cpp (1.15), field_string_ascii.cpp (1.19),
+ field_string_unicode.cpp (1.23), frame_parse.cpp (1.22),
+ header_frame.cpp (1.15), header_tag.cpp (1.16): Adjusted for
+ changes in namespace.
+
+2000-10-03 Tuesday 06:37 eldamitri
+
+ * src/utils.cpp (1.10): Adjusted for changes in namespace, added
+ method toString(uint32)
+
+2000-10-03 Tuesday 06:32 eldamitri
+
+ * src/tag.cpp (1.26): ID3_Tag is now merely an interface.
+ Implementation details are hidden behind the lone member variable,
+ which is a pointer to the class ID3_TagImpl. ID3_Tag's methods are
+ implemented as calls to ID3_TagImpl
+
+2000-10-03 Tuesday 06:30 eldamitri
+
+ * src/misc_support.cpp (1.23):
+ (ID3_GetString): Removed call to ID3_THROW
+
+2000-10-03 Tuesday 06:26 eldamitri
+
+ * src/frame_render.cpp (1.16): Adjusted for changes in namespace,
+ removed calls to ID3_THROW
+
+2000-10-03 Tuesday 06:23 eldamitri
+
+ * src/frame_impl.cpp (1.2):
+ (_InitFields): Creates a default binary field if no field info is
+ available; remove other throw clause
+
+2000-10-03 Tuesday 04:44 eldamitri
+
+ * src/c_wrapper.cpp (1.11, rel-3-7-7): Added include for error.h
+ (should be removed soon).
+
+2000-10-03 Tuesday 04:43 eldamitri
+
+ * include/id3/utils.h (1.12):
+ - Functions are now in namespace dami, replacing namespace id3
+ - Change to reflect changes in string name, namespace
+
+2000-10-03 Tuesday 04:40 eldamitri
+
+ * include/id3/tag.h (1.46): ID3_Tag is now merely an interface.
+ Implementation details are hidden behind the lone member variable,
+ which is a pointer to the class ID3_TagImpl.
+
+2000-10-03 Tuesday 03:57 eldamitri
+
+ * include/id3/strings.h (1.2): Moved from namespace id3:: to
+ namespace dami::. Renamed from 'string' to 'String', 'bstring' to
+ 'BString', and 'wstring' to 'WString'
+
+2000-10-03 Tuesday 03:21 eldamitri
+
+ * include/id3/readers.h (1.3): Moved Readers out of namespace id3.
+ As these will be exposed as part of the library, they are now in
+ global namespace. Classes have been renamed by prepending 'ID3_',
+ as with other classes. Moved class CompressedMemoryReader and
+ CompressedStreamReader into readers_compressed.h.
+
+2000-10-03 Tuesday 03:18 eldamitri
+
+ * include/id3/reader_decorators.h (1.4): Restructured namespaces.
+ All Reader classes are now in namespace dami::io. method
+ readChars() in IdentityReader now supports signed and unsigned chars
+
+2000-10-03 Tuesday 02:53 eldamitri
+
+ * include/id3/reader.h (1.4):
+ - method readChars() now supports signed and unsigned chars
+
+2000-10-03 Tuesday 02:45 eldamitri
+
+ * include/id3/field_impl.h (1.5): (class ID3_FieldImpl): Added a
+ new char* Set method for binary data
+
+2000-10-03 Tuesday 02:36 eldamitri
+
+ * src/Makefile.am (1.17):
+ (id3lib_sources): Added 'helpers.cpp', 'readers.cpp', 'tag_impl.cpp'
+
+2000-10-03 Tuesday 02:31 eldamitri
+
+ * include/id3/Makefile.am (1.10):
+ (the_headers): Added 'reader.h' and 'readers.h', moved 'error.h',
+ 'flags.h', 'header.h', 'header_frame.h', and 'header_tag.h' to
+ noinst_HEADERS so that they're not part of an installed distribution
+ (noinst_HEADERS): Added 'readers_compressed.h'
+
+2000-10-02 Monday 19:03 eldamitri
+
+ * include/id3/helpers.h (1.1), src/helpers.cpp (1.1),
+ include/id3/lyr3.h (1.1), include/id3/lyr3_impl.h (1.1),
+ include/id3/mm.h (1.1), include/id3/mm_impl.h (1.1),
+ include/id3/readers_compressed.h (1.1), include/id3/tag_impl.h
+ (1.1), include/id3/v1.h (1.1), include/id3/v1_impl.h (1.1),
+ src/readers.cpp (1.1), src/tag_impl.cpp (1.1): Initial release
+
+2000-10-02 Monday 19:01 eldamitri
+
+ * examples/: demo_convert.cpp (1.9, rel-3-7-9), demo_copy.cpp
+ (1.3), demo_tag.cpp (1.8): Added include for error.h (should be
+ removed soon).
+
+2000-10-01 Sunday 02:05 eldamitri
+
+ * src/Makefile.am (1.16):
+ (id3lib_sources): Added frame_impl.cpp
+
+2000-10-01 Sunday 02:03 eldamitri
+
+ * include/id3/tag.h (1.45), src/misc_support.cpp (1.22),
+ src/tag_find.cpp (1.18): Added field.h to list of included files
+
+2000-10-01 Sunday 02:03 eldamitri
+
+ * include/id3/frame_impl.h (1.1), src/frame_impl.cpp (1.1): Initial
+ release
+
+2000-10-01 Sunday 02:03 eldamitri
+
+ * include/id3/frame.h (1.32), src/frame.cpp (1.28),
+ src/frame_parse.cpp (1.21), src/frame_render.cpp (1.15):
+ - Class ID3_Frame is now simply an interface. It will pass off all
+ of its funcitonality to a pointer to ID3_FrameImpl, which is its
+ only data member. In this way, the implementation of the ID3_Frame
+ can more easily change without affecting its interface. ID3_Frame
+ can't serve as a true "interface" (that is, abstract base class)
+ since so much code already relies on the ability to create
+ stack-based frame objects, but this is pretty close.
+ - Added methods SetEncryptionID(uchar), GetEncryptionID(),
+ SetGroupingID(uchar), and GetGroupingID()
+
+2000-10-01 Sunday 02:02 eldamitri
+
+ * include/id3/field_impl.h (1.4): (class ID3_FieldImpl): Changed
+ 'friendship' to ID3_FrameImpl
+
+2000-10-01 Sunday 02:01 eldamitri
+
+ * src/c_wrapper.cpp (1.10): Added include for "frame.h" and
+ "field.h"
+
+2000-10-01 Sunday 00:20 eldamitri
+
+ * id3lib.spec.in (1.21):
+ (CXXFLAGS): Added "--enable-debug=no" to call to configure
+
+2000-10-01 Sunday 00:16 eldamitri
+
+ * examples/demo_info.cpp (1.17):
+ (PrintInformation): Minor bugfix for printing out synced lyrics
+
+2000-10-01 Sunday 00:14 eldamitri
+
+ * src/utils.cpp (1.9):
+ - Added implementation for method removeTrailingSpaces(id3::string)
+ and renderNumber(uint32, size_t)
+
+2000-10-01 Sunday 00:13 eldamitri
+
+ * src/: tag_parse_lyrics3.cpp (1.22), tag_parse_musicmatch.cpp
+ (1.10), tag_parse_v1.cpp (1.13): Complete reimplementation of
+ parsing functionality to use ID3_Reader& objects rather char* arrays
+
+2000-10-01 Sunday 00:13 eldamitri
+
+ * src/tag_parse.cpp (1.28):
+ - Renamed function ID3_ParseFrames to id3::parseFrames
+ - Method Parse(ID3_Reader&) now returns bool to indicate success
+ - Renamed function ParseID3v2 to id3::parseID3v2
+ - method ParseFile() now uses ID3_Reader and related methods to
+ parse file
+
+2000-10-01 Sunday 00:13 eldamitri
+
+ * src/: header_frame.cpp (1.14), header_tag.cpp (1.15):
+ (Parse): Now returns bool to indicate success of parse, other minor
+ changes, removed method Parse(const uchar*, size_t)
+
+2000-10-01 Sunday 00:12 eldamitri
+
+ * src/frame_parse.cpp (1.20):
+ - Added function parseFields(ID3_Reader&, ID3_Frame&)
+ - Updated method ID3_Frame::Parse(ID3_Reader&) to return a bool to
+ indicate success
+
+2000-10-01 Sunday 00:12 eldamitri
+
+ * src/frame.cpp (1.27): Removed all occurrences of _bad_parse,
+ removed throws for failed memory allocation, added implementations
+ for new methods defined in frame.h
+
+2000-10-01 Sunday 00:12 eldamitri
+
+ * src/field_string_unicode.cpp (1.22):
+ (ParseUnicodeString): Now returns bool to indicate success of parse,
+ other minor changes
+
+2000-10-01 Sunday 00:12 eldamitri
+
+ * src/field_string_ascii.cpp (1.18):
+ (ParseASCIIString): Now returns bool to indicate success of parse,
+ other minor changes
+
+2000-10-01 Sunday 00:11 eldamitri
+
+ * src/field_integer.cpp (1.14):
+ (ParseInteger): Now returns bool to indicate success of parse
+
+2000-10-01 Sunday 00:11 eldamitri
+
+ * src/field_binary.cpp (1.18):
+ (ParseBinary): Now returns bool to indicate success of parse
+
+2000-10-01 Sunday 00:11 eldamitri
+
+ * src/field.cpp (1.33):
+ (Parse) Updated implementation due to new bool return value, issues
+ an ID3D_WARNING rather than throwing
+
+2000-10-01 Sunday 00:10 eldamitri
+
+ * include/id3/utils.h (1.11): Added declarations for methods
+ removeTrailingSpaces(id3::string) and renderNumber(uint32, size_t)
+
+2000-10-01 Sunday 00:09 eldamitri
+
+ * include/id3/tag.h (1.44):
+ - method Parse(ID3_Reader&) now returns bool
+
+2000-10-01 Sunday 00:09 eldamitri
+
+ * include/id3/readers.h (1.2): (class IStreamReader): Added methods
+ getBeg() and getEnd()
+
+2000-10-01 Sunday 00:09 eldamitri
+
+ * include/id3/reader.h (1.3): (class ID3_Reader) added atEnd()
+ method
+
+2000-10-01 Sunday 00:07 eldamitri
+
+ * include/id3/frame.h (1.31): (class ID3_Frame):
+ - Added methods GetField(ID3_FieldID), GetNumFields(), and
+ GetFieldAt(index_t)
+ - Parse(ID3_Reader&) method now returns bool
+ - Deprecated method Field(ID3_FieldNum)
+ - Removed mehtod BadParse()
+
+2000-10-01 Sunday 00:07 eldamitri
+
+ * include/id3/reader_decorators.h (1.3): (class IdentityReader):
+ Cleaned up implementation (class ExitTrigger): Added (class
+ WindowedReader): new constructors to make using it simpler (class
+ CharReader): Added (class UnsyncReader): Now inherits from
+ CharReader (class LineFeedReader): Added
+
+2000-10-01 Sunday 00:06 eldamitri
+
+ * include/id3/: header.h (1.18), header_frame.h (1.17),
+ header_tag.h (1.16):
+ - method Parse(ID3_Reader&) now returns bool
+ - method Parse(const uchar*, size_t) removed
+
+2000-10-01 Sunday 00:06 eldamitri
+
+ * include/id3/: field.h (1.38), field_impl.h (1.3):
+ Parse(ID3_Reader&) method(s) now return bool
+
+2000-09-27 Wednesday 11:08 eldamitri
+
+ * Makefile.am (1.24):
+ (changelog): added for generating changelog using cvs2cl.pl
+
+2000-09-27 Wednesday 11:06 eldamitri
+
+ * ChangeLog (1.123): Now auto-generated
+
+2000-09-27 Wednesday 11:05 eldamitri
+
+ * cvs2cl.pl (1.1): Initial release
+
+2000-09-27 Wednesday 10:36 eldamitri
+
+ * src/tag_parse.cpp (1.27):
+ (ID3_ParseFrames): Added implementation that uses ID3_Reader&
+ (Parse): Added implementation that uses ID3_Reader&
+ (ParseID3v2): Now makes use of ID3_Tag::Parse(ID3_Reader&)
+
+2000-09-27 Wednesday 10:31 eldamitri
+
+ * src/: header_frame.cpp (1.13), header_tag.cpp (1.14):
+ (Parse): Added overloaded implementation using ID3_Reader&
+
+2000-09-27 Wednesday 10:28 eldamitri
+
+ * src/field_string_unicode.cpp (1.21):
+ (ParseUnicodeString): Replaced with implementation using ID3_Reader&
+
+2000-09-27 Wednesday 10:25 eldamitri
+
+ * src/field_string_ascii.cpp (1.17):
+ (ParseASCIIString): Replaced with implementation using ID3_Reader&
+
+2000-09-27 Wednesday 10:23 eldamitri
+
+ * src/field_integer.cpp (1.13):
+ (ParseInteger): Replaced with implementation using ID3_Reader&
+
+2000-09-27 Wednesday 10:22 eldamitri
+
+ * src/field_binary.cpp (1.17):
+ (ParseBinary): Replaced with implementation using ID3_Reader&
+
+2000-09-27 Wednesday 10:20 eldamitri
+
+ * src/: field.cpp (1.32, rel-3-7-13), frame_parse.cpp (1.19):
+ (Parse): Reimplemented to use new Parse(ID3_Reader&) method, will be
+ soon deprecated
+
+2000-09-27 Wednesday 10:16 eldamitri
+
+ * include/id3/utils.h (1.10):
+ - Reinstated namespace ::id3
+ - Renamed all functions, removing 'ID3_' prefix and lowercasing
+ first letter
+ - Added templated versions of functions min, max, and abs
+
+2000-09-27 Wednesday 10:10 eldamitri
+
+ * include/id3/reader_decorators.h (1.2):
+ - Removed definition of min (now defined in utils.h)
+ - Added new debugging output via ID3_NOTICE and ID3_WARNING (class
+ IdentityReader): Cleaned-up implementation of IdentityReader to
+ match new ID3_Reader interface (class WindowedReader):
+ - Cleaned-up implementation of inWindow, constructor, setWindow,
+ setBeg, setEnd
+ - Removed seekBeg and seekEnd
+ - Added implementation of remainingChars (class UnsyncedReader):
+ - Added new debugging output via ID3_NOTICE and ID3_WARNING
+ - Added implementation of skipChars
+ - Implementation of readChars can accept a NULL buffer
+ - Added implementation of remainingChars (class NumberReader, class
+ TextReader, class BinaryReader): added
+
+2000-09-27 Wednesday 10:02 eldamitri
+
+ * include/id3/reader.h (1.2):
+ - Added END_OF_READER static const
+ - Added methods getBeg() and getEnd()
+ - Removed methods readByte(), readBytes(), and remainingChars()
+ - Replaced peek() with peekChar()
+ - Replaced tell() with getCur()
+ - Replaced seek() with setCur()
+ - skipChars() now returns a streamsize value
+
+2000-09-27 Wednesday 09:56 eldamitri
+
+ * include/id3/header.h (1.17): Added forward declaration of
+ ID3_Reader
+
+2000-09-27 Wednesday 09:53 eldamitri
+
+ * include/id3/field_impl.h (1.2):
+ - Added new Parse method that accepts an ID3_Reader&
+ - Replaced all protected Parse* methods that accept const uchar*
+ string with ones that accept ID3_Reader&
+
+2000-09-27 Wednesday 09:51 eldamitri
+
+ * include/id3/: field.h (1.37), frame.h (1.30), header_frame.h
+ (1.16), header_tag.h (1.15), tag.h (1.43): Added new Parse method
+ that accepts an ID3_Reader&
+
+2000-09-27 Wednesday 09:47 eldamitri
+
+ * src/: tag_file.cpp (1.24), tag_parse_lyrics3.cpp (1.21),
+ tag_parse_musicmatch.cpp (1.9), tag_parse_v1.cpp (1.12),
+ tag_render.cpp (1.30), frame_render.cpp (1.14): Updated for renamed
+ functions in utils.h.
+
+2000-09-27 Wednesday 09:40 eldamitri
+
+ * src/tag_sync.cpp (1.7):
+ - All functions now in namespace ::id3
+ - Renamed all functions to remove ID3_ prefix and uppercase first
+ char
+
+2000-09-27 Wednesday 09:38 eldamitri
+
+ * src/: tag_find.cpp (1.17), utils.cpp (1.8):
+ - All functions now in 'id3' namespace
+ - Renamed functions w/ID3_ prefix, changed first letter to
+ lower-case
+ - (getFileSize): Added implementations for getFileSize(ifstream&)
+ and getFileSize(ofstream&)
+ - (openWritableFile): Added implementation for
+ openWritableFile(const char*, ofstream&)
+ - (openReadableFile): Added implementation for
+ openReadableFile(const char*, ifstream&)
+
+2000-09-27 Wednesday 09:31 eldamitri
+
+ * src/Makefile.am (1.15): Don't link to shared zlib if we didn't
+ compile it.
+
+2000-09-27 Wednesday 09:26 eldamitri
+
+ * include/id3/Makefile.am (1.9):
+ (noinst_HEADERS): Added new files
+
+2000-09-27 Wednesday 09:02 eldamitri
+
+ * examples/demo_info.cpp (1.16):
+ - Added check and inclusion of config.h
+ - Updated for changed function name (ParseNumber ->
+ id3::parseNumber)
+ - Added -n and -w options for turning on NOTICE and WARNING output
+ in library
+
+2000-09-27 Wednesday 08:59 eldamitri
+
+ * examples/Makefile.am (1.16):
+ - Added ID3_DEBUG_LIBS macro (for compiling with libcwd),
+ conditional on ID3_DEBUG_LIBS
+ - now compiles with ID3_DEBUG_LIBS
+ - added ID3LIB_DEBUG_FLAGS to INCLUDES
+ - added `testreader` app and sources
+
+2000-09-27 Wednesday 08:56 eldamitri
+
+ * configure.in (1.45): Call to AC_CHECK_LIB for zlib and popt now
+ only define HAVE_ZLIB and HAVE_POPT_LIB, rather than also adding -lz
+ and -lpopt to LIBS (which is the default behavior).
+
+2000-09-27 Wednesday 08:54 eldamitri
+
+ * AUTHORS (1.7): Reformat AUTHORS file for --usermap option to
+ cvs2cl.pl.
+
+2000-09-27 Wednesday 06:19 eldamitri
+
+ * examples/test_reader.cpp (1.1), include/id3/debug.h (1.2),
+ include/id3/readers.h (1.1), include/id3/strings.h (1.1): Initial
+ release
+
+2000-09-27 Wednesday 05:32 eldamitri
+
+ * include/id3/int28.h (1.11), src/int28.cpp (1.5): No long used
+ (replaced by uint28)
+
+2000-09-27 Wednesday 05:26 eldamitri
+
+ * configure.in (1.44, rel-3-7-2): Fixed bug with header checking
+
+2000-09-22 Friday 06:40 eldamitri
+
+ * include/id3/: reader.h (1.1), reader_decorators.h (1.1), dami.idl
+ (1.1): Initial release
+
+2000-09-22 Friday 01:45 eldamitri
+
+ * doc/index.html.in (1.9): Added empeg to list of projects
+
+2000-09-22 Friday 01:41 eldamitri
+
+ * include/id3/field_def.h (1.2): Minor fix for typo
+
+2000-09-22 Friday 01:37 eldamitri
+
+ * src/tag_render.cpp (1.29):
+ (RenderV1): remove throwing of memory exception
+ (RenderV2): remove throwing of memory exception
+
+2000-09-22 Friday 01:22 eldamitri
+
+ * src/tag_find.cpp (1.16):
+ (Find): remove throwing of memory exception
+
+2000-09-22 Friday 01:17 eldamitri
+
+ * src/header_frame.cpp (1.12): Added inclusion of frame_def.h,
+ field_def.h, and field_impl.h
+
+2000-09-22 Friday 01:16 eldamitri
+
+ * src/frame.cpp (1.26):
+ (_ClearFields): dynamic cast field pointer to fieldImpl so it can be
+ deleted
+ (_InitFields): create a FieldImpl rather than a Field
+
+2000-09-22 Friday 00:39 eldamitri
+
+ * src/: field.cpp (1.31), field_binary.cpp (1.16),
+ field_integer.cpp (1.12), field_string_ascii.cpp (1.16),
+ field_string_unicode.cpp (1.20): Now an implementation of
+ ID3_FieldImpl instead of ID3_Field
+
+2000-09-22 Friday 00:23 eldamitri
+
+ * include/id3/tag.h (1.42): Added inclusion of error.h for
+ convenience
+
+2000-09-22 Friday 00:21 eldamitri
+
+ * include/id3/header_frame.h (1.15): Added a forward declaration
+ for FrameDef, since it was removed from field.h.
+
+2000-09-22 Friday 00:10 eldamitri
+
+ * include/id3/header.h (1.16): (class ID3_Header): Bug fix in
+ initializing the constructor
+
+2000-09-22 Friday 00:03 eldamitri
+
+ * include/id3/: field_def.h (1.1), field_impl.h (1.1), frame_def.h
+ (1.2): Initial release.
+
+2000-09-21 Thursday 23:28 eldamitri
+
+ * include/id3/field.h (1.36):
+ - Made into an abstract base class so that the implementation can be
+ altered without affecting interface
+ - ID3_FieldDef and ID3_FrameDef now defined in separate files
+
+2000-09-15 Friday 03:49 eldamitri
+
+ * Makefile.am (1.23, rel-3-7-13): Delete popt from windows release
+ (doesn't work on windows...)
+
+2000-09-15 Friday 02:03 eldamitri
+
+ * NEWS (1.22), configure.in (1.43, rel-3-7-13, rel-3-7-13),
+ id3lib.spec.in (1.20, rel-3-7-13): Updated for 3.7.13 release
+
+2000-09-15 Friday 01:54 eldamitri
+
+ * src/uint28.cpp (1.7, rel-3-7-13): Added check for iomanip
+
+2000-09-15 Friday 01:54 eldamitri
+
+ * src/tag_parse.cpp (1.26, rel-3-7-13): Minor rearrangement of
+ include files
+
+2000-09-15 Friday 01:52 eldamitri
+
+ * config.h.win32.in (1.6, rel-3-7-13): Fixed versioning constants
+
+2000-09-15 Friday 01:47 eldamitri
+
+ * id3com/ID3Tag.cpp (1.11, rel-3-7-13):
+ (get_VersionString): Fixed version constants
+
+2000-09-15 Friday 00:36 eldamitri
+
+ * include/id3/field.h (1.35, rel-3-7-13): (class ID3_Field): Made
+ BinSize() public, HasChanged() public and const
+
+2000-09-15 Friday 00:35 eldamitri
+
+ * src/misc_support.cpp (1.21, rel-3-7-13):
+ (ID3_GetString): Fixed bug with encoding type
+
+2000-09-15 Friday 00:34 eldamitri
+
+ * src/frame.cpp (1.25, rel-3-7-13):
+ (_InitFields): Access field id via method, not member
+ (Field): Access field id via method, not member
+
+2000-09-15 Friday 00:31 eldamitri
+
+ * src/field.cpp (1.30, rel-3-7-13):
+ (HasChanged): changed to const
+
+2000-09-15 Friday 00:15 eldamitri
+
+ * examples/demo_info.cpp (1.15, rel-3-7-13):
+ (PrintInformation): Adjustment for new indexing in IPLS
+
+2000-09-15 Friday 00:11 eldamitri
+
+ * src/: field_string_ascii.cpp (1.15), field_string_unicode.cpp
+ (1.19) (utags: rel-3-7-13): A complete reimplementation for text
+ strings. Rather than storing all text strings as unicode, requiring
+ extra copies for every Set and Get, the field object stores a union
+ of a char* and unicode_t* pointer, converting back and forth only
+ when necessary. The result is a more efficient, easier-to-maintain
+ implementation.
+
+2000-09-15 Friday 00:06 eldamitri
+
+ * src/misc_support.cpp (1.20):
+ (ID3_GetString): New implementation that retrieves entire string
+ (ID3_GetString): Indexing is no longer off by 1
+
+2000-09-15 Friday 00:03 eldamitri
+
+ * src/frame_parse.cpp (1.18, rel-3-7-13):
+ (Parse): No longer catches exceptions (none thrown in field objects)
+
+2000-09-15 Friday 00:01 eldamitri
+
+ * src/frame.cpp (1.24):
+ (_InitFields): Fields initialized with field def object, rather than
+ manually copying the members
+
+2000-09-14 Thursday 23:58 eldamitri
+
+ * src/field_integer.cpp (1.11, rel-3-7-13):
+ (Set): New implementation that is sensitive to the type of field,
+ new data members
+ (ParseInteger): New implementation that is sensitive to the fixed
+ length (if any)
+ (RenderInteger): Now renders _integer directly
+
+2000-09-14 Thursday 23:54 eldamitri
+
+ * src/field_binary.cpp (1.15, rel-3-7-13):
+ (Set): Now returns number of bytes set; doesn't allocate new memory
+ for a fixed-length field
+ (ParseBinary): Change to take advantage of Set's return value
+
+2000-09-14 Thursday 23:50 eldamitri
+
+ * src/field.cpp (1.29):
+ (ID3_Field): Bug fix; all member variables set appropriately before
+ calling Clear() (~ID3_Field): No longer calls Clear() to free
+ memory, as Clear() will allocate it for fixed-length fields
+ (Clear): Now ensures fixed-length fields have memory allocated
+ appropriately
+
+2000-09-14 Thursday 23:47 eldamitri
+
+ * include/id3/field.h (1.34): (class ID3_Field): All Set() and
+ Add() methods now return number of bytes that were set or added
+
+2000-09-14 Thursday 19:59 eldamitri
+
+ * src/field_binary.cpp (1.14):
+ (Set): New implementation that is sensitive to the type of field,
+ new data members
+ (Get): New implementation that is sensitive to the type of field,
+ new data members; returns nothing if field isn't binary
+ (FromFile): New implementation that is sensitive to the type of
+ field, new data members
+ (ToFile): New implementation that is sensitive to the type of field,
+ new data members
+
+2000-09-14 Thursday 18:26 eldamitri
+
+ * src/field.cpp (1.28):
+ (ID3FD_GeneralText): All language fields changeed back to text
+ strings rather than binary due to improved implementation of text
+ strings
+ (ID3_Field): New constructor implementation w/ID3_FieldDef as param
+ (Clear): New implementation that is sensitive to the type of field
+ (Size, BinSize): new implementations for Size() and BinSize();
+ Size() calculates the number of characters in a text string or the
+ number of bytes in anythings else, BinSize calculates the number of
+ bytes in the rendered field given the current encoding, etc.
+ (Render): Now calls same rendering function for both types of
+ strings (operator=): Will only assign fields that are the same type;
+ new field type-sensitive implementation
+ (SetEncoding): Now reponsible for changing the underlying encoding
+ of the string if a change is requested
+
+2000-09-14 Thursday 18:16 eldamitri
+
+ * include/id3/misc_support.h (1.22, rel-3-7-13):
+ - added ID3_GetString(const ID3_Frame*, ID3FieldID) for retrieving
+ entire ascii string
+ - ID3_GetString(const ID3_Frame*, ID3_FieldID, size_t) no longer has
+ default parameter
+
+2000-09-14 Thursday 18:14 eldamitri
+
+ * include/id3/field.h (1.33): (struct ID3_FieldDef): Renamed
+ members to be consistent with naming convention in rest of library
+ (class ID3_Field):
+ - Size() no longer implemented in the header
+ - Get() now checks to make sure this is an integer field
+ - added Get(char*, size_t) method for retrieving entire ascii string
+ - removed default parameter of Get(char*, size_t, index_t); indexing
+ now starts at 0
+ - added Get(unicode_t*, size_t) for retrieving entire unicode string
+ - removed default parameter of Get(unicode_t*, size_t, index_t);
+ indexing now starts at 0
+ - Get(uchar*, size_t) now returns the number of bytes retrieved
+ - BinSize() no longer has a parameter
+ - Added Set_i and Add_i methods
+ - Added (private) ID3_Field(const ID3_FieldDef&) constructor
+ - Member variables that don't change are now const
+ - Field data no longer represented by _data; rather, a union of the
+ various types of representations is used
+ - field size is now a union: _chars for text strings, _bytes for
+ everything else
+
+2000-09-11 Monday 09:46 eldamitri
+
+ * include/id3.h (1.12, rel-3-7-13), include/id3/error.h (1.14,
+ rel-3-7-13), include/id3/field.h (1.32, rel-3-7-13),
+ include/id3/flags.h (1.3, rel-3-7-13), include/id3/frame.h (1.29,
+ rel-3-7-13), include/id3/globals.h (1.33, rel-3-7-13),
+ include/id3/header.h (1.15, rel-3-7-13), include/id3/header_frame.h
+ (1.14, rel-3-7-13), include/id3/header_tag.h (1.14, rel-3-7-13),
+ include/id3/int28.h (1.10, rel-3-7-13), include/id3/misc_support.h
+ (1.21), include/id3/sized_types.h (1.5, rel-3-7-13),
+ include/id3/spec.h (1.3, rel-3-7-13), include/id3/tag.h (1.41,
+ rel-3-7-13), include/id3/uint28.h (1.7, rel-3-7-13),
+ include/id3/utils.h (1.9, rel-3-7-13), src/error.cpp (1.10,
+ rel-3-7-13), src/field.cpp (1.27), src/field_binary.cpp (1.13),
+ src/field_integer.cpp (1.10), src/field_string_ascii.cpp (1.14),
+ src/field_string_unicode.cpp (1.18), src/frame.cpp (1.23),
+ src/frame_parse.cpp (1.17), src/frame_render.cpp (1.13,
+ rel-3-7-13), src/globals.cpp (1.3, rel-3-7-13), src/header.cpp
+ (1.9, rel-3-7-13), src/header_frame.cpp (1.11, rel-3-7-13),
+ src/header_tag.cpp (1.13, rel-3-7-13), src/int28.cpp (1.4,
+ rel-3-7-13), src/tag.cpp (1.25, rel-3-7-13), src/tag_file.cpp
+ (1.23, rel-3-7-13), src/tag_find.cpp (1.15, rel-3-7-13),
+ src/tag_parse.cpp (1.25), src/tag_parse_musicmatch.cpp (1.8,
+ rel-3-7-13), src/tag_render.cpp (1.28, rel-3-7-13), src/utils.cpp
+ (1.7, rel-3-7-13): Renamed all member variables. Changed '__' to
+ '_', since names with '__' aren't allowed in the C++ standard.
+
+2000-09-11 Monday 09:39 eldamitri
+
+ * Makefile.in (1.35), acconfig.h (1.8, rel-3-7-13), config.h.in
+ (1.9, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-13), configure (1.41), examples/Makefile.in
+ (1.11, rel-3-7-13), include/id3/Makefile.in (1.30),
+ popt/config.status (1.4), src/Makefile.in (1.30),
+ zlib/config.status (1.4): Auto-update
+
+2000-09-10 Sunday 01:07 eldamitri
+
+ * THANKS (1.15, rel-3-7-13): Added Steven Frank.
+
+2000-09-10 Sunday 01:04 eldamitri
+
+ * src/field_binary.cpp (1.12):
+ (Set): No longer creates copies null or empty data
+
+2000-09-10 Sunday 01:03 eldamitri
+
+ * src/field.cpp (1.26, rel-3-7-12): All LANGUAGE fields are now
+ binary so that they won't be converted unnecessarily to unicode.
+
+2000-09-10 Sunday 01:02 eldamitri
+
+ * doc/musicmatch.txt (1.4, rel-3-7-13, rel-3-7-12): Minor typo
+ fixes (thanks Peter Luijer)
+
+2000-09-08 Friday 07:51 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.7):
+ (ParseMusicMatch): Minor changes for warning-free Windows
+ compilation
+
+2000-09-08 Friday 07:46 eldamitri
+
+ * examples/Makefile.am (1.15, rel-3-7-13):
+ (EXTRA_DIST): Added 230-syncedlyrics.tag, thatspot.tag, and ozzy.tag
+
+2000-09-08 Friday 07:41 eldamitri
+
+ * doc/musicmatch.txt (1.3): Minor formatting changes
+
+2000-09-07 Thursday 23:55 eldamitri
+
+ * doc/Makefile.am (1.13, rel-3-7-13):
+ (EXTRA_DIST): Added 'musicmatch.txt' to the list of distribution
+ files
+
+2000-09-07 Thursday 23:53 eldamitri
+
+ * doc/index.html.in (1.8, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-13): Updated info about
+ projects using idrlib: updated freeamp, added AmpBar
+
+2000-09-07 Thursday 23:22 eldamitri
+
+ * doc/musicmatch.txt (1.2): Update documentation on MusicMatch
+ format.
+
+2000-09-06 Wednesday 09:04 eldamitri
+
+ * src/error.cpp (1.9):
+ (ID3_Error): Replaced strdup, since it's not part of standard
+ libraries (thanks Steven Frank)
+
+2000-09-05 Tuesday 08:55 eldamitri
+
+ * doc/musicmatch.txt (1.1): Initial release.
+
+2000-09-05 Tuesday 08:54 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.6):
+ (ParseMusicMatch): Complete reimplementation of the function to make
+ it more robust. Based on new information of the format (thanks to
+ the videoripper).
+
+2000-08-28 Monday 15:41 eldamitri
+
+ * include/id3/field.h (1.31), include/id3/uint28.h (1.6),
+ src/tag_parse_musicmatch.cpp (1.5), src/uint28.cpp (1.6):
+ Portability fixes for the Mac (thanks John Firebaugh)
+
+2000-08-28 Monday 06:27 eldamitri
+
+ * popt/: intl/ChangeLog (1.1), intl/Makefile (1.1),
+ intl/Makefile.in (1.1), intl/VERSION (1.1), intl/bindtextdom.c
+ (1.1), intl/cat-compat.c (1.1), intl/dcgettext.c (1.1),
+ intl/dgettext.c (1.1), intl/explodename.c (1.1), intl/finddomain.c
+ (1.1), intl/gettext.c (1.1), intl/gettext.h (1.1), intl/gettextP.h
+ (1.1), intl/hash-string.h (1.1), intl/intl-compat.c (1.1),
+ intl/l10nflist.c (1.1), intl/libgettext.h (1.1), intl/linux-msg.sed
+ (1.1), intl/loadinfo.h (1.1), intl/loadmsgcat.c (1.1),
+ intl/localealias.c (1.1), intl/po2tbl.sed (1.1), intl/po2tbl.sed.in
+ (1.1), intl/textdomain.c (1.1), intl/xopen-msg.sed (1.1),
+ po/Makefile (1.1), po/Makefile.in (1.1), po/Makefile.in.in (1.1),
+ po/POTFILES (1.1), po/POTFILES.in (1.1), po/cat-id-tbl.c (1.1),
+ po/popt.pot (1.1), po/ro.gmo (1.1), po/ro.po (1.1), po/sk.gmo
+ (1.1), po/sk.po (1.1), po/stamp-cat-id (1.1) (utags: rel-3-7-12,
+ rel-3-7-13): Initial release
+
+2000-08-28 Monday 02:32 eldamitri
+
+ * zlib/config.h (1.1, rel-3-7-13, rel-3-7-12), zlib/config.log
+ (1.1, rel-3-7-13, rel-3-7-12), zlib/config.status (1.1),
+ zlib/libtool (1.1, rel-3-7-13, rel-3-7-12), zlib/stamp-h (1.1,
+ rel-3-7-13, rel-3-7-12), src/templates/cpp_template (1.1,
+ rel-3-7-13, rel-3-7-12), src/templates/header_template (1.1,
+ rel-3-7-13, rel-3-7-12), popt/CHANGES (1.1, rel-3-7-13,
+ rel-3-7-12), popt/COPYING (1.1, rel-3-7-13, rel-3-7-12),
+ popt/Doxyfile (1.1, rel-3-7-13, rel-3-7-12), popt/Doxyfile.in (1.1,
+ rel-3-7-13, rel-3-7-12), popt/Makefile (1.1, rel-3-7-13,
+ rel-3-7-12), popt/Makefile.am (1.1, rel-3-7-13, rel-3-7-12),
+ popt/Makefile.in (1.1, rel-3-7-13, rel-3-7-12), popt/README (1.1,
+ rel-3-7-13, rel-3-7-12), popt/acconfig.h (1.1, rel-3-7-13,
+ rel-3-7-12), popt/aclocal.m4 (1.1, rel-3-7-13, rel-3-7-12),
+ popt/autogen.sh (1.1, rel-3-7-13, rel-3-7-12), popt/config.guess
+ (1.1, rel-3-7-13, rel-3-7-12), popt/config.h (1.1, rel-3-7-13,
+ rel-3-7-12), popt/config.h.in (1.1, rel-3-7-13, rel-3-7-12),
+ popt/config.log (1.1, rel-3-7-13, rel-3-7-12), popt/config.status
+ (1.1), popt/config.sub (1.1, rel-3-7-13, rel-3-7-12),
+ popt/configure (1.1, rel-3-7-13, rel-3-7-12), popt/configure.in
+ (1.1, rel-3-7-13, rel-3-7-12), popt/findme.c (1.1, rel-3-7-13,
+ rel-3-7-12), popt/findme.h (1.1, rel-3-7-13, rel-3-7-12),
+ popt/install-sh (1.1, rel-3-7-13, rel-3-7-12), popt/libtool (1.1,
+ rel-3-7-13, rel-3-7-12), popt/ltconfig (1.1, rel-3-7-13,
+ rel-3-7-12), popt/ltmain.sh (1.1, rel-3-7-13, rel-3-7-12),
+ popt/missing (1.1, rel-3-7-13, rel-3-7-12), popt/mkinstalldirs
+ (1.1, rel-3-7-13, rel-3-7-12), popt/popt.3 (1.1, rel-3-7-13,
+ rel-3-7-12), popt/popt.c (1.1, rel-3-7-13, rel-3-7-12), popt/popt.h
+ (1.1, rel-3-7-13, rel-3-7-12), popt/popt.ps (1.1, rel-3-7-13,
+ rel-3-7-12), popt/popt.spec (1.1, rel-3-7-13, rel-3-7-12),
+ popt/poptconfig.c (1.1, rel-3-7-13, rel-3-7-12), popt/popthelp.c
+ (1.1, rel-3-7-13, rel-3-7-12), popt/poptint.h (1.1, rel-3-7-13,
+ rel-3-7-12), popt/poptparse.c (1.1, rel-3-7-13, rel-3-7-12),
+ popt/stamp-h (1.1, rel-3-7-13, rel-3-7-12), popt/stamp-h.in (1.1,
+ rel-3-7-13, rel-3-7-12), popt/system.h (1.1, rel-3-7-13,
+ rel-3-7-12), popt/test-poptrc (1.1, rel-3-7-13, rel-3-7-12),
+ popt/test1.c (1.1, rel-3-7-13, rel-3-7-12), popt/test2.c (1.1,
+ rel-3-7-13, rel-3-7-12), popt/testit.sh (1.1, rel-3-7-13,
+ rel-3-7-12): Initial release
+
+2000-08-28 Monday 00:59 eldamitri
+
+ * examples/get_pic.cpp (1.3, rel-3-7-13):
+ - No longer #include's getopt.h (unused)
+ - return's 1 instead of exit(1)
+
+2000-08-28 Monday 00:58 eldamitri
+
+ * examples/: demo_convert.cpp (1.8, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-13), demo_copy.cpp (1.2, rel-3-7-13),
+ demo_info.cpp (1.14), demo_tag.cpp (1.7, rel-3-7-13):
+ - Now uses popt instead of getopt for parameter processing
+ - VERSION_NUMBER now a static const char* rather than a macro
+ - PrintUsage, PrintVersion now accept const char* (rather than
+ char*)
+
+2000-08-28 Monday 00:42 eldamitri
+
+ * examples/Makefile.am (1.13): Updated to link in libpopt for
+ parameter processing the examples
+
+2000-08-28 Monday 00:40 eldamitri
+
+ * configure.in (1.42, rel-3-7-1):
+ - Added checks for popt, for use in examples for argument parsing
+ - zlib's Makefile's are no longer created; rather, it is listed as a
+ config subdir
+
+2000-08-28 Monday 00:37 eldamitri
+
+ * Makefile.am (1.22):
+ (SUBDIRS): Made inclusion of popt and zlib conditional
+ (DIST_SUBDIRS): Added to keep track of all directories for
+ distribution
+
+2000-08-28 Monday 00:27 eldamitri
+
+ * id3lib.kdevprj (1.1), id3lib.lsm (1.1) (utags: rel-3-7-12,
+ rel-3-7-13): Initial release
+
+2000-08-28 Monday 00:12 eldamitri
+
+ * zlib/: AUTHORS (1.1), COPYING (1.1), ChangeLog (1.1), INSTALL
+ (1.1), NEWS (1.1, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), README (1.1), acconfig (1.1), acconfig.h (1.1),
+ aclocal.m4 (1.1), config.h.in (1.1), configure (1.1), configure.in
+ (1.1), mkinstalldirs (1.1), reconf (1.1), stamp-h.in (1.1) (utags:
+ rel-3-7-12, rel-3-7-13): Added for updated conditional compilation
+ order in id3lib
+
+2000-08-28 Monday 00:11 eldamitri
+
+ * zlib/: Makefile.am (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0), Makefile.in
+ (1.2), include/Makefile.in (1.2), lib/Makefile.in (1.2),
+ prj/Makefile.in (1.2), src/Makefile.am (1.5), src/Makefile.in (1.5)
+ (utags: rel-3-7-13): Updated for conditional compilation order in
+ id3lib
+
+2000-08-26 Saturday 23:42 eldamitri
+
+ * id3lib.spec.in (1.19):
+ (RPM_OPT_FLAGS): Removed stack-boundary for RedHat 6.2 option,
+ updated release number
+
+2000-08-26 Saturday 22:25 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.20, rel-3-7-13):
+ (ParseLyrics3): Fixed compiler warning
+ (ParseLyrics3v2): Fixed compiler warning
+
+2000-08-26 Saturday 22:21 eldamitri
+
+ * include/id3/tag.h (1.40): (class ID3_Tag): Removed unneccessary
+ method declartions.
+
+2000-08-18 Friday 19:02 adcockj
+
+ * ChangeLog (1.114): Added Picture Functionality thanks to Philip
+ Oldaker
+
+2000-08-18 Friday 19:01 adcockj
+
+ * id3com/: BSTRCollection.h (1.1, rel-3-7-13, rel-3-7-12),
+ ID3COM.rc (1.5, rel-3-7-13), ID3Field.cpp (1.6, rel-3-7-13),
+ ID3Field.h (1.8, rel-3-7-13), ID3Frame.cpp (1.9, rel-3-7-13),
+ ID3Frame.h (1.8, rel-3-7-13), ID3Tag.cpp (1.10), ID3Tag.h (1.8,
+ rel-3-7-13), MimeTypes.cpp (1.1, rel-3-7-13, rel-3-7-12),
+ MimeTypes.h (1.1, rel-3-7-13, rel-3-7-12), StdAfx.cpp (1.6,
+ rel-3-7-13), StdAfx.h (1.6, rel-3-7-13), TextCollection.cpp (1.1,
+ rel-3-7-13, rel-3-7-12), TextCollection.h (1.1, rel-3-7-13,
+ rel-3-7-12), TextCollection.rgs (1.1, rel-3-7-13, rel-3-7-12),
+ id3com.cpp (1.7, rel-3-7-13), id3com.dsp (1.15, rel-3-7-13),
+ id3com.idl (1.10, rel-3-7-13), resource.h (1.5, rel-3-7-13),
+ Sample/ID3Test.vbp (1.6, rel-3-7-13), Sample/ID3Test.vbw (1.7,
+ rel-3-7-13): Added Picture Functionality from Philip Oldaker
+
+2000-07-15 Saturday 18:20 adcockj
+
+ * src/tag_parse.cpp (1.24), ChangeLog (1.113): fixed compile
+ warning under windows
+
+2000-07-14 Friday 09:13 adcockj
+
+ * ChangeLog (1.112): ot compiling under windows
+
+2000-07-14 Friday 09:10 adcockj
+
+ * src/: tag_file.cpp (1.22), utils.cpp (1.6): Got compiling under
+ windows
+
+2000-07-11 Tuesday 06:29 eldamitri
+
+ * src/utils.cpp (1.5): Added implementations of exists,
+ ID3_CreateFile, ID3_OpenFileForWriting, ID3_OpenFileForReading, and
+ ID3_CloseFile
+
+2000-07-11 Tuesday 06:27 eldamitri
+
+ * src/tag_parse_v1.cpp (1.11, rel-3-7-13):
+ - Removed inclusion of stdio.h
+ (ParseID3v1): Now manipulates an fstream rather than a FILE*
+
+2000-07-11 Tuesday 06:26 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.4):
+ - Removed inclusion of stdio.h
+ (MM_ParseTextField): Now manipulates an fstream rather than a FILE*
+ (ParseMusicMatch): Now manipulates an fstream rather than a FILE*
+
+2000-07-11 Tuesday 06:25 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.19):
+ - Removed inclusion of stdio.h
+ (ParseLyrics3): Now manipulates an fstream rather than a FILE*
+ (ParseLyrics3v2): Now manipulates an fstream rather than a FILE*
+
+2000-07-11 Tuesday 06:23 eldamitri
+
+ * src/tag_parse.cpp (1.23):
+ - Removed inclusion of stdio.h
+ (ParseID3v2):
+ - Now manipulates an fstream rather than a FILE*
+ - Now uses ID3_Tag::IsV2Tag rather than ID3_IsTagHeader
+ (ParseFile): Now manipulates an fstream rather than a FILE*
+
+2000-07-11 Tuesday 06:21 eldamitri
+
+ * src/tag_file.cpp (1.21):
+ - Added inclusion of utils.h
+ - Made inclusion of stdio.h dependent on HAVE_MKSTEMP's
+ non-defintion
+ - Removed definition of ID3_PATH_LENGTH (now in utils.h)
+ - Removed CreateFile, OpenFileForWriting, OpenFileForReading, and
+ CloseFile definitions (redefined in utils.cpp)
+ (Link): Removed handling of __file_handle, push all file
+ manipulation into ParseFile
+ (RenderV1ToFile): Now manipulates an fstream rather than a FILE*
+ (RenderV2ToFile): Now manipulates an fstream rather than a FILE*
+ (Update): Now manipulates an fstream rather than a FILE*
+ (Strip): Now manipulates an fstream rather than a FILE*
+
+2000-07-11 Tuesday 06:14 eldamitri
+
+ * src/tag.cpp (1.24):
+ - Added inclusion of utils.h
+ - Removed definition of ID3_PATH_LENGTH (now in utils.h)
+ - Removed all mention of __file_handle
+ - Removed all calls to CloseFile()
+
+2000-07-11 Tuesday 06:12 eldamitri
+
+ * src/: misc_support.cpp (1.19), tag_render.cpp (1.27): Removed
+ inclusion of stdio.h
+
+2000-07-11 Tuesday 06:02 eldamitri
+
+ * include/id3/utils.h (1.8):
+ - Now includes config.h, since it isn't a distributed file
+ - Added definition of ID3_PATH_LENGTH
+ - Added declarations of file utils
+
+2000-07-11 Tuesday 06:00 eldamitri
+
+ * include/id3/tag.h (1.39): (class ID3_Tag): Removed __file_handle
+
+2000-07-11 Tuesday 05:59 eldamitri
+
+ * include/id3/Makefile.am (1.8, rel-3-7-13):
+ (the_headers): removed utils.h
+ (noinst_HEADERS): added utils.h
+
+2000-07-08 Saturday 23:26 eldamitri
+
+ * src/tag_render.cpp (1.26):
+ (RenderV1): Converts ID3v2 COMM frames to ID3v1 comments more
+ liberally
+
+2000-07-08 Saturday 23:23 eldamitri
+
+ * examples/test_remove.cpp (1.6, rel-3-7-13):
+ (main): Now adds an ID3v1 comment
+
+2000-07-08 Saturday 01:49 eldamitri
+
+ * NEWS (1.21), configure.in (1.41), id3lib.spec.in (1.18) (utags:
+ rel-3-7-12): Updated for 3.7.12 release
+
+2000-07-08 Saturday 01:16 eldamitri
+
+ * src/tag_render.cpp (1.25, rel-3-7-12):
+ (RenderV1): Renders comments in the id3v1 tag with a description of
+ STR_V1_COMMENT_DESC
+
+2000-07-08 Saturday 01:14 eldamitri
+
+ * src/tag_file.cpp (1.20, rel-3-7-12):
+ (RenderV2ToHandle): Removed debugging output
+
+2000-07-08 Saturday 01:13 eldamitri
+
+ * src/misc_support.cpp (1.18, rel-3-7-12):
+ (ID3_GetComment): Now a second, optional parameter to find a comment
+ with a specific description. Default value is NULL, which will find
+ the next comment in the tag, regardless of its description.
+
+2000-07-08 Saturday 01:05 eldamitri
+
+ * include/id3/tag.h (1.38, rel-3-7-12):
+ (STR_V1_COMMENT_DESC): Now has the value "ID3v1 Comment"
+ (ID3_Tag): Update()'s default parameter changed from ID3TT_ID3V2 to
+ ID3TT_ALL
+
+2000-07-08 Saturday 01:03 eldamitri
+
+ * include/id3/misc_support.h (1.20, rel-3-7-12): Added a secondary
+ optional parameter ID3_GetComment to find a comment with a specific
+ description.
+
+2000-07-08 Saturday 01:01 eldamitri
+
+ * examples/test_remove.cpp (1.5, rel-3-7-12):
+ (main): If a file is given on the command-line, just remove the
+ description-less comments.
+
+2000-07-06 Thursday 14:26 eldamitri
+
+ * NEWS (1.20, rel-3-7-11): Other minor updates for 3.7.11
+
+2000-07-05 Wednesday 18:36 eldamitri
+
+ * NEWS (1.19), THANKS (1.12, rel-3-7-12, rel-3-7-11), configure.in
+ (1.40, rel-3-7-0, rel-3-7-11), id3lib.spec.in (1.17, rel-3-7-11):
+ Updated for 3.7.11 release
+
+2000-07-05 Wednesday 00:54 eldamitri
+
+ * src/tag_render.cpp (1.24, rel-3-7-11):
+ (RenderV2): Added
+ (Render): Now calls either RenderV1 or RenderV2 based on second
+ parameter
+ (RenderV1ToHandle): Moved to tag_file.cpp
+ (RenderV2ToHandle): Moved to tag_file.cpp
+
+2000-07-05 Wednesday 00:32 eldamitri
+
+ * src/tag_parse_v1.cpp (1.10, rel-3-7-12, rel-3-7-11):
+ (ParseID3v1): New interface: now a stand-alone function, accepts a
+ ref to a tag object
+
+2000-07-05 Wednesday 00:24 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.3, rel-3-7-12, rel-3-7-11):
+ (ParseMusicMatch): New interface: now a stand-alone function,
+ accepts a ref to a tag object
+
+2000-07-05 Wednesday 00:21 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.18, rel-3-7-12, rel-3-7-11):
+ (ParseLyrics3): New interface: now a stand-alone function, accepts
+ a ref to a tag object
+ (ParseLyrics3v2): New interface: now a stand-alone function, accepts
+ a ref to a tag object
+
+2000-07-05 Wednesday 00:18 eldamitri
+
+ * src/tag_parse.cpp (1.22, rel-3-7-12, rel-3-7-11):
+ (ParseID3v2): Now a standalone function
+ (ParseFile): Renamed from ParseFromHandle, update for new changes to
+ interface
+
+2000-07-05 Wednesday 00:05 eldamitri
+
+ * src/tag_file.cpp (1.19, rel-3-7-11):
+ (Link): Updated for new changes to interface
+ (RenderV1ToHandle): Moved from tag_render.cpp, new interface
+ (RenderV2ToHandle): Moved from tag_render.cpp, new interface
+ (Update): Now updates __prepended_bytes, __appended_bytes
+ appropriately
+ (Strip): Updated for new changes to interface
+
+2000-07-04 Tuesday 23:54 eldamitri
+
+ * src/tag.cpp (1.23, rel-3-7-12, rel-3-7-11):
+ (ID3_Tag): Initialize file-related members
+ (Clear): Don't clear file-related members
+ (ID3_GetDataSize): Added implementation
+
+2000-07-04 Tuesday 23:44 eldamitri
+
+ * include/id3/tag.h (1.37, rel-3-7-11): Added ID3_GetDataSize(const
+ ID3_Tag&) function for calculating the size of the non-tag data in a
+ tag object (class ID3_Tag):
+ - RenderV1(uchar*) moved from public to protected
+ - Added GetPrependedBytes(), GetAppendedBytes(), GetFileSize(), and
+ GetFileName()
+ - __prepended_bytes and __appended_bytes renamed from
+ __starting_bytes and __ending_bytes, respectively
+ - Render() can now also accept an ID3_TagType as an optional second
+ parameter
+ - ParseFromHandle(FILE*) repaced with ParseFile()
+ - RenderV1ToHandle, RenderV2ToHandle, ParseID3v2, ParseID3v1,
+ ParseLyrics3*, and ParseMusicmatch methods removed
+ - RenderV2 protected method added
+
+2000-07-04 Tuesday 23:27 eldamitri
+
+ * include/id3/globals.h (1.31):
+ (ID3_V2Spec): Added ID3V2_4_0
+
+2000-07-04 Tuesday 04:48 eldamitri
+
+ * id3com/id3com.dsp (1.14), libprj/id3lib.dsp (1.10, rel-3-7-13),
+ prj/id3lib.dsp (1.11, rel-3-7-13) (utags: rel-3-7-11, rel-3-7-12):
+ Added tag_parse_musicmatch.cpp
+
+2000-07-04 Tuesday 04:46 eldamitri
+
+ * examples/test_remove.cpp (1.4, rel-3-7-11):
+ (main): Tests the ability to remove frames with NULL descriptions.
+
+2000-07-03 Monday 01:37 eldamitri
+
+ * include/id3.h (1.11), src/c_wrapper.cpp (1.9, rel-3-7-13) (utags:
+ rel-3-7-11, rel-3-7-12): New function: ID3Tag_HasTagType(const
+ ID3Tag*, ID3_TagType)
+
+2000-07-03 Monday 01:03 eldamitri
+
+ * include/id3/globals.h (1.30): Minor whitespace changes
+
+2000-07-01 Saturday 18:52 eldamitri
+
+ * src/misc_support.cpp (1.17, rel-3-7-11):
+ (ID3_AddTrack): Fixed bug that wasn't returning the frame added
+ (thanks Benedikt Roth)
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * src/tag_parse_v1.cpp (1.9):
+ (ParseID3v1): Now returns number of bytes parsed.
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.2):
+ (ParseMusicMatch): Now returns number of bytes parsed.
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.17):
+ (ParseLyrics3): Now returns number of bytes parsed. No longer
+ parses Lyrics3 v2.00 tags
+ (ParseLyrics3v2): Added implementation.
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * src/tag_parse.cpp (1.21):
+ (Parse): __file_tags no longer updated
+ (ParseID3v2): Added implementation
+ (ParseFromHandle): Now takes responsibility for setting
+ __starting_bytes, __ending_bytes, and __file_tags. Now finds all
+ (known) tag types attached to the file by iteratively looking for a
+ tag starting where the last known tag was found.
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * src/tag_file.cpp (1.18):
+ (Link): ParseFromHandle no longer returns a value, now accepts a
+ file handle
+ (Update): Now record the tags that have been updated in __file_tags
+ (Strip): If one appended tag type is stripped, they're all stripped.
+ Same for prepended tags
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * include/id3/tag.h (1.36): (class ID3_Tag): New interface for
+ protected Parse methods
+
+2000-07-01 Saturday 09:48 eldamitri
+
+ * include/id3/globals.h (1.29):
+ (ID3_TagTypes): Added LYRICS3, LYRICS3V2, PREPENDED, and APPENDED.
+ Deprecated LYRICS
+
+2000-07-01 Saturday 09:47 eldamitri
+
+ * examples/demo_convert.cpp (1.7, rel-3-7-12, rel-3-7-11):
+ (main): Minor type change
+
+2000-06-25 Sunday 20:12 eldamitri
+
+ * include/id3/globals.h (1.28):
+ (NULL_UNICODE): Defined using a #define so it will compile correctly
+ for C
+
+2000-06-25 Sunday 19:18 eldamitri
+
+ * examples/: demo_convert.cpp (1.6), demo_info.cpp (1.13,
+ rel-3-7-12, rel-3-7-11):
+ (main): Now links against all tags
+
+2000-06-25 Sunday 08:23 eldamitri
+
+ * src/utils.cpp (1.4, rel-3-7-12, rel-3-7-11): Added ID3_IsCRLF,
+ ID3_CRLFtoLF, ID3_TimeToSeconds, and RemoveTrailingSpaces to
+ utils.cpp
+
+2000-06-25 Sunday 08:22 eldamitri
+
+ * src/tag_parse_v1.cpp (1.8): Moved RemoveTrailingSpaces to
+ utils.cpp
+
+2000-06-25 Sunday 08:21 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.16): Moved ID3_IsCRLF and
+ ID3_CRLFtoLF to utils.cpp
+
+2000-06-25 Sunday 08:21 eldamitri
+
+ * src/tag_parse.cpp (1.20):
+ (ParseFromHandle): Added conditional call to ParseMusicMatch
+
+2000-06-25 Sunday 08:20 eldamitri
+
+ * src/tag.cpp (1.22):
+ (AttachFrame): Now simply returns without error if a NULL frame is
+ passed in.
+
+2000-06-25 Sunday 08:19 eldamitri
+
+ * include/id3/utils.h (1.7, rel-3-7-12, rel-3-7-11): Added decl's
+ for ID3_TimeToSeconds, ID3_IsCRLF, ID3_CRLFtoLF, and
+ RemoveTrailingSpaces functions.
+
+2000-06-25 Sunday 08:18 eldamitri
+
+ * include/id3/tag.h (1.35): (class ID3_Tag): Added decl for
+ ParseMusicMatch
+
+2000-06-25 Sunday 08:16 eldamitri
+
+ * include/id3/globals.h (1.27):
+ (ID3_TagType): Added ID3TT_MUSICMATCH
+
+2000-06-25 Sunday 08:15 eldamitri
+
+ * src/Makefile.am (1.14, rel-3-7-13, rel-3-7-12, rel-3-7-11):
+ (id3lib_sources): Added tag_parse_musicmatch.cpp
+
+2000-06-25 Sunday 08:14 eldamitri
+
+ * src/tag_parse_musicmatch.cpp (1.1): Initial revision
+
+2000-06-24 Saturday 03:11 eldamitri
+
+ * examples/README.txt (1.1, rel-3-7-8, rel-3-7-7, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11): Initial revision
+
+2000-06-23 Friday 19:24 adcockj
+
+ * libprj/: .cvsignore (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11),
+ id3lib.dsp (1.9), id3lib.dsw (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11) (utags: rel-3-7-10): Debug library now ib3libD.lib
+
+2000-06-23 Friday 19:24 adcockj
+
+ * prj/: .cvsignore (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11),
+ id3lib.dsp (1.10) (utags: rel-3-7-10): Changed project for changes
+ to zlib
+
+2000-06-23 Friday 19:23 adcockj
+
+ * zlib/prj/zlib.dsp (1.5, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10): Changed debug lib to zlibD.lib
+
+2000-06-23 Friday 19:22 adcockj
+
+ * id3com/: .cvsignore (1.5, rel-3-7-13, rel-3-7-12, rel-3-7-11),
+ id3com.dsp (1.13), id3com.dsw (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11) (utags: rel-3-7-10): Updated project files for zlib
+
+2000-06-23 Friday 18:58 eldamitri
+
+ * NEWS (1.18, rel-3-7-8, rel-3-7-10): Updated with new changes for
+ 3.7.10.
+
+2000-06-23 Friday 18:34 eldamitri
+
+ * examples/test_remove.cpp (1.3, rel-3-7-10):
+ (main): Now removes all frames to test rendering a frame-less tag.
+
+2000-06-23 Friday 18:33 eldamitri
+
+ * src/tag_render.cpp (1.23, rel-3-7-10):
+ (RenderV2ToHandle): If the size of the v2 tag is 0, or there is
+ nothing to Render, then it now behaves just like Strip(ID3TT_ID3V2)
+
+2000-06-23 Friday 17:52 eldamitri
+
+ * examples/Makefile.am (1.12, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (check_PROGRAMS): Added 'findstr'
+
+2000-06-23 Friday 17:52 eldamitri
+
+ * examples/findstr.cpp (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10): Initial revision.
+
+2000-06-23 Friday 17:51 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.15, rel-3-7-10):
+ (ParseLyrics3): Fixed seek value calculation which was giving
+ warnings when compiling under windows.
+
+2000-06-23 Friday 17:49 eldamitri
+
+ * src/tag_find.cpp (1.14, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (Find): Fixed bug which prevented empty strings from being found.
+
+2000-06-23 Friday 07:05 eldamitri
+
+ * examples/230-syncedlyrics.tag (1.2, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10): Updated based on new conversion rules for
+ lyrics3 v2.00
+
+2000-06-23 Friday 06:22 eldamitri
+
+ * NEWS (1.17), THANKS (1.11, rel-3-7-10), configure.in (1.39,
+ rel-3-7-10), id3lib.spec.in (1.16, rel-3-7-10): Updated for 3.7.10
+ release
+
+2000-06-23 Friday 06:00 eldamitri
+
+ * examples/Makefile.am (1.11): Added id3cp and testremove
+
+2000-06-23 Friday 05:55 eldamitri
+
+ * src/tag_file.cpp (1.17, rel-3-7-10):
+ (Link): Reinitializes all file-related member variables when a new
+ file is linked to.
+
+2000-06-23 Friday 05:53 eldamitri
+
+ * examples/: demo_copy.cpp (1.1), ozzy.tag (1.1, rel-3-7-13),
+ thatspot.tag (1.1, rel-3-7-13, rel-3-7-13) (utags: rel-3-7-10,
+ rel-3-7-11, rel-3-7-12): Initial revision.
+
+2000-06-23 Friday 04:50 eldamitri
+
+ * Makefile.am (1.21, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (release): Converts dsw and dsp files to dos format for windows
+ release
+
+2000-06-23 Friday 02:43 eldamitri
+
+ * examples/230-unicode.tag (1.4, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10): The BOMs were incorrect. Now they're
+ correct.
+
+2000-06-23 Friday 02:37 eldamitri
+
+ * src/field_string_unicode.cpp (1.17, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10):
+ (ParseUnicodeString): Updated with definitive comment on the role
+ and value of the BOM. Fixed bug that was swapping byte-order when
+ it shouldn't, and not swapping when it should.
+ (RenderUnicodeString): Renders the BOM correctly now.
+
+2000-06-23 Friday 02:33 eldamitri
+
+ * examples/: test_compression.cpp (1.4, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), test_pic.cpp (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), test_remove.cpp (1.2), test_unicode.cpp
+ (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (main): Remove the call to Update() - it's unnecessary.
+
+2000-06-23 Friday 01:22 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.14):
+ (ParseLyrics3):
+ - Makes use of newly defined AddLyrics and AddSyncLyrics functions
+ in misc_support
+ - INF field converts to COMM frame, not as the description field for
+ SYLT
+
+2000-06-23 Friday 01:19 eldamitri
+
+ * src/misc_support.cpp (1.16, rel-3-7-10):
+ (ID3_GetString): Catch block now catches an ID3_Error instead of an
+ ID3_Err
+ (ID3_AddComment): Added several new implementations, varying based
+ on their parameters. Description now defaults to "", language
+ defaults to "XXX" (for unknown)
+ (ID3_AddLyrics): Added several new implementations, varying based on
+ their parameters. Description now defaults to "", language defaults
+ to "XXX" (for unknown)
+ (ID3_AddSyncLyrics): Added several new implementations, varying on
+ their parameters. Description now defaults to "", language defaults
+ to "XXX" (for unknown), content type defaults to LYRICS. Base
+ function's parameters reordered to be consistent with other
+ functions.
+
+2000-06-23 Friday 01:05 eldamitri
+
+ * include/id3/misc_support.h (1.19, rel-3-7-11, rel-3-7-10): Added
+ new declarations for ID3_AddComment, ID3_AddLyrics, and
+ ID3_AddSyncLyrics
+
+2000-06-22 Thursday 23:21 eldamitri
+
+ * examples/: 230-syncedlyrics.tag (1.1), example.lyr (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10): Initial revision
+
+2000-06-22 Thursday 23:11 eldamitri
+
+ * src/error.cpp (1.8, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (ID3_Error): Use strdup rather than strlen + new + strncpy
+ (~ID3_Error): Use array delete to free memory
+
+2000-06-22 Thursday 23:02 eldamitri
+
+ * include/id3/error.h (1.13, rel-3-7-8, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10): (class ID3_Error):
+ - All methods return char strings now return const char strings
+ - Added default constructor
+
+2000-06-22 Thursday 22:20 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.13):
+ (ID3_IsCRLF): Added
+ (ID3_IsTimeStamp): Added
+ (ID3_CRLFtoLF): Now uses ID3_IsCRLF
+ (ID3_StripTimeStamps): Now uses ID3_IsTimeStamp
+ (ID3_Lyrics3ToSylt): New implementation using ID3_IsTimeStamp
+ (ParseLyrics3): Massive clean-up of implementation
+
+2000-06-22 Thursday 22:16 eldamitri
+
+ * src/misc_support.cpp (1.15):
+ (ID3_AddSyncLyrics): Added initialization of time stamp format.
+
+2000-06-22 Thursday 22:11 eldamitri
+
+ * src/frame.cpp (1.22, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (ID3_Frame): Initialize spec in construcotr.
+
+2000-06-22 Thursday 22:09 eldamitri
+
+ * include/id3/header.h (1.14, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (class ID3_Header): Initialized spec in constructor.
+
+2000-06-22 Thursday 21:31 adcockj
+
+ * src/error.cpp (1.7), src/uint28.cpp (1.5, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), include/id3/error.h (1.12), include/id3/uint28.h (1.5,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10): Fixed ID3_Error memory Leak
+ and windows compiler incompatibilty with uint28
+
+2000-06-21 Wednesday 05:30 eldamitri
+
+ * examples/test_remove.cpp (1.1): Initial revision.
+
+2000-06-21 Wednesday 05:27 eldamitri
+
+ * src/tag.cpp (1.21, rel-3-7-10):
+ (RemoveFrame): Now marks tag as being changed when a frame is
+ removed, which was preventing tags from being updated correctly
+
+2000-06-20 Tuesday 18:06 eldamitri
+
+ * src/misc_support.cpp (1.14): Cleaned up memory leaks from
+ removing frames
+
+2000-06-14 Wednesday 18:43 eldamitri
+
+ * src/uint28.cpp (1.4):
+ - Added new documentation
+ - Made constructors 'explicit'
+ - Defined new class constants BITSUSED, MINVAL, and MAXVAL
+ - New implementation for default constructor
+ - Destructor is now virtual
+ - Assigning a uint32 that is greater than the largest possible value
+ maximizes the internal value, rather than masking it
+ - Implementation of operator=(const char*) moved to Parse(const char
+ *)
+ - Render now returns number of characters rendered
+ - Removed unnecessary inclusion of string.h
+ - Cleaned up implementation of Parse(), Render(), operator<<, and
+ operator>>
+
+2000-06-14 Wednesday 18:41 eldamitri
+
+ * src/header_frame.cpp (1.10, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (SetUnknownFrame): Minor bugfixes in copying frame text id and
+ description
+
+2000-06-14 Wednesday 18:39 eldamitri
+
+ * src/frame_parse.cpp (1.16, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ * src/frame.cpp: Minor updates
+
+2000-06-14 Wednesday 18:38 eldamitri
+
+ * src/frame.cpp (1.21): Minor updates
+
+2000-06-14 Wednesday 18:37 eldamitri
+
+ * src/field.cpp (1.25, rel-3-7-11, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10):
+ (ID3FD_Unimplemented): Added { ID3FN_NOFIELD } entry to mark the end
+ (ID3_FindFrameDef): Removed const qualifer from parameter
+
+2000-06-14 Wednesday 18:24 eldamitri
+
+ * include/id3/uint28.h (1.4): (class uint28):
+ - Added new documentation
+ - Made constructors 'explicit'
+ - Defined new class constants BITSUSED, MINVAL, and MAXVAL
+ - New implementation for default constructor
+ - Destructor is now virtual
+ - Assigning a uint32 that is greater than the largest possible value
+ maximizes the internal value, rather than masking it
+ - Implementation of operator=(const char*) moved to Parse(const char
+ *)
+ - Render now returns number of characters rendered
+
+2000-06-14 Wednesday 18:14 eldamitri
+
+ * include/id3/frame.h (1.28, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (class ID3_Frame): Added decl and def for GetTextID()
+
+2000-06-14 Wednesday 18:13 eldamitri
+
+ * include/id3/field.h (1.30, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ Made FieldDef pointer const in FrameDef struct, and removed const
+ from FindFrameDef param
+
+2000-06-14 Wednesday 18:11 eldamitri
+
+ * examples/demo_info.cpp (1.12, rel-3-7-10):
+ (PrintInformation): Changed output to disply 4-char id and
+ description in parentheses.
+
+2000-06-10 Saturday 18:11 adcockj
+
+ * id3com/Sample/.cvsignore (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10): Initial Version
+
+2000-06-10 Saturday 18:09 adcockj
+
+ * .cvsignore (1.12), config.win32 (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/.cvsignore (1.4), id3com/ID3Tag.cpp
+ (1.9, rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/ID3Tag.h (1.7,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/id3com.dsp (1.12),
+ id3com/id3com.idl (1.9, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ id3com/Sample/ID3Test.vbp (1.5, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/Sample/ID3Test.vbw (1.6, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/Sample/frmID3Test.frm (1.6,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10), src/c_wrapper.cpp
+ (1.8, rel-3-7-10), src/tag_parse.cpp (1.19, rel-3-7-10),
+ src/tag_parse_lyrics3.cpp (1.12), src/tag_render.cpp (1.22),
+ zlib/.cvsignore (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), zlib/prj/.cvsignore (1.4, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10): Fixed Problem with HasV2Tag added
+ VersionString to id3com
+
+2000-06-08 Thursday 09:01 adcockj
+
+ * delphi/ID3COM_TLB.pas (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), delphi/Unit1.pas (1.2, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), delphi/id3com.cfg (1.2, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), delphi/id3com.dof (1.2,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10), delphi/id3com.dpr
+ (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ delphi/readme.txt (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/EnumFields.cpp (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/EnumFields.h (1.5, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/ID3COM.def (1.4,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/ID3COM.rc
+ (1.4, rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/ID3COMps.def
+ (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ id3com/ID3COMps.mk (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/ID3Field.cpp (1.5, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/ID3Field.h (1.7, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/ID3Field.rgs (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/ID3Frame.cpp (1.8, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/ID3Frame.h (1.7, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), id3com/ID3Frame.rgs (1.5, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/ID3Tag.cpp (1.8),
+ id3com/ID3Tag.h (1.6), id3com/ID3Tag.rgs (1.5, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/Makefile.am (1.5,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/StdAfx.cpp
+ (1.5, rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/StdAfx.h (1.5,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/dlldata.c (1.4,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ id3com/frmID3Test.frm (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/id3com.cpp (1.6, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), id3com/id3com.dsp (1.11), id3com/id3com.dsw (1.4),
+ id3com/id3com.idl (1.8), id3com/mssccprj.scc (1.4, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/resource.h (1.4,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), id3com/Sample/ID3Test.vbp
+ (1.4), id3com/Sample/ID3Test.vbw (1.5), id3com/Sample/MSSCCPRJ.SCC
+ (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ id3com/Sample/frmID3Test.frm (1.5), libprj/id3lib.dsp (1.8),
+ libprj/id3lib.dsw (1.4), prj/id3lib.dsp (1.9, rel-3-7-13),
+ prj/id3lib.dsw (1.5, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), prj/id3lib.mak (1.5, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), zlib/prj/zlib.dsp (1.4), zlib/prj/zlib.dsw
+ (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10),
+ zlib/prj/zlib.mak (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10): Hopefully got rid of DOS/Unix file compatability All
+ text files orginally from DOS/windows have been changed to try and
+ remove extra cr
+
+2000-06-06 Tuesday 16:21 eldamitri
+
+ * id3com/EnumFields.cpp (1.4), id3com/EnumFields.h (1.4),
+ id3com/ID3COM.def (1.3), id3com/ID3COM.rc (1.3),
+ id3com/ID3COMps.def (1.3), id3com/ID3COMps.mk (1.3),
+ id3com/ID3Field.cpp (1.4), id3com/ID3Field.h (1.6),
+ id3com/ID3Field.rgs (1.4), id3com/ID3Frame.cpp (1.7),
+ id3com/ID3Frame.h (1.6), id3com/ID3Frame.rgs (1.4),
+ id3com/ID3Tag.cpp (1.7), id3com/ID3Tag.h (1.5), id3com/ID3Tag.rgs
+ (1.4), id3com/Makefile.am (1.4), id3com/StdAfx.cpp (1.4),
+ id3com/StdAfx.h (1.4), id3com/dlldata.c (1.3),
+ id3com/frmID3Test.frm (1.3), id3com/id3com.cpp (1.5),
+ id3com/id3com.dsp (1.10), id3com/id3com.dsw (1.3),
+ id3com/id3com.idl (1.7), id3com/mssccprj.scc (1.3),
+ id3com/resource.h (1.3), id3com/Sample/ID3Test.vbp (1.3),
+ id3com/Sample/ID3Test.vbw (1.4), id3com/Sample/MSSCCPRJ.SCC (1.3),
+ id3com/Sample/frmID3Test.frm (1.4), libprj/Makefile.am (1.2,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), libprj/id3lib.dsp (1.7), libprj/id3lib.dsw
+ (1.3), prj/Makefile.am (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10): Somehow they lost their
+ dos-ness. Converted back to DOS newlines.
+
+2000-06-06 Tuesday 14:23 eldamitri
+
+ * src/tag.cpp (1.20): Minor updates to documentation
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/frame_render.cpp (1.12, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ (Render): Now returns 0 and renders nothing if either there aren't
+ any fields or rendering the fields results in nothing rendered
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/frame.cpp (1.20):
+ - Moved documentation from header file
+ - Minor code changes
+ - GetID() implementation moved to header file
+ - _FindField implementation removed
+ - Field implementation updated with code from _FindField
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/field_string_unicode.cpp (1.16):
+ - Moved documentation from header file
+ - operator=(const unicode_t*) implementation moved to header file
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/field_string_ascii.cpp (1.13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10):
+ - Moved documentation from header file
+ - operator=(const char*) implementation moved to header file
+ - Minor code changes
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/field_integer.cpp (1.9, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ - Moved documentation from header file
+ - operator=(uint32) and Get() implementations moved to header file
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/field_binary.cpp (1.11, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ - Moved documentation from header file
+ - Minor code changes
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * src/field.cpp (1.24):
+ - Moved documentation from header file
+ - Size() implementation moved to header file
+
+2000-06-06 Tuesday 14:22 eldamitri
+
+ * include/id3/tag.h (1.34, rel-3-7-10): Minor whitespace changes
+
+2000-06-06 Tuesday 14:21 eldamitri
+
+ * include/id3/frame.h (1.27): (class ID3_Frame):
+ - Moved most documentation to cpp files
+ - GetID() definition now inlined in the class
+ - _FindField() removed
+
+2000-06-06 Tuesday 14:21 eldamitri
+
+ * include/id3/field.h (1.29): (class ID3_Field):
+ - Moved most documentation to cpp files
+ - ID3_Tag is no longer a friend
+ - Size, Get(uint32), and operator= definitions now inlined in the
+ class
+
+2000-06-06 Tuesday 04:04 eldamitri
+
+ * config.h.win32.in (1.5, rel-3-7-12, rel-3-7-11, rel-3-7-10):
+ Apparently VC++ 6.0 has buggy for loops
+
+2000-06-05 Monday 21:14 adcockj
+
+ * id3com/.cvsignore (1.3): Added some extra files to .cvsignore in
+ id3com
+
+2000-06-04 Sunday 17:13 adcockj
+
+ * id3com/EnumFields.cpp (1.3), id3com/EnumFields.h (1.3),
+ id3com/ID3COM.def (1.2), id3com/ID3COM.rc (1.2),
+ id3com/ID3COMps.def (1.2), id3com/ID3COMps.mk (1.2),
+ id3com/ID3Field.cpp (1.3), id3com/ID3Field.h (1.5),
+ id3com/ID3Field.rgs (1.3), id3com/ID3Frame.cpp (1.6),
+ id3com/ID3Frame.h (1.5), id3com/ID3Frame.rgs (1.3),
+ id3com/ID3Tag.cpp (1.6), id3com/ID3Tag.h (1.4), id3com/ID3Tag.rgs
+ (1.3), id3com/StdAfx.cpp (1.3), id3com/StdAfx.h (1.3),
+ id3com/dlldata.c (1.2), id3com/frmID3Test.frm (1.2),
+ id3com/id3com.cpp (1.4), id3com/id3com.dsp (1.9), id3com/id3com.dsw
+ (1.2), id3com/id3com.idl (1.6), id3com/mssccprj.scc (1.2),
+ id3com/resource.h (1.2), id3com/Sample/ID3Test.vbp (1.2),
+ id3com/Sample/ID3Test.vbw (1.3), id3com/Sample/MSSCCPRJ.SCC (1.2),
+ id3com/Sample/frmID3Test.frm (1.3), libprj/id3lib.dsp (1.6),
+ libprj/id3lib.dsw (1.2): Removed extra cr at the end of all lines
+ in windows code caused by checking in windows code from linux
+
+2000-05-29 Monday 18:06 eldamitri
+
+ * examples/findeng.cpp (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10): Initial revision
+
+2000-05-29 Monday 18:04 eldamitri
+
+ * examples/Makefile.am (1.10):
+ (check_PROGRAMS): Added findeng
+
+2000-05-29 Monday 18:03 eldamitri
+
+ * id3lib.spec.in (1.15): Fixed the date format, even though my way
+ is better...
+
+2000-05-29 Monday 18:00 eldamitri
+
+ * config.h.win32.in (1.4, rel-3-7-12): Apparently VC++ 6.0 has
+ buggy for loops
+
+2000-05-29 Monday 17:59 eldamitri
+
+ * src/frame.cpp (1.19):
+ (_ClearFields): Minor fix to for loop variable to allow compilation
+ in compilers with buggy for loops
+
+2000-05-29 Monday 17:58 eldamitri
+
+ * src/tag_find.cpp (1.13):
+ (Find): Fix for finding strings w/o their own null terminator
+
+2000-05-29 Monday 08:57 eldamitri
+
+ * NEWS (1.16, rel-3-7-7, rel-3-7-9): Further updates for 3.7.9
+ release (hopefully this is it!)
+
+2000-05-29 Monday 08:55 eldamitri
+
+ * zlib/src/Makefile.am (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9): Updated to compile cleanly on a
+
+ (Unix-like) system that needs it
+
+2000-05-29 Monday 08:54 eldamitri
+
+ * src/tag_file.cpp (1.16, rel-3-7-9): Moved inclusion of "tag.h" to
+ after other includes to compile correctly on Solaris (hack!)
+
+2000-05-29 Monday 08:53 eldamitri
+
+ * src/field_string_unicode.cpp (1.15, rel-3-7-9):
+ (RenderUnicodeString): Minor updates (needs major updates to compile
+ and work on all platforms!)
+
+2000-05-29 Monday 08:52 eldamitri
+
+ * src/Makefile.am (1.13, rel-3-7-10, rel-3-7-9):
+ (LDADD): Now conditionally includes distributions zlib if not
+ already in environment
+
+2000-05-29 Monday 08:51 eldamitri
+
+ * include/id3/globals.h (1.25, rel-3-7-9): So it will compile on
+ Solaris, changed index_t typedef into #define
+
+2000-05-29 Monday 08:49 eldamitri
+
+ * examples/: test_compression.cpp (1.3), test_pic.cpp (1.4),
+ test_unicode.cpp (1.2) (utags: rel-3-7-9): Removed inclusion of
+ unnecessary header files
+
+2000-05-29 Monday 08:47 eldamitri
+
+ * configure.in (1.38, rel-3-7-9): Changed AC_SIZE_T to
+ AC_TYPE_SIZE_T
+
+2000-05-29 Monday 04:52 eldamitri
+
+ * examples/get_pic.cpp (1.2, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9):
+ (main): Removed debugging output, added better regular output
+
+2000-05-29 Monday 04:48 eldamitri
+
+ * src/field.cpp (1.23, rel-3-7-9):
+ (BinSize): Minor bugfix for rendering non-unicode textstrings
+
+2000-05-29 Monday 04:44 eldamitri
+
+ * examples/test_compression.cpp (1.2):
+ (main): Removed debugging output
+
+2000-05-29 Monday 04:23 eldamitri
+
+ * examples/: 230-compressed.tag (1.3, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), 230-picture.tag (1.3, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10), 230-unicode.tag (1.3) (utags: rel-3-7-9):
+ Removed the experimental flag from the tag headers and the file
+ alter preservation flag from the frame headers
+
+2000-05-29 Monday 04:20 eldamitri
+
+ * examples/Makefile.am (1.8):
+ (check_PROGRAMS): Added testunicode and testcompression
+
+2000-05-29 Monday 04:19 eldamitri
+
+ * examples/: demo_convert.cpp (1.5, rel-3-7-10), demo_info.cpp
+ (1.11), demo_tag.cpp (1.6, rel-3-7-12, rel-3-7-11, rel-3-7-10)
+ (utags: rel-3-7-9): argc is now unsigned to prevent compiler
+ warning
+
+2000-05-29 Monday 04:18 eldamitri
+
+ * examples/: test_compression.cpp (1.1), test_unicode.cpp (1.1):
+ Initial revision
+
+2000-05-29 Monday 04:13 eldamitri
+
+ * include/id3/frame.h (1.26, rel-3-7-9): (class ID3_Frame): Removed
+ _UpdateStringTypes decl
+
+2000-05-29 Monday 04:11 eldamitri
+
+ * src/frame.cpp (1.18, rel-3-7-9): Removed _UpdateStringTypes
+ implementation (no longer needed)
+ (Size): Updated to not use _UpdateStringTypes (operator=): Fixed to
+ now extract complete info from copied frame
+
+2000-05-29 Monday 04:01 eldamitri
+
+ * src/field_string_unicode.cpp (1.14):
+ (RenderUnicodeString): Changed the byte order for rendering the BOM
+ (this is unlikely to be the right solution, though---the unicode
+ support needs to be much better than this!)
+
+2000-05-29 Monday 04:00 eldamitri
+
+ * src/field.cpp (1.22):
+ (BinSize): Fixed bug that was reporting the wrong binary size for
+ unicode strings
+
+2000-05-29 Monday 03:57 eldamitri
+
+ * include/id3/header_frame.h (1.13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9): (class ID3_FrameHeader): Minor code
+ reformatting
+
+2000-05-29 Monday 01:26 eldamitri
+
+ * src/tag_sync.cpp (1.6, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9):
+ (ID3_ReSync): Fixed a bug in ReSync'ing that caused it to improperly
+ handle the last character
+ (ID3_ShouldUnsync): Fixed a bug with recognizing sync signals
+
+2000-05-29 Monday 01:25 eldamitri
+
+ * src/tag_render.cpp (1.21, rel-3-7-9):
+ (Render): Now returns 0 with NULL buffer rather than throw,
+
+2000-05-29 Monday 01:08 eldamitri
+
+ * src/tag_parse.cpp (1.18, rel-3-7-9):
+ (Parse): No longer saves the return value of ParseFrames to prevent
+ compiler warnings
+
+2000-05-29 Monday 01:07 eldamitri
+
+ * src/tag.cpp (1.19, rel-3-7-9):
+ (ID3_Tag): Reorganized member variable initialization to avoid
+ compiler warnings
+
+2000-05-29 Monday 01:03 eldamitri
+
+ * src/misc_support.cpp (1.13, rel-3-7-9):
+ (ID3_AddTrack): Changed size_t's to luints to prevent comiler
+ warnings
+ (ID3_AddGenre): Changed size_t's to luints to prevent comiler
+ warnings
+
+2000-05-29 Monday 00:56 eldamitri
+
+ * src/frame.cpp (1.17):
+ (ID3_Frame): Reorganized member variable initialization to avoid
+ compiler warnings
+
+2000-05-29 Monday 00:55 eldamitri
+
+ * src/field_string_unicode.cpp (1.13):
+ (ParseUnicodeString): Removed unnecessary cast
+
+2000-05-29 Monday 00:54 eldamitri
+
+ * src/field.cpp (1.21):
+ (ID3_Field): Reorganized member variable initialization to avoid
+ compiler warnings (operator=): Added default clause to prevent
+ compiler warning
+
+2000-05-29 Monday 00:08 eldamitri
+
+ * include/id3/tag.h (1.33, rel-3-7-9): Added GetUnsync()
+
+2000-05-29 Monday 00:07 eldamitri
+
+ * examples/test_pic.cpp (1.3):
+ (main): Now includes actual picture data, unsyncs tag
+
+2000-05-29 Monday 00:03 eldamitri
+
+ * examples/get_pic.cpp (1.1): Initial revision.
+
+2000-05-28 Sunday 23:59 eldamitri
+
+ * examples/composer.jpg (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9): Added. Initial revision.
+
+2000-05-28 Sunday 23:57 eldamitri
+
+ * examples/Makefile.am (1.7, rel-3-7-9):
+ (check_PROGRAMS): Added get_pic
+
+2000-05-28 Sunday 07:07 eldamitri
+
+ * src/tag_render.cpp (1.20):
+ (RenderFrames): Added so that frames are rendered in correct order
+ (Render): Doesn't render if there aren't any frames, makes use of
+ new RenderFrames function
+ (Size): Size is 0 if there aren't any frames
+
+2000-05-28 Sunday 07:02 eldamitri
+
+ * src/header_tag.cpp (1.12, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9):
+ (Render): Now always renders the latest version of the spec
+
+2000-05-28 Sunday 07:00 eldamitri
+
+ * examples/test_pic.cpp (1.2):
+ (main): uncommented the frame additions
+
+2000-05-28 Sunday 05:51 eldamitri
+
+ * examples/test_pic.cpp (1.1): Added.
+
+2000-05-28 Sunday 05:49 eldamitri
+
+ * examples/Makefile.am (1.6):
+ (check_PROGRAMS): Added testpic
+
+2000-05-28 Sunday 05:48 eldamitri
+
+ * src/tag_find.cpp (1.12, rel-3-7-9):
+ (Find): Changed luint to size_t
+
+2000-05-28 Sunday 05:47 eldamitri
+
+ * src/tag_file.cpp (1.15):
+ (Link): If Linking to a tag that's already Linked, simply close the
+ current file and link to the new one
+ (Strip): Only Strips id3v2 if __starting_bytes > 0
+
+2000-05-28 Sunday 05:44 eldamitri
+
+ * src/tag.cpp (1.18):
+ (Clear): No longer removes file name.
+
+2000-05-28 Sunday 05:43 eldamitri
+
+ * src/frame_render.cpp (1.11, rel-3-7-9):
+ (Render): Removed dangling semicolon, fixed call to Render
+
+2000-05-28 Sunday 05:42 eldamitri
+
+ * src/frame.cpp (1.16):
+ (_ClearFields): Clears bitset field rather than deleting it.
+
+2000-05-28 Sunday 05:40 eldamitri
+
+ * src/: field_binary.cpp (1.10, rel-3-7-9), field_string_ascii.cpp
+ (1.12, rel-3-7-9), field_string_unicode.cpp (1.12): All Get()
+ methods now const
+
+2000-05-28 Sunday 05:39 eldamitri
+
+ * include/id3/field.h (1.28, rel-3-7-9): (class ID3_Field): All
+ Get() methods now const
+
+2000-05-28 Sunday 05:30 eldamitri
+
+ * include/id3.h (1.10, rel-3-7-10), src/c_wrapper.cpp (1.7) (utags:
+ rel-3-7-9):
+ - ID3Tag_RemoveFrame returns a pointer to the frame removed
+ - ID3Tag_UpdateByTagType's 2nd parameter is no longer const
+ - luint was replaced with size_t, index_t, flags_t, or uint32
+ - The following functions were updated with const parameters:
+ ID3Tag_HasChanged, ID3Tag_AddFrame, ID3Tag_AddFrames,
+ ID3_RemoveFrame, ID3Tag_Parse, ID3Tag_Link, ID3Tag_Strip,
+ ID3Tag_Find*, ID3Tag_GetFrameNum, ID3Frame_GetID, ID3Frame_GetField,
+ ID3Frame_GetCompression, ID3Field_Size, ID3Field_GetNumTextItems,
+ ID3Field_SetINT, ID3Field_*UNICODE, ID3Field_*ASCII, ID3Field_*File
+
+2000-05-28 Sunday 05:17 eldamitri
+
+ * id3com/: ID3Field.h (1.4), ID3Tag.cpp (1.5), id3com.cpp (1.3),
+ id3com.idl (1.5) (utags: rel-3-7-9): Bugfixes (thanks John Adcock)
+
+2000-05-24 Wednesday 05:03 eldamitri
+
+ * NEWS (1.15), THANKS (1.10, rel-3-7-9), configure.in (1.37,
+ rel-3-7-13, rel-3-7-12), id3lib.spec.in (1.14, rel-3-7-9): Updated
+ for 3.7.9 release
+
+2000-05-24 Wednesday 05:02 eldamitri
+
+ * Makefile.am (1.20, rel-3-7-9):
+ (docs-release): Adds NEWS(.txt) and ChangeLog(.txt) to the docs
+ release
+
+2000-05-23 Tuesday 17:45 eldamitri
+
+ * examples/demo_tag.cpp (1.5):
+ (main): Minor structural changes
+
+2000-05-23 Tuesday 17:42 eldamitri
+
+ * Makefile.am (1.19):
+ (release): win build now copies over delphi directory
+
+2000-05-23 Tuesday 17:41 eldamitri
+
+ * include/id3/frame.h (1.25): (class ID3_Frame): Render is now
+ const (again). Added comments to SetCompression() and
+ GetCompression() to indicate their limitations. Added protected
+ methods for getting and setting the grouping and encryption id's.
+ __encryption_id and __grouping_id are now just single chars, rather
+ than actual buffers.
+
+2000-05-23 Tuesday 17:30 eldamitri
+
+ * include/id3/globals.h (1.24): Made inclusion of iostream.h
+ dependant on a c++ compiler
+
+2000-05-23 Tuesday 17:29 eldamitri
+
+ * include/id3/header_frame.h (1.12): (class ID3_FrameHeader):
+ Removed methods GetExtrasSize(), SetExpandedSize(), GetExpandedSize,
+ SetEncryptionID(), GetEncryptionID(), SetGroupingID,
+ GetGroupingID(), since it was determined that these issues lie
+ outside the domain of the frame header.
+
+2000-05-23 Tuesday 17:27 eldamitri
+
+ * src/frame.cpp (1.15): Updated to reflect changes in
+ __encryption_id and __grouping_id from char buffs to chars.
+
+2000-05-23 Tuesday 17:26 eldamitri
+
+ * src/frame_parse.cpp (1.15, rel-3-7-9):
+ (Parse): Added parsing of "extra" information from frame header to
+ here so that the domain of the frame and frame header are more
+ clearly (and cleanly) defined.
+
+2000-05-23 Tuesday 17:24 eldamitri
+
+ * src/frame_render.cpp (1.10):
+ (Render): Rewritten to make its operation easier to understand and
+ to make it a const method. Also added extensive comments to explain
+ reason for its somewhat convoluted implementation.
+
+2000-05-23 Tuesday 17:22 eldamitri
+
+ * src/header_frame.cpp (1.9, rel-3-7-9):
+ (Parse): Now only responsible for parsing header proper, and not any
+ "extra" info in the data that is a result of the various flags being
+ set (encryiption id, grouping id, and decompressed frame size).
+
+2000-05-23 Tuesday 17:20 eldamitri
+
+ * src/tag_file.cpp (1.14):
+ (Update): Added call to CloseFile so that the file isn't left open
+ when Update exits.
+
+2000-05-23 Tuesday 17:19 eldamitri
+
+ * src/tag_render.cpp (1.19):
+ (RenderV1ToHandle): Put in a throw in wehn file handle is null.
+ (RenderV2ToHandle): Added a call to reopen new file for writing
+ after writing out v2 under linux so that the file handle isn't null
+ after leaving this function.
+
+2000-05-22 Monday 21:21 eldamitri
+
+ * delphi/: ID3COM_TLB.dcu (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10), ID3COM_TLB.pas (1.1), Unit1.dcu (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), Unit1.dfm (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10), Unit1.pas (1.1), id3com.cfg
+ (1.1), id3com.dof (1.1), id3com.dpr (1.1), id3com.res (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10), readme.txt (1.1)
+ (utags: rel-3-7-9): Added. Provided by Michael Little <mike at
+ netlinear dot com>.
+
+2000-05-22 Monday 21:02 eldamitri
+
+ * src/frame_parse.cpp (1.14):
+ (Parse): Fixed bug that wasn't dealing with compressed frames
+ correctly
+
+2000-05-22 Monday 20:58 eldamitri
+
+ * src/header_frame.cpp (1.8):
+ (SetUnknownFrame): Minor change to return if allocation fails
+
+2000-05-15 Monday 18:38 eldamitri
+
+ * src/misc_support.cpp (1.12): Replaced all frame->SetID() calls
+ with constructor calls that pass in the appropriate ID.
+
+2000-05-12 Friday 23:15 eldamitri
+
+ * include/id3/field.h (1.27):
+ - Updated luint parameter, return type with more descriptive type
+ name (either size_t, index_t, or flags_t)
+ - (struct ID3_FrameDef): Removed lPriority and parseHandler fields
+
+2000-05-12 Friday 23:12 eldamitri
+
+ * include/id3/tag.h (1.32, rel-3-7-12, rel-3-7-11):
+ - CreateFile now returns an ID3_Err
+ - ID3_IsTagHeader now returns an int32
+
+2000-05-12 Friday 23:09 eldamitri
+
+ * src/field.cpp (1.20):
+ - Removed priorities and parse handler func pointers from frame def
+ entries
+ - Updated luint parameter, return type with more descriptive type
+ name (either size_t, index_t, or flags_t)
+
+2000-05-12 Friday 23:09 eldamitri
+
+ * src/frame_render.cpp (1.9):
+ (Render):
+ - Updated luint parameter, return type with more descriptive type
+ name (either size_t, index_t, or flags_t)
+ - No longer calls UpdateStringTypes, instead iterates through the
+ fields, setting the encoding for each depending on the value of the
+ ENCODING field.
+
+2000-05-12 Friday 23:09 eldamitri
+
+ * src/header_frame.cpp (1.7):
+ (SetUnknownFrame): parseHandler no longer a member of FrameDef
+ (operator=): parseHandler no longer a member of FrameDef
+
+2000-05-12 Friday 23:09 eldamitri
+
+ * src/: header_tag.cpp (1.11), header.cpp (1.8, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9):
+ (SetSpec): Parameter no longer const
+
+2000-05-12 Friday 23:08 eldamitri
+
+ * src/tag.cpp (1.17):
+ (ID3_IsTagHeader): Return an int32 rather than an lsint
+ (Clear): Now sets the header's spec to the latest version
+
+2000-05-12 Friday 23:08 eldamitri
+
+ * src/tag_file.cpp (1.13):
+ (exists): Returns 'false' rather than throwing
+ (CreateFile): Returns the error encountered rather than throwing
+ (OpenFileForWriting): Returns the error rather than throwing.
+ (OpenFileForReading): Returns the error rather than throwing.
+ (Link): Return 0 rather than throwing
+ (Update): Creates a file if opening it for writing files, now
+ renders a v2 tag before rendering a v1 tag
+
+2000-05-12 Friday 23:08 eldamitri
+
+ * src/tag_parse.cpp (1.17):
+ (Parse): removed call to Clear(), since we might want to parse more
+ information into an already-full tag
+ (ParseFromHandle): Return with a 0 rather than throw if there's an
+ error either seeking or reading the file
+
+2000-05-12 Friday 23:07 eldamitri
+
+ * src/tag_parse_v1.cpp (1.7, rel-3-7-10, rel-3-7-9):
+ (ParseID3v1): Exit from the function, rather than throw, if it isn't
+ possible to seek to 128 bytes from the end of the file (i.e., empty
+ files)
+
+2000-05-12 Friday 23:07 eldamitri
+
+ * src/tag_render.cpp (1.18):
+ (RenderV1ToHandle): If file size is less than the length of an id3v1
+ tag, don't even bother looking for one, but rather append the tag at
+ the end. This allows writing tags to empty files.
+
+2000-05-12 Friday 23:07 eldamitri
+
+ * src/error.cpp (1.6, rel-3-7-9), src/field_binary.cpp (1.9),
+ src/field_integer.cpp (1.8, rel-3-7-9), src/field_string_ascii.cpp
+ (1.11), src/field_string_unicode.cpp (1.11), src/frame.cpp (1.14),
+ src/frame_parse.cpp (1.13), src/misc_support.cpp (1.11),
+ src/utils.cpp (1.3, rel-3-7-10, rel-3-7-9), include/id3/error.h
+ (1.11, rel-3-7-7, rel-3-7-9), include/id3/frame.h (1.24),
+ include/id3/globals.h (1.23), include/id3/header.h (1.13,
+ rel-3-7-9), include/id3/misc_support.h (1.18, rel-3-7-9),
+ include/id3/utils.h (1.6, rel-3-7-10, rel-3-7-9): Updated luint
+ parameter, return type with more descriptive type name (either
+ size_t, index_t, or flags_t)
+
+2000-05-12 Friday 06:31 eldamitri
+
+ * include/id3/flags.h (1.2, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9): (class ID3_Flags): Changed TYPE to flags_t
+
+2000-05-12 Friday 06:25 eldamitri
+
+ * include/id3/globals.h (1.22): Added typedefs for index_t (size_t)
+ and flags_t (uint16)
+
+2000-05-12 Friday 06:24 eldamitri
+
+ * include/id3/header_tag.h (1.13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9): (class ID3_TagHeader): Added SetExtended(),
+ GetExtended()
+
+2000-05-12 Friday 06:24 eldamitri
+
+ * include/id3/tag.h (1.31):
+ - Removed acBinary and bTagOwns fields from ID3_Elem (unused)
+ - Constructor parameter now const
+ - Changed all luint return types, parameters to one of index_t,
+ size_t, or flags_t, where appropriate
+ - RemoveFrame now returns a frame pointer
+ - Render, RenderV1 now const methods
+ - Added HasTagType() method in favor of deprecated HasV2Tag(),
+ HasV1Tag(), and HasLyrics() methods
+ - Removed all *Sync* methods (now standalone funcs declared in
+ utils.h)
+ - Removed all List, Elem helper methods (now standalone)
+ - Updated, reorganized private member variables
+
+2000-05-12 Friday 06:17 eldamitri
+
+ * src/tag.cpp (1.16):
+ - Removed all occurrences of __instances (unused)
+ - Made RemoveFromList and ClearList local functions
+ - Removed implementation of SetupTag(), moved most of its
+ functionality to Clear()
+ - Updated constructors to no longer rely on SetupTag
+ - Updated destructor to make better use of Clear()
+ - Updated appropriate methods to increment/decrement __num_frames
+ when necessary
+ - RemoveFrame nwo returns the pointer to the frame returned (NULL if
+ not removed or not present) and therefore the tag is now released
+ from its responsibility of managing frame's memory
+ - Makes use of new __hdr member variable where appropriate
+ - NumFrames implementation removed (moved to header file)
+
+2000-05-12 Friday 06:05 eldamitri
+
+ * src/tag_file.cpp (1.12):
+ - Updated member variables to new names
+ (Link):
+ - Updated luint return type to be size_t
+ - Updated to use new __tags_to_parse member variable
+ (Update): Updated luint parameter, return type to flags_t
+ (Strip): Updated luint parameter, return type to flags_t
+
+2000-05-12 Friday 06:01 eldamitri
+
+ * src/tag_find.cpp (1.11):
+ (Find): Updated luint parameter to be uint32
+ (GetFrameNum):
+ - Updated luint parameter to be index_t
+ - Reimplemented so that it returns the NumFrames - index element,
+ since the frames are stored in a stack and would otherwise be
+ traversed in reverse order (operator[]): Updated luint parameter to
+ be index_t
+
+2000-05-12 Friday 05:48 eldamitri
+
+ * src/tag_parse.cpp (1.16):
+ (ID3_ParseFrames): Now a local function rather than an ID3_Tag
+ member function, accepts an ID3_Tag reference
+ (ParseFromHandle): Updated luint return type to size_t, updated to
+ use new __tags_to_parse member variable
+
+2000-05-12 Friday 05:45 eldamitri
+
+ * src/: tag_parse_v1.cpp (1.6), tag_parse_lyrics3.cpp (1.11,
+ rel-3-7-9): Updated for new member variables
+
+2000-05-12 Friday 05:45 eldamitri
+
+ * src/tag_render.cpp (1.17):
+ - Updated member variables to new names
+ (Render):
+ - Updated luint return type to size_t
+ - method now const
+ - No longer sets actual tag to have LATEST spec
+ - Made use of new __hdr member variable
+ (Size):
+ - Updated luint return type to size_t
+ - Made use of new __hdr member variable
+ (RenderV1):
+ - Updated luint return type to size_t
+ - method now const
+ - Made use of new __file_tags member variable
+ (PaddingSize):
+ - Updated luint return type to size_t
+
+2000-05-12 Friday 05:40 eldamitri
+
+ * src/tag_sync.cpp (1.5):
+ (ID3_ReSync): Updated luint parameter, return type to size_t
+ (ID3_GetUnSyncSize): Updated luint parameter, return type to size_t
+ (ID3_UnSync): Updated luint parameters to size_t
+
+2000-05-11 Thursday 18:04 eldamitri
+
+ * include/id3/utils.h (1.5), src/tag_sync.cpp (1.4): All syncing
+ functions are now stand-alone, rather than member functions of
+ ID3_Tag
+
+2000-05-11 Thursday 15:01 eldamitri
+
+ * NEWS (1.14), configure.in (1.36, rel-3-7-11), id3lib.spec.in
+ (1.13) (utags: rel-3-7-8): Updated for 3.7.8 release
+
+2000-05-11 Thursday 14:49 eldamitri
+
+ * src/tag_render.cpp (1.16, rel-3-7-8):
+ (RenderV1): Fixed bug with writing too many bytes to the v1 tag
+
+2000-05-11 Thursday 14:49 eldamitri
+
+ * src/tag_file.cpp (1.11, rel-3-7-8):
+ (OpenFileForWriting): Fixed bug when stripping an id3v2 tag w/no
+ id3v1 tag
+
+2000-05-11 Thursday 14:49 eldamitri
+
+ * src/: field.cpp (1.19), field_string_ascii.cpp (1.10),
+ field_string_unicode.cpp (1.10) (utags: rel-3-7-8): Fixed major bug
+ that caused all string tags to be written out as binary data with
+ wrong encoding.
+
+2000-05-10 Wednesday 18:33 eldamitri
+
+ * NEWS (1.13), THANKS (1.9, rel-3-7-8), configure.in (1.35),
+ id3lib.spec.in (1.12) (utags: rel-3-7-7): Updated for 3.7.7 release
+
+2000-05-10 Wednesday 18:31 eldamitri
+
+ * Makefile.am (1.18, rel-3-7-8, rel-3-7-7): Reordered subdirs to
+ put zlib before src so it will be compiled before id3lib if
+ necessary
+
+2000-05-10 Wednesday 18:30 eldamitri
+
+ * include/id3/Makefile.am (1.7, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7): utils.h re-included as a
+ distributed file
+
+2000-05-10 Wednesday 18:29 eldamitri
+
+ * zlib/src/Makefile.in (1.3, rel-3-7-8, rel-3-7-7, rel-3-7-8,
+ rel-3-7-7): Improved configuration for building zlib
+
+2000-05-10 Wednesday 17:21 eldamitri
+
+ * include/id3/field.h (1.26, rel-3-7-12, rel-3-7-8, rel-3-7-7):
+ (class ID3_Field): Minor fix to IsEncodable so as to prevent
+ warnings in windows.
+
+2000-05-10 Wednesday 17:19 eldamitri
+
+ * src/tag_render.cpp (1.15, rel-3-7-7):
+ (RenderV1): Minor bug fix
+
+2000-05-10 Wednesday 16:54 eldamitri
+
+ * src/field_string_ascii.cpp (1.9, rel-3-7-7):
+ (ParseASCIIString): Minor fix
+
+2000-05-10 Wednesday 16:49 eldamitri
+
+ * src/frame_parse.cpp (1.11, rel-3-7-8, rel-3-7-7):
+ (Parse): Fixed a minor bug with initializing fields not in scope
+
+2000-05-10 Wednesday 16:45 eldamitri
+
+ * examples/demo_info.cpp (1.10, rel-3-7-8, rel-3-7-7):
+ (PrintInformation): Removed old comment that no longer described the
+ operation of the function accurately.
+
+2000-05-10 Wednesday 15:24 eldamitri
+
+ * include/id3/misc_support.h (1.17, rel-3-7-8, rel-3-7-7): Updated
+ interface to synced lyrics helper funcs to accept refs instead of
+ pointers, where appropriate.
+
+2000-05-10 Wednesday 15:23 eldamitri
+
+ * src/misc_support.cpp (1.10, rel-3-7-8, rel-3-7-7): Minor fixes,
+ interface changes
+
+2000-05-10 Wednesday 15:22 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.10, rel-3-7-8, rel-3-7-7):
+ (ParseLyrics3): Fixed bug in using new synced lyrics helper func.
+
+2000-05-10 Wednesday 05:41 eldamitri
+
+ * include/id3/field.h (1.25, rel-3-7-11): (class ID3_Field): Added
+ GetType(), IsEncodable(); uncommented GetEncoding(), SetEncoding();
+ added __enc member variable
+
+2000-05-10 Wednesday 05:39 eldamitri
+
+ * include/id3/globals.h (1.21, rel-3-7-8, rel-3-7-7): (enum
+ ID3_FieldFlags): Renamed for clarity: NULL->CSTR, NULLDIVIDE->LIST,
+ ADJUSTENC->ENCODABLE; removed ADJUSTEDBY; added TEXTLIST (enum
+ ID3_FieldType): Added NONE, TEXTSTRING, and NUMTYPES; removed
+ ASCIISTRING and UNICODESTRING
+
+2000-05-10 Wednesday 05:36 eldamitri
+
+ * include/id3/tag.h (1.30, rel-3-7-8, rel-3-7-7): (class ID3_Tag):
+ Removed decls of AddBinary(), ExpandBinaries(), and
+ ProcessBinaries(), since they'reno longer needed
+
+2000-05-10 Wednesday 05:35 eldamitri
+
+ * src/field.cpp (1.18, rel-3-7-7):
+ - Updated for renamed field flags
+ - Changed ID3FTY_ASCIISTRING's to ID3FTY_TEXTSTRING's
+ (ID3_Field): Updated to initialize __enc
+ (Clear): Updated to clear __enc
+ (SetSpec): Removed, no lnger needed
+ (Parse): Updated for use with new text encoding scheme
+ (Render): Updated for use with new text encoding scheme
+ (SetEncoding): Uncommented, updated
+
+2000-05-10 Wednesday 05:30 eldamitri
+
+ * src/field_string_ascii.cpp (1.8): Updated for renamed field flags
+ (Set): Changes encoding, rather that type, of field
+ (Add): Changes encoding, rather that type, of field
+
+2000-05-10 Wednesday 05:29 eldamitri
+
+ * src/field_string_unicode.cpp (1.9, rel-3-7-7): Updated for
+ renamed field flags
+ (Set): Changes encoding, rather that type, of field
+
+2000-05-10 Wednesday 05:27 eldamitri
+
+ * src/frame.cpp (1.13, rel-3-7-8, rel-3-7-7):
+ (_UpdateFieldDeps): Removed, never used
+ (_UpdateStringTypes): Reimplemented using new encoding code
+
+2000-05-10 Wednesday 05:25 eldamitri
+
+ * src/frame_parse.cpp (1.10):
+ (Parse): Uncommented call to SetEncoding
+
+2000-05-10 Wednesday 05:24 eldamitri
+
+ * src/tag_parse.cpp (1.15, rel-3-7-8, rel-3-7-7):
+ (ID3_GetLastElem): Removed, no longer necessary
+ (AddBinary): Removed, no longer necessary
+ (ExpandBinaries): Removed, no longer necessary
+ (ProcessBinaries): Removed, no longer necessary
+
+2000-05-10 Wednesday 03:50 eldamitri
+
+ * include/id3/globals.h (1.20): (enum ID3_TextEnc): Added NONE and
+ NUMENCODINGS to enumeration.
+
+2000-05-10 Wednesday 03:50 eldamitri
+
+ * include/id3/field.h (1.24): (class ID3_Field): Added (commented
+ out) decl's for SetEncoding() and GetEncoding(); removed __spec
+ member variable
+
+2000-05-10 Wednesday 03:45 eldamitri
+
+ * src/frame_parse.cpp (1.9):
+ (Parse): Added call to SetEncoding (commented out for now)
+
+2000-05-10 Wednesday 03:42 eldamitri
+
+ * src/header_tag.cpp (1.10, rel-3-7-8, rel-3-7-7):
+ (Parse): Fixed bug with determining data size.
+
+2000-05-10 Wednesday 03:42 eldamitri
+
+ * src/tag_parse.cpp (1.14):
+ (ParseFrames): Fixed bug with setting the frame spec (it wasn't!)
+
+2000-05-10 Wednesday 03:39 eldamitri
+
+ * src/field.cpp (1.17):
+ (SetEncoding): Added implementation (commented out for now)
+
+2000-05-09 Tuesday 16:32 eldamitri
+
+ * zlib/: include/deflate.h (1.2), include/infblock.h (1.2),
+ include/infcodes.h (1.2), include/inffast.h (1.2),
+ include/inffixed.h (1.2), include/inftrees.h (1.2),
+ include/infutil.h (1.2), include/trees.h (1.2), include/zconf.h
+ (1.2), include/zlib.h (1.2), include/zutil.h (1.2), src/adler32.c
+ (1.2), src/compress.c (1.2), src/crc32.c (1.2), src/deflate.c
+ (1.2), src/gzio.c (1.2), src/infblock.c (1.2), src/infcodes.c
+ (1.2), src/inffast.c (1.2), src/inflate.c (1.2), src/inftrees.c
+ (1.2), src/infutil.c (1.2), src/trees.c (1.2), src/uncompr.c (1.2),
+ src/zutil.c (1.2) (utags: rel-3-7-10, rel-3-7-7, rel-3-7-11,
+ rel-3-7-8, rel-3-7-12, rel-3-7-9, rel-3-7-13): Converted to
+ unix-style carriage returns.
+
+2000-05-09 Tuesday 15:47 eldamitri
+
+ * include/id3/field.h (1.23): (class ID3_Field): Added InScope and
+ GetID methods, removed SetSpec method and __spec member variable,
+ updated Parse* methods to only accept two parameters, not three
+
+2000-05-09 Tuesday 15:45 eldamitri
+
+ * include/id3/frame.h (1.23, rel-3-7-8, rel-3-7-7): (class
+ ID3_Frame): Changed SetID() and Parse() methods to return a bool to
+ indicate if the frame has changed; added BadParse() and
+ GetDataSize() methods, added __bad_parse member variable
+
+2000-05-09 Tuesday 15:38 eldamitri
+
+ * include/id3/header_frame.h (1.11, rel-3-7-8, rel-3-7-7): (class
+ ID3_FrameHeader): Added GetExtrasSize(), SetExpandedSize(),
+ GetExpandedSize(), SetEncryptionID(), GetEncryptionID(),
+ SetGroupingID(), and GetGroupingID() methods, as well as
+ __encryption_id, __grouping_id, and __expanded_size member variables
+
+2000-05-09 Tuesday 15:36 eldamitri
+
+ * include/id3/header_tag.h (1.12, rel-3-7-8, rel-3-7-7): (class
+ ID3_TagHeader): Added GetUnsync() method
+
+2000-05-09 Tuesday 15:35 eldamitri
+
+ * include/id3/tag.h (1.29): (class ID3_Tag): Added ParseFrames()
+ method, __hdr member variable
+
+2000-05-09 Tuesday 15:34 eldamitri
+
+ * src/field.cpp (1.16):
+ (ID3_Field): Removed initialization of __spec
+ (SetSpec): Removed
+ (BinSize): No longer checks spec (relies on calling function)
+ (Parse): Updated for new parameters, no longer checks spec (relies
+ on calling function)
+ (Render): No longer checks spec (relies on calling function)
+ (operator=): No longer copies over spec
+
+2000-05-09 Tuesday 15:30 eldamitri
+
+ * src/field_binary.cpp (1.8, rel-3-7-8, rel-3-7-7):
+ (ParseBinary): Updated for new parameters
+
+2000-05-09 Tuesday 15:29 eldamitri
+
+ * src/field_integer.cpp (1.7, rel-3-7-8, rel-3-7-7):
+ (ParseInteger): Updated for new parameters
+
+2000-05-09 Tuesday 15:28 eldamitri
+
+ * src/field_string_ascii.cpp (1.7):
+ (ParseASCIIString): Updated for new parameters
+
+2000-05-09 Tuesday 15:28 eldamitri
+
+ * src/field_string_unicode.cpp (1.8):
+ (ParseUnicodeString): Updated for new parameter
+
+2000-05-09 Tuesday 15:26 eldamitri
+
+ * src/frame.cpp (1.12):
+ (_ClearFields): Added implementation
+ (Clear): Updated to use _ClearFields
+ (_SetID): Added implementation
+ (SetID): Now returns bool indicating if the frame changed
+ (Size): Now checks to see if a field is in scope before adding its
+ size
+
+2000-05-09 Tuesday 15:18 eldamitri
+
+ * src/frame_parse.cpp (1.8):
+ (Parse): New implementation
+
+2000-05-09 Tuesday 15:17 eldamitri
+
+ * src/frame_render.cpp (1.8, rel-3-7-8, rel-3-7-7):
+ (Render): Minor implementation change
+
+2000-05-09 Tuesday 15:13 eldamitri
+
+ * src/header_frame.cpp (1.6, rel-3-7-8, rel-3-7-7):
+ (SetFrameID): Minor implementation change
+ (Parse): Now checks for compression, encryption, and grouping
+
+2000-05-09 Tuesday 15:05 eldamitri
+
+ * src/header_tag.cpp (1.9):
+ (Parse): Updated to prepare for handling extended headers
+
+2000-05-09 Tuesday 15:04 eldamitri
+
+ * src/tag_parse.cpp (1.13):
+ (ParseFrames): Added implementation
+ (Parse): New implementation, using ParseFrames
+
+2000-05-08 Monday 15:57 eldamitri
+
+ * include/id3/globals.h (1.19), include/id3/misc_support.h (1.16),
+ src/misc_support.cpp (1.9), src/tag_parse_lyrics3.cpp (1.9):
+ Updated with new enums, helper functions for adding synced lyrics
+ (thanks Severino Delaurenti).
+
+2000-05-08 Monday 15:55 eldamitri
+
+ * examples/demo_info.cpp (1.9):
+ (PrintInformation): Updated for new names of ContentType enums
+
+2000-05-08 Monday 15:54 eldamitri
+
+ * doc/index.html.in (1.7, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7): Updated to mention COM as a
+ supported language.
+
+2000-05-08 Monday 06:07 eldamitri
+
+ * include/id3/error.h (1.10, rel-3-7-8, rel-3-7-7),
+ include/id3/field.h (1.22, rel-3-7-10), include/id3/frame.h (1.22),
+ include/id3/tag.h (1.28), src/field.cpp (1.15),
+ src/field_binary.cpp (1.7), src/field_string_unicode.cpp (1.7),
+ src/frame_parse.cpp (1.7), src/tag.cpp (1.15, rel-3-7-8,
+ rel-3-7-7), src/tag_find.cpp (1.10, rel-3-7-8, rel-3-7-7),
+ src/tag_parse.cpp (1.12), src/tag_render.cpp (1.14): Updated
+ interface to use const appropriately
+
+2000-05-08 Monday 05:13 eldamitri
+
+ * include/id3/misc_support.h (1.15): All Get* functions now take
+ const pointers to tags, Minor cleanup
+
+2000-05-08 Monday 05:11 eldamitri
+
+ * include/id3/tag.h (1.27):
+ - All Find methods are now const
+ - __cursor is now mutable so Find methods can be const
+ - Removed decl of protected GetLastElem (not dependant on tag data)
+
+2000-05-08 Monday 05:10 eldamitri
+
+ * src/c_wrapper.cpp (1.6, rel-3-7-8, rel-3-7-7):
+ (ID3Frame_GetCompression): Now returns false by default (thanks John
+ Adcock)
+
+2000-05-08 Monday 05:08 eldamitri
+
+ * src/misc_support.cpp (1.8): Fixed bug in AddGenre, all Get*
+ functions now take const pointers to tags, no function throws on
+ error.
+
+2000-05-08 Monday 05:06 eldamitri
+
+ * src/tag_find.cpp (1.9):
+ (Find): All are now const methods
+
+2000-05-08 Monday 05:05 eldamitri
+
+ * src/tag_parse.cpp (1.11):
+ (ID3_GetLastElem): Renamed from ID3_Tag::GetLastElem (local to file)
+ (AddBinary): Updated to use ID3_GetLastElem
+ (ProcessBinaries): Updated to use ID3_GetLastElem
+
+2000-05-08 Monday 05:04 eldamitri
+
+ * id3com/: ID3Frame.cpp (1.5, rel-3-7-9), ID3Frame.h (1.4,
+ rel-3-7-9), id3com.idl (1.4) (utags: rel-3-7-7, rel-3-7-8): Updated
+ for the changes to compression in ID3_Tag and ID3_Frame
+
+2000-05-08 Monday 05:02 eldamitri
+
+ * id3com/Makefile.am (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7):
+ Removed references to deleted files.
+
+2000-05-08 Monday 05:00 eldamitri
+
+ * id3com/: ID3COM_p.c (1.3), ID3Test.vbp (1.2), ID3Test.vbw (1.2):
+ Not needed.
+
+2000-05-06 Saturday 23:41 eldamitri
+
+ * examples/demo_info.cpp (1.8):
+ (PrintInformation): Now prints out timestamp format for synced
+ lyrics
+
+2000-05-06 Saturday 23:38 eldamitri
+
+ * src/tag_parse.cpp (1.10), include/id3/tag.h (1.26):
+ (Parse): Now returns the tag size
+
+2000-05-06 Saturday 23:25 eldamitri
+
+ * include/id3/utils.h (1.4, rel-3-7-8, rel-3-7-7): Commented out
+ namespace, RenderNumber now returns number of bytes rendered
+
+2000-05-06 Saturday 23:24 eldamitri
+
+ * src/field_integer.cpp (1.6): Replaced '#include "misc_support.h"'
+ with '#include "utils.h"'
+ (RenderInteger): Minor cleanup
+
+2000-05-06 Saturday 23:22 eldamitri
+
+ * src/frame_render.cpp (1.7): Replaced '#include "misc_support.h"'
+ with '#include "utils.h"'
+ (Render): Minor cleanup
+
+2000-05-06 Saturday 23:22 eldamitri
+
+ * src/header_frame.cpp (1.5):
+ (Parse): Minor cleanup
+ (Render): Minor cleanup
+
+2000-05-06 Saturday 23:20 eldamitri
+
+ * src/header_tag.cpp (1.8):
+ (Render): Minor cleanup
+ (Parse): Minor cleanup
+
+2000-05-06 Saturday 23:20 eldamitri
+
+ * src/misc_support.cpp (1.7), include/id3/misc_support.h (1.14):
+ Moved utility functions to utils.cpp
+
+2000-05-06 Saturday 23:18 eldamitri
+
+ * src/tag.cpp (1.14):
+ (SetupTag): Minor cleanups
+
+2000-05-06 Saturday 23:17 eldamitri
+
+ * src/tag_file.cpp (1.10, rel-3-7-7):
+ (Link): Minor cleanups
+
+2000-05-06 Saturday 23:16 eldamitri
+
+ * src/: tag_parse.cpp (1.9), tag_find.cpp (1.8),
+ field_string_unicode.cpp (1.6), field_string_ascii.cpp (1.6):
+ Replaced '#include "misc_support.h"' with '#include "utils.h"'
+
+2000-05-06 Saturday 23:16 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.8):
+ (ID3_RenderTimeStamp): Added new function
+ (ID3_Lyrics3ToSylt): Cleaned up the function, minor bugfix for
+ newlines
+
+2000-05-06 Saturday 23:13 eldamitri
+
+ * src/tag_render.cpp (1.13): Minor cleanups
+
+2000-05-06 Saturday 23:10 eldamitri
+
+ * src/utils.cpp (1.2, rel-3-7-8, rel-3-7-7):
+ (ParseNumber): New, easier-to-understand implementation
+ (RenderNumber):
+ - New, easier-to-understand implementation
+ - Now returns number of bytes rendered
+
+2000-05-06 Saturday 07:46 eldamitri
+
+ * configure.in (1.34): Not having sys/param.h or wchar.h doesn't
+ prevent compilation.
+
+2000-05-06 Saturday 07:42 eldamitri
+
+ * examples/demo_info.cpp (1.7):
+ (PrintUsage): Parameter now const
+ (PrintVersion): Parameter now const
+ (PrintInformation): Parameter now const, now prints out info about
+ synced lyrics
+
+2000-05-06 Saturday 07:42 eldamitri
+
+ * include/id3/field.h (1.21): Added GetBinary() method
+
+2000-05-06 Saturday 07:42 eldamitri
+
+ * include/id3/globals.h (1.18): Removed VerCtl enumeration, and
+ LyricsContent enumeration.
+
+2000-05-06 Saturday 07:42 eldamitri
+
+ * src/tag_file.cpp (1.9), include/id3/tag.h (1.25): The Link()
+ methods' filename parameter is now const.
+
+2000-05-06 Saturday 07:42 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.7): Bugfixes to the synchronized
+ lyrics conversion.
+
+2000-05-05 Friday 05:36 eldamitri
+
+ * Makefile.in (1.14), configure (1.20), libtool (1.2),
+ src/Makefile.am (1.12, rel-3-7-8, rel-3-7-7), src/Makefile.in
+ (1.8), zlib/src/Makefile.am (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0): Updated to
+ allow zlib to conditionally compile when it isn't found (not yet
+ working right)
+
+2000-05-05 Friday 05:35 eldamitri
+
+ * include/id3/: Makefile.am (1.6), Makefile.in (1.9): Designated
+ utils.h and uint28.h as not needing to be installed
+
+2000-05-05 Friday 05:16 eldamitri
+
+ * configure.in (1.33, rel-3-7-10): Updated to allow zlib to
+ conditionally compile when it isn't found.
+
+2000-05-05 Friday 05:15 eldamitri
+
+ * include/id3/: frame.h (1.21), tag.h (1.24): Made destructor
+ virtual to avoid compilation warnings (thanks Peter Thorstenson)
+
+2000-05-05 Friday 05:13 eldamitri
+
+ * doc/index.html.in (1.6): Added ref to new project: Sonize.
+
+2000-05-04 Thursday 22:52 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.6):
+ (ID3_StripTimeStamps): Fixed logic of bad data (thanks Severino)
+ (ID3_Lyrics3ToSylt): Added implementation (thanks Severino)
+ (ParseLyrics3): Adds description, language, lyricist, and
+ information (thanks Severino)
+
+2000-05-04 Thursday 22:52 eldamitri
+
+ * src/misc_support.cpp (1.6):
+ (ID3_AddTitle): Now checks if memory wasn't allocated (thanks
+ Severino)
+ (ID3_GetLyricist): Added implementation (thanks Severino)
+ (ID3_AddLyricist): Added implementation (thanks Severino)
+ (ID3_RemoveLyricist): Added implementation (thanks Severino)
+
+2000-05-04 Thursday 22:51 eldamitri
+
+ * src/field.cpp (1.14):
+ (ID3FD_LinkedInfo): Removed unnecessary (read: wrong) size field for
+ id3v2.2.x
+ (ID3FD_SyncLyrics): Added (thanks Severino)
+ (ID3_FrameDefs): Updated ID3FID_SYNCEDLYRICS frame def to use
+ ID3FD_SyncLyrics
+
+2000-05-04 Thursday 22:51 eldamitri
+
+ * include/id3/misc_support.h (1.13): Added declaration of
+ ID3_GetLyricist, ID3_AddLyricist, and ID3_RemoveLyricist (thanks
+ Severino)
+
+2000-05-04 Thursday 22:51 eldamitri
+
+ * include/id3/globals.h (1.17): Added ID3FN_TIMESTAMPFORMAT and
+ ID3FN_CONTENTTYPE constants for the new synced lyrics support
+ (thanks Severino)
+
+2000-05-04 Thursday 03:44 eldamitri
+
+ * NEWS (1.12), THANKS (1.8), configure.in (1.32), id3lib.spec.in
+ (1.11): Updated for 3.7.6 release
+
+2000-05-04 Thursday 02:59 eldamitri
+
+ * include/id3/frame.h (1.20):
+ (SetCompression): Added as a replacement for
+ ID3_Tag::GetCompression()
+ (GetCompression): Added
+
+2000-05-04 Thursday 02:56 eldamitri
+
+ * include/id3.h (1.9, rel-3-7-8, rel-3-7-7), src/c_wrapper.cpp
+ (1.5): Added ID3Frame_SetCompression and ID3Frame_GetCompression.
+ Deprecated ID3Tag_SetCompression
+
+2000-05-04 Thursday 01:24 eldamitri
+
+ * src/uint28.cpp (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7):
+ (operator=): Returns *this (operator>>): Removed std:: (will put
+ this in later when make the move to STL/STC)
+
+2000-05-04 Thursday 01:24 eldamitri
+
+ * src/header_tag.cpp (1.7): Added static definition of
+ ID3_TagHeader::ID
+
+2000-05-04 Thursday 01:23 eldamitri
+
+ * include/id3/uint28.h (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7):
+ Replaced #include iostream with #include iostream.h. Removed
+ #include algorithm (not needed)
+
+2000-05-04 Thursday 01:23 eldamitri
+
+ * include/id3/header_tag.h (1.11): (class ID3_TagHeader): Replaced
+ definition of ID3_TagHeader with just a declaration (windows didn't
+ like having it defined in the header)
+
+2000-05-04 Thursday 01:23 eldamitri
+
+ * include/id3/header.h (1.12, rel-3-7-8, rel-3-7-7):
+ (Clear): Updated to return boolean if the header actually changed
+
+2000-05-04 Thursday 01:23 eldamitri
+
+ * include/id3/frame.h (1.19):
+ (Contains): Added comparison to ensure boolean output
+
+2000-05-04 Thursday 01:16 eldamitri
+
+ * id3com/id3com.dsp (1.8), libprj/id3lib.dsp (1.5), prj/id3lib.dsp
+ (1.8) (utags: rel-3-7-7, rel-3-7-8, rel-3-7-9): Updated to compile
+ with new changes to the library
+
+2000-05-03 Wednesday 19:13 eldamitri
+
+ * id3com/ID3Frame.cpp (1.4):
+ (get_FrameName): Updated for new ID3_Frame::GetDescription.
+
+2000-05-03 Wednesday 19:13 eldamitri
+
+ * src/frame.cpp (1.11):
+ (GetDescription): Now returns NULL rather than "Unknown" for unknown
+ frames.
+
+2000-05-03 Wednesday 16:10 eldamitri
+
+ * examples/demo_info.cpp (1.6):
+ (PrintInformation): Updated for new ID3_Frame::GetDescription()
+
+2000-05-03 Wednesday 16:09 eldamitri
+
+ * include/id3/field.h (1.20), include/id3/frame.h (1.18),
+ src/field.cpp (1.13), src/frame.cpp (1.10): Replaced
+ ID3_GetFrameDescription() with ID3_Frame::GetDescription() and
+ static ID3_Frame::GetDescription(ID3_FrameID)
+
+2000-05-03 Wednesday 16:05 eldamitri
+
+ * include/id3/header_tag.h (1.10), include/id3/tag.h (1.23),
+ src/header_tag.cpp (1.6), src/tag.cpp (1.13): Moved
+ ID3_TagHeader::IsHeader() to ID3_Tag::IsV2Tag()
+
+2000-05-03 Wednesday 06:20 eldamitri
+
+ * src/tag_file.cpp (1.8):
+ (Strip): Fix of a major bug that would delete too much info when
+ stripping a file with an ID3v2 tag present
+
+2000-05-03 Wednesday 05:02 eldamitri
+
+ * include/id3/error.h (1.9), include/id3/field.h (1.19),
+ include/id3/frame.h (1.17), include/id3/tag.h (1.22), src/error.cpp
+ (1.5, rel-3-7-8, rel-3-7-7), src/field.cpp (1.12),
+ src/field_binary.cpp (1.6), src/field_integer.cpp (1.5),
+ src/field_string_ascii.cpp (1.5), src/field_string_unicode.cpp
+ (1.5), src/frame.cpp (1.9), src/frame_parse.cpp (1.6),
+ src/frame_render.cpp (1.6), src/tag.cpp (1.12), src/tag_file.cpp
+ (1.7), src/tag_find.cpp (1.7), src/tag_parse.cpp (1.8),
+ src/tag_parse_lyrics3.cpp (1.5), src/tag_parse_v1.cpp (1.5,
+ rel-3-7-8, rel-3-7-7), src/tag_render.cpp (1.12): Renamed member
+ variables to something not so windows-ish (ick!)
+
+2000-05-03 Wednesday 00:43 eldamitri
+
+ * src/field.cpp (1.11):
+ * src/field.cpp: Removed left over comment that wasn't commented
+
+2000-05-03 Wednesday 00:18 eldamitri
+
+ * src/field.cpp (1.10):
+ (ID3_FrameDefs): Descriptions for PCNT, POSS, PRIV, and POPM were
+ not matched up with their appropriate frame def (thanks Daryl
+ Pawluk)
+
+2000-05-03 Wednesday 00:10 eldamitri
+
+ * src/tag.cpp (1.11):
+ (SetPadding): Fixed minor bug (thanks Sasa Ðolic)
+
+2000-05-03 Wednesday 00:00 eldamitri
+
+ * include/id3.h (1.8): Minor bugfix for #endif (thanks John
+ Southerland)
+
+2000-05-02 Tuesday 23:59 eldamitri
+
+ * include/id3/globals.h (1.16): Added ID3FID_METACOMPRESSION enum
+ for ID3v2.2.1's compressed-data meta-frame ("CDM")
+
+2000-05-02 Tuesday 23:59 eldamitri
+
+ * include/id3/header.h (1.11):
+ (ID3_HeaderInfo):
+ - Struct now defined within ID3_Header
+ - renamed to Info (ID3_Header::Info)
+ - renamed member variables to something not so windows-ish (ick!)
+ - removed ID3_V2Spec member (redundant)
+ (ID3_Header):
+ - Most members now defined in header
+ - Removed *Flags() methods; replaced with __flags protected data
+ members subclasses should now provide subclasses to access this
+ member
+ - removed ID3_V2Spec member (redundant)
+ - Added Parse() pure virtual method to be implemented by subclasses
+ - renamed member variables to something not so windows-ish (ick!)
+ - SetSpec's parameter is no longer const, now returns bool to
+ indicate if the spec actually changed
+ - Clear() now returns bool to indicate if the tag actually needed
+ clearing
+ - Size() method is now const
+
+2000-05-02 Tuesday 23:59 eldamitri
+
+ * include/id3/header_frame.h (1.10):
+ - ID3FL #define's now public enum's within the class
+ - Added SetCompression(), SetEncryption(), SetGrouping(),
+ GetCompression(), GetEncryption(), GetGrouping(), and GetReadOnly()
+ methods and their definitions
+ - renamed member variables to something not so windows-ish (ick!)
+
+2000-05-02 Tuesday 23:59 eldamitri
+
+ * include/id3/header_tag.h (1.9):
+ - ID3HF #define's now public enum's within the class
+ - Added default constructor, copy constructor, destructor,
+ SetSpec(), Parse(), SetUnsync(), and static IsHeader() methods
+ - Added enumeration of offsets, sizes for header fields
+ - Added static const char* ID variable
+ - Deprecated ID3_IsTagHeader (use ID3_TagHeader::IsHeader() instead)
+
+2000-05-02 Tuesday 23:59 eldamitri
+
+ * include/id3/spec.h (1.2, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7):
+ - SetSpec's, SetVersion's now return bool
+ - SetSpec's parameter is no longer const
+
+2000-05-02 Tuesday 23:58 eldamitri
+
+ * include/id3/: tag.h (1.21), frame.h (1.16): SetSpec's parameter
+ is no longer const, now returns bool
+
+2000-05-02 Tuesday 23:58 eldamitri
+
+ * src/field.cpp (1.9):
+ (ID3FD_LinkedInfo): Now is valid through ID3v2.2.1
+ (ID3FD_CDM): Added for ID3v2.2.1's compressed data meta-frame
+ (ID3_FrameDefs):
+ - Added def for CDM
+ - If a frame isn't defined for a spec, this is now signified with an
+ empty id string, rather than one filled with spaces
+
+2000-05-02 Tuesday 23:58 eldamitri
+
+ * src/frame.cpp (1.8):
+ (SetSpec): Updated for new SetSpec interface, now just calls
+ __FrmHdr's SetSpec
+
+2000-05-02 Tuesday 23:58 eldamitri
+
+ * src/frame_parse.cpp (1.5): Removed #include <iostream.h>
+
+2000-05-02 Tuesday 23:57 eldamitri
+
+ * src/frame_render.cpp (1.5):
+ (Render): Now uses FrameHeader's GetCompression(), SetCompression(),
+ SetEncryption(), and SetGrouping() methods.
+
+2000-05-02 Tuesday 23:56 eldamitri
+
+ * src/header.cpp (1.7, rel-3-7-8, rel-3-7-7): Moved most methods to
+ the header file. SetSpec reimplemented to assign __info pointer.
+ ID3_SpecInfo (renamed to _spec_info) is static to the file and no
+ longer has the V2Spec member. It is now accessed directly via
+ subscript in SetSpec.
+
+2000-05-02 Tuesday 23:56 eldamitri
+
+ * src/header_frame.cpp (1.4):
+ (ID3_FrameHeader): Moved to header (~ID3_FrameHeader): Moved to
+ header
+ (SetFrameID): Now no-ops when the id is the same as the current
+ (Size): Now returns 0 if __info is NULL
+ (Parse): Updated to use new __flags member variable
+ (Render): New interface; method is now const, no longer throws
+ (Clear): New interface; now returns a boolean to indicate if the
+ header actually changed
+
+2000-05-02 Tuesday 23:56 eldamitri
+
+ * src/header_tag.cpp (1.5):
+ (IsHeader): Added implementation; returns 0 if buffer isn't an id3v2
+ tag header, otherwise returns the size of the tag (including the
+ header)
+ (ID3_IsTagHeader): Deprecated; now uses IsHeader
+ (SetSpec): Updated for new interface; now returns a boolean to
+ indicate if the spec actually changed
+ (Size): New interface; method is now const
+ (Render): New interface; method is now const, new implementation
+ (Parse): Added implementation (operator=): Implementation moved to
+ header file
+
+2000-05-02 Tuesday 23:56 eldamitri
+
+ * src/tag.cpp (1.10):
+ (SetSpec): Updated for new interface; now returns a boolean to
+ indicate if the spec actually changed
+
+2000-05-02 Tuesday 23:56 eldamitri
+
+ * src/tag_file.cpp (1.6):
+ (Strip): Added note to log error
+
+2000-05-02 Tuesday 23:55 eldamitri
+
+ * src/tag_parse.cpp (1.7):
+ (ExpandBinaries): Now uses new METACOMPRESSION frame id rather than
+ comparing the text id directly
+ (ProcessBinaries): Updated for new FrameHeader methods:
+ GetCompression(),GetEncryption(), GetCrouping()
+ (Parse): Updated to use new uint28 class; updated to use new
+ TagHeader enum's
+
+2000-05-02 Tuesday 22:35 eldamitri
+
+ * include/id3/Makefile.am (1.5): Removed int28.h, added flags.h,
+ uint28.h, and utils.h
+
+2000-05-02 Tuesday 22:34 eldamitri
+
+ * src/Makefile.am (1.11): Removed int28.cpp, added uit28.cpp and
+ utils.cpp
+
+2000-05-02 Tuesday 18:57 eldamitri
+
+ * src/tag_render.cpp (1.11):
+ (Render): Replaced call of SetFlags(ID3HF_UNSYNC) to SetUnsync(true)
+
+2000-05-02 Tuesday 18:54 eldamitri
+
+ * include/id3/flags.h (1.1, rel-3-7-8, rel-3-7-7): Added; basic
+ class for manipulating a flags bitset
+
+2000-05-02 Tuesday 18:53 eldamitri
+
+ * include/id3/utils.h (1.3), src/utils.cpp (1.1): Added; moved util
+ functions out of misc_support
+
+2000-05-02 Tuesday 18:50 eldamitri
+
+ * include/id3/uint28.h (1.2), src/uint28.cpp (1.2): Added; better
+ implementation of the 28-bit unsigned int class.
+
+2000-05-01 Monday 18:41 eldamitri
+
+ * include/id3/frame.h (1.15):
+ - No longer includes field.h, added advanced decl of ID3_Field
+ - ID3_Tag is no longer a friend class
+ - HasChanged(), Parse(), Size(), Render(), SetSpec() now public
+ - Added decl for Contains(ID3_FieldID) method
+ - Minor cleanup
+
+2000-05-01 Monday 18:38 eldamitri
+
+ * include/id3/tag.h (1.20): No long er includes header_frame.h,
+ deprecated SetCompression (compression should be set on a
+ frame-by-frame basis).
+
+2000-05-01 Monday 18:36 eldamitri
+
+ * src/tag.cpp (1.9): Removed all occurrences of SetCompression
+
+ (deprecated)
+
+2000-05-01 Monday 17:51 eldamitri
+
+ * src/tag_find.cpp (1.6):
+ (Find): Replaced direct access of field bits with call to Contains
+
+2000-05-01 Monday 17:30 eldamitri
+
+ * src/tag_render.cpp (1.10):
+ (Render): Removed compression step - this will be handled in the
+ frame
+
+2000-05-01 Monday 15:04 eldamitri
+
+ * Makefile.am (1.17), configure.in (1.31, rel-3-7-12),
+ src/Makefile.am (1.10), src/error.cpp (1.4), src/field.cpp (1.8),
+ src/field_binary.cpp (1.5), src/field_integer.cpp (1.4),
+ src/field_string_ascii.cpp (1.4), src/field_string_unicode.cpp
+ (1.4), src/frame.cpp (1.7), src/frame_parse.cpp (1.4),
+ src/frame_render.cpp (1.4), src/globals.cpp (1.2, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7),
+ src/header.cpp (1.6), src/header_frame.cpp (1.3),
+ src/header_tag.cpp (1.4), src/int28.cpp (1.3, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7),
+ src/misc_support.cpp (1.5), src/tag.cpp (1.8), src/tag_file.cpp
+ (1.5), src/tag_find.cpp (1.5), src/tag_parse.cpp (1.6),
+ src/tag_parse_lyrics3.cpp (1.4), src/tag_parse_v1.cpp (1.4),
+ src/tag_render.cpp (1.9), src/tag_sync.cpp (1.3, rel-3-7-8,
+ rel-3-7-7): Removed Log comments at the end of all files.
+
+2000-04-29 Saturday 00:04 eldamitri
+
+ * include/id3/misc_support.h (1.12), src/misc_support.cpp (1.4):
+ All ID3_Add* functions now return pointers to ID3_Frame's rather
+ than bool's. They no longer throw; if a function isn't created, or
+ if an error occurs, a NULL frame is returned. The ID3_Frame pointer
+ that is returned is the pointer to the actual frame attached to the
+ tag, but it can be safely ignored as the tag will handle freeing its
+ memory.
+
+2000-04-28 Friday 19:27 eldamitri
+
+ * NEWS (1.11), configure.in (1.30, rel-3-7-11), id3lib.spec.in
+ (1.10) (utags: rel-3-7-5): Updated for 3.7.5 release
+
+2000-04-28 Friday 18:56 eldamitri
+
+ * THANKS (1.7, rel-3-7-5): Added mention of Severino's
+ contribution, other minor fixes
+
+2000-04-28 Friday 18:36 eldamitri
+
+ * doc/Doxyfile.in (1.4, rel-3-7-2, rel-3-6-0, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5): Removed source browser
+
+2000-04-28 Friday 18:36 eldamitri
+
+ * doc/index.html.in (1.5, rel-3-7-5): Updated to emphasize tagging
+ for both ID3v1 and ID3v2, now mentions C interface, added link to
+ javpc project, slight rewording in places.
+
+2000-04-28 Friday 18:32 eldamitri
+
+ * id3com/ID3Frame.cpp (1.3), id3com/ID3Tag.cpp (1.4, rel-3-7-8,
+ rel-3-7-7), id3com/ID3Tag.h (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7),
+ id3com/id3com.idl (1.3), examples/demo_info.cpp (1.5) (utags:
+ rel-3-7-5): More id3com fixes and usage of new frame descriptions
+ (thanks John Adcock)
+
+2000-04-28 Friday 18:26 eldamitri
+
+ * include/id3/field.h (1.18, rel-3-7-9, rel-3-7-5): (struct
+ ID3_FrameDef): Added sDescription field (thanks John Adcock)
+ (ID3_GetFrameDescription): Added declaration
+
+2000-04-28 Friday 18:23 eldamitri
+
+ * src/field.cpp (1.7, rel-3-7-5): Added frame descriptions (thanks
+ John Adcock) and ID3_GetFrameDescription implementation.
+
+2000-04-28 Friday 18:22 eldamitri
+
+ * src/frame.cpp (1.6), include/id3/frame.h (1.14) (utags:
+ rel-3-7-5): InitFields method no longer accepts a parameter.
+
+2000-04-28 Friday 18:08 eldamitri
+
+ * src/tag.cpp (1.7), include/id3/tag.h (1.19) (utags: rel-3-7-5):
+ Updated documentation.
+
+2000-04-28 Friday 17:59 eldamitri
+
+ * src/tag_parse.cpp (1.5, rel-3-7-5):
+ (ProcessBinaries): Removed parseHandler code (never used, and will
+ likely be replaced).
+
+2000-04-28 Friday 17:56 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.3, rel-3-7-5):
+ (ParseLyrics3): Added code for parsing Lyrics3 v1.00 tags (thanks
+ Severino Delaurenti)
+
+2000-04-27 Thursday 17:54 eldamitri
+
+ * src/tag_render.cpp (1.8, rel-3-7-5):
+ (RenderV2ToHandle): Fixes a nasty bug when saving a V2 tag to a file
+ (thanks John Adcock)
+
+2000-04-27 Thursday 17:53 eldamitri
+
+ * src/field.cpp (1.6): Fixed bugs in creation and assignment
+ (thanks John Adcock)
+
+2000-04-27 Thursday 17:51 eldamitri
+
+ * src/field_binary.cpp (1.4, rel-3-7-5):
+ (Set): Now handles the case when null data is passed in (thanks John
+ Adcock)
+
+2000-04-27 Thursday 17:41 eldamitri
+
+ * id3com/: Sample/ID3Test.vbw (1.2, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), id3com.dsp (1.7) (utags: rel-3-7-5): Minor update
+
+2000-04-27 Thursday 17:41 eldamitri
+
+ * id3com/ID3Tag.cpp (1.3):
+ (FindFrame): Updated to use AttachFrame
+ (FindFrameString): Updated to use AttachFrame
+
+2000-04-27 Thursday 17:33 eldamitri
+
+ * id3com/Sample/frmID3Test.frm (1.2, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5): Extended the sample with more utility
+ (thanks John Adcock)
+
+2000-04-27 Thursday 04:55 eldamitri
+
+ * NEWS (1.10), THANKS (1.6), configure.in (1.29, rel-3-7-9),
+ id3lib.spec.in (1.9) (utags: rel-3-7-4): Updated for 3.7.4 release
+
+2000-04-27 Thursday 04:37 eldamitri
+
+ * include/id3.h (1.7, rel-3-7-5, rel-3-7-4): Minor cleanup
+
+2000-04-27 Thursday 04:36 eldamitri
+
+ * include/id3/globals.h (1.15, rel-3-7-5, rel-3-7-4): Fixed
+ ID3_C_EXPORT and ID3_C_VAR defs so windows funcs are exported
+ correctly
+
+2000-04-27 Thursday 04:36 eldamitri
+
+ * include/id3.h (1.6): Every function declaration was prepended
+ with ID3_C_EXPORT so they will compile correctly under windows.
+
+2000-04-27 Thursday 04:35 eldamitri
+
+ * id3com/id3com.dsp (1.6), libprj/id3lib.dsp (1.4, rel-3-7-5),
+ prj/id3lib.dsp (1.7, rel-3-7-5) (utags: rel-3-7-4): Fixed to work
+ with most current release
+
+2000-04-27 Thursday 04:35 eldamitri
+
+ * Makefile.am (1.16, rel-3-6-2, rel-3-7-5, rel-3-7-4): Updated
+ release directive to clean up windows distribution of unneeded
+ files/directories.
+
+2000-04-26 Wednesday 22:30 eldamitri
+
+ * Makefile.am (1.15): Copy windows projects over manually
+
+2000-04-26 Wednesday 22:30 eldamitri
+
+ * configure.in (1.28): No longer generate Makefiles for windows
+ projects
+
+2000-04-26 Wednesday 22:26 eldamitri
+
+ * include/id3.h (1.5, rel-3-7-13): Removed C++ comments
+
+2000-04-26 Wednesday 20:43 eldamitri
+
+ * id3com/Sample/: ID3Test.vbp (1.1, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5), ID3Test.vbw (1.1), MSSCCPRJ.SCC (1.1,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5), frmID3Test.frm (1.1)
+ (utags: rel-3-7-4): Initial release; a simple VB app for testing
+ id3com.dll
+
+2000-04-26 Wednesday 19:02 eldamitri
+
+ * id3com/: EnumFields.cpp (1.2, rel-3-7-9, rel-3-7-8, rel-3-7-7,
+ rel-3-7-5, rel-3-7-4), EnumFields.h (1.2, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4), ID3COM_p.c (1.2, rel-3-7-5,
+ rel-3-7-4), ID3Field.cpp (1.2, rel-3-7-9, rel-3-7-8, rel-3-7-7,
+ rel-3-7-5, rel-3-7-4), ID3Field.h (1.3, rel-3-7-8, rel-3-7-7,
+ rel-3-7-5, rel-3-7-4), ID3Field.rgs (1.2, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4), ID3Frame.cpp (1.2, rel-3-7-4),
+ ID3Frame.h (1.3, rel-3-7-5, rel-3-7-4), ID3Frame.rgs (1.2,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4), ID3Tag.cpp
+ (1.2, rel-3-7-4), ID3Tag.h (1.2, rel-3-7-4), ID3Tag.rgs (1.2,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4), StdAfx.cpp
+ (1.2, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4),
+ StdAfx.h (1.2, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4), id3com.cpp (1.2, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4), id3com.dsp (1.5), id3com.idl (1.2, rel-3-7-4): Thanks
+ to John Adcock for this update
+ - Fixes to work bring id3com up to speed with library.
+ - Fixed namespace collision caused by restructuring
+ - Changed the project file a bit so it is safer
+ - Changed license to LGPL to match rest of library
+
+2000-04-26 Wednesday 18:53 eldamitri
+
+ * include/id3/globals.h (1.14): Fixed ID3_C_VAR and ID#_C_EXPORT
+ definitions, thanks to John Adcock
+
+2000-04-26 Wednesday 17:58 eldamitri
+
+ * include/id3/frame.h (1.13, rel-3-7-4): ID3_Frame now inherits
+ from ID3_Speccable, SetSpec's parameter is now const, and declared
+ GetSpec
+
+2000-04-26 Wednesday 17:54 eldamitri
+
+ * include/id3/header.h (1.10, rel-3-7-5, rel-3-7-4): Removed
+ SetSpec's default parameter, made parameter const
+
+2000-04-26 Wednesday 17:54 eldamitri
+
+ * include/id3/tag.h (1.18, rel-3-7-4): SetSpec's parameter now
+ const
+
+2000-04-26 Wednesday 17:53 eldamitri
+
+ * src/field.cpp (1.5, rel-3-7-4): Updated lists of
+ supported/unsupported frames (PRIV now supported)
+ (ID3FD_Private): Added definition
+ (ID3_FrameDefs): Updated Private's definition
+
+2000-04-26 Wednesday 17:51 eldamitri
+
+ * src/frame.cpp (1.5, rel-3-7-4):
+ (SetSpec): Parameter now const
+ (GetSpec): Added implementation
+
+2000-04-26 Wednesday 17:50 eldamitri
+
+ * src/header.cpp (1.5, rel-3-7-5, rel-3-7-4):
+ (ID3_Header): Made call to SetSpec have explicit parameter
+ (SetSpec): Parameter now const
+
+2000-04-26 Wednesday 17:49 eldamitri
+
+ * src/tag.cpp (1.6, rel-3-7-4):
+ (SetSpec): Parameter now const
+
+2000-04-26 Wednesday 17:48 eldamitri
+
+ * src/tag_render.cpp (1.7, rel-3-7-4):
+ (PaddingSize): Fix for padding logic, thanks to John Adcock for the
+ patch.
+
+2000-04-26 Wednesday 06:18 eldamitri
+
+ * include/id3/spec.h (1.1, rel-3-7-5, rel-3-7-4): Added; defines
+ ID3_Speccable pure virtual class, which provides {Get,Set}Spec
+ methods and deprecated {Get,Set}Version, GetRevision
+
+2000-04-26 Wednesday 06:18 eldamitri
+
+ * include/id3/header.h (1.9):
+ - Now inherits from ID3_Speccable
+ - Deprecated SetVersion, added SetSpec and GetSpec
+ - Deprecated ID3_LookupHeaderInfo(uchar, uchar) in favor of
+ ID3_LookupHeaderInfo(ID3_V2Spec)
+ - Removed ID3v2_{VERSION,REVISION}; now use ID3V2_LATEST instead
+ - Replaced version/revision uchar combination with ID3_V2Spec enums
+
+2000-04-26 Wednesday 06:18 eldamitri
+
+ * include/id3/globals.h (1.13):
+ - Removed ID3_SpecVersion (not used anyway)
+ - Defined ID3_V1Spec and ID3_V2Spec to enumerate various iterations
+ of each specification
+
+2000-04-26 Wednesday 06:17 eldamitri
+
+ * include/id3/frame.h (1.12): Replaced (protected) SetVersion with
+ SetSpec
+
+2000-04-26 Wednesday 06:17 eldamitri
+
+ * include/id3/field.h (1.17, rel-3-7-4):
+ - ID3_VerCtl enumeration deprecated in favor of using two ID3_V2Spec
+ enums to denote field scope
+ - Deprecated (private) SetVersion in favor of SetSpec
+ - Replaced version/revision uchar combination with ID3_V2Spec enums
+
+2000-04-26 Wednesday 05:44 eldamitri
+
+ * include/id3/Makefile.am (1.4, rel-3-7-5, rel-3-7-4):
+ (the_headers): Added spec.h
+
+2000-04-26 Wednesday 05:43 eldamitri
+
+ * src/spec.cpp (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4):
+ Initial release; implements functions ID3_V2SpecToVer,
+ ID3_V2SpecToRev, and ID3_VerRevToV2Spec declared in spec.h
+
+2000-04-26 Wednesday 05:42 eldamitri
+
+ * src/: field.cpp (1.4), frame.cpp (1.4), frame_parse.cpp (1.3,
+ rel-3-7-5, rel-3-7-4), frame_render.cpp (1.3, rel-3-7-5,
+ rel-3-7-4), header.cpp (1.4), header_tag.cpp (1.3, rel-3-7-5,
+ rel-3-7-4), tag.cpp (1.5), tag_parse.cpp (1.4, rel-3-7-4),
+ tag_render.cpp (1.6):
+ - Replaced version/revision uchar combination with ID3_V2Spec enums
+ - Deprecated {Get,Set}Version, GetRevision for {Get,Set}Spec
+ - ID3_VerCtl enumeration deprecated in favor of using two ID3_V2Spec
+ enums to denote field scope
+ - Replaced ID3v2_VERSION, ID3v2_REVISION constants with ID3V2_LATEST
+ enum
+ - Use ID3V2_UNKNOWN enum rather than 0 for version, revision
+
+2000-04-26 Wednesday 05:42 eldamitri
+
+ * src/c_wrapper.cpp (1.4, rel-3-7-5, rel-3-7-4):
+ (ID3Tag_AttachFrame): Added implementation
+
+2000-04-26 Wednesday 05:41 eldamitri
+
+ * src/Makefile.am (1.9, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-5, rel-3-7-4):
+ (the_sources): Added spec.cpp
+
+2000-04-26 Wednesday 04:49 eldamitri
+
+ * include/id3/tag.h (1.17):
+ - Removed default params for deprecated Link(char *, bool, bool)
+ since they were causing ambiguity for Link(char *, luint)
+ - Now inherits from ID3_Speccable
+ - Deprecated SetVersion, added SetSpec and GetSpec
+
+2000-04-26 Wednesday 02:47 eldamitri
+
+ * doc/index.html.in (1.4, rel-3-7-4):
+ - Minor reformatting
+ - Added Zlurp! to list of projects using id3lib
+ - Added "Valid HTML 4.01" image, link to validator
+
+2000-04-25 Tuesday 02:16 eldamitri
+
+ * NEWS (1.9), configure.in (1.27) (utags: rel-3-7-3): Updated for
+ 3.7.3 release
+
+2000-04-24 Monday 22:21 eldamitri
+
+ * id3lib.spec.in (1.8, rel-3-7-3): Added explicite RPM_OPT_FLAGS
+ def based on arch, since -fno-exceptions and -fno-rtti are part of
+ the default flags in rpmrc and we need both exceptions and rtti
+ (exceptions uses rtti)
+
+2000-04-24 Monday 22:18 eldamitri
+
+ * doc/Makefile.am (1.12, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3):
+ (dox): Added to make the documentation generation more granular
+ (docs): Now uses dox
+
+2000-04-24 Monday 17:02 eldamitri
+
+ * id3com/id3com.dsp (1.4, rel-3-7-3): Added c_wrapper.cpp and
+ globals.cpp
+
+2000-04-24 Monday 16:59 eldamitri
+
+ * include/id3.h (1.4, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-3):
+ - Added decl for ID3Tag_AttachFrame
+ - ID3Tag_{Parse,Update,Strip} now all return ID3_Err's
+ - ID3Tag_UpdateType renamed to ID3Tag_UpdateByTagType, returns
+ ID3_Err
+
+2000-04-24 Monday 16:59 eldamitri
+
+ * include/id3/field.h (1.16, rel-3-7-3): FixedLength is now
+ unsigned, since a 0 rather than a -1 will represent a
+ variable-length field
+
+2000-04-24 Monday 16:59 eldamitri
+
+ * include/id3/frame.h (1.11, rel-3-7-3): Added decl for copy
+ constructor
+
+2000-04-24 Monday 16:59 eldamitri
+
+ * include/id3/globals.h (1.12, rel-3-7-3): Replaced C++ comments
+ for C comments
+
+2000-04-24 Monday 16:59 eldamitri
+
+ * include/id3/tag.h (1.16, rel-3-7-3):
+ - Moved doxygen comments to appropriate cpp file
+ - AddNewFrame deprecated for AttachFrame
+ - Link(char *, bool, bool) deprecated for Link(char *, luint)
+ - OpenFileFor{Reading,Writing} now returns an ID3_Err rather than
+ void
+
+2000-04-24 Monday 16:49 eldamitri
+
+ * src/tag_parse.cpp (1.3, rel-3-7-3):
+ - Added comments originally in include/id3/tag.h
+ - (ParseFromHandle): Conditionally parses tag types based on
+ __ulTagsToParse, which replaces __bParseLyrics3 and __bParseID3v1
+
+2000-04-24 Monday 16:48 eldamitri
+
+ * src/: tag_find.cpp (1.4, rel-3-7-5, rel-3-7-4), tag_render.cpp
+ (1.5) (utags: rel-3-7-3): Added comments originally in
+ include/id3/tag.h
+
+2000-04-24 Monday 16:48 eldamitri
+
+ * src/tag_file.cpp (1.4, rel-3-7-5, rel-3-7-4, rel-3-7-3):
+ - Added comments originally in include/id3/tag.h
+ - (OpenFileForWriting): Now returns ID3_Err rather than void
+ - (OpenFileForReading): Now returns ID3_Err rather than void
+ - (Link): Deprecated Link(char *, bool, bool) for Link(char *,
+ luint), which accepts an unsigned int representing the tag types to
+ parse.
+
+2000-04-24 Monday 16:48 eldamitri
+
+ * src/tag.cpp (1.4, rel-3-7-3):
+ - Added comments originally in include/id3/tag.h
+ - (operator<<): Made frame parameter constant
+ - (AddFrame):
+ - Made frame parameter constant
+ - Now adds a copy of the frame onto the tag, rather than the frame
+ passed in, thus allowing the tag to be repsonsible for deleting
+ the frame
+ - (AddNewFrame): Deprecated in favor of AttachFrame
+ - (AddFrames): Adds copies of frames
+
+2000-04-24 Monday 16:48 eldamitri
+
+ * src/misc_support.cpp (1.3, rel-3-7-5, rel-3-7-4, rel-3-7-3):
+ - Calls to AddNewFrame replaced with calls to AttachFrame
+ - Minor changes to prevent warnings w/gcc
+
+2000-04-24 Monday 16:48 eldamitri
+
+ * src/frame.cpp (1.3, rel-3-7-3):
+ (ID3_Frame): Added copy constructor implementation
+
+2000-04-24 Monday 16:47 eldamitri
+
+ * src/: field.cpp (1.3), field_binary.cpp (1.3, rel-3-7-4),
+ field_integer.cpp (1.3, rel-3-7-5, rel-3-7-4),
+ field_string_ascii.cpp (1.3, rel-3-7-5, rel-3-7-4),
+ field_string_unicode.cpp (1.3, rel-3-7-5, rel-3-7-4) (utags:
+ rel-3-7-3): __lFixedLength changed to __ulFixedLength. A fixed
+ length of 0, rather than -1, represents a variable-length field,
+ since we should never have a fixed field length of 0.
+
+2000-04-24 Monday 16:47 eldamitri
+
+ * src/error.cpp (1.3, rel-3-7-5, rel-3-7-4, rel-3-7-3):
+ (ID3_ErrorDescs): Added "no error" to list
+
+2000-04-24 Monday 16:47 eldamitri
+
+ * src/c_wrapper.cpp (1.3, rel-3-7-3):
+ (ID3Tag_Parse): Now returns an ID3_Err
+ (ID3Tag_Update): Now returns an ID3_Err
+ (ID3Tag_UpdateByTagType): Renamed from UpdateType, now returns an
+ ID3_Err
+ (ID3Tag_Strip): Now returns an ID3_Err
+
+2000-04-23 Sunday 19:38 eldamitri
+
+ * src/tag_render.cpp (1.4):
+ - Moved def of ID3_PATH_LENGTH from tag.h, since its def requires a
+ macro defined in config.h, which isn't accessible from the .h files.
+ - Updated ID3_V1_LEN constants to new names
+
+2000-04-23 Sunday 19:38 eldamitri
+
+ * src/tag_parse_v1.cpp (1.3, rel-3-7-5, rel-3-7-4, rel-3-7-3):
+ - Updated ID3_V1_LEN constants to new names
+
+2000-04-23 Sunday 19:38 eldamitri
+
+ * src/tag_file.cpp (1.3):
+ - Updated ID3_TagType constants to new names
+
+2000-04-23 Sunday 19:37 eldamitri
+
+ * src/tag.cpp (1.3):
+ - Moved def of ID3_PATH_LENGTH from tag.h, since its def requires a
+ macro defined in config.h, which isn't accessible from the .h files.
+ - __sFileName is now dynamically allocated
+
+2000-04-23 Sunday 19:37 eldamitri
+
+ * include/id3/tag.h (1.15):
+ - Moved def of ID3_PATH_LENGTH from tag.h, since its def requires a
+ macro defined in config.h, which isn't accessible from the .h files.
+ - Moved LEN_V1 constants (renamed to ID3_V1_LEN constants) to
+ globals.h
+ - Moved ID3V1_Tag struct declaration to globals.h
+ - Moved ID3_TagType enum declaration to globals.h
+ - Updated ID3_TagType constants to new names
+ - __sFileName is no longer a fixed-length char array, but rather a
+ char pointer, since ID3_PATH_LENGTH can't be defined in tag.h
+
+2000-04-23 Sunday 19:37 eldamitri
+
+ * include/id3/globals.h (1.11):
+ - Remove ID3_ENUM_TYPE macro, renamed and redefined ID3_ENUM_DECL
+ macro to ID3_ENUM to make it easier to use
+ - Added ID3_MACRO macro
+ - Renamed the ID3_SpecVersion, ID3_TatType enums to follow more
+ consistent naming of all enums
+ - Moved LEN_V1 constants into ID3_V1Lengths enumeration, since array
+ lengths can't be specified with consts in C
+ - Added ID3V1_Tag struct from tag.h
+ - Added ID3_FieldFlags, ID3_FieldType, ID3_VerCtl enums from field.h
+ - Added ID3_Err enum from error.h
+
+2000-04-23 Sunday 19:37 eldamitri
+
+ * include/id3/field.h (1.15): Moved ID3_FieldFlags, ID3_FieldType,
+ ID3_VerCtl enums to globals.h
+
+2000-04-23 Sunday 19:36 eldamitri
+
+ * include/id3/error.h (1.8, rel-3-7-5, rel-3-7-4, rel-3-7-3): Moved
+ ID3_Err enumeration to globals.h
+
+2000-04-23 Sunday 19:36 eldamitri
+
+ * examples/demo_info.cpp (1.4, rel-3-7-4, rel-3-7-3):
+ - Removed dependency on config.h
+
+2000-04-23 Sunday 19:36 eldamitri
+
+ * examples/: demo_convert.cpp (1.4), demo_tag.cpp (1.4) (utags:
+ rel-3-7-7, rel-3-7-8, rel-3-7-3, rel-3-7-4, rel-3-7-5):
+ - Removed dependency on config.h
+ - Updated ID3_TagType constants to new names
+
+2000-04-23 Sunday 01:35 eldamitri
+
+ * include/id3.h (1.3): Added declaration from ID3Tag_UpdateType
+
+2000-04-23 Sunday 01:33 eldamitri
+
+ * src/c_wrapper.cpp (1.2): Added implementations for
+ ID3Tag_UpdateType and ID3_Frame{New,NewID,Delete}.
+
+2000-04-23 Sunday 00:55 eldamitri
+
+ * doc/index.html.in (1.3, rel-3-7-3): Updated DOCTYPE.
+
+2000-04-22 Saturday 06:50 eldamitri
+
+ * id3lib.spec.in (1.7, rel-3-7-2): Fixed minor bugs in doc
+ cleaning, and better separation of noarch tasks.
+
+2000-04-21 Friday 22:13 eldamitri
+
+ * NEWS (1.8), configure.in (1.26) (utags: rel-3-7-2): Updated for
+ 3.7.2 release
+
+2000-04-21 Friday 22:12 eldamitri
+
+ * config.h.win32.in (1.3, rel-3-7-11, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2): Updated to
+ be in line with config.h.in
+
+2000-04-21 Friday 22:02 eldamitri
+
+ * configure.in (1.25): Added DOX_DIR_{HTML,LATEX,MAN,RTF} so that
+ doxygen's output directories need only be adjusted in one file
+
+2000-04-21 Friday 21:55 eldamitri
+
+ * Makefile.am (1.14, rel-3-7-3, rel-3-7-2):
+ (docs): Added for creating documentation from top directory
+ (docs-release): Added for automating creation of documentation
+ deliverables
+ (release): Updated to create documentation release
+
+2000-04-21 Friday 21:52 eldamitri
+
+ * id3lib.spec.in (1.6):
+ - More conditional blocks for noarch
+ - More thorough cleaning of files for documentation
+ - Updated html directory
+
+2000-04-21 Friday 21:47 eldamitri
+
+ * doc/Doxyfile.in (1.3, rel-3-7-4, rel-3-7-3, rel-3-7-2):
+ - Turned off verbatim headers
+ - Added *.c to example patterns
+ - Generalized output directories
+
+2000-04-21 Friday 21:45 eldamitri
+
+ * doc/Makefile.am (1.11, rel-3-7-2):
+ (docs):
+ - More thorough building of documentation (pd.gz, pdf, html)
+ - Generalized doxygen's output directories
+ - Cleans up intermediate files
+ (dist-hook): Removed; doxygen-created docs no longer distributed
+ with main tarball release
+
+2000-04-21 Friday 21:39 eldamitri
+
+ * doc/index.html.in (1.2, rel-3-7-2): Generalized doxygen's html
+ output directory
+
+2000-04-21 Friday 21:38 eldamitri
+
+ * examples/Makefile.am (1.5, rel-3-7-8, rel-3-7-7, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2):
+ (EXTRA_DIST): mp3 files are no longer distributed
+
+2000-04-21 Friday 07:56 eldamitri
+
+ * src/dll_wrapper.cpp (1.3): Removed; replaced by c_wrapper.cpp
+
+2000-04-21 Friday 07:53 eldamitri
+
+ * id3lib.spec.in (1.5):
+ - Fixed date of changelog entry for 3.7.1-1
+ - Added conditional blocks so docs only get built for noarch target
+
+2000-04-21 Friday 07:50 eldamitri
+
+ * examples/Makefile.am (1.4): Updated for new example: id3simple
+
+2000-04-21 Friday 07:49 eldamitri
+
+ * examples/demo_simple.c (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2): Initial release; simple example of how to
+ use the C interface
+
+2000-04-21 Friday 07:47 eldamitri
+
+ * include/id3.h (1.2, rel-3-7-2): Fixed parameters for ID3Tag_Strip
+
+2000-04-21 Friday 07:46 eldamitri
+
+ * include/id3/header_tag.h (1.8, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2):
+ - Moved ID3_{TAGID,TAGIDSIZE,TAGHEADERSIZE} macros to globals.h
+
+2000-04-21 Friday 07:45 eldamitri
+
+ * include/id3/globals.h (1.10, rel-3-7-2):
+ - Updated WIN32 macros for creating dll's
+ - Added ID3_{TAGID,TAGIDSIZE,TAGHEADERSIZE} macros from header.h
+ - Changed all enumerations to use same syntax for C and C++
+
+2000-04-21 Friday 07:10 eldamitri
+
+ * prj/: id3lib.dsp (1.6), id3lib.mak (1.4, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4) (utags: rel-3-7-2, rel-3-7-3):
+ - Added globals.cpp
+ - Removed version.cpp, types.h, version.h
+ - Renamed src\dll_wrapper.cpp to src\c_wrapper.cpp
+
+2000-04-21 Friday 07:07 eldamitri
+
+ * libprj/id3lib.dsp (1.3, rel-3-7-3, rel-3-7-2):
+ - Added globals.cpp
+ - Removed version.cpp, externals.h, types.h, version.h
+ - Renamed include\id3\dll.h to include\id3.h
+
+2000-04-21 Friday 07:05 eldamitri
+
+ * id3com/id3com.dsp (1.3, rel-3-7-2): Removed version.cpp
+
+2000-04-21 Friday 06:59 eldamitri
+
+ * src/Makefile.am (1.8, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-3, rel-3-7-2):
+ (the_sources): Added c_wrapper.cpp
+ (EXTRA_DIST): Removed, since dll_wrapper.cpp is no longer
+ distributed
+
+2000-04-21 Friday 06:58 eldamitri
+
+ * src/c_wrapper.cpp (1.1, rel-3-7-2): Renamed and updated from
+ dll_wrapper.cpp
+
+2000-04-21 Friday 06:54 eldamitri
+
+ * src/tag_find.cpp (1.3, rel-3-7-2): Minor updates
+
+2000-04-20 Thursday 17:12 eldamitri
+
+ * doc/Makefile.am (1.10, rel-3-7-1):
+ (dist-hook): Copies latex code into dist package
+
+2000-04-20 Thursday 17:11 eldamitri
+
+ * id3lib.spec.in (1.4, rel-3-7-1): Updated to make doc package as
+ lean as possible
+
+2000-04-20 Thursday 06:59 eldamitri
+
+ * NEWS (1.7), configure.in (1.24, rel-3-7-8) (utags: rel-3-7-1):
+ Updated for 3.7.1 release
+
+2000-04-20 Thursday 06:58 eldamitri
+
+ * id3lib.spec.in (1.3):
+ * id3lib.spec.in: Added HISTORY to all %doc's
+
+2000-04-20 Thursday 06:56 eldamitri
+
+ * include/Makefile.am (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1): Fixed typo.
+
+2000-04-20 Thursday 06:55 eldamitri
+
+ * id3com/: ID3Field.h (1.2), ID3Frame.h (1.2) (utags: rel-3-7-1,
+ rel-3-7-2, rel-3-7-3): Changed #include <id3/dll.h> to #include
+ <id3.h>
+
+2000-04-20 Thursday 06:19 eldamitri
+
+ * include/id3/dll.h (1.6): No longer needed
+
+2000-04-20 Thursday 06:03 eldamitri
+
+ * id3lib.spec.in (1.2):
+ - Removed zlib-devel requirement from devel
+ - Added doc package to distribute documentation
+ - Added examples package to distribute binary examples
+ - Moved doc/ and examples/ source files from devel to doc package
+
+2000-04-20 Thursday 05:54 eldamitri
+
+ * include/Makefile.am (1.3): Added id3.h to included directories
+
+2000-04-20 Thursday 05:52 eldamitri
+
+ * configure.in (1.23):
+ - Added ID3LIB_NAME definition
+ - Prepended '__' onto all macros that will be defined in config.h to
+ alleviate namespace clashes
+
+2000-04-20 Thursday 05:50 eldamitri
+
+ * src/tag_render.cpp (1.3, rel-3-7-2, rel-3-7-1):
+ (RenderV2ToHandle): Now uses ID3_PATH_LENGTH instead of MAXPATHLEN
+
+2000-04-20 Thursday 05:49 eldamitri
+
+ * src/header.cpp (1.3, rel-3-7-3, rel-3-7-2, rel-3-7-1):
+ (ID3_LookupHeaderInfo): Minor update
+
+2000-04-20 Thursday 05:48 eldamitri
+
+ * src/globals.cpp (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1): Initial release
+
+2000-04-20 Thursday 05:47 eldamitri
+
+ * src/Makefile.am (1.7, rel-3-7-1):
+ (the_sources): Added globals.cpp, removed version.cpp
+
+2000-04-20 Thursday 05:45 eldamitri
+
+ * include/id3/tag.h (1.14, rel-3-7-2, rel-3-7-1):
+ - Abstracted MAXPATHLEN into ID3_PATH_LENGTH macro for platform
+ differences (inspired by glib.h from http://www.gtk.org)
+ - Removed log comments to reduce file size
+
+2000-04-20 Thursday 05:43 eldamitri
+
+ * include/id3/Makefile.am (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1):
+ (the_headers): Removed dll.h, externals.h, version.h, and types.h.
+
+2000-04-20 Thursday 05:43 eldamitri
+
+ * include/id3/: error.h (1.7, rel-3-7-2), field.h (1.14,
+ rel-3-7-2), frame.h (1.10, rel-3-7-2), header.h (1.8, rel-3-7-3,
+ rel-3-7-2), header_frame.h (1.9, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2), header_tag.h (1.7), int28.h (1.9, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2) (utags: rel-3-7-1): Minor updates;
+ removed log comments to reduce file size
+
+2000-04-20 Thursday 05:42 eldamitri
+
+ * include/id3/sized_types.h (1.4, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1): Made compilable with C (changed
+ comments, etc.).
+
+2000-04-20 Thursday 05:41 eldamitri
+
+ * include/id3/misc_support.h (1.11, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1):
+ - Moved MASK macros to globals.h
+ - Removed log comments to reduce file size
+
+2000-04-20 Thursday 05:38 eldamitri
+
+ * include/id3/globals.h (1.9, rel-3-7-1):
+ - Made compilable with C (changed comments, etc.).
+ - Merged in contents of types.h.
+ - Added bool typedef and true/false defines for C compilation.
+ - Added version constants (replacements for functions in version.h)
+ - Added ID3_SpecVersion enum
+ - Added new macros to abstract differences between latforms
+
+2000-04-20 Thursday 05:27 eldamitri
+
+ * examples/: demo_convert.cpp (1.3), demo_info.cpp (1.3),
+ demo_tag.cpp (1.3) (utags: rel-3-7-1, rel-3-7-2): Replaced call to
+ ID3_FullName with ID3LIB_FULL_NAME constant
+
+2000-04-20 Thursday 05:24 eldamitri
+
+ * include/id3.h (1.1, rel-3-7-1): Added; replaces include/id3/dll.h
+
+2000-04-20 Thursday 05:21 eldamitri
+
+ * doc/Makefile.am (1.9):
+ (dist-hook): Made copying of the html more selective
+
+2000-04-20 Thursday 05:20 eldamitri
+
+ * doc/Doxyfile.in (1.2, rel-3-6-2, rel-3-0-6pre1, rel-3-7-1):
+ (INPUT): Updated for new src code path.
+ (EXAMPLE_PATH): Updated for new example code path
+
+2000-04-20 Thursday 03:57 eldamitri
+
+ * include/id3/externals.h (1.4), include/id3/utils.h (1.2),
+ include/id3/version.h (1.6), src/version.cpp (1.3): No longer
+ needed
+
+2000-04-20 Thursday 02:40 eldamitri
+
+ * include/id3/: types.h (1.7), utils.h (1.1): Renamed from types.h
+ to utils.h to better match its special purpose
+
+2000-04-20 Thursday 00:52 eldamitri
+
+ * examples/Makefile.am (1.3, rel-3-7-1):
+ (bin_PROGRAMS): Changed from check_PROGRAMS so that they build w/o
+ make check
+ (EXTRA_DIST): Removed readme.txt
+
+2000-04-19 Wednesday 04:04 eldamitri
+
+ * configure.in (1.22, rel-3-7-7):
+ (AC_OUTPUT): Added examples/Makefile, removed src/id3/Makefile and
+ src/examples/Makefile
+
+2000-04-19 Wednesday 04:03 eldamitri
+
+ * Makefile.am (1.13, rel-3-7-1):
+ (SUBDIRS): Added 'examples'
+
+2000-04-19 Wednesday 04:02 eldamitri
+
+ * src/Makefile.am (1.6, rel-3-7-5, rel-3-7-4): Moved from src/id3
+ to src.
+
+2000-04-19 Wednesday 04:02 eldamitri
+
+ * src/.cvsignore (1.3, rel-3-7-1): Updated for new files
+
+2000-04-19 Wednesday 04:01 eldamitri
+
+ * src/id3/.cvsignore (1.4): No longer needed
+
+2000-04-19 Wednesday 04:00 eldamitri
+
+ * examples/.cvsignore (1.2, rel-3-7-1), src/examples/.cvsignore
+ (1.9): Moved .cvsignore from src/examples to examples
+
+2000-04-19 Wednesday 03:49 eldamitri
+
+ * id3com/id3com.dsp (1.2), libprj/id3lib.dsp (1.2), prj/id3lib.dsp
+ (1.5), prj/id3lib.mak (1.3) (utags: rel-3-7-1): Updated for new
+ file paths.
+
+2000-04-19 Wednesday 00:14 eldamitri
+
+ * src/: version.cpp (1.2), id3/version.cpp (1.6): Moved version.cpp
+ from src/id3/ to src/
+
+2000-04-19 Wednesday 00:14 eldamitri
+
+ * src/: tag_sync.cpp (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1), id3/tag_sync.cpp (1.11): Moved tag_sync.cpp
+ from src/id3/ to src/
+
+2000-04-19 Wednesday 00:14 eldamitri
+
+ * src/: tag_render.cpp (1.2), id3/tag_render.cpp (1.21): Moved
+ tag_render.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:13 eldamitri
+
+ * src/: tag_parse_v1.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/tag_parse_v1.cpp (1.16): Moved tag_parse_v1.cpp from src/id3/
+ to src/
+
+2000-04-19 Wednesday 00:13 eldamitri
+
+ * src/: tag_parse_lyrics3.cpp (1.2, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1), id3/tag_parse_lyrics3.cpp (1.13): Moved
+ tag_parse_lyrics3.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:13 eldamitri
+
+ * src/: tag_parse.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/tag_parse.cpp (1.21): Moved tag_parse.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:13 eldamitri
+
+ * src/: tag_find.cpp (1.2, rel-3-7-1), id3/tag_find.cpp (1.14):
+ Moved tag_find.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:13 eldamitri
+
+ * src/: tag_file.cpp (1.2, rel-3-7-2, rel-3-7-1), id3/tag_file.cpp
+ (1.18): Moved tag_file.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:12 eldamitri
+
+ * src/: tag.cpp (1.2, rel-3-7-2, rel-3-7-1), id3/tag.cpp (1.15):
+ Moved tag.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:12 eldamitri
+
+ * src/: misc_support.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/misc_support.cpp (1.23): Moved misc_support.cpp from src/id3/
+ to src/
+
+2000-04-19 Wednesday 00:12 eldamitri
+
+ * src/: int28.cpp (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1), id3/int28.cpp (1.13): Moved int28.cpp from src/id3/ to
+ src/
+
+2000-04-19 Wednesday 00:12 eldamitri
+
+ * src/: header_tag.cpp (1.2, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ id3/header_tag.cpp (1.15): Moved header_tag.cpp from src/id3/ to
+ src/
+
+2000-04-19 Wednesday 00:12 eldamitri
+
+ * src/: header_frame.cpp (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1), id3/header_frame.cpp (1.17): Moved
+ header_frame.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:11 eldamitri
+
+ * src/: header.cpp (1.2), id3/header.cpp (1.15): Moved header.cpp
+ from src/id3/ to src/
+
+2000-04-19 Wednesday 00:11 eldamitri
+
+ * src/: frame_render.cpp (1.2, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ id3/frame_render.cpp (1.14): Moved frame_render.cpp from src/id3/
+ to src/
+
+2000-04-19 Wednesday 00:11 eldamitri
+
+ * src/: frame_parse.cpp (1.2, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ id3/frame_parse.cpp (1.13): Moved frame_parse.cpp from src/id3/ to
+ src/
+
+2000-04-19 Wednesday 00:11 eldamitri
+
+ * src/: frame.cpp (1.2, rel-3-7-2, rel-3-7-1), id3/frame.cpp
+ (1.15): Moved frame.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:11 eldamitri
+
+ * src/: field_string_unicode.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/field_string_unicode.cpp (1.17): Moved field_string_unicode.cpp
+ from src/id3/ to src/
+
+2000-04-19 Wednesday 00:10 eldamitri
+
+ * src/: field_string_ascii.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/field_string_ascii.cpp (1.21): Moved field_string_ascii.cpp
+ from src/id3/ to src/
+
+2000-04-19 Wednesday 00:10 eldamitri
+
+ * src/: field_integer.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/field_integer.cpp (1.15): Moved field_integer.cpp from src/id3/
+ to src/
+
+2000-04-19 Wednesday 00:10 eldamitri
+
+ * src/: field.cpp (1.2, rel-3-7-2, rel-3-7-1), id3/field.cpp
+ (1.21): Moved field.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:10 eldamitri
+
+ * src/: field_binary.cpp (1.2, rel-3-7-2, rel-3-7-1),
+ id3/field_binary.cpp (1.14): Moved field_binary.cpp from src/id3/
+ to src/
+
+2000-04-19 Wednesday 00:10 eldamitri
+
+ * src/: error.cpp (1.2, rel-3-7-2, rel-3-7-1), id3/error.cpp
+ (1.14): Moved error.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:09 eldamitri
+
+ * src/: dll_wrapper.cpp (1.2, rel-3-7-1), id3/dll_wrapper.cpp
+ (1.15): Moved dll_wrapper.cpp from src/id3/ to src/
+
+2000-04-19 Wednesday 00:07 eldamitri
+
+ * src/id3/Makefile.am (1.11): No longer needed
+
+2000-04-18 Tuesday 23:47 eldamitri
+
+ * examples/Makefile.am (1.2), src/examples/Makefile.am (1.9): Moved
+ Makefile.am from src/examples to examples
+
+2000-04-18 Tuesday 23:46 eldamitri
+
+ * examples/jules.mp3 (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1), src/examples/jules.mp3 (1.2):
+ Moved jules.mp3 from src/examples to examples
+
+2000-04-18 Tuesday 23:46 eldamitri
+
+ * examples/jules-goodtag.mp3 (1.2, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/jules-goodtag.mp3 (1.2): Moved jules-goodtag.mp3 from
+ src/examples to examples
+
+2000-04-18 Tuesday 23:46 eldamitri
+
+ * examples/jules-badtag.mp3 (1.2, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/jules-badtag.mp3 (1.2): Moved jules-badtag.mp3 from
+ src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/demo_tag.cpp (1.2), src/examples/demo_tag.cpp (1.4):
+ Moved demo_tag.cpp from src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/demo_main.cpp (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1), src/examples/demo_main.cpp (1.3):
+ Moved demo_main.cpp from src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/demo_info.cpp (1.2), src/examples/demo_info.cpp (1.8):
+ Moved demo_info.cpp from src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/demo_convert.cpp (1.2), src/examples/demo_convert.cpp
+ (1.11): Moved demo_convert.cpp from src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/230-unicode.tag (1.2, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/230-unicode.tag (1.2): Moved 230-unicode.tag from
+ src/examples to examples
+
+2000-04-18 Tuesday 23:45 eldamitri
+
+ * examples/230-picture.tag (1.2, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/230-picture.tag (1.2): Moved 230-picture.tag from
+ src/examples to examples
+
+2000-04-18 Tuesday 23:44 eldamitri
+
+ * examples/230-compressed.tag (1.2, rel-3-7-8, rel-3-7-7,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/230-compressed.tag (1.2): Moved 230-compressed.tag
+ from src/examples to examples
+
+2000-04-18 Tuesday 23:40 eldamitri
+
+ * examples/221-compressed.tag (1.2, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ src/examples/221-compressed.tag (1.2, rel-3-0-6pre1): Moved
+ 221-compressed.tag from src/examples to examples
+
+2000-04-18 Tuesday 23:38 eldamitri
+
+ * src/examples/readme.txt (1.3): Moved readme.txt from src/examples
+ to examples
+
+2000-04-18 Tuesday 07:18 eldamitri
+
+ * .cvsignore (1.5, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0): Ignore spec file
+
+2000-04-18 Tuesday 07:16 eldamitri
+
+ * Makefile.am (1.12, rel-3-7-0):
+ (EXTRA_DIST): Added HISTORY and id3lib.spec[.in]
+ (id3lib.spec): Added rule for generating from id3lib.spec.in
+ (release): Now depends on id3lib.spec
+
+2000-04-18 Tuesday 07:14 eldamitri
+
+ * id3lib.spec.in (1.1, rel-3-7-0): Added
+
+2000-04-17 Monday 15:10 eldamitri
+
+ * doc/: html/.cvsignore (1.3), html/Makefile.am (1.2, rel-3-6-2),
+ latex/.cvsignore (1.3), latex/Makefile.am (1.2, rel-3-6-2),
+ man/.cvsignore (1.3), man/Makefile.am (1.2, rel-3-6-2),
+ texinfo/.cvsignore (1.3), texinfo/Makefile.am (1.2, rel-3-6-2): No
+ longer used. These directories will be automatically generated.
+
+2000-04-17 Monday 14:52 eldamitri
+
+ * configure.in (1.21, rel-3-7-0):
+ (AC_OUTPUT): Removed doc's subdirs.
+
+2000-04-17 Monday 14:50 eldamitri
+
+ * doc/Makefile.am (1.8, rel-3-7-0): Fixed bug which prevented
+ successful 'make distcheck'
+
+2000-04-17 Monday 07:11 eldamitri
+
+ * configure.in (1.20): Minor updates.
+
+2000-04-17 Monday 07:10 eldamitri
+
+ * NEWS (1.6, rel-3-6-0), THANKS (1.5, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1), TODO (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1) (utags: rel-3-7-0): Updated for
+ release of 3.7.0
+
+2000-04-17 Monday 07:07 eldamitri
+
+ * doc/.cvsignore (1.3, rel-3-7-1, rel-3-7-0): Added Doxyfile and
+ index.html.
+
+2000-04-17 Monday 07:05 eldamitri
+
+ * HISTORY (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0): Minor update.
+
+2000-04-17 Monday 07:04 eldamitri
+
+ * AUTHORS (1.6, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0): Updated email address
+
+2000-04-17 Monday 06:58 eldamitri
+
+ * doc/Makefile.am (1.7):
+ (EXTRA_DIST): Added new files.
+ (Doxyfile): Added new rule for generating Doxyfile.
+ (index.html): Added new rule for generating index.html.
+ (docs): Added new rule for generating documentation.
+ (dist-hook): Added hook for creating a distrbution (copies
+ documentation to the distribution directory)
+
+2000-04-17 Monday 06:55 eldamitri
+
+ * doc/: Doxyfile.in (1.1), id3lib.css (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1), index.html.in (1.1,
+ rel-3-7-1) (utags: rel-3-7-0): Added.
+
+2000-04-17 Monday 06:53 eldamitri
+
+ * doc/index.html (1.2): Removed. Automatically generated from
+ index.html.in.
+
+2000-04-17 Monday 05:59 eldamitri
+
+ * doc/id3guide.html (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0): Updated to use
+ id3lib.css.
+
+2000-04-17 Monday 04:31 eldamitri
+
+ * src/id3/: field.cpp (1.20), field_binary.cpp (1.13),
+ field_integer.cpp (1.14), field_string_ascii.cpp (1.20),
+ tag_file.cpp (1.17) (utags: rel-3-7-0): Updated parameters of
+ certain methods with const modifier to match declaration.
+
+2000-04-15 Saturday 21:07 eldamitri
+
+ * doc/Makefile.am (1.6):
+ (EXTRA_DIST): Updated to reflect documentation changes
+
+2000-04-15 Saturday 20:44 eldamitri
+
+ * src/examples/demo_info.cpp (1.7, rel-3-7-0):
+ (PrintInformation): Renamed ID3FN_SYMBOL to ID3FN_ID
+
+2000-04-15 Saturday 20:34 eldamitri
+
+ * doc/: id3lib-manual.php (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), index.html (1.1),
+ id3v2.3.0.html (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3v2.3.0.txt (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0): Added
+
+2000-04-15 Saturday 20:32 eldamitri
+
+ * doc/: 3d-logo.gif (1.1), attilas_id3logo.jpg (1.1), fillpx.gif
+ (1.1) (utags: rel-3-7-10, rel-3-7-7, rel-3-7-11, rel-3-7-8,
+ rel-3-7-0, rel-3-7-12, rel-3-7-9, rel-3-7-1, rel-3-7-13, rel-3-7-2,
+ rel-3-7-3, rel-3-7-4, rel-3-7-5): Initial revision.
+
+2000-04-15 Saturday 20:25 eldamitri
+
+ * doc/id3guide.html (1.3): Updated with version at
+ http://www.id3.org
+
+2000-04-14 Friday 22:33 eldamitri
+
+ * doc/id3v2-3.00.txt (1.3): Out of date
+
+2000-04-14 Friday 22:27 eldamitri
+
+ * doc/: bugreport.txt (1.3), logo.txt (1.3), software.txt (1.3): No
+ longer needed
+
+2000-04-14 Friday 05:39 eldamitri
+
+ * src/id3/field.cpp (1.19):
+ (ID3FD_LinkedInfo): Fixed bug in definition of LinkedInfo array.
+ (ID3FD_Registration): Renamed ID3FN_SYMBOL to ID3FN_ID
+
+2000-04-14 Friday 05:39 eldamitri
+
+ * include/id3/globals.h (1.8, rel-3-7-0):
+ (ID3_FieldID): Renamed ID3FN_SYMBOL to ID3FN_ID
+
+2000-04-12 Wednesday 18:52 eldamitri
+
+ * prj/: id3lib.dsp (1.4), id3lib.dsw (1.4, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1),
+ id3lib.mak (1.2) (utags: rel-3-7-0): Fixed dos newlines
+
+2000-04-12 Wednesday 18:37 eldamitri
+
+ * id3com/.cvsignore (1.1), libprj/.cvsignore (1.1) (utags:
+ rel-3-7-0, rel-3-7-1, rel-3-7-2, rel-3-7-3, rel-3-7-4, rel-3-7-5):
+ Initial revision
+
+2000-04-12 Wednesday 18:36 eldamitri
+
+ * configure.in (1.19):
+ (AC_OUTPUT): Add id3com/Makefile and libprj/Makefile
+
+2000-04-12 Wednesday 18:31 eldamitri
+
+ * Makefile.am (1.11):
+ (SUBDIRS): Added id3com and libprj
+
+2000-04-12 Wednesday 18:29 eldamitri
+
+ * id3com/Makefile.am (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0):
+ (EXTRA_DIST): Removed files.txt
+
+2000-04-12 Wednesday 17:34 eldamitri
+
+ * id3com/EnumFields.cpp (1.1, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), id3com/EnumFields.h (1.1, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3COM.def (1.1, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3COM.rc (1.1, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), id3com/ID3COM_p.c (1.1, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3COMps.def (1.1, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3COMps.mk (1.1, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3Field.cpp (1.1, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/ID3Field.h (1.1,
+ rel-3-7-0), id3com/ID3Field.rgs (1.1, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3Frame.cpp (1.1, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/ID3Frame.h (1.1,
+ rel-3-7-0), id3com/ID3Frame.rgs (1.1, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), id3com/ID3Tag.cpp (1.1, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/ID3Tag.h (1.1, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/ID3Tag.rgs (1.1,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/ID3Test.vbp
+ (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), id3com/ID3Test.vbw (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/StdAfx.cpp
+ (1.1, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/StdAfx.h
+ (1.1, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/dlldata.c
+ (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/frmID3Test.frm
+ (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/id3com.cpp
+ (1.1, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ id3com/id3com.dsp (1.1, rel-3-7-0), id3com/id3com.dsw (1.1,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/id3com.idl (1.1,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/mssccprj.scc
+ (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/resource.h
+ (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), id3com/vssver.scc
+ (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), libprj/id3lib.dsp (1.1, rel-3-7-0),
+ libprj/id3lib.dsw (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ id3com/Makefile.am (1.1), libprj/Makefile.am (1.1, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0): Initial release
+
+2000-04-11 Tuesday 05:38 eldamitri
+
+ * include/id3/: error.h (1.6, rel-3-7-0), field.h (1.13,
+ rel-3-7-0), frame.h (1.9, rel-3-7-0), globals.h (1.7), tag.h (1.13,
+ rel-3-7-0), version.h (1.5, rel-3-7-0): Updated comments for use
+ with doxygen.
+
+2000-04-10 Monday 22:58 eldamitri
+
+ * src/id3/header_frame.cpp (1.16, rel-3-7-0): (operator=): Fixed
+ bug - now returns *this.
+
+2000-04-10 Monday 22:57 eldamitri
+
+ * src/id3/tag_parse.cpp (1.20, rel-3-7-0):
+ * src/id3/tag_parse.cpp
+ (ProcessBinaries): Removed name of caught error since it isn't used.
+
+2000-04-10 Monday 22:17 eldamitri
+
+ * include/id3/: field.h (1.12), frame.h (1.8): Updated comments for
+ use with doxygen.
+
+2000-04-10 Monday 22:14 eldamitri
+
+ * prj/id3lib.dsp (1.3), prj/id3lib.dsw (1.3), zlib/prj/zlib.dsp
+ (1.3, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0): Updated to allow for
+ better compilation under windows.
+
+2000-04-10 Monday 18:57 eldamitri
+
+ * src/id3/: misc_support.cpp (1.22), tag_find.cpp (1.13) (utags:
+ rel-3-7-0): Added inclusion of string.h
+
+2000-04-10 Monday 18:57 eldamitri
+
+ * src/id3/: int28.cpp (1.12, rel-3-7-0), tag_parse.cpp (1.19):
+ (ProcessBinaries): Minor change to prevent warning in windows.
+
+2000-04-10 Monday 18:57 eldamitri
+
+ * src/id3/header_tag.cpp (1.14, rel-3-7-0): (operator=): Added
+ implementation.
+
+2000-04-10 Monday 18:57 eldamitri
+
+ * src/id3/: header.cpp (1.14, rel-3-7-0), header_frame.cpp (1.15):
+ (Copy): removed. (operator=): Updated implementation so it isn't
+ reliant on Copy.
+
+2000-04-10 Monday 18:57 eldamitri
+
+ * include/id3/header_tag.h (1.6, rel-3-7-0): (class ID3_TagHeader):
+ Added decl for operator=.
+
+2000-04-10 Monday 18:56 eldamitri
+
+ * include/id3/header_frame.h (1.8, rel-3-7-0): (class
+ ID3_FrameHeader): Added decl for operator=, removed decl of Copy
+
+2000-04-10 Monday 18:56 eldamitri
+
+ * include/id3/header.h (1.7, rel-3-7-0): (class ID3_Header):
+ Removed decl of Copy.
+
+2000-04-10 Monday 05:40 eldamitri
+
+ * include/id3/tag.h (1.12): Started updating comments for doxygen.
+
+2000-04-10 Monday 00:46 eldamitri
+
+ * src/id3/tag_parse.cpp (1.18): Minor structure change.
+
+2000-04-10 Monday 00:42 eldamitri
+
+ * src/id3/header_frame.cpp (1.14):
+ (ID3_FrameHeader): Added implementation.
+ (SetUnknownFrame): Added implementation.
+ (SetFrameID): Sanity checking inputs.
+ (Parse): Now checks to make sure frame id isn't bogus. If it is,
+ creates an "unknown" frame.
+ (Render): Fixed bug in short/long id determination logic
+ (GetTextID): Fixed bug in short/long id determination logic
+ (Copy): Handles case when copying a frame that has an "unknown"
+ frame type.
+ (Clear): Now deletes __pFrameDef is it was dynamically created.
+
+2000-04-10 Monday 00:37 eldamitri
+
+ * src/id3/field.cpp (1.18): Added implementation for DEFAULT.
+
+2000-04-10 Monday 00:36 eldamitri
+
+ * include/id3/header_frame.h (1.7): (class ID3_FrameHeader): Added
+ destructor and new method SetUnknownFrame(const char*) for creating
+ a frame with an unknown frame id. Added __bDynFrameDef member, set
+ when __pFrameDef has been dynamically created.
+
+2000-04-10 Monday 00:34 eldamitri
+
+ * include/id3/field.h (1.11): (struct ID3_FieldDef): Added DEFAULT.
+ (struct ID3_FrameDef): Made text id's fixed length char arrays
+ rather than char ptrs.
+
+2000-04-09 Sunday 16:07 eldamitri
+
+ * configure.in (1.18): Added check for mkstemp.
+
+2000-04-09 Sunday 16:07 eldamitri
+
+ * config.h.win32.in (1.2, rel-3-7-1, rel-3-7-0): Updated for
+ HAVE_MKSTEMP, which it doesn't define, but it's at least
+ comprehensive.
+
+2000-04-09 Sunday 16:05 eldamitri
+
+ * Makefile.am (1.10):
+ (config.h.win32): Fixed bug in creating config.h.win32.
+ (release): Added. Creates id3lib-$(VERSION).tar.gz and
+ id3lib-$(VERSION).zip.
+ (snapshot): Added. Created id3lib-$(DATE).tar.gz and
+ id3lib-$(DATE).zip
+
+2000-04-09 Sunday 16:03 eldamitri
+
+ * src/id3/tag_render.cpp (1.20, rel-3-7-0):
+ (RenderV2ToHandle): Changed conditional from '#if defined WIN32' to
+ '#if !defined HAVE_MKSTEMP'.
+
+2000-04-08 Saturday 06:49 eldamitri
+
+ * configure.in (1.17): Updated to version 3.7.0, per Kamran's
+
+ (MusicMatch) suggestion. Other minor updates.
+
+2000-04-08 Saturday 06:47 eldamitri
+
+ * Makefile.am (1.9): Updated for config.h.win32.
+
+2000-04-08 Saturday 06:45 eldamitri
+
+ * zlib/prj/zlib.dsp (1.2), prj/id3lib.dsp (1.2), prj/id3lib.dsw
+ (1.2): Updated for Visual C++ 6.0.
+
+2000-04-08 Saturday 06:44 eldamitri
+
+ * src/id3/tag_render.cpp (1.19): Changed new ANSI-standard C++
+ include headers to old-style headers.
+ (RenderV2ToHandle): Added conditional code for rendering in windows.
+
+2000-04-08 Saturday 06:41 eldamitri
+
+ * src/id3/tag_file.cpp (1.16): Changed new ANSI-standard C++
+ include headers to old-style headers. Fixed minor problems for
+ windows.
+
+2000-04-08 Saturday 06:40 eldamitri
+
+ * src/id3/misc_support.cpp (1.21): Changed new ANSI-standard C++
+ include headers to old-style headers.
+ (ID3_GetString): Removed variable name to prevent warning in
+ windows.
+
+2000-04-08 Saturday 06:35 eldamitri
+
+ * src/id3/: field.cpp (1.17), frame.cpp (1.14, rel-3-7-0): Changed
+ new ANSI-standard C++ include headers to old-style headers. Fixed
+ return bug in operator=.
+
+2000-04-08 Saturday 06:33 eldamitri
+
+ * src/id3/dll_wrapper.cpp (1.14, rel-3-7-0): Changed new
+ ANSI-standard C++ include headers to old-style headers. Updated
+ ID3_VerInfo to represent major, minor, and patch versions.
+
+2000-04-08 Saturday 06:32 eldamitri
+
+ * include/id3/field.h (1.10), include/id3/int28.h (1.8, rel-3-7-0),
+ include/id3/tag.h (1.11), src/id3/error.cpp (1.13, rel-3-7-0),
+ src/id3/field_string_ascii.cpp (1.19),
+ src/id3/field_string_unicode.cpp (1.16, rel-3-7-0),
+ src/id3/frame_render.cpp (1.13, rel-3-7-0), src/id3/header.cpp
+ (1.13), src/id3/header_frame.cpp (1.13), src/id3/header_tag.cpp
+ (1.13), src/id3/tag_parse.cpp (1.17), src/id3/tag_parse_lyrics3.cpp
+ (1.12, rel-3-7-0), src/id3/tag_parse_v1.cpp (1.15, rel-3-7-0):
+ Changed new ANSI-standard C++ include headers to old-style headers.
+
+2000-04-08 Saturday 06:30 eldamitri
+
+ * config.h.win32.in (1.1, rel-3-7-10): Initial release.
+
+2000-04-07 Friday 21:35 eldamitri
+
+ * include/id3/tag.h (1.10): Added HasV1Tag, HasV2Tag, and HasLyrics
+ (thanks John Adcock).
+
+2000-04-07 Friday 21:07 eldamitri
+
+ * include/id3/dll.h (1.5, rel-3-7-0): Added extern "C"
+
+2000-04-07 Friday 06:47 eldamitri
+
+ * src/id3/Makefile.am (1.10, rel-3-7-0): Updated versioning macros,
+ ala glib (http://www.gtk.org). Also added a few more tests.
+
+2000-04-07 Friday 06:46 eldamitri
+
+ * configure.in (1.16): Changed occurrences of 'micro' to 'patch'.
+
+2000-04-07 Friday 06:45 eldamitri
+
+ * include/id3/: error.h (1.5), field.h (1.9), int28.h (1.7),
+ misc_support.h (1.10, rel-3-7-0), tag.h (1.9), types.h (1.6,
+ rel-3-7-0): Minor cleanup for log comments.
+
+2000-04-07 Friday 06:40 eldamitri
+
+ * include/id3/version.h (1.4), src/id3/version.cpp (1.5,
+ rel-3-7-0): Changed the version functions to reflect the name
+ change of release and revision to major and minor.
+
+2000-04-07 Friday 06:29 eldamitri
+
+ * include/id3/tag.h (1.8), src/id3/tag_file.cpp (1.15),
+ src/id3/tag_parse.cpp (1.16): Added optional parameters to Link to
+ make parsing of id3v1/lyrics3 tags optional.
+
+2000-04-06 Thursday 23:19 eldamitri
+
+ * README (1.6, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0), THANKS (1.4): Updated with
+ current information.
+
+2000-04-06 Thursday 21:36 eldamitri
+
+ * Makefile.am (1.8):
+ * Makefile.am: Put in version requirement for automake (1.4).
+
+2000-04-06 Thursday 21:35 eldamitri
+
+ * configure.in (1.15): Updated versioning macros, ala glib
+ (http://www.gtk.org). Also added a few more tests.
+
+2000-04-06 Thursday 21:34 eldamitri
+
+ * HISTORY (1.2, rel-3-0-6pre1): Added note to refer to ChangeLog
+ for changes since 3.05a.
+
+2000-04-06 Thursday 21:34 eldamitri
+
+ * AUTHORS (1.5): Updated to reflect MusicMatch's release of project
+ direction.
+
+2000-04-06 Thursday 01:59 eldamitri
+
+ * reconf (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0): Now calls local acconfig.
+
+2000-04-06 Thursday 01:59 eldamitri
+
+ * acconfig (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0): Recommitted.
+
+2000-04-05 Wednesday 07:20 eldamitri
+
+ * include/id3/dll.h (1.4), include/id3/error.h (1.4),
+ include/id3/externals.h (1.3, rel-3-7-0), include/id3/field.h
+ (1.8), include/id3/frame.h (1.7), include/id3/globals.h (1.6),
+ include/id3/header.h (1.6), include/id3/header_frame.h (1.6),
+ include/id3/header_tag.h (1.5), include/id3/int28.h (1.6),
+ include/id3/misc_support.h (1.9), include/id3/sized_types.h (1.3,
+ rel-3-7-0), include/id3/tag.h (1.7), include/id3/types.h (1.5),
+ include/id3/version.h (1.3), src/id3/dll_wrapper.cpp (1.13),
+ src/id3/error.cpp (1.12), src/id3/field.cpp (1.16),
+ src/id3/field_binary.cpp (1.12), src/id3/field_integer.cpp (1.13),
+ src/id3/field_string_ascii.cpp (1.18),
+ src/id3/field_string_unicode.cpp (1.15), src/id3/frame.cpp (1.13),
+ src/id3/frame_parse.cpp (1.12, rel-3-7-0), src/id3/frame_render.cpp
+ (1.12), src/id3/header.cpp (1.12), src/id3/header_frame.cpp (1.12),
+ src/id3/header_tag.cpp (1.12), src/id3/int28.cpp (1.11),
+ src/id3/misc_support.cpp (1.20), src/id3/tag.cpp (1.14, rel-3-7-0),
+ src/id3/tag_file.cpp (1.14), src/id3/tag_find.cpp (1.12),
+ src/id3/tag_parse.cpp (1.15), src/id3/tag_parse_lyrics3.cpp (1.11),
+ src/id3/tag_parse_v1.cpp (1.14), src/id3/tag_render.cpp (1.18),
+ src/id3/tag_sync.cpp (1.10, rel-3-7-0), src/id3/version.cpp (1.4):
+ Updated initial comment information to reflect license, copyright
+ change.
+
+2000-04-05 Wednesday 07:09 eldamitri
+
+ * COPYING (1.5, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0): Switched to the LGPL.
+
+2000-03-03 Friday 21:58 eldamitri
+
+ * orig/dll/: id3lib.dll, id3lib.exp, id3lib.h, id3lib.lib,
+ readme.txt (rel-3-1.[1,1,1,1,1]): Removed
+
+2000-03-03 Friday 21:57 eldamitri
+
+ * examples/Makefile.am (rel-3-1.2): Updated for development branch.
+
+2000-03-03 Friday 21:22 eldamitri
+
+ * include/id3/Makefile.in (rel-3-1.3): Removed - automatically
+ generated
+
+2000-03-02 Thursday 23:17 eldamitri
+
+ * examples/test_uint28.cpp (1.1): file test_uint28.cpp was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 23:17 eldamitri
+
+ * examples/test_tag.cpp (1.1): file test_tag.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 23:17 eldamitri
+
+ * examples/test_lib.cpp (1.1): file test_lib.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 23:17 eldamitri
+
+ * examples/test_frame.cpp (1.1): file test_frame.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 23:17 eldamitri
+
+ * examples/test_file.cpp (1.1): file test_file.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 23:14 eldamitri
+
+ * examples/: demo_convert.cpp, demo_info.cpp, demo_main.cpp,
+ demo_tag.cpp, readme.txt (rel-3-1.[2,2,2,2,2]): Removed
+
+2000-03-02 Thursday 22:37 eldamitri
+
+ * acconfig (1.1): file acconfig was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 22:36 eldamitri
+
+ * Makefile.am, configure.in (rel-3-1.[1,1]): Updated for
+ development branch
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/uint28.h (1.1): file uint28.h was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/tag_header.h (1.1): file tag_header.h was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/tag_find.h (1.1): file tag_find.h was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/macros.h (1.1): file macros.h was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/lib.h (1.1): file lib.h was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/genre.h (1.1): file genre.h was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 22:24 eldamitri
+
+ * include/id3/frame_header.h (1.1): file frame_header.h was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/frame_def.h (1.1): file frame_def.h was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/enums.h (1.1): file enums.h was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/details.h (1.1): file details.h was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/debug.h (1.1): file debug.h was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/conversion_ops.h (1.1): file conversion_ops.h was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/constants.h (1.1): file constants.h was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 22:23 eldamitri
+
+ * include/id3/common_ops.h (1.1): file common_ops.h was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 22:21 eldamitri
+
+ * include/id3/Makefile.in, include/id3/Makefile.in,
+ include/id3/common_ops.h, include/id3/constants.h,
+ include/id3/conversion_ops.h, include/id3/debug.h,
+ include/id3/details.h, include/id3/enums.h,
+ include/id3/frame_def.h, include/id3/frame_header.h,
+ include/id3/genre.h, include/id3/lib.h, include/id3/macros.h,
+ include/id3/tag_find.h, include/id3/tag_header.h,
+ include/id3/uint28.h, acconfig, examples/test_file.cpp,
+ examples/test_frame.cpp, examples/test_lib.cpp,
+ examples/test_tag.cpp, examples/test_uint28.cpp
+ (rel-3-1.[1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Initial
+ revision
+
+2000-03-02 Thursday 22:20 eldamitri
+
+ * include/id3/: Makefile.am, field.h, frame.h, header.h,
+ sized_types.h, tag.h, types.h (rel-3-1.[1,1,1,1,1,1,1]): Complete
+ rewrite for developer branch
+
+2000-03-02 Thursday 22:13 eldamitri
+
+ * include/id3/: dll.h, error.h, externals.h, globals.h,
+ header_frame.h, header_tag.h, int28.h, misc_support.h, version.h
+ (rel-3-1.[1,1,1,1,1,1,1,1,1]): Removed
+
+2000-03-02 Thursday 21:35 eldamitri
+
+ * src/Makefile.am (rel-3-1.3): Updated for development branch
+
+2000-03-02 Thursday 21:09 eldamitri
+
+ * src/uint28.cpp (1.1): file uint28.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 21:09 eldamitri
+
+ * src/text_field.cpp (1.1): file text_field.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 21:09 eldamitri
+
+ * src/tag_header.cpp (1.1): file tag_header.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 21:09 eldamitri
+
+ * src/lib.cpp (1.1): file lib.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/integer_field.cpp (1.1): file integer_field.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/genre.cpp (1.1): file genre.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/frame_header.cpp (1.1): file frame_header.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/frame_defs.cpp (1.1): file frame_defs.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/field_defs.cpp (1.1): file field_defs.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/details.cpp (1.1): file details.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/debug.cpp (1.1): file debug.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 21:08 eldamitri
+
+ * src/conversion_ops.cpp (1.1): file conversion_ops.cpp was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 21:07 eldamitri
+
+ * src/common_ops.cpp (1.1): file common_ops.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 21:07 eldamitri
+
+ * src/: binary_field.cpp, common_ops.cpp, conversion_ops.cpp,
+ debug.cpp, details.cpp, field_defs.cpp, frame_defs.cpp,
+ frame_header.cpp, genre.cpp, integer_field.cpp, lib.cpp,
+ tag_header.cpp, text_field.cpp, uint28.cpp
+ (rel-3-1.[1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Initial revision
+
+2000-03-02 Thursday 21:07 eldamitri
+
+ * src/binary_field.cpp (1.1): file binary_field.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 21:05 eldamitri
+
+ * src/: field.cpp, frame.cpp, header.cpp, tag.cpp
+ (rel-3-1.[2,2,2,2]): Complete rewrite for developer branch
+
+2000-03-02 Thursday 20:45 eldamitri
+
+ * src/: dll_wrapper.cpp, error.cpp, field_binary.cpp,
+ field_integer.cpp, field_string_ascii.cpp,
+ field_string_unicode.cpp, frame_parse.cpp, frame_render.cpp,
+ header_frame.cpp, header_tag.cpp, int28.cpp, misc_support.cpp,
+ tag_file.cpp, tag_find.cpp, tag_parse.cpp, tag_parse_lyrics3.cpp,
+ tag_parse_v1.cpp, tag_render.cpp, tag_sync.cpp, version.cpp
+ (rel-3-1.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]): Removed
+
+2000-03-02 Thursday 20:23 eldamitri
+
+ * src/: .cvsignore, id3/.cvsignore (rel-3-1.[1,1]): Moved from
+ src/id3/ to src/
+
+2000-03-02 Thursday 20:18 eldamitri
+
+ * src/version.cpp (1.1): file version.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 20:18 eldamitri
+
+ * src/tag_sync.cpp (1.1): file tag_sync.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 20:18 eldamitri
+
+ * src/tag_render.cpp (1.1): file tag_render.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 20:18 eldamitri
+
+ * src/tag_parse_v1.cpp (1.1): file tag_parse_v1.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/tag_parse_lyrics3.cpp (1.1): file tag_parse_lyrics3.cpp was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/tag_parse.cpp (1.1): file tag_parse.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/tag_find.cpp (1.1): file tag_find.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/tag_file.cpp (1.1): file tag_file.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/tag.cpp (1.1): file tag.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/misc_support.cpp (1.1): file misc_support.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/int28.cpp (1.1): file int28.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/header_tag.cpp (1.1): file header_tag.cpp was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/header_frame.cpp (1.1): file header_frame.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/header.cpp (1.1): file header.cpp was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/frame_render.cpp (1.1): file frame_render.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:17 eldamitri
+
+ * src/frame_parse.cpp (1.1): file frame_parse.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/frame.cpp (1.1): file frame.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/field_string_unicode.cpp (1.1): file field_string_unicode.cpp
+ was initially added on branch rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/field_string_ascii.cpp (1.1): file field_string_ascii.cpp was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/field_integer.cpp (1.1): file field_integer.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/field.cpp (1.1): file field.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/field_binary.cpp (1.1): file field_binary.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/error.cpp (1.1): file error.cpp was initially added on branch
+ rel-3-1.
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/: dll_wrapper.cpp, id3/dll_wrapper.cpp, error.cpp,
+ id3/error.cpp, field_binary.cpp, id3/field_binary.cpp, field.cpp,
+ id3/field.cpp, id3/field_integer.cpp, field_integer.cpp,
+ field_string_ascii.cpp, id3/field_string_ascii.cpp,
+ field_string_unicode.cpp, id3/field_string_unicode.cpp, frame.cpp,
+ id3/frame.cpp, frame_parse.cpp, id3/frame_parse.cpp,
+ frame_render.cpp, id3/frame_render.cpp, header.cpp, id3/header.cpp,
+ header_frame.cpp, id3/header_frame.cpp, header_tag.cpp,
+ id3/header_tag.cpp, int28.cpp, id3/int28.cpp, Makefile.am,
+ id3/Makefile.am, misc_support.cpp, id3/misc_support.cpp, tag.cpp,
+ id3/tag.cpp, tag_file.cpp, id3/tag_file.cpp, tag_find.cpp,
+ id3/tag_find.cpp, tag_parse.cpp, id3/tag_parse.cpp,
+ tag_parse_lyrics3.cpp, id3/tag_parse_lyrics3.cpp, tag_parse_v1.cpp,
+ id3/tag_parse_v1.cpp, tag_render.cpp, id3/tag_render.cpp,
+ tag_sync.cpp, id3/tag_sync.cpp, version.cpp, id3/version.cpp
+ (rel-3-1.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2
+ ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Moved from src/id3/
+ to rc/
+
+2000-03-02 Thursday 20:16 eldamitri
+
+ * src/dll_wrapper.cpp (1.1): file dll_wrapper.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 20:09 eldamitri
+
+ * src/Makefile.am (rel-3-1.1): No longer has current directory
+ structure
+
+2000-03-02 Thursday 20:06 eldamitri
+
+ * examples/.cvsignore (1.1): file .cvsignore was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 19:47 eldamitri
+
+ * COPYING (rel-3-1.1): Updated to LGPL
+
+2000-03-02 Thursday 19:32 eldamitri
+
+ * src/examples/221-compressed.tag, src/examples/230-compressed.tag,
+ src/examples/230-picture.tag, src/examples/230-unicode.tag,
+ src/examples/demo_convert.cpp, src/examples/demo_info.cpp,
+ src/examples/demo_main.cpp, src/examples/demo_tag.cpp,
+ src/examples/jules-badtag.mp3, src/examples/jules-goodtag.mp3,
+ src/examples/jules.mp3, src/examples/Makefile.am,
+ src/examples/readme.txt, examples/.cvsignore,
+ src/examples/.cvsignore (rel-3-1.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+ Moved from src/examples/ to examples/
+
+2000-03-02 Thursday 18:46 eldamitri
+
+ * examples/readme.txt (rel-3-1.1): Moved readme.txt from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:46 eldamitri
+
+ * examples/readme.txt (1.1): file readme.txt was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 18:46 eldamitri
+
+ * examples/Makefile.am (rel-3-1.1): Moved Makefile.am from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:46 eldamitri
+
+ * examples/Makefile.am (1.1): file Makefile.am was initially added
+ on branch rel-3-1.
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules.mp3 (1.1): file jules.mp3 was initially added on
+ branch rel-3-1.
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules.mp3 (rel-3-1.1): Moved jules.mp3 from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules-goodtag.mp3 (1.1): file jules-goodtag.mp3 was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules-goodtag.mp3 (rel-3-1.1): Moved jules-goodtag.mp3
+ from src/examples/ to examples/
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules-badtag.mp3 (1.1): file jules-badtag.mp3 was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:45 eldamitri
+
+ * examples/jules-badtag.mp3 (rel-3-1.1): Moved jules-badtag.mp3
+ from src/examples/ to examples/
+
+2000-03-02 Thursday 18:44 eldamitri
+
+ * examples/demo_tag.cpp (rel-3-1.1): Moved demo_tag.cpp from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:44 eldamitri
+
+ * examples/demo_tag.cpp (1.1): file demo_tag.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 18:44 eldamitri
+
+ * examples/demo_main.cpp (1.1): file demo_main.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 18:44 eldamitri
+
+ * examples/demo_main.cpp (rel-3-1.1): Moved demo_main.cpp from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/demo_info.cpp (rel-3-1.1): Moved demo_info.cpp from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/demo_info.cpp (1.1): file demo_info.cpp was initially
+ added on branch rel-3-1.
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/demo_convert.cpp (1.1): file demo_convert.cpp was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/demo_convert.cpp (rel-3-1.1): Moved demo_convert.cpp
+ from src/examples/ to examples/
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/230-unicode.tag (1.1): file 230-unicode.tag was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:43 eldamitri
+
+ * examples/230-unicode.tag (rel-3-1.1): Moved 230-unicode.tag from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/230-picture.tag (rel-3-1.1): Moved 230-picture.tag from
+ src/examples/ to examples/
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/230-picture.tag (1.1): file 230-picture.tag was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/230-compressed.tag (1.1): file 230-compressed.tag was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/230-compressed.tag (rel-3-1.1): Moved 230-compressed.tag
+ from src/examples/ to examples/
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/221-compressed.tag (1.1): file 221-compressed.tag was
+ initially added on branch rel-3-1.
+
+2000-03-02 Thursday 18:42 eldamitri
+
+ * examples/221-compressed.tag (rel-3-1.1): Moved 221-compressed.tag
+ from src/examples/ to examples/
+
+2000-01-04 Tuesday 17:38 eldamitri
+
+ * configure.in (1.14): Removed AC_C_CONST and AC_C_INLINE checks,
+ since we're using a C++ compiler and these check against the C
+ compiler.
+
+2000-01-04 Tuesday 17:33 eldamitri
+
+ * src/id3/Makefile.am (1.9):
+ (the_sources): Moved dll_wrapper.cpp to EXTRA_DIST.
+
+2000-01-04 Tuesday 16:42 eldamitri
+
+ * include/id3/field.h (1.7), include/id3/int28.h (1.5),
+ include/id3/misc_support.h (1.8), include/id3/tag.h (1.6),
+ include/id3/types.h (1.4), src/id3/dll_wrapper.cpp (1.12),
+ src/id3/error.cpp (1.11), src/id3/field.cpp (1.15),
+ src/id3/field_binary.cpp (1.11), src/id3/field_integer.cpp (1.12),
+ src/id3/field_string_ascii.cpp (1.17),
+ src/id3/field_string_unicode.cpp (1.14), src/id3/frame.cpp (1.12),
+ src/id3/frame_parse.cpp (1.11), src/id3/frame_render.cpp (1.11),
+ src/id3/header.cpp (1.11), src/id3/header_frame.cpp (1.11),
+ src/id3/header_tag.cpp (1.11), src/id3/int28.cpp (1.10),
+ src/id3/misc_support.cpp (1.19), src/id3/tag.cpp (1.13),
+ src/id3/tag_file.cpp (1.13), src/id3/tag_find.cpp (1.11),
+ src/id3/tag_parse.cpp (1.14), src/id3/tag_parse_lyrics3.cpp (1.10),
+ src/id3/tag_parse_v1.cpp (1.13), src/id3/tag_render.cpp (1.17),
+ src/id3/tag_sync.cpp (1.9), src/id3/version.cpp (1.3):
+ * include/id3/field.h:
+ * include/id3/int28.h:
+ * include/id3/misc_support.h:
+ * include/id3/tag.h:
+ * include/id3/types.h:
+ * src/id3/dll_wrapper.cpp
+ * src/id3/error.cpp
+ * src/id3/field.cpp
+ * src/id3/field_binary.cpp
+ * src/id3/field_integer.cpp
+ * src/id3/field_string_ascii.cpp
+ * src/id3/field_string_unicode.cpp
+ * src/id3/frame.cpp
+ * src/id3/frame_parse.cpp
+ * src/id3/frame_render.cpp
+ * src/id3/header.cpp
+ * src/id3/header_frame.cpp
+ * src/id3/header_tag.cpp
+ * src/id3/int28.cpp
+ * src/id3/misc_support.cpp
+ * src/id3/tag.cpp
+ * src/id3/tag_file.cpp:
+ * src/id3/tag_find.cpp:
+ * src/id3/tag_parse.cpp:
+ * src/id3/tag_parse_lyrics3.cpp: For compilation with gcc 2.95.2 and
+ better compatibility with ANSI/ISO standard C++, updated,
+ rearranged, and removed (where necessary) #include directives.
+
+1999-12-27 Monday 07:15 scott
+
+ * configure.in (1.13), config.win32 (1.4, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0): Changed release information from 3.6.2 to 3.0.6, to
+ prepare for future MusicMatch release to happen Real Soon Now.
+
+1999-12-27 Monday 07:14 scott
+
+ * include/id3/frame.h (1.6): (class ID3_Frame): Added declaration
+ for constructor which accepts a frame header to copy. Removed
+ redundant data members that are now encapsulated within new frame
+ header member. Added declaration for new methods InitFields and
+ InitFieldBits.
+
+1999-12-27 Monday 07:11 scott
+
+ * include/id3/header.h (1.5):
+ (ID3_VERSION, ID3_REVISION): Renamed to ID3v2_* (class ID3_Header):
+ Added declarations for GetVersion, GetRevision, AddFlags, SetFlags,
+ Clear, Copy, and operator= methods. Changed return type for Size
+ and Render from luint to size_t.
+
+1999-12-27 Monday 07:09 scott
+
+ * include/id3/header_frame.h (1.5):
+ (ID3_FrameAttr): Removed. (class ID3_FrameHeader): Added
+ declarations for default constructor and Parse, GetFrameID,
+ GetTextID, GetFrameDef, and Clear methods. Changed return type for
+ Size and Render. Replaced __eFrameID data member with __pFrameDef,
+ which encapsulates more information about the frame header.
+
+1999-12-27 Monday 07:06 scott
+
+ * include/id3/header_tag.h (1.4):
+ (ID3_TAGIDSIZE): Added constant. (class ID3_TagHeader): Minor
+ return type changes for Size and Render.
+
+1999-12-27 Monday 07:05 scott
+
+ * src/id3/frame.cpp (1.11):
+ (ID3_Frame): Added data member initialization list. Updated to
+ reflect abstraction of field bits initialization. Added new
+ constructor which accepts a frame header to copy into the frame.
+ (InitFieldBits): Added implementation. Abstracted from the
+ constuctor.
+ (Clear): Updated to reflect addition of new header data member.
+ Restructured method so it can be used in more situations.
+ (InitFields): Added implementation. Abstracted from the SetID
+ method.
+ (SetID): Updated to reflect new method abstractions.
+ (GetID, SetVersion, Size): Updated to reflect new frame header data
+ member.
+
+1999-12-27 Monday 06:55 scott
+
+ * src/id3/frame_parse.cpp (1.10):
+ (Parse): Moved header processing tasks to the header object, now a
+ member of ID3_Frame.
+
+1999-12-27 Monday 06:48 scott
+
+ * src/id3/frame_render.cpp (1.10):
+ (Render): Moved header processing tasks to the header object, now a
+ member of ID3_Frame. Similar changes made due to removal of
+ redundant information from frame object.
+
+1999-12-27 Monday 06:43 scott
+
+ * src/id3/header.cpp (1.10):
+ (ID3_Header): Updated for new version constants.
+ (AddFlags): Added implementation. Adds flag(s) to current flags.
+ (RemoveFlags): Added implementation. Removes flag(s) from current
+ flags.
+ (GetVersion): Added implementation. Returns version number of
+ header.
+ (GetRevision): Added implementation. Returns revision of header.
+ (Clear): Added implementation. Clears contents of header.
+ (operator=): Added implementation. Assignment operator.
+ (Copy): Added implementation. Copies content of another header.
+
+1999-12-27 Monday 06:40 scott
+
+ * src/id3/header_frame.cpp (1.10):
+ (ID3_FrameHeader): Added default constructor.
+ (SetFrameID): Modified to reflect internal representation change.
+ Now searches and stores frame definition associated with the frame
+ id.
+ (GetFrameInfo): Removed.
+ (Parse): Added implementation. Based on former GetFrameInfo.
+ (Render): Modified to reflect internal representation change.
+ (GetTextID): Added implementation. Gets text id associated with
+ frame header.
+ (Copy): Added implementation. Copies another frame header.
+ (GetFrameID): Added implementation. Gets frame id associated with
+ frame header.
+ (GetFrameDef): Added implementation. Gets frame definition
+ associated with frame header.
+ (Clear): Added implementation. Clears contents of frame header.
+
+1999-12-27 Monday 06:32 scott
+
+ * src/id3/header_tag.cpp (1.10):
+ (Size, Render): Minor return type change.
+ (ID3_IsTagHeader): Updated for new version constants.
+
+1999-12-27 Monday 06:30 scott
+
+ * src/id3/tag.cpp (1.12):
+ (SetupTag): Updated for new version constants.
+
+1999-12-27 Monday 06:29 scott
+
+ * src/id3/tag_parse.cpp (1.13):
+ (ExpandBinaries, ProcessBinaries): Moved header processing tasks to
+ the header object, now a member of ID3_Frame.
+
+1999-12-27 Monday 06:26 scott
+
+ * src/id3/tag_render.cpp (1.16):
+ (Render): Updated for new version constants and inclusion of header
+ in each frame.
+
+1999-12-26 Sunday 17:40 scott
+
+ * TODO (1.3): Updated to reflect changes made to the library.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/misc_support.h (1.7):
+ (MASK): Defined macro for masking bits. (): Added declarations for
+ ParseNumber and RenderNumber, for converting between character
+ arrays and unsigned ints.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/int28.h (1.4): (class int28): Restructured.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/header_frame.h (1.4):
+ (ID3FL_READONLY): Renamed from ID3FL_SIGNED. (class
+ ID3_FrameHeader): Minor cleanup to interface.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/header.h (1.4): (class ID3_Header): Minor cleanup to
+ interface.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/frame.h (1.5): (class ID3_Frame): Added bReadOnly
+ property.
+
+1999-12-26 Sunday 17:40 scott
+
+ * include/id3/field.h (1.6): (class ID3_Field): Cleaned up
+ interface to Parse* methods.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/tag_parse.cpp (1.12):
+ (ExpandBinaries): Now uses ParseNumber, defined in misc_support.
+ (ProcessBinaries): Now uses ParseNumber, defined in misc_support.
+ (Parse): Now uses ParseNumber, defined in misc_support.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/misc_support.cpp (1.18):
+ (ParseNumber): Defined. Converts a character buffer up to 4 bytes
+ in size into its equivalent big-endian integer equivalent.
+ (RenderNumber): Defined. Converts an integer into an equivalent
+ big-endian binary character array, up to 4 bytes in length.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/int28.cpp (1.9):
+ (set): Now uses ParseNumber, defined in misc_support. Restructured
+ code.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/header_frame.cpp (1.9):
+ (GetFrameInfo): Now uses ParseNumber, defined in misc_support.
+ (Render): Now uses RenderNumber, defined in misc_support.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/header.cpp (1.9):
+ (GetDataSize): Added implementation.
+ (GetFlags): Added implementation.
+
+1999-12-26 Sunday 16:11 scott
+
+ * src/id3/: frame_render.cpp (1.9), header_tag.cpp (1.9):
+ (Render): Now uses RenderNumber, defined in misc_support.
+
+1999-12-26 Sunday 16:10 scott
+
+ * src/id3/field_integer.cpp (1.11):
+ (ParseInteger): Now uses ParseNumber, defined in misc_support.
+ (RenderInteger): Now uses RenderNumber, defined in misc_support.
+
+1999-12-26 Sunday 16:10 scott
+
+ * src/id3/: field_binary.cpp (1.10), field_string_ascii.cpp (1.16),
+ field_string_unicode.cpp (1.13), frame.cpp (1.10), frame_parse.cpp
+ (1.9): Minor reformatting.
+
+1999-12-26 Sunday 01:33 scott
+
+ * src/id3/tag_render.cpp (1.15): Minor comment change.
+
+1999-12-26 Sunday 01:33 scott
+
+ * src/id3/field.cpp (1.14): (): Updated list of implemented and
+ unimplemented frames to include their id3lib frame id, id3v2.2 id,
+ and www.id3.org description.
+ (ID3FD_Unimplemented): Added for unimplemented frames so that their
+ data is preseved when parsing and rendering.
+ (ID3_FrameDefs): Added entries for new frames, using
+ ID3FD_Unimplemented as frame definition. Updated renamed entries.
+
+1999-12-26 Sunday 01:29 scott
+
+ * src/examples/demo_info.cpp (1.6):
+ (GetDescription): Reformatted. Descriptions now match those from
+ www.id3.org. Added descriptions for new frame id's.
+ (PrintInformation): Updated for added frames. Now handles
+ unimplemented frames.
+
+1999-12-26 Sunday 01:26 scott
+
+ * src/examples/demo_convert.cpp (1.10, rel-3-7-0):
+ (PrintUsage): Included new padding option.
+ (main): Added new option for padding the tag.
+
+1999-12-26 Sunday 01:23 scott
+
+ * include/id3/globals.h (1.5):
+ (ID3_FieldID): Reformatted.
+ (ID3_FrameID): Reformatted. Commented descriptions from
+ www.id3.org. Renamed some frame id's: ID3FID_KEY ->
+ ID3FID_INITIALKEY, ID3FID_BEATSPERMINUTE -> ID3FID_BPM, ID3FID_OWNER
+ -> ID3FID_FILEOWNER. Added new frame id's: ID3FID_AUDIOCRYPTO
+
+ (AENC/CRA), ID3FID_COMMERCIAL (COMR/), ID3FID_EQUALIZATION
+
+ (EQUA/EQU), ID3FID_EVENTTIMING (ETCO/ETC), ID3FID_CDID (MCDI/MCI),
+ ID3FID_MPEGLOOKUP (MLLT/MLL), ID3FID_OWNERSHIP (OWNE/),
+ ID3FID_POSITIONSYNC (POSS/), ID3FID_PRIVATE (PRIV/)
+ ID3FID_BUFFERSIZE (RBUF/BUF), ID3FID_VOLUMEADJ (RVAD/RVA),
+ ID3FID_SYNCEDLYRICS (SYLT/SLT), ID3FID_SYNCEDTEMPO (SYTC/STC),
+ ID3FID_METACRYPTO (/CRM).
+
+1999-12-23 Thursday 16:56 scott
+
+ * src/id3/field_string_ascii.cpp (1.15), ChangeLog (1.24):
+ (RenderASCIIString): Rewrote the function so that it doesn't create
+ temporary dynamic storage, and so that it copies the number of
+ characters, not the number of bytes, in the string.
+
+1999-12-23 Thursday 16:56 scott
+
+ * src/examples/demo_tag.cpp (1.3, rel-3-7-0): Fixed a bug which
+ prevented comment descriptions from being added. Added check and
+ include for config.h.
+
+1999-12-23 Thursday 16:56 scott
+
+ * src/examples/: demo_convert.cpp (1.9), demo_info.cpp (1.5): Added
+ check and include for config.h.
+
+1999-12-17 Friday 17:22 scott
+
+ * THANKS (1.3): Updated with thanks for those of who have submitted
+ recent bugfixes.
+
+1999-12-17 Friday 17:22 scott
+
+ * README (1.5): Removed BRIEF HISTORY. Fixed typos in FURTHER
+ READING. Added CONTACT information. Added original contact.txt
+ information.
+
+1999-12-17 Friday 17:22 scott
+
+ * COPYING (1.4): Named MusicMatch as project coordinator.
+
+1999-12-17 Friday 17:21 scott
+
+ * AUTHORS (1.4):
+ * AUTHORS: Listed MusicMatch as contact project maintainer. Moved
+ contact.txt info to README.
+
+1999-12-17 Friday 17:12 scott
+
+ * src/id3/tag_sync.cpp (1.8): Updated opening comment block.
+ (ShouldUnsync): Added for use with GetUnSyncSize and UnSync.
+ (ReSync, GetUnSyncSize, UnSync): Renamed variables. Restructured
+ code.
+
+1999-12-17 Friday 17:05 scott
+
+ * include/id3/dll.h (1.3), include/id3/error.h (1.3),
+ include/id3/externals.h (1.2), include/id3/field.h (1.5),
+ include/id3/frame.h (1.4), include/id3/globals.h (1.4),
+ include/id3/header.h (1.3), include/id3/header_frame.h (1.3),
+ include/id3/header_tag.h (1.3), include/id3/int28.h (1.3),
+ include/id3/misc_support.h (1.6), include/id3/sized_types.h (1.2),
+ include/id3/tag.h (1.5), include/id3/types.h (1.3),
+ include/id3/version.h (1.2), src/id3/dll_wrapper.cpp (1.11),
+ src/id3/error.cpp (1.10), src/id3/field.cpp (1.13),
+ src/id3/field_binary.cpp (1.9), src/id3/field_integer.cpp (1.10),
+ src/id3/field_string_ascii.cpp (1.14),
+ src/id3/field_string_unicode.cpp (1.12), src/id3/frame.cpp (1.9),
+ src/id3/frame_parse.cpp (1.8), src/id3/frame_render.cpp (1.8),
+ src/id3/header.cpp (1.8), src/id3/header_frame.cpp (1.8),
+ src/id3/header_tag.cpp (1.8), src/id3/int28.cpp (1.8),
+ src/id3/misc_support.cpp (1.17), src/id3/tag.cpp (1.11),
+ src/id3/tag_file.cpp (1.12), src/id3/tag_find.cpp (1.10),
+ src/id3/tag_parse.cpp (1.11), src/id3/tag_parse_lyrics3.cpp (1.9),
+ src/id3/tag_parse_v1.cpp (1.12), src/id3/tag_render.cpp (1.14),
+ src/id3/version.cpp (1.2): Updated opening comment block.
+
+1999-12-16 Thursday 15:40 scott
+
+ * src/id3/tag_parse_v1.cpp (1.11), ChangeLog (1.22): Fixed
+ inclusion config.h (thanks Alexander Voronin).
+
+1999-12-16 Thursday 15:40 scott
+
+ * src/id3/tag_parse_lyrics3.cpp (1.8):
+ (ID3_CRLFtoLF): Fixed memory allocation bug (thanks Alexander
+ Voronin).
+
+1999-12-16 Thursday 15:39 scott
+
+ * src/id3/tag_render.cpp (1.13): Minor formatting cleanup.
+
+1999-12-15 Wednesday 07:38 scott
+
+ * ChangeLog (1.21): Added ChangeLog entries from before 11/15/1999
+ rom cvs log.
+
+1999-12-15 Wednesday 07:37 scott
+
+ * include/id3/field.h (1.4): Reformatted some comments.
+
+1999-12-15 Wednesday 07:36 scott
+
+ * src/id3/field_string_ascii.cpp (1.13):
+ (ParseASCIIString): Better comment for assigning bytesUsed.
+
+1999-12-13 Monday 17:49 scott
+
+ * src/id3/tag_parse.cpp (1.10): Minor code cleanup.
+
+1999-12-13 Monday 06:26 scott
+
+ * configure.in (1.12):
+ (AC_HAVE_HEADERS): Added check for sys/param.h.
+
+1999-12-13 Monday 06:26 scott
+
+ * config.win32 (1.3): Added definition of MAXPATHLEN.
+
+1999-12-13 Monday 06:24 scott
+
+ * src/id3/field.cpp (1.12):
+ (ID3FD_TermsOfUse): Added for defining USER frame.
+ (ID3FD_LinkedInfo): Added for defining LINK frame. (): Added
+ comments that detail which frames are defined and which aren't.
+ (ID3_FrameDefs): Added definitions for the following new frames:
+ ID3FID_LINKEDINFO, ID3FID_BEATSPERMINUTE, ID3FID_PLAYLISTDELAY,
+ ID3FID_KEY, ID3FID_SONGLEN, ID3FID_ORIGYEAR, ID3FID_OWNER,
+ ID3FID_SIZE, ID3FID_ISRC, and ID3FID_TERMSOFUSE. Also sorted the
+ elements of the FrameDefs array based on the long id field.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/examples/demo_tag.cpp (1.2): Added new option for adding a
+ comment description to a comment.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/examples/demo_convert.cpp (1.8):
+ (main): Minor code cleanup.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/id3/tag_render.cpp (1.12):
+ (RenderV2ToHandle): Cleaned up creation of temp files. Now ensures
+ temp file will be in same directory as original file, thereby
+ ensuring that the call to rename will not be used across partitions.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/id3/tag_file.cpp (1.11):
+ (exists): Add const qualifier to parameter.
+ (Link): Change to reflect new __sFileName type.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/id3/tag.cpp (1.10):
+ (SetupTag, ~ID3_Tag): Slight changes to reflect new __sFileName
+ type.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/id3/misc_support.cpp (1.16):
+ (ID3_AddComment): Fixed bug that wasn't adding specified comment
+ description to comment.
+
+1999-12-13 Monday 05:44 scott
+
+ * src/id3/field_string_ascii.cpp (1.12):
+ (Get): Potential memory leaks plugged (thanks MusicMatch).
+ (RenderASCIIString): Bugfix for coversion from unicode to ascii
+ string (thanks MusicMatch). Some code cleanup.
+
+1999-12-13 Monday 05:23 scott
+
+ * include/id3/tag.h (1.4): (): Include sys/param.h (if available)
+ to define MAXPATHLEN. (class ID3_Tag): Made private methods
+ protected. Changed __sFileName from a char * to a char array of
+ size MAXPATHLEN+1.
+
+1999-12-13 Monday 05:23 scott
+
+ * include/id3/globals.h (1.3):
+ (ID3_FrameID): Added constants for the following newly supported
+ frames: linked information (LINK), BPM (TBPM), playlist delay
+
+ (TDLY), initial key (TKEY), song length (TLEN), original year
+
+ (TORY), original owner (TOWN), file size (TSIZ), International
+ Standard Recording Code (TSRC), and terms of use (USER).
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/tag_file.cpp (1.10): Minor code cleanup.
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/tag.cpp (1.9):
+ (ID3_Tag): Added copy constructor implementation. (operator=):
+ Added implementation.
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/misc_support.cpp (1.15):
+ (ID3_GetString): Added implementation for new nIndex parameter,
+ which will pull out the nIndex'th string from the field, such as for
+ the involved people list frame.
+ (ID3_GetGenre): Fixed bug that wasn't finding the track num frame
+ rather than the genre frame (thanks Alexander Voronin).
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/frame.cpp (1.8): (operator=): Added implementation.
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/field_string_unicode.cpp (1.11):
+ (Add): Cleaned up and restructured code to make for easier reading.
+ Also fixed a bug in adding strings to an involved people list frame.
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/field_string_ascii.cpp (1.11):
+ (ParseASCIIString): Fixed bug which prevented correct parsing of
+ fields separated with NULL dividers (such as the involved people
+ frame). Slightly restructured the code for better performance.
+
+1999-12-09 Thursday 04:32 scott
+
+ * src/id3/field_integer.cpp (1.9):
+ (Get): Added const qualifier.
+
+1999-12-09 Thursday 04:31 scott
+
+ * src/id3/field.cpp (1.11): (): Better comments of the
+ ID3VC_HIGHER/ID3VC_LOWER section in the field defs. (operator=):
+ Added implementation.
+
+1999-12-09 Thursday 03:48 scott
+
+ * src/examples/demo_info.cpp (1.4):
+ (PrintInformation): Separated out information printing code into
+ this separate function.
+ (main): Added new runtime option -a that will test the ability of
+ id3lib to make copies of tags. Not very useful in general, but nice
+ for testing the new operator= code.
+
+1999-12-09 Thursday 03:45 scott
+
+ * include/id3/tag.h (1.3): (class ID3_Tag): Added copy constructor
+ and operator= method declarations.
+
+1999-12-09 Thursday 03:45 scott
+
+ * include/id3/misc_support.h (1.5):
+ (ID3_GetString): Added nItems parameter for retrieving a string from
+ a list (for example, the involved people list).
+
+1999-12-09 Thursday 03:45 scott
+
+ * include/id3/frame.h (1.3): (class ID3_Frame): Added operator=
+ method declaration.
+
+1999-12-09 Thursday 03:45 scott
+
+ * include/id3/field.h (1.3): (class ID3_Field): Added const to Get
+ method. Added operator= method declaration.
+
+1999-12-06 Monday 08:01 scott
+
+ * src/examples/Makefile.am (1.8, rel-3-7-0, rel-3-7-0):
+ (check_PROGRAMS): Added id3lib
+ (id3tag_SOURCES): Added
+
+1999-12-06 Monday 08:00 scott
+
+ * src/examples/demo_tag.cpp (1.1): Added. Allows for simple
+ tagging of files from the command line.
+
+1999-12-06 Monday 07:46 scott
+
+ * src/id3/tag_render.cpp (1.11):
+ (RenderV2ToHandle): Use mkstemp instead of tmpfile for creating a
+ temporary file, enabling only a single copy for rendering new id3v2
+ tag. Used an fstream for the temporary file.
+
+1999-12-05 Sunday 06:34 scott
+
+ * include/id3/misc_support.h (1.4): Updated the Add functions so
+ that they accept an option boolean parameter which indicates if the
+ function should replace the current frame, if any. Made any char *
+ parameters const, if appropriate. Added a Remove function for each
+ of the frame types handled in this file. Also generalized
+ AddComment so that it now accepts a Description string, which
+ defaults to "".
+
+1999-12-05 Sunday 06:34 scott
+
+ * src/id3/misc_support.cpp (1.14):
+ (ID3_AddArtist): Added extra boolean parameter (see changes for
+ misc_support.h above) as well as the functionality that implements
+ the feature. If bReplace is true, than the new information replaces
+ the information in the previous Artist frame, if any. If bReplace
+ is false, the information is added only if no previous Artist frame
+ existed.
+ (ID3_AddAlbum): See changes for ID3_AddArtist.
+ (ID3_AddTitle): See changes for ID3_AddArtist.
+ (ID3_AddYear): See changes for ID3_AddArtist.
+ (ID3_AddComment): See changes for ID3_AddArtist. Also generalized
+ implementaiton using the new sDescription parameter.
+ (ID3_AddTrack): See changes for ID3_AddArtist.
+ (ID3_AddGenre): See changes for ID3_AddArtist.
+ (ID3_AddLyrics): See changes for ID3_AddArtist.
+ (ID3_RemoveArtists): Added. Removes any and all frames that are
+ associated with artist information (namely, ID3FID_LEADARTIST,
+ ID3FID_BAND, ID3FID_CONDUCTOR, and ID3FID_COMPOSER) from the tag.
+ (ID3_RemoveAlbums): Added. Removes any and all album name frames
+ (ID3_RemoveTitles): Added. Removes any and all song title frames
+ (ID3_RemoveYears): Added. Removes any and all year frames
+ (ID3_RemoveComments): Added. Removes any and all comment frames
+ that match the sDescription parameter. If sDescription is NULL, all
+ comment frames are removed.
+ (ID3_RemoveTracks): Added. Removes any and all track number frames
+ (ID3_RemoveGenres): Added. Removes any and all content type frames
+ (ID3_RemoveLyrics): Added. Removes any and all unsynced lyrics
+ frames
+
+1999-12-05 Sunday 06:34 scott
+
+ * src/id3/tag_parse_v1.cpp (1.10):
+ (ParseID3v1): Added STR_V1_COMMENT_DESC as description parameter to
+ call to ID3_AddComment
+
+1999-12-03 Friday 15:10 scott
+
+ * Makefile.am (1.7, rel-3-6-0, rel-3-6-2):
+ (EXTRA_DIST): Added config.win32.
+
+1999-12-03 Friday 04:42 scott
+
+ * config.win32 (1.2, rel-3-6-2, rel-3-6-0): Updated for release
+ 3.6.2.
+
+1999-12-03 Friday 04:42 scott
+
+ * NEWS (1.5, rel-3-6-2): Added update for release 3.6.2.
+
+1999-12-03 Friday 01:47 scott
+
+ * configure.in (1.11, rel-3-6-0, rel-3-6-2):
+ (id3lib_patch): Upped to 2 for new release 3.6.2
+ (AC_OUTPUT): Added Makefiles for prj and zlib and its subdirs
+
+1999-12-03 Friday 01:45 scott
+
+ * Makefile.am (1.6):
+ (SUBDIRS): Added prj and zlib
+
+1999-12-03 Friday 01:44 scott
+
+ * prj/Makefile.am (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7),
+ zlib/Makefile.am (1.1, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7), zlib/include/Makefile.am (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7), zlib/lib/Makefile.am (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), zlib/prj/Makefile.am (1.1, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7), zlib/src/Makefile.am (1.1) (utags: rel-3-6-2,
+ rel-3-7-0, rel-3-7-1, rel-3-7-2, rel-3-7-3, rel-3-7-4, rel-3-6-0,
+ rel-3-7-5): Added for distribution purposes.
+
+1999-12-03 Friday 00:09 scott
+
+ * zlib/: include/deflate.h (1.1, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), include/infblock.h
+ (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), include/infcodes.h (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), include/inffast.h
+ (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), include/inffixed.h (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), include/inftrees.h
+ (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), include/infutil.h (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), include/trees.h (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ include/zconf.h (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), include/zlib.h (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), include/zutil.h (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ prj/zlib.dsp (1.1, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7), prj/zlib.dsw (1.1, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0), prj/zlib.mak (1.1, rel-3-7-9, rel-3-7-8, rel-3-7-7,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ src/adler32.c (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), src/compress.c (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), src/crc32.c (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ src/deflate.c (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), src/gzio.c (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), src/infblock.c (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ src/infcodes.c (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), src/inffast.c (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), src/inflate.c (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ src/inftrees.c (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), src/infutil.c (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0), src/trees.c (1.1,
+ rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0),
+ src/uncompr.c (1.1, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0), src/zutil.c (1.1, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0) (utags: rel-3-6-2,
+ rel-3-6-0): Added for windows compilation. (thanks elrod)
+
+1999-12-02 Thursday 23:51 scott
+
+ * src/id3/dll_wrapper.cpp (1.10, rel-3-6-2): Fixed config.h macros.
+
+1999-12-02 Thursday 23:46 scott
+
+ * config.win32 (1.1), prj/id3lib.dsp (1.1, rel-3-6-2, rel-3-6-0),
+ prj/id3lib.dsw (1.1, rel-3-6-2, rel-3-6-0), prj/id3lib.mak (1.1,
+ rel-3-6-2, rel-3-6-0): Added to the distribution for windows
+ compilation.
+
+1999-12-02 Thursday 23:45 scott
+
+ * include/id3/: dll.h (1.2), error.h (1.2), field.h (1.2), frame.h
+ (1.2), globals.h (1.2), header.h (1.2), header_frame.h (1.2),
+ header_tag.h (1.2), int28.h (1.2), misc_support.h (1.3), tag.h
+ (1.2), types.h (1.2) (utags: rel-3-6-2, rel-3-6-0): Changed all of
+ the #include <id3/*> to #include "*" to help ensure that the sources
+ are searched for in the right places.
+
+1999-12-02 Thursday 02:58 scott
+
+ * Makefile.in (1.12), acconfig.h (1.6), aclocal.m4 (1.8),
+ config.h.in (1.6), configure (1.17), doc/Makefile.in (1.7),
+ doc/html/Makefile.in (1.3), doc/latex/Makefile.in (1.3),
+ doc/man/Makefile.in (1.3), doc/texinfo/Makefile.in (1.3),
+ include/Makefile (1.3), include/Makefile.in (1.3),
+ include/id3/Makefile (1.7), include/id3/Makefile.in (1.7),
+ m4/Makefile.in (1.7), src/Makefile.in (1.6),
+ src/examples/Makefile.in (1.9), src/id3/Makefile.in (1.15): Removed
+ automatically generated files. Will be generated in the normal
+ process of ./reconf && ./configure.
+
+1999-12-02 Thursday 02:47 scott
+
+ * src/: Makefile.am (1.5, rel-3-7-3, rel-3-7-2, rel-3-7-0,
+ rel-3-6-2), Makefile.in (1.5), id3/Makefile.am (1.8, rel-3-6-0,
+ rel-3-6-2), id3/Makefile.in (1.14): Removed EXTRA_DIST (no more
+ ChangeLog)
+
+1999-12-02 Thursday 02:46 scott
+
+ * doc/Makefile.am (1.5, rel-3-6-2), doc/Makefile.in (1.6),
+ src/examples/Makefile.am (1.7, rel-3-6-2), src/examples/Makefile.in
+ (1.8):
+ (EXTRA_DIST): Removed ChangeLog.
+
+1999-12-02 Thursday 02:33 scott
+
+ * ChangeLog (1.11): Coalesced all the ChangeLog's (previously one
+ for each directory) into this toplevel ChangeLog.
+
+1999-12-02 Thursday 02:33 scott
+
+ * README (1.4, rel-3-6-2): Spelling error corrected.
+
+1999-12-02 Thursday 02:33 scott
+
+ * NEWS (1.4): Updated for the 3.6.1 release.
+
+1999-12-02 Thursday 02:24 scott
+
+ * doc/ChangeLog (1.5, rel-3-7-5, rel-3-7-4, rel-3-7-3),
+ m4/ChangeLog (1.5), src/ChangeLog (1.2, rel-3-7-0, rel-3-6-2),
+ src/examples/ChangeLog (1.7), src/id3/ChangeLog (1.10): Merged into
+ the top-level ChangeLog.
+
+1999-12-01 Wednesday 23:22 scott
+
+ * src/id3/tag_render.cpp (1.10, rel-3-6-2):
+ (RenderV1ToHandle): Removed reference to tagV1---not used. Other
+ minor windows-compatibility fixes. (thanks elrod)
+
+1999-12-01 Wednesday 23:19 scott
+
+ * src/id3/tag_parse_v1.cpp (1.9, rel-3-6-2):
+ (ParseID3v1): Minor fix for windows compatibility (thanks elrod).
+
+1999-12-01 Wednesday 23:16 scott
+
+ * src/id3/tag_file.cpp (1.9, rel-3-6-2):
+ (truncate): Added. Defined only for windows, which doesn't have
+ unistd.h available (thanks elrod).
+
+1999-12-01 Wednesday 23:11 scott
+
+ * src/id3/misc_support.cpp (1.13, rel-3-6-2): Now returns 0 when
+ input is NULL.
+
+1999-12-01 Wednesday 23:10 scott
+
+ * include/id3/misc_support.h (1.2): Minor declaraction problem
+
+ (thanks, elrod).
+
+1999-12-01 Wednesday 20:13 scott
+
+ * configure (1.13), configure.in (1.10): Upped the patch number to
+ 1.
+
+1999-12-01 Wednesday 20:10 scott
+
+ * include/: Makefile (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7), Makefile.am (1.2,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0), Makefile.in (1.2), id3/Makefile
+ (1.2), id3/Makefile.am (1.2, rel-3-7-0, rel-3-6-2, rel-3-6-0),
+ id3/Makefile.in (1.2):
+ (EXTRA_DIST): Removed. No extra files to distribute
+
+1999-12-01 Wednesday 20:08 scott
+
+ * Makefile.am (1.5), Makefile.in (1.8):
+ (SUBDIRS): Added "include".
+
+1999-12-01 Wednesday 19:13 scott
+
+ * src/examples/Makefile.am (1.6, rel-3-6-2):
+ (INCLUDES): Updated to point to new toplevel include directory.
+
+1999-12-01 Wednesday 19:12 scott
+
+ * configure.in (1.9):
+ (AC_OUTPUT): Added include/Makefile and include/id3/Makefile
+
+1999-12-01 Wednesday 19:09 scott
+
+ * include/: Makefile.am (1.1), id3/Makefile.am (1.1) (utags:
+ rel-3-6-2, rel-3-7-0, rel-3-7-1, rel-3-7-2, rel-3-7-3, rel-3-7-4,
+ rel-3-6-0, rel-3-7-5): Initial revision.
+
+1999-12-01 Wednesday 19:03 scott
+
+ * src/id3/: Makefile.am (1.7), Makefile.in (1.9):
+ (INCLUDES): Now points to new, toplevel include directory.
+ (the_headers, id3includedir, id3include_HEADERS): Removed. Headers
+ are no longer in this directory.
+
+1999-12-01 Wednesday 19:00 scott
+
+ * src/id3/: dll_wrapper.cpp (1.9), error.cpp (1.9, rel-3-6-2),
+ field.cpp (1.10, rel-3-6-2), field_binary.cpp (1.8, rel-3-6-2),
+ field_integer.cpp (1.8, rel-3-6-2), field_string_ascii.cpp (1.10,
+ rel-3-6-2), field_string_unicode.cpp (1.10, rel-3-6-2), frame.cpp
+ (1.7, rel-3-6-2), frame_parse.cpp (1.7, rel-3-6-2),
+ frame_render.cpp (1.7, rel-3-6-2), header.cpp (1.7, rel-3-6-2),
+ header_frame.cpp (1.7, rel-3-6-2), header_tag.cpp (1.7, rel-3-6-2),
+ int28.cpp (1.7, rel-3-6-2), misc_support.cpp (1.12), tag.cpp (1.8,
+ rel-3-6-2), tag_file.cpp (1.8), tag_find.cpp (1.9, rel-3-6-2),
+ tag_parse.cpp (1.9, rel-3-6-2), tag_parse_lyrics3.cpp (1.7,
+ rel-3-6-2), tag_parse_v1.cpp (1.8), tag_render.cpp (1.9),
+ tag_sync.cpp (1.7, rel-3-6-2): Changed all of the #include <id3/*>
+ to #include "*" to help ensure that the sources are searched for in
+ the right places (and to make compiling under windows easier).
+
+1999-12-01 Wednesday 18:14 scott
+
+ * include/id3/dll.h (1.1), src/id3/dll.h (1.8, rel-3-6-0),
+ include/id3/error.h (1.1), src/id3/error.h (1.10),
+ include/id3/externals.h (1.1, rel-3-6-2, rel-3-6-0),
+ src/id3/externals.h (1.6), include/id3/field.h (1.1),
+ src/id3/field.h (1.11), include/id3/frame.h (1.1), src/id3/frame.h
+ (1.10), include/id3/globals.h (1.1), src/id3/globals.h (1.5),
+ include/id3/header.h (1.1), src/id3/header.h (1.7),
+ include/id3/header_frame.h (1.1), src/id3/header_frame.h (1.7),
+ include/id3/header_tag.h (1.1), src/id3/header_tag.h (1.6),
+ include/id3/int28.h (1.1), src/id3/int28.h (1.6),
+ include/id3/misc_support.h (1.1), src/id3/misc_support.h (1.9),
+ include/id3/sized_types.h (1.1, rel-3-6-2, rel-3-6-0),
+ src/id3/sized_types.h (1.2), include/id3/tag.h (1.1), src/id3/tag.h
+ (1.11), include/id3/types.h (1.1), src/id3/types.h (1.8),
+ include/id3/version.h (1.1, rel-3-6-2, rel-3-6-0),
+ src/id3/version.h (1.9): moved from src/id3 to include/id3
+
+1999-12-01 Wednesday 05:26 scott
+
+ * TODO (1.2, rel-3-6-2, rel-3-6-0): New stuff todo.
+
+1999-12-01 Wednesday 05:25 scott
+
+ * README (1.3, rel-3-6-0, rel-3-6-0): Renamed ID3Lib to id3lib.
+
+1999-12-01 Wednesday 05:21 scott
+
+ * COPYING (1.3, rel-3-6-2, rel-3-6-0): Renamed ID3Lib to id3lib.
+ Fixed spelling of "optimizations".
+
+1999-11-30 Tuesday 21:32 scott
+
+ * m4/: Makefile.am (1.4, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2), Makefile.in
+ (1.5) (utags: rel-3-6-0):
+ (m4macros): Removed sh_types.m4.
+
+1999-11-30 Tuesday 21:19 scott
+
+ * src/id3/version.cpp (1.1, rel-3-6-2, rel-3-6-0): Added.
+ Implements version functions declared in version.h.
+
+1999-11-30 Tuesday 21:18 scott
+
+ * src/id3/sized_types.h (1.1, rel-3-6-0): Added. Converted from
+ sh_types.h in toplevel m4 directory. Defines size-specific types
+ based on macros in limits.h. int8, uint8, int16, uint16, int32,
+ uint32.
+
+1999-11-30 Tuesday 21:16 scott
+
+ * src/id3/version.h (1.8, rel-3-6-0): Changed from preprocessor
+ macros to functions. Now changes to top level configure.in with
+ regards to version info will be reflected in these functions without
+ having to change this file.
+
+1999-11-30 Tuesday 21:13 scott
+
+ * src/id3/: misc_support.h (1.8), types.h (1.7) (utags: rel-3-6-0):
+ Removed include for wchar.h
+
+1999-11-30 Tuesday 21:12 scott
+
+ * src/id3/misc_support.cpp (1.11, rel-3-6-0): No more
+ SIZE_SPECIFIC_TYPES code. No more code for wchar's. Typedefs in
+ sized_types.h guarantee that unicode_t will be two bytes.
+
+1999-11-30 Tuesday 21:09 scott
+
+ * src/id3/globals.h (1.4, rel-3-6-0): No longer includes config.h.
+ No more SIZE_SPECIFIC_TYPES code. No more code for wchar_t. Added
+ include for sized_types.h.
+
+1999-11-30 Tuesday 21:08 scott
+
+ * src/id3/: Makefile.am (1.6, rel-3-6-0), Makefile.in (1.6):
+ (the_headers): Added sized_headers.h
+ (the_sources): Added version.cpp
+ (LTVERSION): Updated to make use of configure.in variables.
+
+1999-11-30 Tuesday 21:05 scott
+
+ * src/examples/: demo_convert.cpp (1.7), demo_info.cpp (1.3)
+ (utags: rel-3-6-2, rel-3-6-0): Updated to reflect changes from
+ version macros to version functions.
+
+1999-11-30 Tuesday 21:02 scott
+
+ * acconfig.h (1.5, rel-3-6-0), aclocal.m4 (1.5, rel-3-6-0),
+ config.h.in (1.5, rel-3-6-0), configure (1.9), doc/Makefile.in
+ (1.5, rel-3-6-0), doc/html/Makefile.in (1.2, rel-3-6-0),
+ doc/latex/Makefile.in (1.2, rel-3-6-0), doc/man/Makefile.in (1.2,
+ rel-3-6-0), doc/texinfo/Makefile.in (1.2, rel-3-6-0),
+ m4/Makefile.in (1.4), src/Makefile.in (1.4, rel-3-6-0),
+ src/examples/Makefile.in (1.6, rel-3-6-0): Changed as a result of
+ changes to Makefile.am and configure.in.
+
+1999-11-30 Tuesday 21:01 scott
+
+ * configure.in (1.8, rel-3-6-0):
+ * configure.in: Minor modifications. Removed call to
+ SH_SIZE_SPECIFIC_TYPES---these types are now defined in
+ src/id3/sized_types.h. Removed ID3LIB_NAME macro (same as PACKAGE).
+ Removed ID3LIB_RELEASE macro (same as VERSION). Renamed
+ ID3LIB_IDSTRING to ID3LIB_FULLNAME and removed the date part of it.
+
+1999-11-30 Tuesday 20:54 scott
+
+ * Makefile.am (1.4, rel-3-6-0), Makefile.in (1.4):
+ (EXTRA_DIST): Removed ChangeLog, configure, HISTORY, and TODO.
+ These are included in the distribution automatically.
+
+1999-11-30 Tuesday 20:41 scott
+
+ * m4/sh_types.m4 (1.2): Removed. Content now in
+ src/id3/sized_types.h (a more appropriate file).
+
+1999-11-30 Tuesday 15:25 scott
+
+ * configure.in (1.7): Generalized versioning mechanism so it only
+ has to be changed in this file to be propagated throughout rest of
+ source code. Used a hack to make libtool version coincide with
+ release versioning. This is expressly warned against in the libtool
+ docs, so it might be changed. However, it also seems to be a common
+ practice amongst other library writers, so I'm torn. Added
+ versioning macro definitions normally found in version.h. Probably
+ not the best place for this...
+
+1999-11-29 Monday 23:57 scott
+
+ * doc/: html/Makefile.am (1.1, rel-3-6-0, rel-3-6-2, rel-3-6-0),
+ html/Makefile.in (1.1), latex/Makefile.am (1.1, rel-3-6-0,
+ rel-3-6-2, rel-3-6-0), latex/Makefile.in (1.1), man/Makefile.am
+ (1.1, rel-3-6-0, rel-3-6-2, rel-3-6-0), man/Makefile.in (1.1),
+ texinfo/Makefile.am (1.1, rel-3-6-0, rel-3-6-2, rel-3-6-0),
+ texinfo/Makefile.in (1.1): Initial revision.
+
+1999-11-29 Monday 23:53 scott
+
+ * configure (1.8), configure.in (1.6): Added doc/*/Makefile to
+ AC_OUPUT
+
+1999-11-29 Monday 23:50 scott
+
+ * src/id3/: Makefile.am (1.5), Makefile.in (1.5):
+ (the_headers): Added globals.h to header file listing.
+
+1999-11-29 Monday 21:18 scott
+
+ * doc/: Makefile.am (1.4, rel-3-6-0), Makefile.in (1.4):
+ * Makefile.am: Removed refs to removed files.
+
+1999-11-29 Monday 20:42 scott
+
+ * src/examples/Makefile.am (1.5, rel-3-6-0, rel-3-6-0, rel-3-6-0):
+ Added the test tags to the distribution.
+
+1999-11-29 Monday 20:39 scott
+
+ * src/examples/: 221-compressed.tag (1.1), 230-compressed.tag
+ (1.1), 230-picture.tag (1.1), 230-unicode.tag (1.1), jules.mp3
+ (1.1) (utags: rel-3-6-2, rel-3-7-0, rel-3-6-0): Initial revision.
+
+1999-11-29 Monday 20:26 scott
+
+ * src/id3/: dll.h (1.7, rel-3-6-0), dll_wrapper.cpp (1.8,
+ rel-3-6-0), error.cpp (1.8, rel-3-6-0), error.h (1.9, rel-3-6-0),
+ externals.h (1.5, rel-3-6-0), field.cpp (1.9, rel-3-6-0), field.h
+ (1.10, rel-3-6-0), field_binary.cpp (1.7, rel-3-6-0),
+ field_integer.cpp (1.7, rel-3-6-0), field_string_ascii.cpp (1.9,
+ rel-3-6-0), field_string_unicode.cpp (1.9, rel-3-6-0), frame.cpp
+ (1.6, rel-3-6-0), frame.h (1.9, rel-3-6-0), frame_parse.cpp (1.6,
+ rel-3-6-0), frame_render.cpp (1.6, rel-3-6-0), globals.h (1.3),
+ header.cpp (1.6, rel-3-6-0), header.h (1.6, rel-3-6-0),
+ header_frame.cpp (1.6, rel-3-6-0), header_frame.h (1.6, rel-3-6-0),
+ header_tag.cpp (1.6, rel-3-6-0), header_tag.h (1.5, rel-3-6-0),
+ int28.cpp (1.6, rel-3-6-0), int28.h (1.5, rel-3-6-0),
+ misc_support.cpp (1.10), misc_support.h (1.7), tag.cpp (1.7,
+ rel-3-6-0), tag.h (1.10, rel-3-6-0), tag_file.cpp (1.7, rel-3-6-0),
+ tag_find.cpp (1.8, rel-3-6-0), tag_parse.cpp (1.8, rel-3-6-0),
+ tag_parse_lyrics3.cpp (1.6, rel-3-6-0), tag_parse_v1.cpp (1.7,
+ rel-3-6-0), tag_render.cpp (1.8, rel-3-6-0), tag_sync.cpp (1.6,
+ rel-3-6-0), types.h (1.6), version.h (1.7): Updated the leading
+ license information of the file to reflect new maintainer.
+
+1999-11-29 Monday 20:17 scott
+
+ * src/id3/misc_support.h (1.6): Renamed ID3_ASCIItoUnicode to
+ mbstoucs. Renamed ID3_UnicodeToASCII to ucstombs. Added
+ declarations for ucslen, ucscpy, ucsncpy, ucscmp, and ucsncmp.
+
+1999-11-29 Monday 20:15 scott
+
+ * src/id3/globals.h (1.2): Updated documentation to work better
+ with doc++ (probably doesn't work well with kdoc anymore). Added
+ the unicode_t typedef.
+
+1999-11-29 Monday 20:13 scott
+
+ * src/id3/version.h (1.6): Updated documentation to work better
+ with doc++ (probably doesn't work well with kdoc anymore). Updated
+ the constants.
+
+1999-11-29 Monday 20:05 scott
+
+ * src/id3/: field.h (1.9), frame.h (1.8), tag.h (1.9): Updated
+ documentation to work better with doc++ (probably doesn't work well
+ with kdoc anymore).
+
+1999-11-29 Monday 19:56 scott
+
+ * src/id3/misc_support.cpp (1.9): (): Made includsion of wchar.h
+ dependant on SIZE_SPECIFIC_TYPES. Put in compile-time checks to
+ compile differently based on the definition of unicode_t.
+ (mbstoucs): Renamed from ID3_ASCIItoUnicode.
+ (ucstombs): Renamed from ID3_UnicodeToASCII.
+ (ucslen): Added. Returns the length of a unicode character string.
+ (ucscpy): Added. Copies one unicode string to another.
+ (ucsncpy): Added. Copies n chars from one unicode string to
+ another.
+ (ucscmp): Added. Compares two unicode strings.
+ (ucsncmp): Added. Compares the first n chars of two unicode
+ strings.
+
+1999-11-29 Monday 19:47 scott
+
+ * src/id3/tag_find.cpp (1.7): (): Updated methods to use unicode_t
+ instead of wchar_t. unicode_t is defined in globals.h. The type
+ unicode_t is more likely to be two bytes on every platform. Updated
+ calls to unicode methods to more general methods defined in
+ misc_support.cpp.
+
+1999-11-29 Monday 19:15 scott
+
+ * src/id3/field_string_unicode.cpp (1.8): (): Updated methods to
+ use unicode_t instead of wchar_t. unicode_t is defined in
+ globals.h. The type unicode_t is more likely to be two bytes on
+ every platform. Updated calls to unicode methods to more general
+ methods defined in misc_support.cpp.
+ (ParseUnicodeString): Fixed a bug (?) to make unicode parsing work.
+ Not really sure if this is the source of the bug, or if there is a
+ more pervasive misunderstanding of the format of unicode. Need to
+ check on this.
+
+1999-11-29 Monday 18:23 scott
+
+ * src/id3/field_string_ascii.cpp (1.8): Updated methods to use
+ unicode_t instead of wchar_t. unicode_t is defined in globals.h.
+ The type unicode_t is more likely to be two bytes on every platform.
+ Updated calls to unicode methods to more general methods defined in
+ misc_support.cpp.
+
+1999-11-29 Monday 18:21 scott
+
+ * src/id3/field.cpp (1.8): Updated methods to use unicode_t instead
+ of wchar_t. unicode_t is defined in globals.h. The type unicode_t
+ is more likely to be two bytes on every platform.
+
+1999-11-29 Monday 18:00 scott
+
+ * src/id3/error.h (1.8): Updated documentation to work better with
+ doc++ (probably doesn't work well with kdoc anymore).
+
+1999-11-29 Monday 16:11 scott
+
+ * src/id3/: dll.h (1.6), dll_wrapper.cpp (1.7): Updated unicode
+ function declarations to now pass unicode_t instead of wchar_t.
+ unicode_t now defined in globals.h.
+
+1999-11-29 Monday 16:04 scott
+
+ * doc/Makefile.in (1.3): Updated as a result of changes to
+ Makefile.am.
+
+1999-11-29 Monday 16:04 scott
+
+ * doc/Makefile.am (1.3): Added.
+
+1999-11-29 Monday 16:03 scott
+
+ * AUTHORS (1.3, rel-3-6-2, rel-3-6-2, rel-3-6-0): Included text
+ from contact.txt in original distribution.
+
+1999-11-29 Monday 16:01 scott
+
+ * Makefile.in (1.3), acconfig.h (1.4), aclocal.m4 (1.4),
+ config.h.in (1.4), configure (1.7): Updated as a result of changes
+ to configure.in.
+
+1999-11-29 Monday 16:00 scott
+
+ * configure.in (1.5): Added many more checks. Restructured into
+ more logical groups.
+
+1999-11-29 Monday 15:56 scott
+
+ * m4/sh_types.m4 (1.1): Added. Defines size-specific typedefs
+ based on macro defs in limits.h.
+
+1999-11-29 Monday 15:55 scott
+
+ * m4/lf_cxx_convenience.m4 (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0): Added. Pulled out non-portability macros from
+ lf_cxx.m4.
+
+1999-11-29 Monday 15:45 scott
+
+ * m4/lf_cxx.m4 (1.2, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0):
+ Moved conenience macros to lf_cxx_convenience.m4.
+
+1999-11-29 Monday 15:44 scott
+
+ * m4/: Makefile.am (1.3, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7), Makefile.in (1.3):
+ Added sh_types.m4 and lf_cxx_convenience.m4 to distribution.
+
+1999-11-26 Friday 18:29 scott
+
+ * doc/contact.txt (1.3):
+ * contact.txt: Removed. Relevant information updated and included
+ in README and AUTHORS.
+
+1999-11-26 Friday 18:09 scott
+
+ * doc/software.txt (1.2, rel-3-6-2, rel-3-6-0): Removed. No longer
+ applies to this fork.
+
+1999-11-26 Friday 17:17 scott
+
+ * doc/: id3v2-3.00.txt (1.2, rel-3-6-2, rel-3-6-0), id3guide.html
+ (1.2, rel-3-6-2, rel-3-6-0), logo.txt (1.2, rel-3-6-2, rel-3-6-0),
+ contact.txt (1.2), bugreport.txt (1.2, rel-3-6-2, rel-3-6-0):
+ dos2unix'ified
+
+1999-11-26 Friday 17:01 scott
+
+ * doc/licence.txt (1.2): Removed. Replaced with COPYING file in
+ top dir.
+
+1999-11-26 Friday 16:58 scott
+
+ * doc/id3libhistory.txt (1.3): Removed. Replaced with HISTORY file
+ in top dir.
+
+1999-11-26 Friday 16:06 scott
+
+ * doc/zlib_readme.txt (1.2):
+ * zlib_readme.txt: Removed. zlib sources no longer included in the
+ distribution.
+
+1999-11-26 Friday 16:03 scott
+
+ * doc/id3lib305.doc (1.2):
+ * id3lib305.doc: Removed. Replaced with inline documentation found
+ in source, converted into various formats (html, latex, texinfo,
+ man) using doc++ or kdoc.
+
+1999-11-25 Thursday 20:25 scott
+
+ * src/id3/version.h (1.5): Added doc++/kdoc/javadoc-like
+ documentation. Replaced #define's with const's.
+
+1999-11-25 Thursday 20:24 scott
+
+ * src/id3/types.h (1.5): Removed typedefs, which are now included
+ in the globas.h file.
+
+1999-11-25 Thursday 20:22 scott
+
+ * src/id3/tag.h (1.8): (): Added doc++/kdoc/javadoc-like
+ documentation, mostly transcribed from Dirk's ID3Lib Documentation
+ MSWord doc.
+ (ID3_TagTypes): Added. The different types of tags that can be
+ parsed and/or rendered by id3lib. (class ID3_Tag): Changed the
+ interface to AddFrame slightly. Now there is two AddTag-like
+ methods: AddTag and AddNewTag. The former merely attaches the frame
+ to the tag without taking repsonsibility for deallocating the frame
+ when the tag goes out of scope or is deleted. The latter does take
+ this responsibility. Granted, there could be a better interface for
+ this, but it works for now... Update and Strip now return flags
+ which indicate what tags were actually updated or stripped. Removed
+ OpenLinkedFile method; replaced with OpenFileForReading,
+ OpenFileForWriting, and CreateFile.
+
+1999-11-25 Thursday 20:15 scott
+
+ * src/id3/frame.h (1.7): Added doc++/kdoc/javadoc-like
+ documentation, mostly transcribed from Dirk's ID3Lib Documentation
+ MSWord doc.
+
+1999-11-25 Thursday 20:11 scott
+
+ * src/id3/field.h (1.8): Added doc++/kdoc/javadoc-like
+ documentation, mostly transcribed from Dirk's ID3Lib Documentation
+ MSWord doc. (ID3_FieldFlags ): Created enumeration to replace
+ generic constants.
+ (ID3_FieldID): Removed. Replaced in globals.h.
+ (ID3_FrameID): Removed. Replaced in globals.h. (class ID3_Field):
+ Made the constructor private.
+
+1999-11-25 Thursday 20:05 scott
+
+ * src/id3/error.h (1.7): Added doc++/kdoc/javadoc-like
+ documentation.
+ (ID3_Err): Added error types SmallBuffer and ReadOnly.
+
+1999-11-25 Thursday 19:52 scott
+
+ * src/id3/misc_support.cpp (1.8):
+ * misc_support.cpp: Replaced every call to AddFrame with
+ AddNewFrame.
+
+1999-11-25 Thursday 19:51 scott
+
+ * src/id3/tag_render.cpp (1.7):
+ (Render): Replaced manual array initialization with call to memset.
+ (GenerateTempName): Removed method. No longer used.
+ (RenderV1): New method. Renders an id3v1 tag to an array.
+ (RenderV1ToHandle): Moved work of writing tag to array to RenderV1.
+ (RenderV2ToHandle): Rather than generating a temporary file name
+ with mktemp (or similar) and opening that file name to a temporary
+ file, we now use tmpfile to create a temporary file directly.
+ Unfortunately, this means we can't just rename the tempfile to the
+ original file when all the copying is done, so we have to perform a
+ second copy from the temp file back to the original. This makes the
+ code less efficient but more portable, as we rely on tmpfile for
+ knowing where to create the temporary file. To improve, we'll need
+ to figure out a portable mechanism for creating temporary files
+
+ (i.e., resolve the differences between /tmp/ and C:\temp\).
+
+1999-11-25 Thursday 19:41 scott
+
+ * src/id3/tag_parse.cpp (1.7):
+ (ProcessBinaries): Minor code reorg.
+
+1999-11-25 Thursday 19:39 scott
+
+ * src/id3/tag_file.cpp (1.6):
+ (OpenLinkedFile): Removed method. Replaced with CreateFile,
+ OpenFileForReading, and OpenFileForWriting.
+ (CreateFile): New method. Creates a new file with file name
+ sFileName. Throws if unable to.
+ (OpenFileForWriting): New method. Opens a file with write
+ permissions. Throws if unable to.
+ (OpenFileForReading): New method. Opens a file with read
+ permissions. Throws if unable to.
+ (CloseFile): New method. Closes a file. Returns true if
+ successful, false otherwise.
+ (Link): Now dynamically allocate sFileName. Make use of new method
+ OpenFileForReading rather than OpenLinkedFile. Closes the file when
+ done.
+ (Update): Now returns a flag indicating which tags were actually
+ written. Calls OpenFileForWriting to open the file appropriately.
+ Closes the file when done.
+ (Strip): Now returns a flag indicating which tags were actually
+ written. Now strips a file "in place," by copying the non-stripped
+ information to the beginning of the file and using ftruncate to chop
+ off the rest. Prevents having to create a temporary file. Calls
+ OpenFileForWriting to open the file appropriately. Closes the file
+ when done.
+
+1999-11-25 Thursday 19:24 scott
+
+ * src/id3/tag.cpp (1.6):
+ (SetupTag): Initialized sFileName to NULL rather than the empty
+ string to indicate no filename is present.
+ (ID3_Tag): Deleted sFileName if allocated. Added call to CloseFile.
+ (AddFrame): Modified to reflect change in interface. AddFrame now
+ adds a frame without taking responsibility for deallocating the
+ memory when the tag goes out of scope.
+ (AddNewFrame): New method. AddNewFrame adds a frame and takes
+ responsibility for deallocating the frame when the tag goes out of
+ scope.
+
+1999-11-25 Thursday 19:17 scott
+
+ * src/id3/error.cpp (1.7):
+ (ID3_ErrorDescs): Added descriptions for new error types.
+ (ID3_Error): Minor bugfix in string copying.
+
+1999-11-25 Thursday 19:15 scott
+
+ * src/id3/dll.h (1.5): Removed many of the enums and typedefs to
+ globals.h to reduce redundancy.
+
+1999-11-25 Thursday 19:13 scott
+
+ * src/id3/globals.h (1.1):
+ * globals.h: Added. Includes constants, typedefs, and enums common
+ to several files that were redundantly copying them.
+
+1999-11-25 Thursday 19:11 scott
+
+ * src/examples/Makefile.am (1.4): Removed demo_strip from the make
+ rules.
+
+1999-11-25 Thursday 19:01 scott
+
+ * src/examples/demo_convert.cpp (1.6): Adding stripping
+ capabilities with the -s flag.
+
+1999-11-25 Thursday 18:38 scott
+
+ * Makefile.am (1.3):
+ * Makefile.am (EXTRA_DIST): Added HISTORY and TODO
+
+1999-11-25 Thursday 18:15 scott
+
+ * src/examples/demo_convert.cpp (1.5):
+ * demo_convert.cpp
+ (PrintUsage): Added for printing usage information.
+ (PrintVersion): Added for printing version information.
+ (DisplayTags): Added for printing out the contents of a tag flag.
+ (main): Modified to make use of command-line options via option.h.
+ Can now choose which type of tag to convert to, can convert multiple
+ tags at once. Can print out usage and version info.
+
+1999-11-25 Thursday 07:20 scott
+
+ * doc/id3libhistory.txt (1.2): Reformatted to fit within 80 chars.
+
+1999-11-25 Thursday 07:19 scott
+
+ * THANKS (1.2, rel-3-6-2, rel-3-6-0): Transcribed the Thanks
+ section from Dirk's original documentation.
+
+1999-11-25 Thursday 07:18 scott
+
+ * README (1.2): Filled the README with semi-useful information.
+
+1999-11-25 Thursday 07:17 scott
+
+ * NEWS (1.2): Actually added some news.
+
+1999-11-25 Thursday 07:14 scott
+
+ * HISTORY (1.1, rel-3-6-2, rel-3-6-0), TODO (1.1): Initial
+ revision.
+
+1999-11-25 Thursday 07:14 scott
+
+ * COPYING (1.2): Change from the GPL to the original statement
+ about being in the Public Domain.
+
+1999-11-25 Thursday 07:13 scott
+
+ * AUTHORS (1.2, rel-3-6-0, rel-3-0-6pre1): Minor clarification.
+
+1999-11-19 Friday 20:27 scott
+
+ * src/id3/tag_render.cpp (1.6):
+ (RenderV1ToHandle): Added. Adds or overwrites an id3v1 tag to a
+ file handle. Needs testing.
+ (RenderV2ToHandle): Renamed from RenderToHandle.
+
+1999-11-19 Friday 20:12 scott
+
+ * src/id3/tag_parse_v1.cpp (1.6):
+ (ID3_RemoveTrailingSpaces): Minor code cleanup.
+ (ParseID3v1): Massive recoding of method to make use of new
+ functions defined in misc_support. Simplifies flow of method.
+
+1999-11-19 Friday 20:10 scott
+
+ * src/id3/tag_find.cpp (1.6):
+ * tag_find.cpp (Find): Add const qualifier.
+
+1999-11-19 Friday 20:09 scott
+
+ * src/id3/tag_file.cpp (1.5):
+ (Update): Changed parameter to be a flag which indicates which type
+ of tag to update, either V1_TAG, V2_TAG, or BOTH_TAGS. Updated
+ method to act appropriately based on the parameter passed in.
+ (Strip): Changed parameter to be a flag which indicates which type
+ of tag to update, either V1_TAG, V2_TAG, or BOTH_TAGS. Updated
+ method to act appropriately based on the parameter passed in.
+
+1999-11-19 Friday 20:07 scott
+
+ * src/id3/tag.h (1.7):
+ * tag.h: Added new constants: STR_V1_COMMENT_DESC (to be added to
+ the description of comments converted from id3v1 tags); V1_TAG,
+ V2_TAG, and BOTH_TAGS (used for methods Strip and Update to
+ determine which tag to act on); and LEN_V1, LEN_V1_ID, LEN_V1_TITLE,
+ LEN_V1_ARTIST, LEN_V1_ALBUM, LEN_V1_YEAR, LEN_V1_COMMENT,
+ LEN_V1_GENRE (the lengths of the id3v1 tag and its fields).
+ Generalized ID3V1_Tag struct using newly defined constants. Added 1
+ to each char array size for null terminator. Added const qualifier
+ to appropriate methods and parameters. Added declaration of
+ RenderV1ToHandle method. Renamed "RenderToHandle" to
+ "RenderV2ToHandle".
+
+1999-11-19 Friday 19:59 scott
+
+ * src/id3/misc_support.h (1.5):
+ * misc_support.h: Added the function declarations for ID3_GetString,
+ ID3_GetArtist, ID3_GetAlbum, ID3_GetTitle, ID3_GetYear, ID3_AddYear,
+ ID3_GetComment, ID3_AddComment, ID3_GetTrack, ID3_GetTrackNum,
+ ID3_AddTrack, ID3_GetGenre, ID3_GetGenreNum, and ID3_GetLyrics.
+
+1999-11-19 Friday 19:53 scott
+
+ * src/id3/misc_support.cpp (1.7):
+ (ID3_ASCIItoUnicode): Updated interface to make parameters const.
+ Replaced content of the code with call to mbstowcs, a function
+ defined in wchar.h for converting from a regular string to a wchar
+ string. The original code might be reinstated if another type is
+ used to store unicode characters.
+ (ID3_UnicodeToASCII): Updated interface to make parameters const.
+ Replaced content of the code with call to wcstombs, a function
+ defined in wchar.h for converting from a wchar string to a regular
+ string. The original code might be reinstated if another type is
+ used to store unicode characters.
+ (ID3_GetString): Added. Returns a dynamically-allocated copy of the
+ string contained in the frame/field parameters.
+ (ID3_GetArtist): Added. Returns the artist as a string. Will
+ return the LEADARTIST, the BAND, the CONDUCTOR, or the COMPOSER,
+ whichever is found first in that order.
+ (ID3_GetAlbum): Added. Returns the album as a string.
+ (ID3_GetTitle): Added. Returns the song title as a string.
+ (ID3_GetYear): Added. Returns the year as a string.
+ (ID3_AddYear): Added. Adds the year as a string to the frame.
+ (ID3_GetComment): Added. Returns the first comment found as a
+ string.
+ (ID3_AddComment): Added. Adds the comment as a string with the
+ description stored in STR_V1_COMMENT_DESC, currently
+ "ID3v1_Comment". Won't add if a tag with that or no description
+ already exists.
+ (ID3_GetTrack): Added. Returns the track number as a string.
+ (ID3_GetTrackNum): Added. Returns the track number as an unsigned
+ integer.
+ (ID3_AddTrack): Added. Adds the track number and track total as a
+ string in the form "N/T", where N is the track number and T is the
+ total. If no total is indicated, then only the track number is
+ added.
+ (ID3_GetGenre): Added. Returns the genre as a string.
+ (ID3_GetGenreNum): Added. Returns the genre as a number.
+ (ID3_AddGenre): Added. Adds the genre number as a string in the
+ form "(G)", where G is the genre number.
+ (ID3_GetLyrics): Added. Gets the unsynced lyrics as a string.
+
+1999-11-19 Friday 18:49 scott
+
+ * src/id3/field_string_unicode.cpp (1.7): (operator=): Updated
+ interface to make parameters const.
+ (Set): Updated interface to make parameters const. Bug fix for
+ fixed length strings. Minor variable renaming.
+ (Add): Updated interface to make parameters const.
+ (Get): Updated interface to make parameters const. Fixed bug which
+ would add a null character to the string regardless of the length of
+ string requested. Now only adds a null when the actual length of
+ the string is less than the maxium number of characters requested.
+
+1999-11-19 Friday 18:34 scott
+
+ * src/id3/field_string_ascii.cpp (1.7): (operator=): Updated
+ interface to make parameters const.
+ (Set): Updated interface to make parameters const. Bug fix for
+ fixed length strings.
+ (Get): Removed check for nonempty strings so empty strings would be
+ set correctly. Minor code cleanup.
+ (Add): Updated interface to make parameters const. Made variable
+ name more descriptive.
+
+1999-11-19 Friday 18:29 scott
+
+ * src/id3/field_integer.cpp (1.6):
+ (ParseInteger): Updated interface to make parameters const.
+
+1999-11-19 Friday 18:28 scott
+
+ * src/id3/field_binary.cpp (1.6):
+ (Set): Updated interface to make parameters const.
+ (FromFile): Updated interface to make parameters const.
+ (ToFile): Updated interface to make parameters const.
+ (ParseBinary): Updated interface to make parameters const.
+
+1999-11-19 Friday 18:19 scott
+
+ * src/id3/field.h (1.7):
+ * field.h (class ID3_Field): Updated method interfaces to make
+ appropriate parameters const.
+
+1999-11-19 Friday 18:18 scott
+
+ * src/id3/field.cpp (1.7):
+ * field.cpp
+ (BinSize): Added check for an ascii string when called by Size,
+ since we store every string internally as unicode.
+ (Parse): Updated interface to make parameters const.
+ (ID3_FindFrameDef): Updated interface to make parameter const.
+ (ID3_FindFrameID): Updated interface to make parameter const.
+
+1999-11-19 Friday 18:13 scott
+
+ * src/id3/dll_wrapper.cpp (1.6):
+ * dll_wrapper.cpp (ID3Tag_Strip): Updated for interface change to
+ Tag::Strip. Now accepts tag flags rather than a v1 boolean.
+
+1999-11-19 Friday 18:10 scott
+
+ * src/examples/: Makefile.am (1.3), Makefile.in (1.3): Added
+ compilation options for demo_strip.cpp
+
+1999-11-19 Friday 18:09 scott
+
+ * src/examples/demo_info.cpp (1.2):
+ * demo_info.cpp: Added runtime options for version and help. Minor
+ code cleanup.
+
+1999-11-19 Friday 17:56 scott
+
+ * src/examples/demo_strip.cpp (1.1):
+ * demo_strip.cpp: Initial revision.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/tag_parse.cpp (1.6):
+ * tag_parse.cpp
+ (ProcessBinaries): Added try/catch block to catch any exceptions so
+ that the parser can carry on parsing the rest of the frames if any
+ particular frame is poorly encoded. Need to add some sort of
+ mechanism to determine how many frames exist, how many have been
+ parsed correctly and how many have been parsed incorrectly.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/field_string_unicode.cpp (1.6):
+ * field_string_unicode.cpp
+ (ParseUnicodeString): Put in sanity check for indices so that memcpy
+ doesn't go out of bounds. Made unicode code more specific to the
+ type of data storing unicode characters. This fix doesn't work if
+ the type is different than two bytes in size. Need to fix so that
+ the type is guaranteed to be two bytes.
+ (RenderUnicodeString): Made unicode code more specific to the type
+ of data storing unicode characters.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/field_string_ascii.cpp (1.6):
+ * field_string_ascii.cpp (ParseASCIIString): Added sanity check for
+ indices so we don't call memcpy with out-of-bounds indices.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/field.cpp (1.6):
+ * field.cpp (Render): Minor reformatting.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/error.h (1.6):
+ * error.h (ID3_Err): Added new ID3_Err: ID3E_BadData.
+
+1999-11-16 Tuesday 23:50 scott
+
+ * src/id3/error.cpp (1.6):
+ * error.cpp (ID3_ErrorDescs): Added text entry for ID3E_BadData.
+
+1999-11-16 Tuesday 06:32 scott
+
+ * src/id3/: Makefile.am (1.4), Makefile.in (1.3), ChangeLog (1.2,
+ rel-3-6-0) (utags: rel-3-0-6pre1):
+ * Makefile.am: Upped the version info to 3.0.6.
+
+1999-11-16 Tuesday 06:30 scott
+
+ * src/examples/readme.txt (1.2, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1): Reformatted.
+
+1999-11-16 Tuesday 06:29 scott
+
+ * src/examples/: Makefile.am (1.2), Makefile.in (1.2) (utags:
+ rel-3-0-6pre1): Added macros to allow for compiling test programs
+ id3convert and id3info.
+
+1999-11-16 Tuesday 06:28 scott
+
+ * src/examples/demo_convert.cpp (1.4, rel-3-0-6pre1): More
+ descriptive error message.
+
+1999-11-16 Tuesday 06:27 scott
+
+ * src/examples/demo_main.cpp (1.2, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1): Reformatted, dos2unix, cleaned up code, etc.
+
+1999-11-16 Tuesday 06:25 scott
+
+ * doc/: Makefile.am (1.2), Makefile.in (1.2) (utags:
+ rel-3-0-6pre1):
+ (EXTRA_DIST): Added doc files that are to be distributed.
+
+1999-11-16 Tuesday 06:23 scott
+
+ * m4/: Makefile.am (1.2, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2), Makefile.in (1.2)
+ (utags: rel-3-0-6pre1): Adjusted so that the macros aren't
+ installed.
+
+1999-11-16 Tuesday 06:21 scott
+
+ * src/: Makefile.am (1.4, rel-3-6-0), Makefile.in (1.2) (utags:
+ rel-3-0-6pre1):
+ (EXTRA_DIST): Added ChangeLog.
+ (SUBDIRS): Added examples.
+
+1999-11-16 Tuesday 06:09 scott
+
+ * doc/ChangeLog (1.1), src/examples/jules-badtag.mp3 (1.1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ src/examples/jules-goodtag.mp3 (1.1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), src/examples/demo_info.cpp (1.1,
+ rel-3-0-6pre1): Initial revision.
+
+1999-11-16 Tuesday 06:09 scott
+
+ * configure (1.5), configure.in (1.4) (utags: rel-3-0-6pre1):
+ Changed the distribution version to 3.0.6pre1.
+
+1999-11-16 Tuesday 06:00 scott
+
+ * Makefile.am (1.2), Makefile.in (1.2) (utags: rel-3-0-6pre1):
+ Added EXTRA_DIST and moved EXTRA_SUBDIRS to SUBDIRS.
+
+1999-11-15 Monday 21:48 scott
+
+ * .cvsignore (1.1), doc/.cvsignore (1.1, rel-3-6-0, rel-3-0-6pre1),
+ m4/.cvsignore (1.1, rel-3-6-0, rel-3-0-6pre1), src/.cvsignore (1.1,
+ rel-3-6-0, rel-3-0-6pre1), src/examples/.cvsignore (1.1),
+ src/id3/.cvsignore (1.1, rel-3-0-6pre1): Initial revision.
+
+1999-11-15 Monday 21:23 scott
+
+ * src/id3/dll_wrapper.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h.
+
+1999-11-15 Monday 21:23 scott
+
+ * src/id3/ChangeLog (1.1): Initial entry. The current entries are
+ actually entries culminated over a couple of weeks of work. I have
+ to make better use of this tool...
+
+1999-11-15 Monday 21:21 scott
+
+ * src/id3/tag_render.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Minor code cleanup. Removed assignments from if checks;
+ first makes assignment, then checks for appropriate value. Made
+ private member variable names more descriptive. Now uses mktemp
+ rather than mkstemp in GenerateTempName so that a file descriptor
+ isn't created along with the temporary name.
+
+1999-11-15 Monday 21:20 scott
+
+ * src/id3/tag_find.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Removed assignments from if checks; first makes
+ assignment, then checks for appropriate value. Made private member
+ variable names more descriptive. Major code cleanup: use of for
+ loops instead of while's to ease code readability, more compact
+ looping structures to reduce possibility in coding or human parsing
+ errors,
+
+1999-11-15 Monday 21:20 scott
+
+ * src/id3/tag_file.cpp (1.4, rel-3-0-6pre1): Added include for
+ config.h. Minor code cleanup. Removed assignments from if checks;
+ first makes assignment, then checks for appropriate value. Made
+ private member variable names more descriptive. OpenLinkedFile now
+ checks to see if the file is writable or not, and still opens the
+ file, even if it can't be written to. This needs to be more robust
+
+ (i.e., we shouldn't be creating temp files if the file isn't
+ writable). Made use of bFileWrtiable variable, which was
+ introduced.
+
+1999-11-15 Monday 21:20 scott
+
+ * src/id3/tag.h (1.6, rel-3-0-6pre1): Made variable names more
+ descriptive. Added const qualifier to appropriate methods.
+
+1999-11-15 Monday 21:19 scott
+
+ * src/id3/int28.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Changed some ints to luints to avoid compiler warnings.
+
+1999-11-15 Monday 21:18 scott
+
+ * src/id3/: header.h (1.5), header_frame.h (1.5) (utags:
+ rel-3-0-6pre1): Made variable names more descriptive.
+
+1999-11-15 Monday 21:18 scott
+
+ * src/id3/header.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Minor code cleanup. Made private member variable names
+ more descriptive. Fixed bug I introduced in logic of checking
+ version/revision numbers in ID3_LookupHeaderInfo, and cleaned up the
+ code in the process.
+
+1999-11-15 Monday 21:18 scott
+
+ * src/id3/: frame_parse.cpp (1.5), header_tag.cpp (1.5) (utags:
+ rel-3-0-6pre1): Added include for config.h. Made variable names
+ more descriptive.
+
+1999-11-15 Monday 21:18 scott
+
+ * src/id3/frame.h (1.6, rel-3-0-6pre1): Made ID3_Tag a friend of
+ ID3_Frame to allow access to the private members in ID3_Frame. Made
+ variable names more descriptive. Added const qualifier to
+ appropriate methods.
+
+1999-11-15 Monday 21:15 scott
+
+ * src/id3/: field_binary.cpp (1.5), field_integer.cpp (1.5),
+ field_string_ascii.cpp (1.5), field_string_unicode.cpp (1.5),
+ frame.cpp (1.5), frame_render.cpp (1.5), header_frame.cpp (1.5),
+ misc_support.cpp (1.6), tag.cpp (1.5), tag_parse.cpp (1.5),
+ tag_parse_lyrics3.cpp (1.5), tag_parse_v1.cpp (1.5), tag_sync.cpp
+ (1.5) (utags: rel-3-0-6pre1): Added include for config.h. Minor
+ code cleanup. Removed assignments from if checks; first makes
+ assignment, then checks for appropriate value. Made private member
+ variable names more descriptive.
+
+1999-11-15 Monday 21:15 scott
+
+ * src/id3/field.h (1.6, rel-3-0-6pre1): Made ID3_Frame and ID3_Tag
+ friends of the ID3_Field class to allow access to the private
+ members in ID3_Field. Made ID3FF field flags const luints, rather
+ than #define's. Made member variable names of classes and structs
+ more descriptive.
+
+1999-11-15 Monday 21:15 scott
+
+ * src/id3/field.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Replaced LU_NULL with ID3FF_NONE for more consistency in
+ flag naming. Blocked out the ID3FD_Volume array definition since it
+ is currently unused. Reformatted ID3_FrameDefs for easier reading
+ (although most lines are more than 80 chars long now). Made private
+ member variable names more descriptive. Fixed bug in SetVersion
+ (was checking "rev != rev"). Adjusted logic somewhat in BinSize to
+ ease code reading. Fixed bug in BinSize that was causing incorrect
+ parsing of correct frames, such as COMM (previously assumed a
+ wchar_t is 2 bytes, which might not be true on some platforms).
+
+1999-11-15 Monday 21:15 scott
+
+ * src/id3/error.h (1.5, rel-3-0-6pre1): Made constructor public.
+ Added new interface to error reporting to allow for more descriptive
+ error messages (this should still be worked on). Made private
+ member variable names more descriptive. Added const qualifier to
+ appropriate methods.
+
+1999-11-15 Monday 21:15 scott
+
+ * src/id3/error.cpp (1.5, rel-3-0-6pre1): Added include for
+ config.h. Added new interface to error reporting to allow for more
+ descriptive error messages (this should still be worked on). Made
+ private member variable names more descriptive.
+
+1999-11-15 Monday 21:13 scott
+
+ * src/id3/: Makefile.am (1.3, rel-3-7-0, rel-3-6-2), Makefile.in
+ (1.2):
+ * Makefile.am, Makefile.in: Updated versioning info and CXXFLAGS
+
+1999-11-04 Thursday 06:19 scott
+
+ * src/examples/demo_convert.cpp (1.3): Removed deprecated call to
+ SetVersion (now a private method)
+
+1999-11-04 Thursday 05:33 scott
+
+ * m4/Makefile.in (1.1), doc/Makefile.in (1.1), src/Makefile.in
+ (1.1), src/id3/Makefile.in (1.1), src/examples/Makefile.in (1.1):
+ Initial revision.
+
+1999-11-04 Thursday 05:32 scott
+
+ * Makefile.in (1.1), acconfig.h (1.3, rel-3-0-6pre1), aclocal.m4
+ (1.3, rel-3-0-6pre1), config.h.in (1.3, rel-3-0-6pre1), configure
+ (1.4), src/id3/error.h (1.4), src/id3/field.h (1.5),
+ src/id3/frame.h (1.5), src/id3/tag.h (1.5): Initial revision
+
+1999-11-04 Thursday 05:15 scott
+
+ * src/id3/: dll.h (1.4, rel-3-0-6pre1), dll_wrapper.cpp (1.4),
+ error.cpp (1.4), error.h (1.3), externals.h (1.4, rel-3-0-6pre1),
+ field.cpp (1.4), field.h (1.4), field_binary.cpp (1.4),
+ field_integer.cpp (1.4), field_string_ascii.cpp (1.4),
+ field_string_unicode.cpp (1.4), frame.cpp (1.4), frame.h (1.4),
+ frame_parse.cpp (1.4), frame_render.cpp (1.4), header.cpp (1.4),
+ header.h (1.4), header_frame.cpp (1.4), header_frame.h (1.4),
+ header_tag.cpp (1.4), header_tag.h (1.4, rel-3-0-6pre1), int28.cpp
+ (1.4), int28.h (1.4, rel-3-0-6pre1), misc_support.cpp (1.5),
+ misc_support.h (1.4, rel-3-0-6pre1), tag.cpp (1.4), tag.h (1.4),
+ tag_file.cpp (1.3), tag_find.cpp (1.4), tag_parse.cpp (1.4),
+ tag_parse_lyrics3.cpp (1.4), tag_parse_v1.cpp (1.4), tag_render.cpp
+ (1.4), tag_sync.cpp (1.4), types.h (1.4, rel-3-0-6pre1), version.h
+ (1.4, rel-3-0-6pre1): Added cvs Id and Log tags to beginning and
+ end of file, respectively.
+
+1999-11-04 Thursday 04:58 scott
+
+ * configure.in (1.3): Removed reference to zlib
+
+1999-11-04 Thursday 04:56 scott
+
+ * src/id3/misc_support.cpp (1.4): Added log cvs tag.
+
+1999-11-04 Thursday 04:55 scott
+
+ * src/id3/: dll_wrapper.cpp (1.3), error.cpp (1.3), field.cpp
+ (1.3), field_binary.cpp (1.3), field_integer.cpp (1.3),
+ field_string_ascii.cpp (1.3), field_string_unicode.cpp (1.3),
+ frame.cpp (1.3), frame_parse.cpp (1.3), frame_render.cpp (1.3),
+ header.cpp (1.3), header_frame.cpp (1.3), header_tag.cpp (1.3),
+ int28.cpp (1.3), misc_support.cpp (1.3), tag.cpp (1.3),
+ tag_find.cpp (1.3), tag_parse.cpp (1.3), tag_parse_lyrics3.cpp
+ (1.3), tag_parse_v1.cpp (1.3), tag_render.cpp (1.3), tag_sync.cpp
+ (1.3): Code clean up. No semantic changes.
+
+1999-11-02 Tuesday 06:54 scott
+
+ * src/id3/: dll.h (1.3), externals.h (1.3), field.h (1.3), frame.h
+ (1.3), header.h (1.3), header_frame.h (1.3), header_tag.h (1.3),
+ int28.h (1.3), misc_support.h (1.3), tag.h (1.3), types.h (1.3),
+ version.h (1.3): Formatting changes (tabs to spaces, excess space
+ removal, etc.)
+
+1999-11-01 Monday 06:48 scott
+
+ * src/: Makefile.am (1.3), zlib/Makefile.am (1.2), zlib/adler32.c
+ (1.2), zlib/compress.c (1.2), zlib/crc32.c (1.2), zlib/deflate.c
+ (1.2), zlib/deflate.h (1.2), zlib/gzio.c (1.2), zlib/infblock.c
+ (1.2), zlib/infblock.h (1.2), zlib/infcodes.c (1.2),
+ zlib/infcodes.h (1.2), zlib/inffast.c (1.2), zlib/inffast.h (1.2),
+ zlib/inffixed.h (1.2), zlib/inflate.c (1.2), zlib/inftrees.c (1.2),
+ zlib/inftrees.h (1.2), zlib/infutil.c (1.2), zlib/infutil.h (1.2),
+ zlib/trees.c (1.2), zlib/trees.h (1.2), zlib/uncompr.c (1.2),
+ zlib/zconf.h (1.2), zlib/zlib.h (1.2), zlib/zutil.c (1.2),
+ zlib/zutil.h (1.2): Removed zlib files -- unnecessary for linx
+
+1999-11-01 Monday 06:38 scott
+
+ * src/examples/demo_convert.cpp (1.2): Cleaned up code (tabs,
+ whitespace, etc)
+
+1999-11-01 Monday 06:34 scott
+
+ * acconfig.h (1.2), aclocal.m4 (1.2), config.h.in (1.2), configure
+ (1.3): Removed automatically generated files created with ./reconf
+
+1999-11-01 Monday 06:29 scott
+
+ * configure (1.2), configure.in (1.2), src/Makefile.am (1.2),
+ src/id3/Makefile.am (1.2): Now makes Makefiles in src/zlib and
+ src/examples
+
+1999-11-01 Monday 06:23 scott
+
+ * src/: zlib/Makefile.am (1.1), examples/Makefile.am (1.1,
+ rel-3-0-6pre1): Initial revision
+
+1999-11-01 Monday 06:19 scott
+
+ * src/id3/: dll.h (1.2), dll_wrapper.cpp (1.2), error.cpp (1.2),
+ error.h (1.2), externals.h (1.2), field.cpp (1.2), field.h (1.2),
+ field_binary.cpp (1.2), field_integer.cpp (1.2),
+ field_string_ascii.cpp (1.2), field_string_unicode.cpp (1.2),
+ frame.cpp (1.2), frame.h (1.2), frame_parse.cpp (1.2),
+ frame_render.cpp (1.2), header.cpp (1.2), header.h (1.2),
+ header_frame.cpp (1.2), header_frame.h (1.2), header_tag.cpp (1.2),
+ header_tag.h (1.2), int28.cpp (1.2), int28.h (1.2),
+ misc_support.cpp (1.2), misc_support.h (1.2), tag.cpp (1.2), tag.h
+ (1.2), tag_file.cpp (1.2), tag_find.cpp (1.2), tag_parse.cpp (1.2),
+ tag_parse_lyrics3.cpp (1.2), tag_parse_v1.cpp (1.2), tag_render.cpp
+ (1.2), tag_sync.cpp (1.2), types.h (1.2), version.h (1.2): Cleaned
+ up the code somwhat. Made some of the files more readable in 80
+ character displays. Switched tabs to spaces. Changed #include to
+ point to right directory for the id3 .h files. Changed call to
+ tmpnam to mkstemp in tag_render.cpp.
+
+1999-11-01 Monday 05:57 scott
+
+ * orig/source/examples/readme.txt (1.2), src/examples/readme.txt
+ (1.1): Moved readme.txt from orig/sources/examples to src/examples
+
+1999-11-01 Monday 05:57 scott
+
+ * orig/source/examples/demo_main.cpp (1.2),
+ src/examples/demo_main.cpp (1.1): Moved demo_main.cpp from
+ orig/sources/examples to src/examples
+
+1999-11-01 Monday 05:57 scott
+
+ * orig/source/examples/demo_convert.cpp (1.2),
+ src/examples/demo_convert.cpp (1.1): Moved demo_convert.cpp from
+ orig/sources/examples to src/examples
+
+1999-11-01 Monday 05:52 scott
+
+ * doc/id3v2.png (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), orig/documentation/id3v2.png (1.2): Moved id3v2.png
+ from orig/documentation to doc
+
+1999-11-01 Monday 05:52 scott
+
+ * doc/id3v2.ico (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), orig/documentation/id3v2.ico (1.2): Moved id3v2.ico
+ from orig/documentation to doc
+
+1999-11-01 Monday 05:52 scott
+
+ * doc/id3v2.gif (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), orig/documentation/id3v2.gif (1.2): Moved id3v2.gif
+ from orig/documentation to doc
+
+1999-11-01 Monday 05:52 scott
+
+ * doc/id3lib305.doc (1.1, rel-3-0-6pre1),
+ orig/documentation/id3lib305.doc (1.2): Moved id3lib305.doc from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:52 scott
+
+ * doc/id3guide.html (1.1, rel-3-0-6pre1),
+ orig/documentation/id3guide.html (1.2): Moved id3guide.html from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/zlib_readme.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/zlib_readme.txt (1.2): Moved zlib_readme.txt
+ from orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/software.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/software.txt (1.2): Moved software.txt from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/logo.txt (1.1, rel-3-0-6pre1), orig/documentation/logo.txt
+ (1.2): Moved logo.txt from orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/licence.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/licence.txt (1.2): Moved licence.txt from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/id3v2-3.00.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/id3v2-3.00.txt (1.2): Moved id3v2-3.00.txt from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/id3libhistory.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/id3libhistory.txt (1.2): Moved id3libhistory.txt
+ from orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/contact.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/contact.txt (1.2): Moved contact.txt from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:48 scott
+
+ * doc/bugreport.txt (1.1, rel-3-0-6pre1),
+ orig/documentation/bugreport.txt (1.2): Moved bugreport.txt from
+ orig/documentation to doc
+
+1999-11-01 Monday 05:40 scott
+
+ * src/: id3/trees.h (1.2), zlib/trees.h (1.1): Moved trees.h from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:40 scott
+
+ * src/: id3/deflate.h (1.2), zlib/deflate.h (1.1): Moved deflate.h
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/zutil.h (1.2), zlib/zutil.h (1.1): Moved zutil.h from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/zlib.h (1.2), zlib/zlib.h (1.1): Moved zlib.h from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/zconf.h (1.2), zlib/zconf.h (1.1): Moved zconf.h from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/infutil.h (1.2), zlib/infutil.h (1.1): Moved infutil.h
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/inftrees.h (1.2), zlib/inftrees.h (1.1): Moved
+ inftrees.h from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/inffixed.h (1.2), zlib/inffixed.h (1.1): Moved
+ inffixed.h from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/inffast.h (1.2), zlib/inffast.h (1.1): Moved inffast.h
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/infcodes.h (1.2), zlib/infcodes.h (1.1): Moved
+ infcodes.h from src/id3 to src/zlib
+
+1999-11-01 Monday 05:39 scott
+
+ * src/: id3/infblock.h (1.2), zlib/infblock.h (1.1): Moved
+ infblock.h from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/zutil.c (1.2), zlib/zutil.c (1.1): Moved zutil.c from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/uncompr.c (1.2), zlib/uncompr.c (1.1): Moved uncompr.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/trees.c (1.2), zlib/trees.c (1.1): Moved trees.c from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/infutil.c (1.2), zlib/infutil.c (1.1): Moved infutil.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/inftrees.c (1.2), zlib/inftrees.c (1.1): Moved
+ inftrees.c from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/inflate.c (1.2), zlib/inflate.c (1.1): Moved inflate.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/inffast.c (1.2), zlib/inffast.c (1.1): Moved inffast.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/infcodes.c (1.2), zlib/infcodes.c (1.1): Moved
+ infcodes.c from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/infblock.c (1.2), zlib/infblock.c (1.1): Moved
+ infblock.c from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/gzio.c (1.2), zlib/gzio.c (1.1): Moved gzio.c from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/deflate.c (1.2), zlib/deflate.c (1.1): Moved deflate.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/crc32.c (1.2), zlib/crc32.c (1.1): Moved crc32.c from
+ src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/compress.c (1.2), zlib/compress.c (1.1): Moved
+ compress.c from src/id3 to src/zlib
+
+1999-11-01 Monday 05:38 scott
+
+ * src/: id3/adler32.c (1.2), zlib/adler32.c (1.1): Moved adler32.c
+ from src/id3 to src/zlib
+
+1999-11-01 Monday 05:36 scott
+
+ * orig/source/library/zutil.h (1.2), src/id3/zutil.h (1.1): Moved
+ zutil.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/zlib.h (1.2), src/id3/zlib.h (1.1): Moved
+ zlib.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/zconf.h (1.2), src/id3/zconf.h (1.1): Moved
+ zconf.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/trees.h (1.2), src/id3/trees.h (1.1): Moved
+ trees.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infutil.h (1.2), src/id3/infutil.h (1.1):
+ Moved infutil.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inftrees.h (1.2), src/id3/inftrees.h (1.1):
+ Moved inftrees.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inffixed.h (1.2), src/id3/inffixed.h (1.1):
+ Moved inffixed.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inffast.h (1.2), src/id3/inffast.h (1.1):
+ Moved inffast.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infcodes.h (1.2), src/id3/infcodes.h (1.1):
+ Moved infcodes.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infblock.h (1.2), src/id3/infblock.h (1.1):
+ Moved infblock.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/deflate.h (1.2), src/id3/deflate.h (1.1):
+ Moved deflate.h to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/zutil.c (1.2), src/id3/zutil.c (1.1): Moved
+ zutil.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/uncompr.c (1.2), src/id3/uncompr.c (1.1):
+ Moved uncompr.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/trees.c (1.2), src/id3/trees.c (1.1): Moved
+ trees.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infutil.c (1.2), src/id3/infutil.c (1.1):
+ Moved infutil.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inftrees.c (1.2), src/id3/inftrees.c (1.1):
+ Moved inftrees.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inflate.c (1.2), src/id3/inflate.c (1.1):
+ Moved inflate.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/inffast.c (1.2), src/id3/inffast.c (1.1):
+ Moved inffast.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infcodes.c (1.2), src/id3/infcodes.c (1.1):
+ Moved infcodes.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/infblock.c (1.2), src/id3/infblock.c (1.1):
+ Moved infblock.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/gzio.c (1.2), src/id3/gzio.c (1.1): Moved
+ gzio.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/deflate.c (1.2), src/id3/deflate.c (1.1):
+ Moved deflate.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/crc32.c (1.2), src/id3/crc32.c (1.1): Moved
+ crc32.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/compress.c (1.2), src/id3/compress.c (1.1):
+ Moved compress.c to src/zlib
+
+1999-11-01 Monday 05:35 scott
+
+ * orig/source/library/adler32.c (1.2), src/id3/adler32.c (1.1):
+ Moved adler32.c to src/zlib
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_version.h (1.2), src/id3/version.h (1.1):
+ Renamed id3_version.h to version.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_types.h (1.2), src/id3/types.h (1.1):
+ Renamed id3_types.h to types.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_sync.cpp (1.2), src/id3/tag_sync.cpp
+ (1.1): Renamed id3_tag_sync.cpp to tag_sync.cpp and moved to
+ src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_render.cpp (1.2),
+ src/id3/tag_render.cpp (1.1): Renamed id3_tag_render.cpp to
+ tag_render.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_parse_v1.cpp (1.2),
+ src/id3/tag_parse_v1.cpp (1.1): Renamed id3_tag_parse_v1.cpp to
+ tag_parse_v1.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_parse_lyrics3.cpp (1.2),
+ src/id3/tag_parse_lyrics3.cpp (1.1): Renamed
+ id3_tag_parse_lyrics3.cpp to tag_parse_lyrics3.cpp and moved to
+ src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_parse.cpp (1.2),
+ src/id3/tag_parse.cpp (1.1): Renamed id3_tag_parse.cpp to
+ tag_parse.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_find.cpp (1.2), src/id3/tag_find.cpp
+ (1.1): Renamed id3_tag_find.cpp to tag_find.cpp and moved to
+ src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag_file.cpp (1.2), src/id3/tag_file.cpp
+ (1.1): Renamed id3_tag_file.cpp to tag_file.cpp and moved to
+ src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag.h (1.2), src/id3/tag.h (1.1): Renamed
+ id3_tag.h to tag.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_tag.cpp (1.2), src/id3/tag.cpp (1.1):
+ Renamed id3_tag.cpp to tag.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_misc_support.h (1.2),
+ src/id3/misc_support.h (1.1): Renamed id3_misc_support.h to
+ misc_support.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_misc_support.cpp (1.2),
+ src/id3/misc_support.cpp (1.1): Renamed id3_misc_support.cpp to
+ misc_support.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_int28.h (1.2), src/id3/int28.h (1.1):
+ Renamed id3_int28.h to int28.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_int28.cpp (1.2), src/id3/int28.cpp (1.1):
+ Renamed id3_int28.cpp to int28.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header_tag.h (1.2), src/id3/header_tag.h
+ (1.1): Renamed id3_header_tag.h to header_tag.h and moved to
+ src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header_tag.cpp (1.2),
+ src/id3/header_tag.cpp (1.1): Renamed id3_header_tag.cpp to
+ header_tag.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header_frame.h (1.2),
+ src/id3/header_frame.h (1.1): Renamed id3_header_frame.h to
+ header_frame.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header_frame.cpp (1.2),
+ src/id3/header_frame.cpp (1.1): Renamed id3_header_frame.cpp to
+ header_frame.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header.h (1.2), src/id3/header.h (1.1):
+ Renamed id3_header.h to header.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_header.cpp (1.2), src/id3/header.cpp
+ (1.1): Renamed id3_header.cpp to header.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_frame_render.cpp (1.2),
+ src/id3/frame_render.cpp (1.1): Renamed id3_frame_render.cpp to
+ frame_render.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_frame_parse.cpp (1.2),
+ src/id3/frame_parse.cpp (1.1): Renamed id3_frame_parse.cpp to
+ frame_parse.cpp and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_frame.h (1.2), src/id3/frame.h (1.1):
+ Renamed id3_frame.h to frame.h and moved to src/id3
+
+1999-11-01 Monday 05:31 scott
+
+ * orig/source/library/id3_frame.cpp (1.2), src/id3/frame.cpp (1.1):
+ Renamed id3_frame.cpp to frame.cpp and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field_string_unicode.cpp (1.2),
+ src/id3/field_string_unicode.cpp (1.1): Renamed
+ id3_field_string_unicode.cpp to field_string_unicode.cpp and moved
+ to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field_string_ascii.cpp (1.2),
+ src/id3/field_string_ascii.cpp (1.1): Renamed
+ id3_field_string_ascii.cpp to field_string_ascii.cpp and moved to
+ src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field_integer.cpp (1.2),
+ src/id3/field_integer.cpp (1.1): Renamed id3_field_integer.cpp to
+ field_integer.cpp and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field_binary.cpp (1.2),
+ src/id3/field_binary.cpp (1.1): Renamed id3_field_binary.cpp to
+ field_binary.cpp and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field.h (1.2), src/id3/field.h (1.1):
+ Renamed id3_field.h to field.h and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_field.cpp (1.2), src/id3/field.cpp (1.1):
+ Renamed id3_field.cpp to field.cpp and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_externals.h (1.2), src/id3/externals.h
+ (1.1): Renamed id3_externals.h to externals.h and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_error.h (1.2), src/id3/error.h (1.1):
+ Renamed id3_error.h to error.h and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_error.cpp (1.2), src/id3/error.cpp (1.1):
+ Renamed id3_error.cpp to error.cpp and moved to src/id3
+
+1999-11-01 Monday 05:30 scott
+
+ * orig/source/library/id3_dll_wrapper.cpp (1.2),
+ src/id3/dll_wrapper.cpp (1.1): Renamed id3_dll_wrapper.cpp to
+ dll_wrapper.cpp and moved to src/id3
+
+1999-11-01 Monday 05:26 scott
+
+ * orig/source/library/id3_dll.h (1.2), src/id3/dll.h (1.1): Renamed
+ id3_dll.h to dll.h and moved to src/id3
+
+1999-11-01 Monday 04:14 scott
+
+ * orig/dll/id3lib.dll (1.1), orig/dll/id3lib.exp (1.1),
+ orig/dll/id3lib.h (1.1), orig/dll/id3lib.lib (1.1),
+ orig/dll/readme.txt (1.1), orig/documentation/bugreport.txt (1.1),
+ orig/documentation/contact.txt (1.1),
+ orig/documentation/id3guide.html (1.1),
+ orig/documentation/id3lib305.doc (1.1),
+ orig/documentation/id3libhistory.txt (1.1),
+ orig/documentation/id3v2-3.00.txt (1.1),
+ orig/documentation/id3v2.gif (1.1), orig/documentation/id3v2.ico
+ (1.1), orig/documentation/id3v2.png (1.1),
+ orig/documentation/licence.txt (1.1), orig/documentation/logo.txt
+ (1.1), orig/documentation/software.txt (1.1),
+ orig/documentation/zlib_readme.txt (1.1),
+ orig/source/examples/demo_convert.cpp (1.1),
+ orig/source/examples/demo_main.cpp (1.1),
+ orig/source/examples/readme.txt (1.1),
+ orig/source/library/adler32.c (1.1), orig/source/library/compress.c
+ (1.1), orig/source/library/crc32.c (1.1),
+ orig/source/library/deflate.c (1.1), orig/source/library/deflate.h
+ (1.1), orig/source/library/gzio.c (1.1),
+ orig/source/library/id3_dll.h (1.1),
+ orig/source/library/id3_dll_wrapper.cpp (1.1),
+ orig/source/library/id3_error.cpp (1.1),
+ orig/source/library/id3_error.h (1.1),
+ orig/source/library/id3_externals.h (1.1),
+ orig/source/library/id3_field.cpp (1.1),
+ orig/source/library/id3_field.h (1.1),
+ orig/source/library/id3_field_binary.cpp (1.1),
+ orig/source/library/id3_field_integer.cpp (1.1),
+ orig/source/library/id3_field_string_ascii.cpp (1.1),
+ orig/source/library/id3_field_string_unicode.cpp (1.1),
+ orig/source/library/id3_frame.cpp (1.1),
+ orig/source/library/id3_frame.h (1.1),
+ orig/source/library/id3_frame_parse.cpp (1.1),
+ orig/source/library/id3_frame_render.cpp (1.1),
+ orig/source/library/id3_header.cpp (1.1),
+ orig/source/library/id3_header.h (1.1),
+ orig/source/library/id3_header_frame.cpp (1.1),
+ orig/source/library/id3_header_frame.h (1.1),
+ orig/source/library/id3_header_tag.cpp (1.1),
+ orig/source/library/id3_header_tag.h (1.1),
+ orig/source/library/id3_int28.cpp (1.1),
+ orig/source/library/id3_int28.h (1.1),
+ orig/source/library/id3_misc_support.cpp (1.1),
+ orig/source/library/id3_misc_support.h (1.1),
+ orig/source/library/id3_tag.cpp (1.1),
+ orig/source/library/id3_tag.h (1.1),
+ orig/source/library/id3_tag_file.cpp (1.1),
+ orig/source/library/id3_tag_find.cpp (1.1),
+ orig/source/library/id3_tag_parse.cpp (1.1),
+ orig/source/library/id3_tag_parse_lyrics3.cpp (1.1),
+ orig/source/library/id3_tag_parse_v1.cpp (1.1),
+ orig/source/library/id3_tag_render.cpp (1.1),
+ orig/source/library/id3_tag_sync.cpp (1.1),
+ orig/source/library/id3_types.h (1.1),
+ orig/source/library/id3_version.h (1.1),
+ orig/source/library/infblock.c (1.1),
+ orig/source/library/infblock.h (1.1),
+ orig/source/library/infcodes.c (1.1),
+ orig/source/library/infcodes.h (1.1), orig/source/library/inffast.c
+ (1.1), orig/source/library/inffast.h (1.1),
+ orig/source/library/inffixed.h (1.1), orig/source/library/inflate.c
+ (1.1), orig/source/library/inftrees.c (1.1),
+ orig/source/library/inftrees.h (1.1), orig/source/library/infutil.c
+ (1.1), orig/source/library/infutil.h (1.1),
+ orig/source/library/trees.c (1.1), orig/source/library/trees.h
+ (1.1), orig/source/library/uncompr.c (1.1),
+ orig/source/library/zconf.h (1.1), orig/source/library/zlib.h
+ (1.1), orig/source/library/zutil.c (1.1),
+ orig/source/library/zutil.h (1.1), AUTHORS (1.1, rel-3-0-6pre1),
+ COPYING (1.1, rel-3-0-6pre1), ChangeLog (1.1), INSTALL (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ Makefile.am (1.1), NEWS (1.1, rel-3-0-6pre1), README (1.1,
+ rel-3-0-6pre1), THANKS (1.1, rel-3-0-6pre1), acconfig.h (1.1),
+ aclocal.m4 (1.1), config.guess (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), config.h.in (1.1), config.sub (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ configure (1.1), configure.in (1.1), install-sh (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1), ltconfig (1.1,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ ltmain.sh (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), missing (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), mkinstalldirs (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), reconf (1.1, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), stamp-h.in (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7,
+ rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ doc/Makefile.am (1.1), m4/Makefile.am (1.1, rel-3-0-6pre1),
+ m4/lf_bash.m4 (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), m4/lf_cc.m4 (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), m4/lf_cxx.m4 (1.1, rel-3-0-6pre1),
+ m4/lf_fortran.m4 (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11,
+ rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4,
+ rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), m4/lf_host_type.m4 (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), m4/lf_lisp.m4 (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1), m4/lf_local.m4
+ (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ m4/lf_nm.m4 (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), m4/lf_texidoc.m4 (1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), m4/lf_txtc.m4 (1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1), m4/lf_warnings.m4
+ (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9,
+ rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2,
+ rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ m4/lf_x11.m4 (1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), src/Makefile.am (1.1, rel-3-6-0, rel-3-0-6pre1),
+ src/id3/Makefile.am (1.1): Initial revision
+
+1999-11-01 Monday 04:14 scott
+
+ * orig/: dll/id3lib.dll (1.1.1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), dll/id3lib.exp (1.1.1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1), dll/id3lib.h
+ (1.1.1.1, rel-3-7-13, rel-3-7-12, rel-3-7-11, rel-3-7-10,
+ rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3,
+ rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2, rel-3-6-0,
+ rel-3-0-6pre1), dll/id3lib.lib (1.1.1.1, rel-3-7-13, rel-3-7-12,
+ rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8, rel-3-7-7, rel-3-7-5,
+ rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1, rel-3-7-0, rel-3-6-2,
+ rel-3-6-0, rel-3-0-6pre1), dll/readme.txt (1.1.1.1, rel-3-7-13,
+ rel-3-7-12, rel-3-7-11, rel-3-7-10, rel-3-7-9, rel-3-7-8,
+ rel-3-7-7, rel-3-7-5, rel-3-7-4, rel-3-7-3, rel-3-7-2, rel-3-7-1,
+ rel-3-7-0, rel-3-6-2, rel-3-6-0, rel-3-0-6pre1),
+ documentation/bugreport.txt (1.1.1.1), documentation/contact.txt
+ (1.1.1.1), documentation/id3guide.html (1.1.1.1),
+ documentation/id3lib305.doc (1.1.1.1),
+ documentation/id3libhistory.txt (1.1.1.1),
+ documentation/id3v2-3.00.txt (1.1.1.1), documentation/id3v2.gif
+ (1.1.1.1), documentation/id3v2.ico (1.1.1.1),
+ documentation/id3v2.png (1.1.1.1), documentation/licence.txt
+ (1.1.1.1), documentation/logo.txt (1.1.1.1),
+ documentation/software.txt (1.1.1.1), documentation/zlib_readme.txt
+ (1.1.1.1), source/examples/demo_convert.cpp (1.1.1.1),
+ source/examples/demo_main.cpp (1.1.1.1), source/examples/readme.txt
+ (1.1.1.1), source/library/adler32.c (1.1.1.1),
+ source/library/compress.c (1.1.1.1), source/library/crc32.c
+ (1.1.1.1), source/library/deflate.c (1.1.1.1),
+ source/library/deflate.h (1.1.1.1), source/library/gzio.c
+ (1.1.1.1), source/library/id3_dll.h (1.1.1.1),
+ source/library/id3_dll_wrapper.cpp (1.1.1.1),
+ source/library/id3_error.cpp (1.1.1.1), source/library/id3_error.h
+ (1.1.1.1), source/library/id3_externals.h (1.1.1.1),
+ source/library/id3_field.cpp (1.1.1.1), source/library/id3_field.h
+ (1.1.1.1), source/library/id3_field_binary.cpp (1.1.1.1),
+ source/library/id3_field_integer.cpp (1.1.1.1),
+ source/library/id3_field_string_ascii.cpp (1.1.1.1),
+ source/library/id3_field_string_unicode.cpp (1.1.1.1),
+ source/library/id3_frame.cpp (1.1.1.1), source/library/id3_frame.h
+ (1.1.1.1), source/library/id3_frame_parse.cpp (1.1.1.1),
+ source/library/id3_frame_render.cpp (1.1.1.1),
+ source/library/id3_header.cpp (1.1.1.1),
+ source/library/id3_header.h (1.1.1.1),
+ source/library/id3_header_frame.cpp (1.1.1.1),
+ source/library/id3_header_frame.h (1.1.1.1),
+ source/library/id3_header_tag.cpp (1.1.1.1),
+ source/library/id3_header_tag.h (1.1.1.1),
+ source/library/id3_int28.cpp (1.1.1.1), source/library/id3_int28.h
+ (1.1.1.1), source/library/id3_misc_support.cpp (1.1.1.1),
+ source/library/id3_misc_support.h (1.1.1.1),
+ source/library/id3_tag.cpp (1.1.1.1), source/library/id3_tag.h
+ (1.1.1.1), source/library/id3_tag_file.cpp (1.1.1.1),
+ source/library/id3_tag_find.cpp (1.1.1.1),
+ source/library/id3_tag_parse.cpp (1.1.1.1),
+ source/library/id3_tag_parse_lyrics3.cpp (1.1.1.1),
+ source/library/id3_tag_parse_v1.cpp (1.1.1.1),
+ source/library/id3_tag_render.cpp (1.1.1.1),
+ source/library/id3_tag_sync.cpp (1.1.1.1),
+ source/library/id3_types.h (1.1.1.1), source/library/id3_version.h
+ (1.1.1.1), source/library/infblock.c (1.1.1.1),
+ source/library/infblock.h (1.1.1.1), source/library/infcodes.c
+ (1.1.1.1), source/library/infcodes.h (1.1.1.1),
+ source/library/inffast.c (1.1.1.1), source/library/inffast.h
+ (1.1.1.1), source/library/inffixed.h (1.1.1.1),
+ source/library/inflate.c (1.1.1.1), source/library/inftrees.c
+ (1.1.1.1), source/library/inftrees.h (1.1.1.1),
+ source/library/infutil.c (1.1.1.1), source/library/infutil.h
+ (1.1.1.1), source/library/trees.c (1.1.1.1), source/library/trees.h
+ (1.1.1.1), source/library/uncompr.c (1.1.1.1),
+ source/library/zconf.h (1.1.1.1), source/library/zlib.h (1.1.1.1),
+ source/library/zutil.c (1.1.1.1), source/library/zutil.h (1.1.1.1)
+ (utags: id3lib-3-05a, ID3LIB_3_05a): Import of ID3LIB v. 3.05a
+
diff --git a/HISTORY b/HISTORY
new file mode 100644
index 0000000..3438772
--- /dev/null
+++ b/HISTORY
@@ -0,0 +1,315 @@
+$Id: HISTORY,v 1.3 2000/04/17 05:05:01 eldamitri Exp $
+
+ID3Lib History
+
+The following is a history of id3lib up to version 3.05a. Please see the
+NEWS file for changes since then.
+
+23 Nov 1998 3.05a - Released 3.05a in which the only change was the
+ inclusion of a C header file for using the DLL
+ (how forgetful I am!).
+
+22 Nov 1998 3.05 - Released 3.05 and the DLL.
+
+ 8 Nov 1998 3.05 - Finished the first revision of the DLL. Interesting
+ stuff. Contains both C++ class and C functions (the
+ C++ classes that are exported to the DLL are Tag,
+ Frame, Field and Error).
+ - Took out the SetVersion function from the ID3_Tag
+ class. This is because I no longer wish ID3Lib to be
+ able to create the old ID3v2-2.0 tags. ID3Lib will
+ always create the latest version tags it is capable
+ of creating.
+
+ 1 Nov 1998 3.05 - Removed the encryption and grouping stuff. I have a
+ lot to do before I finish that section and I might
+ end up implementing it differently, so I thought it
+ best to remove it before people started using it
+ (no-one should since it wasn't fully functional
+ anyway).
+
+13 Oct 1998 3.05 - Work has begun on the Windows DLL.
+
+ 9 Oct 1998 3.04 - Added the text list handling functions from 2.16, but
+ they are slightly different under 3.xx.
+ - Also added a Size() function for fields which
+ applications can use to allocate buffers and so on.
+ - Work has progressed on the encryption and grouping
+ side of things, but nothing usable by an application
+ just yet.
+
+ 5 Oct 1998 3.04 - Changed the ID3_AddHandler() function to include a
+ parameter which specifies the factor by which the
+ size of the frame may increase as a result of
+ encryption or encoding. This is used for buffer and
+ size estimates.
+
+ 3 Oct 1998 3.03a - Fixed a small Unicode BOM bug.
+
+ 2 Oct 1998 3.03 - Added very minimal and not-totally-functional support
+ for the automatic handling of encryption and
+ grouping.
+ - Added a function to ID3_Tag which makes attaching
+ arrays of ID3_Frame objects easy.
+
+ 1 Oct 1998 3.03 - Yesterday, ID3v2-3.0 became an informal standard.
+ Due to this, ID3Lib now does not create ID3v2-3.0
+ tags with the EXPERIMENTAL bit set.
+
+30 Sep 1998 3.02 - Expanded the error handling class to include
+ functions which return the ID3Lib source file and
+ line number of the exception. This is useful for
+ debugging and generating bug reports (hint, hint).
+
+28 Sep 1998 3.02 - Added the grouping registration and encryption
+ registration frames. Also added support for parsing
+ and rendering frames with the grouping and encryption
+ symbols, although currently this data is ignored. I
+ plan to implement call backs to handle the encryption
+ and decryption of data. Also, there is currently no
+ checking at render-time that all frames which have
+ these symbols also have a corresponding rego frame.
+
+26 Sep 1998 3.02 - Changed the 'tag changed' stuff so that calls to
+ ID3_Tag::SetVersion(), ID3_Tag::SetCompression() etc
+ now constitute a change in the tag. This is because
+ of the relaxed restrictions on the calls to these
+ functions before rendering/updating. - Fixed a bug
+ in the ID3_Tag::Link() command.
+
+25 Sep 1998 3.01 - Added the ID3_Tag::RemoveFrame() function.
+ - Added the ID3_Tag::SetExtendedHeader() function, even
+ though this setting is currently ignored.
+ - Added luint return type to the Field::Get() functions
+ for ASCII and Unicode strings. These functions now
+ return how many characters (not bytes necessarily) of
+ the supplied buffer were used, not including the
+ NULL-termination.
+ - Added the 'unique file identifier' frame which I
+ omitted from 3.00 but was present in 2.xx.
+ - Added code that allows ID3Lib and applications to
+ track whether a tag has been altered since the last
+ parse or render.
+ - Slightly altered the padding strategy when a tag
+ shrinks in size.
+ - No more requirements on when ID3_Tag::SetVersion()
+ etc must be called, except that they should be called
+ prior to an update or render if you plan to use
+ different settings than the defaults.
+
+21 Sep 1998 3.00 - Released 3.00
+
+15 Sep 1998 3.00 - Added support for parsing and converting ID3v1/1.1
+ and Lyrics3 v2.0 tags and CDM frames from 2.01
+ experimental tags. Also parses Unicode now.
+
+ 9 Sep 1998 3.00 - Work almost done on 3.00. A little bit to fix up in
+ the parsing department (doesn't parse Unicode yet, or
+ CDMs from the old 2.01 draft). Then just add
+ validity checking and support for most of the frames.
+
+ 2 Sep 1998 2.16 - Small Unicode string parsing bug fixed.
+
+25 Aug 1998 2.15 - Small bug fixes in the tag parsing routines.
+ - Completely removed support for creating extended
+ headers, and ID3Lib will now ignore tags which have
+ the EXTENDEDHEADER bit set (as under 2.00, this bit
+ isn't defined).
+
+24 Aug 1998 2.14 - Small bug fixes in the example file 'convert.cpp'.
+ - ID3Lib now sets the EXPERIMENTAL bit in the tag
+ header.
+
+13 Aug 1998 2.13 - As of 2.13, ID3Lib now comes in two flavours. The
+ first is the normal distribution as we have come to
+ know and love. The second is a machine-specific
+ archive which contains the static link libraries.
+ Currently, you can get Win32 link libraries.
+
+12 Aug 1998 2.12 - As of 2.12, the ID3Lib distribution will contain
+ precompiled static libraries for Visual C++ and
+ eventually for Linux i386. The MSVC static libs are
+ be compiled for the multi-threaded run-time library
+ and there will be one for debugging and one normal
+ one for release-quality applications.
+
+ - Fixed a small exclusion in the 'id3_support.h' file.
+ It now contains a #include for the 'wchar.h' header
+ file. The absence of this line resulted in some
+ applications producing compilation errors if they
+ didn't already include it or 'stdio.h'.
+
+11 Aug 1998 2.12 - I created a small problem in 2.11 where the name of
+ the URL field in the 'ID3FID_WWWUSER' frame ('WXX')
+ was changed from ID3FN_URL to ID3FN_TEXT. This has
+ been fixed (is back to ID3FN_URL).
+ - When reading a binary tag, previous versions of
+ ID3Lib ignored the fact that some of the frames in
+ the tag may have been compressed, so when writing the
+ tag back out, those old frames were written without
+ compression. This is fixed so that all old frames
+ are written back out as they were read in, unless of
+ course you explicitly change the compression status
+ before rendering the new tag.
+ - Added the ID3C_SetSongSize and ID3C_GetSongSize
+ commands to the ID3_Tag class. These allow you to
+ tell ID3Lib how big (in bytes) the song file is to
+ which you intend attaching the tag. ID3Lib can then
+ work out how much padding the tag requires to
+ correctly make the entire resulting file fill an even
+ multiple of 2Kb.
+ - If the tag we are manipulating was read in as a
+ binary tag before we started playing with it, then
+ ID3Lib will record the size of tag before we started
+ fooling around with it. This way, the padding system
+ can pad the new tag out to the old size if the new
+ tag will still fit inside the old one. This makes
+ file manipulation much easier when writing tags to
+ existing song files. If it won't fit, then the new
+ tag will receive padding as per the 2K cluster
+ method. All this talk of padding only applies if the
+ tag's padding property is set to ID3PD_AUTOMATIC,
+ which it is by default.
+
+10 Aug 1998 2.11 - Replaced ID3C_SetID and GetID with proper field
+ names, and the same with ID3C_SetComp and GetComp.
+ This requires a change in source code for the
+ application. Without quotes, do a search and
+ replace...
+
+ "ID3C_SetID," replace with "ID3C_Set, ID3FN_ID,"
+ "ID3C_GetID," replace with "ID3C_Get, ID3FN_ID,"
+ "ID3C_SetComp," replace with "ID3C_Set, ID3FN_COMPRESSED,"
+ "ID3C_GetComp," replace with "ID3C_Get, ID3FN_COMPRESSED,"
+
+ - Thanks to a suggestion by Ilana Rudnik, I added a
+ generic frame type called 'ID3FID_UNSUPPORTED' which
+ is only to be used by applications as a
+ 'place-holder' in lists and arrays while waiting for
+ ID3Lib to support all the frames.
+
+ 6 Aug 1998 2.11 - Created the ID3C_Locate and ID3C_GetNumFrames
+ commands.
+ - Made the documentation an HTML file instead of boring
+ text.
+
+ 5 Aug 1998 2.11 - Thanks to Eng-Keong Lee, I have located and fixed a
+ bug which most-of-the-time caused a crash when
+ performing an ID3C_SetID on a frame for the first
+ time.
+
+ 3 Aug 1998 2.10 - Fixed a few things to make ID3Lib compile completely
+ cleanly under Linux - thanks to Carlos Puchol for
+ finding the remaining hassles.
+ - Added two commands to adjust the unsync facility -
+ ID3C_SetUnsync and ID3C_GetUnsync. The default is
+ ID3SY_AUTOMATIC.
+ - Add support for the 2.01 extended tag header. By
+ default, ID3Lib will NOT write an extended header to
+ tags it creates. This can be adjusted by the
+ ID3C_SetExtHeader command.
+ - Changed the directory structure so that the required
+ zlib source is now in the same directory as the
+ ID3Lib source.
+
+ 2 Aug 1998 2.10 - Fixed a small memory leak which occurred when
+ clearing a tag of frames which were read in from an
+ external binary tag.
+ - Added a 'bugreport.txt' file to the documentation to
+ improve effectiveness of bug reporting.
+
+ 1 Aug 1998 2.10 - Adding support for tag padding. This results in two
+ new commands which operate on ID3_Tag objects:
+ ID3C_SetPadding and ID3C_GetPadding.
+
+ 1 Aug 1998 2.09 - Fixed some bugs in the ID3C_ToFile and ID3C_FromFile
+ commands.
+ - Fixed a bug which prevented empty strings which were
+ supposed to be NULL-terminated from doing so.
+
+31 Jul 1998 2.09 - Changed the functionality of the error handling
+ mechanism. The function interface to the error
+ handler has changed - see the example source file
+ 'main.cpp' for details.
+ - Improved frame verification somewhat.
+
+28 July 1998 2.08 - Added ID3C_ToFile command to binary fields.
+ - Changed the format of the ID3C_Size command when
+ applied to frames. There is now a required second
+ parameter which specifies which field you require the
+ size of. If you request ID3FN_ALL, you will get the
+ size of the frame itself.
+ - The above change for ID3C_Size now also applies to
+ the ID3C_Clear command (again, only when applied to
+ frames).
+ - Enhanced the ID3C_Find command so as to allow
+ searches based on the ID3FN_LANGUAGE field and the
+ ID3FN_DESCRIPTION field.
+
+27 July 1998 2.07 - Fixed a bug which had the WXX and TXX frames
+ including a language field which they shouldn't.
+ - Fixed a bug in the string's ID3C_Get command which
+ wrongly interpreted the presence of a '/' symbol in
+ the string as meaning that the string was a textlist.
+
+21 July 1998 2.06 - Added support for frame compression via zlib. This
+ means that all frames have an extra attribute which
+ specifies whether the frame should be compressed.
+ - Changed some typedefs and macro names so as not to
+ clash with some of Windows' pre-defined
+ datatypes/names. Thanks to Chuck Zenkus for finding
+ this.
+
+14 July 1998 2.05 - Finished up Unicode support. All internal string
+ handling is done with Unicode strings. Strings are
+ converted as needed during rendering of the tag.
+
+ 6 July 1998 2.05 - BINARY fields now support an 'ID3C_FromFile' command
+ which fills the field with data from the specified
+ file. The file is read and the contents placed in
+ the field immediately on the field encountering this
+ command.
+
+ 2 July 1998 2.04 - Improved support for frame validation.
+ - Repaired a cool bug in the error handling which
+ prevented an application from finding further
+ information about the error. This fix resulted in a
+ new format for the application error handler
+ function.
+
+ 2.03 - Added support for the ID3C_Add, ID3C_Remove,
+ ID3C_GetElement, ID3C_GetNumElements commands in the
+ STRING field type. This allows easy use of the text
+ lists as used in the 'TP1' frame.
+
+ - Improved error handling once more.
+ - Added support for the ID3C_Increment command in the
+ INT field type.
+ - Added support for the CNT, POP, GEO, TCO, TCR and UFI
+ frames.
+ - Added preliminary validation checking for frames to
+ ensure they meet the ID3v2 standard requirements.
+ Not fully implemented.
+
+ 2.02 - Adjusted the '::Do()' function slightly - you can now
+ chain commands together. The last parameter to this
+ call must now always be 'ID3C_DONE'.
+
+ 1 July 1998 2.01 - Added the 'ID3_IsTagHeader()' function and an
+ appropriately adjusted ID3C_Parse command.
+
+30 June 1998 2.00 - First preliminary release of ID3Lib v2.00. Supports
+ lots of frames (even PIC). Lots of work still
+ needed.
+
+25 June 1998 2.00 - Abandoned the v1.xx framework in favour of a more
+ versatile and expandable one. This required a major
+ re-write of most of the internals of the library as
+ well as changes to any applications using the
+ previous framework. The new framework is part of all
+ ID3Libs which are 2.xx.
+
+23 June 1998 1.01 - Released v1.01 which added support for four new
+ frames. TXX, WXX, COM, ULT
+
+21 June 1998 1.00 - Initial Release (v1.0)
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..421bc5c
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,179 @@
+Basic Installation
+==================
+
+ For more information specific to this package, please read the README
+file. This source code distribution is autoconfiguring and you should be
+able to compile it and install it without manual interventions such as
+editing Makefiles, configuration files, and so on. These are generic
+instructions for people who are not familiar with installing autoconfiguring
+software.
+
+The simplest way to compile this package is to enter the source code
+main directory and do the following:
+
+ 1. Configure the source code by typing:
+ % sh ./configure
+
+ If you're planning to install the package into your home directory
+ or to a location other than `/usr/local' then add the flag
+ `--prefix=PATH' to `configure'. For example, if your home directory
+ is `/home/luser' you can configure the package to install itself there
+ by invoking:
+ % sh ./configure --prefix=/home/luser
+
+ While running, `configure' prints some messages telling which
+ features is it checking for.
+
+ 2. Compile the package by typing:
+ % make
+ Running `make' takes a while. If this is a very large package, now
+ is the time to go make some coffee.
+
+ 3. Some packages are bundled with self-tests for source-code
+ verification. If this package includes such tests, you can
+ optionally run them after compilation by typing
+ % make check
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. Type `make uninstall' to undo the installation.
+ During installation, the following files go to the following directories:
+ Executables -> /prefix/bin
+ Libraries -> /prefix/lib
+ Public header files -> /prefix/include
+ Man pages -> /prefix/man/man?
+ Info files -> /prefix/info
+ where `prefix' is either `/usr/local' or the PATH that you specified
+ in the `--prefix' flag.
+
+ If any of these directories do not presently exist, they will be
+ created on demand.
+
+ If you are installing in your home directory make sure that
+ `/home/luser/bin' is in your path. If you're using the bash shell
+ add this line at the end of your .cshrc file:
+ PATH="/home/luser/bin:${PATH}"
+ export PATH
+ If you are using csh or tcsh, then use this line instead:
+ setenv PATH /home/luser/bin:${PATH}
+ By prepending your home directory to the rest of the PATH you can
+ override systemwide installed software with your own custom installation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'.
+
+Compiler configuration
+======================
+
+ The `configure' shell script is responsible for choosing and configuring
+the compiler(s).
+
+The following options allow you to specify whether you
+want to enable or disable various debugging mechanisms:
+
+`--with-warnings'
+ Make the compilers very picky about warnings. Try this whenever you
+ write new code since it may catch a few bugs. This is not active by
+ default because all too often warnings can be too picky and scare
+ the end-user.
+
+`--disable-assert'
+ Compile without using assertions. This results in faster code,
+ but should not be used during developerment, or to run `make check'
+ which depends on assertions. It should only be used for production
+ runs on code that you believe is bug free.
+
+All programs are compiled with optimization level 2 by default (-O2).
+Occasionally that confuses the debugger when code is inlined. To disable
+optimization and enable debugging, set the shell environment variables
+CFLAGS, CXXFLAGS, FFLAGS to `-g'. On the bash shell, you can do this
+like this:
+ $ export CFLAGS="-g"
+ $ export CXXFLAGS="-g"
+ $ export FFLAGS="-g"
+On the tcsh shell, use the `setenv' command instead:
+ % setenv CFLAGS "-g"
+ ...etc...
+For other shell, please consult your shell's documentation.
+
+Similarly, you can increase the optimization level by assigning these
+variables to "-g -O3".
+
+The following options allow you to reconsider the `configure' shell script's
+choice of Fortran compilers.
+
+`--with-f2c'
+ Compile the Fortran code by translating it to C, even if a native
+ Fortran compiler is available. A copy of the f2c translator should be
+ bundled in the distribution. It will be compiled and then used to
+ compile your Fortran code.
+`--with-g77'
+ Compile the Fortran code with g77 even if a proprietary Fortran
+ compiler is available
+`--with-f77=F77'
+ Compile the Fortran code with the specified Fortran compiler.
+
+Depending on what languages the package uses, some of these options may
+or may not be available. To see what is available, type:
+ % sh ./configure --help
+
+About the configure script
+==========================
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+Advanced installation options.
+==============================
+
+ The `configure' script also understands the following more advanced
+options, to handle situations for which `--prefix' alone is not sufficient.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..3181288
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,87 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# require automake 1.5
+AUTOMAKE_OPTIONS = 1.5
+
+EXTRA_DIST = \
+ HISTORY \
+ config.h.win32 \
+ config.h.win32.in \
+ id3lib.spec \
+ id3lib.spec.in \
+ reconf \
+ makefile.win32 \
+ makewin32.bat
+if ID3_NEEDZLIB
+zlib_subdir = zlib
+else
+zlib_subdir =
+endif
+
+SUBDIRS = . m4 $(zlib_subdir) doc include id3com src examples
+DIST_SUBDIRS = . m4 zlib doc include id3com src examples prj libprj
+
+INCLUDES = @ID3LIB_DEBUG_FLAGS@
+
+config.h.win32: $(top_builddir)/config.status $(top_srcdir)/config.h.win32.in
+ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+id3lib.spec: $(top_builddir)/config.status $(top_srcdir)/id3lib.spec.in
+ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+docsdistdir = $(PACKAGE)-doc-$(VERSION)
+
+.PHONY: release snapshot docs-release docs
+
+changelog:
+ ./cvs2cl.pl --tags --branches --revisions --day-of-week --prune --fsf -U AUTHORS -W 3600
+
+docs:
+ -cd doc && $(MAKE) $(AM_MAKEFLAGS) $@
+
+docs-release: docs
+ -mv doc/$(docsdistdir).* .
+ -cd examples && $(MAKE) $(AM_MAKEFLAGS) clean
+ -mkdir $(docsdistdir)
+ -cp -R examples $(docsdistdir)
+ -cp doc/*.* $(docsdistdir)
+ -cp -R doc/@DOX_DIR_HTML@ $(docsdistdir)
+ -cp NEWS $(docsdistdir)/NEWS.txt
+ -cp ChangeLog $(docsdistdir)/ChangeLog.txt
+ -find $(docsdistdir) -name "Makefile*" -exec rm -f {} \;
+ -find $(docsdistdir) -name "*.mp3" -exec rm -f {} \;
+ GZIP=$(GZIP_ENV) $(TAR) zcf $(docsdistdir).tar.gz $(docsdistdir)
+ -rm -rf $(docsdistdir)
+
+release: config.h.win32 id3lib.spec
+ -rm -rf .deps */.deps $(distdir).zip
+ $(MAKE) $(AM_MAKEFLAGS) distcheck
+ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+ -cp -R id3com/ prj/ libprj/ delphi/ $(distdir)
+ -find $(distdir) -name "*~" -exec rm {} \;
+ -find $(distdir) -type d -name CVS -exec rm -r {} \;
+ -find $(distdir) -name .cvsignore -exec rm {} \;
+ -find $(distdir) \( -name "*.dsp" -or -name "*.dsw" \) -exec unix2dos {} \;
+ cd $(distdir) && cp config.h.win32 config.h
+ cd $(distdir) && zip -r ../$(distdir).zip *
+ cd $(distdir) && ./configure && $(MAKE) $(AM_MAKEFLAGS) docs-release
+ mv $(distdir)/$(docsdistdir).* .
+ -rm -rf $(distdir)
+
+snapshot: config.h.win32
+ ss_distdir=$(PACKAGE)-`date +"%Y%m%d"`; \
+ $(MAKE) $(AM_MAKEFLAGS) distdir distdir=$$ss_distdir; \
+ chmod -R a+r $$ss_distdir; \
+ GZIP=$(GZIP_ENV) $(TAR) chozf $${ss_distdir}.tar.gz $$ss_distdir; \
+ cd $$ss_distdir && cp config.h.win32 config.h && cd ..; \
+ cd $$ss_distdir && zip -r ../$${ss_distdir}.zip * && cd ..; \
+ rm -rf $$ss_distdir
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..8c121c5
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,539 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+# require automake 1.5
+AUTOMAKE_OPTIONS = 1.5
+
+EXTRA_DIST = \
+ HISTORY \
+ config.h.win32 \
+ config.h.win32.in \
+ id3lib.spec \
+ id3lib.spec.in \
+ reconf \
+ makefile.win32 \
+ makewin32.bat
+
+@ID3_NEEDZLIB_TRUE@zlib_subdir = zlib
+@ID3_NEEDZLIB_FALSE@zlib_subdir =
+
+SUBDIRS = . m4 $(zlib_subdir) doc include id3com src examples
+DIST_SUBDIRS = . m4 zlib doc include id3com src examples prj libprj
+
+INCLUDES = @ID3LIB_DEBUG_FLAGS@
+
+docsdistdir = $(PACKAGE)-doc-$(VERSION)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
+ uninstall-info-recursive all-recursive install-data-recursive \
+ install-exec-recursive installdirs-recursive install-recursive \
+ uninstall-recursive check-recursive installcheck-recursive
+DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
+ Makefile.in NEWS THANKS TODO acconfig.h aclocal.m4 config.guess \
+ config.h.in config.sub configure configure.in depcomp \
+ install-sh ltconfig ltmain.sh missing mkinstalldirs
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)
+
+$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+$(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+ cd $(srcdir) && $(AUTOCONF)
+
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(top_srcdir)/configure.in $(ACLOCAL_M4) $(top_srcdir)/acconfig.h
+ cd $(top_srcdir) && $(AUTOHEADER)
+ touch $(srcdir)/config.h.in
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = .
+distdir = $(PACKAGE)-$(VERSION)
+
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+
+GZIP_ENV = --best
+distcleancheck_listfiles = find . -type f -print
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ $(am__remove_distdir)
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/=build
+ mkdir $(distdir)/=inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/=inst && pwd` \
+ && cd $(distdir)/=build \
+ && ../configure --srcdir=.. --prefix=$$dc_install_base \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ find $$dc_install_base -type f -print ; \
+ exit 1; } >&2 ) \
+ && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \
+ && rm -f $(distdir).tar.gz \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @echo "$(distdir).tar.gz is ready for distribution" | \
+ sed 'h;s/./=/g;p;x;p;x'
+distcleancheck: distclean
+ if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+distclean-am: clean-am distclean-generic distclean-hdr distclean-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf autom4te.cache
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
+ clean-generic clean-libtool clean-recursive dist dist-all \
+ dist-gzip distcheck distclean distclean-generic distclean-hdr \
+ distclean-libtool distclean-recursive distclean-tags \
+ distcleancheck distdir dvi dvi-am dvi-recursive info info-am \
+ info-recursive install install-am install-data install-data-am \
+ install-data-recursive install-exec install-exec-am \
+ install-exec-recursive install-info install-info-am \
+ install-info-recursive install-man install-recursive \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am installdirs-recursive maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive mostlyclean \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+ tags tags-recursive uninstall uninstall-am uninstall-info-am \
+ uninstall-info-recursive uninstall-recursive
+
+
+config.h.win32: $(top_builddir)/config.status $(top_srcdir)/config.h.win32.in
+ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+id3lib.spec: $(top_builddir)/config.status $(top_srcdir)/id3lib.spec.in
+ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+.PHONY: release snapshot docs-release docs
+
+changelog:
+ ./cvs2cl.pl --tags --branches --revisions --day-of-week --prune --fsf -U AUTHORS -W 3600
+
+docs:
+ -cd doc && $(MAKE) $(AM_MAKEFLAGS) $@
+
+docs-release: docs
+ -mv doc/$(docsdistdir).* .
+ -cd examples && $(MAKE) $(AM_MAKEFLAGS) clean
+ -mkdir $(docsdistdir)
+ -cp -R examples $(docsdistdir)
+ -cp doc/*.* $(docsdistdir)
+ -cp -R doc/@DOX_DIR_HTML@ $(docsdistdir)
+ -cp NEWS $(docsdistdir)/NEWS.txt
+ -cp ChangeLog $(docsdistdir)/ChangeLog.txt
+ -find $(docsdistdir) -name "Makefile*" -exec rm -f {} \;
+ -find $(docsdistdir) -name "*.mp3" -exec rm -f {} \;
+ GZIP=$(GZIP_ENV) $(TAR) zcf $(docsdistdir).tar.gz $(docsdistdir)
+ -rm -rf $(docsdistdir)
+
+release: config.h.win32 id3lib.spec
+ -rm -rf .deps */.deps $(distdir).zip
+ $(MAKE) $(AM_MAKEFLAGS) distcheck
+ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+ -cp -R id3com/ prj/ libprj/ delphi/ $(distdir)
+ -find $(distdir) -name "*~" -exec rm {} \;
+ -find $(distdir) -type d -name CVS -exec rm -r {} \;
+ -find $(distdir) -name .cvsignore -exec rm {} \;
+ -find $(distdir) \( -name "*.dsp" -or -name "*.dsw" \) -exec unix2dos {} \;
+ cd $(distdir) && cp config.h.win32 config.h
+ cd $(distdir) && zip -r ../$(distdir).zip *
+ cd $(distdir) && ./configure && $(MAKE) $(AM_MAKEFLAGS) docs-release
+ mv $(distdir)/$(docsdistdir).* .
+ -rm -rf $(distdir)
+
+snapshot: config.h.win32
+ ss_distdir=$(PACKAGE)-`date +"%Y%m%d"`; \
+ $(MAKE) $(AM_MAKEFLAGS) distdir distdir=$$ss_distdir; \
+ chmod -R a+r $$ss_distdir; \
+ GZIP=$(GZIP_ENV) $(TAR) chozf $${ss_distdir}.tar.gz $$ss_distdir; \
+ cd $$ss_distdir && cp config.h.win32 config.h && cd ..; \
+ cd $$ss_distdir && zip -r ../$${ss_distdir}.zip * && cd ..; \
+ rm -rf $$ss_distdir
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..0173693
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,325 @@
+$Id: NEWS,v 1.27 2002/07/23 13:57:45 t1mpy Exp $
+
+this file will not be updated anymore. Please go to http://sourceforge.net/news/?group_id=979 for the latest news
+
+Old News:
+
+2001-09-08 Version 3.8.0pre2
+* ID3Lib maintainer has disappeared. Project maintenance taken over by existing
+ developers
+* Many bug fixes -- mostly compilation problems -- more detailed info will be
+ provided in a later release.
+
+2000-11-20 Version 3.8.0pre1
+
+* First prerelease of 3.8.0 stable.
+* Clean separation of interface and implementation to help ensure interface and
+ binary compatibility of future releases
+* Completely revamped implementation of tag reading and writing
+* Better debugging output in debug mode
+* New documentation (much more still needed)
+* Command-line options processing now more cross-platform
+* Removed all exception handling
+* Minor changes to public interface
+* Use of std::string and other STL classes in implementation
+* id3com source code removed from source distribution. It has moved to its own
+ project at http://sourceforge.net/projects/id3com
+* Many more changes than can be mentioned here: see ChangeLog file
+
+2000-09-07 Version 3.7.13
+
+* id3com is broken; maintainer has disappeared; anyone care to fix it?
+* Complete reimplementation of ID3_Field: cleaner, safer, faster, clearer, more
+ efficient
+* Much more robust MusicMatch parsing
+* Improved conversion from ID3v2 to ID3v1
+* Cleaner implementation of file processing
+* Examples now use popt for command-line processing
+* Improved portability for Macintosh
+* Improved build process for platforms without popt or zlib
+* New documentation about the MusicMatch tagging format
+* Minor updates to ID3_Field interface
+* New interface behavior:
+ // copies entire string (same for unicode_t*)
+ size_t ID3_Field::Get(const uchar*, size_t)
+ // for lists, copies a specific item in string (0-based)
+ size_t ID3_Field::Get(const uchar*, size_t, index_t);
+ // returns the size in characters for strings, in bytes for all else
+ size_t ID3_Field::Size() cosnt;
+ // returns the rendered size of the field
+ size_t ID3_Field::BinSize() cosnt;
+
+2000-07-07 Version 3.7.12
+
+* Removed debugging output left over from 3.7.11
+* Update() now updates all tag types by default, not just ID3v2
+* Added a second, optional parameter to ID3_GetComment to find a comment with
+ a specific description
+* Converting an ID3v1 comment to an ID3v2 COMM frame now has the description
+ "ID3v1 Comment"
+* An ID3v2 COMM frame will only be converted to an ID3v1 comment if it has a
+ description of "ID3v1 Comment"
+
+2000-07-05 Version 3.7.11
+
+* Now parses and converts files with MusicMatch tags (beta - needs testing!)
+* New tag type enums: ID3TT_LYRICS3, ID3TT_LYRICS3V2, ID3TT_MUSICMATCH,
+ ID3TT_PREPENDED, ID3TT_APPENDED. Deprecated ID3TT_LYRICS
+* Improved file processing routines; cleaned up interface w.r.t. files
+* Stripping one type of appended tag strips them all
+* New C function: ID3Tag_HasTagType
+* New methods for ID3_Tag: GetPrependedBytes(), GetAppendedBytes(),
+ GetFileSize(), and GetFileName()
+* New function for calculating size of non-tag data in file: ID3_GetDataSize()
+* Render now parameterized on ID3_TagType
+* Bug fixes
+
+2000-06-23 Version 3.7.10
+
+* New and updated example tags
+* Corrected unicode parsing and rendering
+* Improved parsing/conversion of Lyrics3 v2.00 tags
+* Fixed errors with exception handling (thanks to Luca Leonardo Scorcia for the
+ bug reports)
+* Fixed bugs/memory leaks with removing frames and updating tag (thanks to Luca
+ Leonardo Scorcia for the bug reports)
+* Fixed finding of frames with empty text fields (thanks to Luca Leonardo
+ Scorcia for the bug reports)
+* Improved documentation/implementation for uint28
+* Added GetTextID() method for ID3_Frame objects
+* Tag doesn't render if there aren't any frames; frame doesn't render if there
+ aren't any fields
+* Reordered ID3_AddSyncLyrics() parameters for better consistency with other
+ helper functions
+* ID3_GetSyncLyricsInfo() parameters updated to be more specific
+* Several other minor bug fixes
+
+2000-05-28 Version 3.7.9
+
+* Added new test programs in examples/ for creating example tag files
+* Further improvements to compile on (Unix) systems that don't have zlib
+* Fixed a bug when parsing compressed frames (thanks to Christian Becker for
+ the bug report and example file)
+* Fixed several bugs when writing to files (thanks to Lothar Egger and Peter
+ Thorstenson for the bug reports)
+* New delphi example code for use with id3com (thanks Michael Little)
+* Bugfixes for id3com (thanks John Adcock)
+* Changed behavior of Link() and Clear() in ID3_Tag: Clear() doesn't remove
+ file reference, and Link'ing to an already-linked tag just changes the file
+ reference
+* Cleaned up the class interfaces to use size_t, flags_t, and index_t rather
+ than luint, so as to be more descriptive
+* ID3_Tag::RemoveFrame() now returns the pointer to the frame removed (NULL if
+ not present), thus releasing the tag from its repsonsibility of managing that
+ frame's memory
+* Cleaned up C interface so that appropriate function parameters are const
+* Cleaned up implementation of ID3_Tag::Clear() to fix inconsistencies
+* Deprecated ID3_Tag's HasV2Tag(), HasV1Tag(), and HasLyrics() methods in
+ favor of ID3_Tag::HasTagType() method
+* All Render() methods now const
+* Added GetUnsync() method to ID3_Tag
+* Cleaned up internal class definitions (thereby destroying binary
+ compatibility)
+* ID3v2 tag now won't render (and its reported size is 0) if there aren't any
+ frames (per the spec)
+* Fixed a bug when copying frames that prevented rendering compressed frames in
+ certain situations
+* Fixed a bug with resyncing that caused it to improperly handle the last byte
+* Fixed a bug with recognizing certain sync signals
+* Lots of other minor changes
+
+2000-05-11 Version 3.7.8
+
+* Major bug fix that caused all string frames to be written out as unicode, yet
+ with the wrong encoding information given
+* Bug fix for stripping id3v2 tags that wouldn't remove enough data
+* Bug fix for writing id3v1 tags that might add extraneous data to the tag
+
+2000-05-10 Version 3.7.7
+
+* As part of the major rewrite of underlying codebase started with previous
+ release, this release features near-complete reimplementation of most of the
+ ID3v2 parsing code - smaller, faster, and better organized
+* Much imporved Lyrics3 v2 tag support, along with much improved synchronized
+ lyrics (SYLT) support (thanks Severino Delaurenti)
+* Updated id3com to reflect changes to compression strategy introduced in last
+ release (thanks John Adcock)
+* Cleaned up the parameters to several functions/methods with regards to
+ constness
+* Several new methods to several classes
+* A variety of bugfixes
+
+2000-05-03 Version 3.7.6
+
+* Beginning of major rewrite of underlying codebase to improve efficiency,
+ expandability; the interface will need minor updates through this endeavor
+ (sorry!)
+* Major bugfix in ID3_Tag::Strip which was deleting too much info from a file
+ in certain circumstances
+* Add descriptions to frames; can access either through a ID3_Frame method for
+ a frame object, or via the static method on the class (w/ ID3_FrameID param)
+ (thanks John Adcock for descriptions, Daryl Pawluk for spotting misorder)
+* Frame compression is determined frame by frame, so deprecated
+ ID3_Tag::SetCompression() for ID3_Frame::SetCompression().
+ ID3_Tag::SetCompression() is now a no-op (updated C interface accordingly)
+* New method ID3_Frame::Contains(ID3_FieldID) for determining if a frame
+ contains a particular field
+* New static method ID3_Tag::IsV2Tag() deprecates ID3_IsTagHeader()
+* Other minor bugfixes
+
+2000-04-28 Version 3.7.5
+
+* Fixed nasty bug with rewriting tags to windows files (thanks John Adcock)
+* More fixes, improvements to id3com files (thanks John Adcock)
+* Added parsing of Lyrics3 v1.00 tags (thanks Severino Delaurenti)
+* Updated documentation, but still in flux
+* Other minor bugfixes
+
+2000-04-26 Version 3.7.4
+
+* Fixed windows project files so that they all work correctly with new release
+ (thanks John Adcock, Robert Moon, and Lothar Egger)
+* Added a simple VB app to test id3lib using id3com.dll (thanks John Adcock)
+* Added better implementation of PRIV (Private) frame (thanks John Adcock)
+* Fixed padding logic (thanks John Adcock)
+* New "Spec Versioning" system under the hood produces minor interface change
+ - Defined new enum: ID3_V2Spec (ID3V2_2_0, ID3V2_2_1, ID3V2_3_0, etc.)
+ - {Get,Set}Spec now used in favor of deprected {Get,Set}Version, GetRevision
+ - Field definitions updated accordingly; now smaller and more exact
+
+2000-04-24 Version 3.7.3
+
+* C/C++ interface changes:
+ - Moved V1_LEN* constants into an enumeration so that they can be used as
+ array size initializers in C. Renamed the constants for consistency
+ (LEN_V1 -> ID3_V1_LEN, LEN_V1_TITLE -> ID3_V1_LEN_TITLE, etc.)
+ - Renamed ID3_TagType's enums to be more consistent with rest of library's
+ enums (V1_TAG -> ID3TT_ID3V1, V2_TAG -> ID3TT_ID3V2, etc.)
+ - ID3_Err enumeration now defines ID3E_NoError
+* C++ interface changes:
+ - ID3_Frame now has a copy constructor
+ - ID3_Tag::AddNewFrame deprecated for AttachFrame (no other difference in
+ behavior)
+ - ID3_Tag::Link(char *, bool, bool) deprecated for
+ ID3_Tag::Link(char *, luint). Now accepts ID3_TagTypes to determine which
+ tags to parse. i.e, mytag.Link("myfile.mp3", ID3TT_ID3V2 | ID3TT_LYRICS);
+ - ID3_Tag::operator<<, ID3_Tag::AddFrame: relevant parameters now const
+* C interface changes:
+ - ID3Tag_Parse, ID3Tag_Update, ID3Tag_Strip now return an ID3_Err
+ - Added functions ID3Tag_UpdateByTagType, ID3Frame_New, ID3Frame_NewID,
+ ID3Frame_Delete
+* Implementation changes:
+ - AddFrame, AddFrames now add copies of the frames passed in.
+ - AttachFrame adds the actual frame passed to it.
+ - The tag takes responsibility for managing its frames' memory in all cases.
+* Miscellaneous changes:
+ - Moved most enum and struct declarations to include/id3/globals.h so they
+ are accessible to C interface
+ - id3com.dsp file is 'fixed', but the project still doesn't compile w/o
+ errors
+ - Most doxygen comments moved from tag.h to respective files
+ - Fixed a bug in id3lib.spec which caused rpm binaries to be compiled without
+ exception handling
+ - examples, include/id3/* header files no longer include config.h
+ - Other minor bugfixes
+
+2000-04-21 Version 3.7.2
+
+* Implementation of C interface for all platforms (in src/c_wrapper.cpp, which
+ replaces dll_wrapper.cpp)
+* Added examples/demo_simple.c which demonstrates basic use of C interface
+* Auto-generated documentation no longer shipped with main tarball distribution
+* mp3 example files no longer included (still available via CVS)
+* Updated Windows project files so that they'll (hopefully) compile cleanly
+ again
+
+2000-04-19 Version 3.7.1
+
+* Interface changed: functions in version.{h,cpp} replaced with constants
+ defined in globals.h
+* Added a spec file for creating rpm's
+* C interface now defined in include/id3.h, replaces include/src/dll.h;
+* Lots of file movement. src/id3/* to src/; src/examples to examples;
+* Examples now compiled as installable binaries, rather than 'checks'
+* Removed unnecessary files: externals.h, types.h, version.{h,cpp}, dll.h
+
+2000-04-15 Version 3.7.0
+
+* New project management: MusicMatch handed reigns over to Scott Thomas Haug
+* New project licensing: LGPL (http://www.gnu.org/copyleft/lesser.html)
+* New versioning: 3.7.x is unstable series leading up to 3.8.x stable
+* Many bug fixes
+* Better windows compatibility, with new windows project files
+* Improved documentation, using the Doxygen documentation system
+ (http://www.stack.nl/~dimitri/doxygen/)
+* Extended API, improved implementation
+* More supported frames
+* Now parses and rerenders unrecognized frame types
+* Better version handling in configuration files, similar to the glib library
+ (http://www.gtk.org)
+
+1999-12-02 Version 3.6.2
+
+* Improved portability: another minor portability fixes, along with the
+ inclusion of zlib sources and project files for windows compilation.
+
+1999-12-01 Version 3.6.1
+
+* Code movement: moved the header files from src/id3 to include/id3 to allow
+ for easier windows compilation.
+* Improved portability: made changes in several files to improve compilation
+ on windows. (thanks to elrod for the fixes)
+* Random cleanup: some spelling errors fixed, some minor file administration,
+ etc.
+
+1999-11-30 Version 3.6.0
+
+* Code overhaul: more descriptive variable naming, streamlined implementation
+ logic, cleaner interface specification, generalization of magic numbers and
+ strings.
+* Better documentation: transcribed the the "Documentation for ID3Lib 3.05"
+ document (written by Dirk Mahoney, 22 Nov 1998) into the actual source, using
+ javadoc-like tags so as to create documentation with the application doc++.
+ Using this program (and ones like it) allows for creating the documentation
+ in many different formats, including html, texinfo, man, latex, and the like.
+* Added functionality: Added additional functions for simplified access to
+ common tags, such as artist, title, and album.
+* More robust error checking: Improved upon the exception handling already in
+ place to better handle error conditions, such as invalid tags, unrecognized
+ frames, and the like. Work is still needed to ensure the library can handle
+ error situations gracefully.
+* Improved portability: restructured the code into a GNU-like directory.
+ hierarchy. By making use of the GNU tools automake and autoconf, a wide
+ variety of platforms can be easily supported. This allows for a standard
+ "./configure; make; make install" installation process, as well as an
+ equally trivial method for uninstallation: "make uninstall". Likewise,
+ "make check" builds the example applications (see below).
+* Enhanced examples: the src/examples/ subdirectory has both new and improved
+ examples demonstrating how to make use of id3lib. The original "id3convert"
+ example now can convert both ways between id3v1 and id3v2 tags, as well as
+ strip both types of tags off of files via command-line switches.
+ Additionally, an "id3info" app has been added for displaying id3v1/v2 tag
+ information about a file.
+* Bug fixing: Fixes, fixes, and more fixes. A continual process.
+* The zlib library files were removed from the project. The need for zlib
+ was instead made a requirement through the configuration process via autoconf
+ and automake.
+* All of the id3lib library files were renamed by removing the "id3_" prefix.
+ Instead, the library files were placed in an id3 subdirectory in the src
+ directory. Likewise, when the library is installed on a system, an "id3"
+ subdirectory is created in the indicated include directory, and the header
+ files are placed there. Pragmatically, this means that code that makes use
+ of id3lib needs to "#include <id3/tag.h>" rather than "#include <id3_tag.h>".
+ This was done to create more structure and to avoid clutter in the include
+ directory.
+* The versioning strategy has been updated to be more in line with the
+ "libtool" way. However, in order to be more compatible with how versions
+ progressed previously, I've taken the approach that many other libraries have
+ taken: I've "massaged" the version:revision:age numbers so that the resulting
+ compiled library shows up as id3lib.so.3.6.0 (or whatever the current release
+ is). This is /strongly/ advised against in the libtool documentation, so I'm
+ considering going to a more "traditional" libtool versioning approach (see
+ the libtool info page for more information).
+
+There is yet much to do! Please see the TODO file for known bugs and lacking
+features...
diff --git a/README b/README
new file mode 100644
index 0000000..d813998
--- /dev/null
+++ b/README
@@ -0,0 +1,98 @@
+General Information
+===================
+
+id3lib is a software library for manipulating ID3v1/v1.1 and ID3v2 tags.
+id3lib 3.0.x conforms to all ID3v2 standards up to and including the ID3v2.3.0
+informal standard.
+
+The id3lib project makes use of the resources available through
+SourceForge.net. Using SourceForge, the id3lib project is able to provide
+several tools for developers, including a project homepage, a mailing list, a
+patch manager, bug tracking, and cvs access, among other things.
+
+The id3lib project page, which includes links to all of the above, is:
+ http://sourceforge.net/project/?group_id=979
+
+The official id3lib homepage is:
+ http://id3lib.sourceforge.net
+
+The id3lib developers' mailing list's address is:
+ id3lib-devel@lists.sourceforge.net
+
+You can subscribe, unsubscribe, and view mailing list archives at:
+ http://lists.sourceforge.net/mailman/listinfo/id3lib-devel
+
+Information about ID3v2 and related standards can be found at:
+ http://www.id3.org
+
+Installation
+============
+
+See the file 'INSTALL'
+
+Requirements
+============
+
+In order to successfully compile and use id3lib, the following programs and
+libraries are needed:
+
+Compiling:
+----------
+g++ 2.8/egcs 1.0.3 (or compatible)
+GNU make
+autoconf 2.13
+automake 1.4
+zlib
+doxygen (optional, for creating documentation)
+
+Using:
+----------
+zlib
+
+How to report bugs
+==================
+
+To report a bug, submit it to the bug tracker, linked to from the id3lib
+project page, or send mail to the id3lib-devel mailing list.
+
+If you send it to the mailing list, please include the following:
+
+* The version of id3lib
+
+* Information about your system. For instance:
+
+ - What operating system and version
+ - For Linux, what version of the C library
+
+ And anything else you think is relevant.
+
+* How to reproduce the bug.
+
+ Please include either a short test program that exhibits the
+ behavior or an example tag that isn't correctly parsed/rendered by
+ the library. As a last resort, you can also provide a pointer to
+ a larger piece of software or tagged file that can be downloaded.
+
+* If the bug was a crash, the exact text that was printed out
+ when the crash occured.
+
+* Further information such as stack traces may be useful, but
+ is not necessary.
+
+Patches
+=======
+
+Patches can be submitted to the patch manager at the id3lib project page, as
+mentioned above. Please follow the instructions there. So as not to annoy
+uniterested parties with large email messages, it is preferable that you not
+send such patches to the mailing list.
+
+For Further Reading
+===================
+
+id3lib is free software. Please see the COPYING file for details.
+For documentation, please see the files in the doc subdirectory.
+See the HISTORY file for information about development up to version 3.05a.
+See the NEWS file for information about development since 3.05a.
+See the ChangeLog file for an account of changes made to files in the library.
+See the AUTHORS and THANKS files to see who has contributed to id3lib.
diff --git a/THANKS b/THANKS
new file mode 100644
index 0000000..47dd751
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,122 @@
+$Id: THANKS,v 1.20 2003/03/02 16:38:17 t1mpy Exp $
+
+id3lib THANKS file
+
+See the AUTHORS file for a list of past and current project maintainers.
+
+Since version 3.05a, several individuals have helped further the development of
+id3lib. They are listed below, in no particular order. Please inform the
+current project maintainer if anyone has been missed.
+
+* Paul-Henri (paul-henri.ferme@noos.fr) and Christopher John Shaker <(cjshaker@shaker-net.com)
+ for pointing out where the code could have been more robust in tag_find.cpp.
+* Bradley J. Marker for pointing out that checking for NULL in Set() can
+ prevent crashes.
+* Todd Wilson for making a better field.cpp.
+* Baz (thebaz@pluizig.com) for creating a patch to get vbr info.
+* Tobias Hoppe (choppe@cs.uni-magdeburg.de) for providing a better way to
+ get the framesize.
+* Philipp Thomas (pthomas@suse.de) for help with compiling id3lib for gcc 3.2,
+ and make it better compliant with libstdc++
+* John George (johngeorge_k@asianetindia.com) for donating a number of routines
+ in misc_support.cpp.
+* Frog Prince (thefrogprince@hotmail.com) for helping with compatibility issues
+ for VB and Delphi
+* Simon Ferrett (simon@musicmatch.com) made the id3lib.org domain point to our
+ project page. He also kindly created an email alias.
+* Kamran (kamran@musicmatch.com) fixed several bugs in MusicMatch's internal
+ version of ID3Lib which were merged into the current public version of
+ id3lib.
+* Alexander Voronin (av@oskarsb.ru) has submitted several patches to fix a
+ variety of bugs.
+* John Adcock (johnadcock@hotmail.com) provided the COM wrapper and lib
+ projects for id3lib, the VB test app for id3com.dll, as well as several
+ bugfixes and improvements.
+* Myers W. Carpenter (myers@fil.org) has submitted a patch for improving the
+ interface and functionality of the library.
+* Justin Rogers (justin@mlstoday.com) has provided much valuable conversation
+ as to the design and implementation of id3lib.
+* Mark B. Elrod (elrod@liquidmetal.com) has provided several patches for better
+ win32 functionality.
+* Scott Moser (smoser@brickies.net) provided the php translation of the
+ original ID3Lib manual
+* Robert Moon (rob@emusic.com) provided tremendous help getting the C interface
+ up to speed, as well as providing bugfixes for the Windows projects.
+* Lothar Egger (lothar.egger@chello.at) also assisted in fixing the Windows
+ projects, as well as providing assistance for testing the dlls under Windows
+* Severino Delaurenti (id3lib@castlems.com) added functionality for parsing
+ Lyrics3 v1.0 and v2.0 tags, as well as improving synchronized lyric frame
+ (SYLT) dramatically.
+* Michael Little (mike@netlinear.com) provided the delphi code for use with
+ id3com.
+* Peter Luijer (videoripper@hotmail.com) provided much useful documentation
+ on the MusicMatch tagging format.
+* Steven Frank (stevenf@users.sourceforge.net) provided invaluable help in
+ tracking down runtime bugs for the Macintosh port.
+* The following individuals have assisted by providing bug reports and (often)
+ suggestions for fixes:
+ - Ben Noblet (Ben.Noblet@xt3.com.au)
+ - Benedikt Roth (Benedikt.Roth@gmx.net)
+ - Christian Becker (chris@craze.de)
+ - Daryl Pawluk (dpawluk@home.com)
+ - John Firebaugh (jfirebaugh@mac.com)
+ - John Southerland (jbsouthe@home.com)
+ - Luca Leonardo Scorcia (scrlln@tin.it)
+ - Peter Thorstenson (swede@openlink.com.br)
+ - Sasa Ðolic (sasad@moderngroove.com)
+ - Steven Frank (stevenf@users.sourceforge.net)
+ - Tim Newsome (nuisance@cmu.edu)
+
+Dirk Mahoney included the following at the end of his documentation on ID3Lib
+3.05a. It is included in verbatim here.
+
+ Special Thanks and Credits
+
+ I would like to extend my many thanks to the people who have contributed to
+ the ID3Lib project. The show of support has been tremendous. I consider
+ ID3Lib to be a very 'international' product, as contributions have come from
+ almost literally every corner of the globe. If I have missed you, please
+ forgive my lapse of memory.
+
+ * Jean-loup Gailly and Mark Adler - for their great zlib compression library
+ and for making it free.
+ * Tord Jansson - for much help with teaching me how to make and use DLLs.
+ * Slava Karpenko for creating the MacOS static link libraries for the PowerPC
+ and CodeWarrior.
+ * Bob Kohn - for his advice, input, and generally creating the ID3Lib license
+ agreement.
+ * Eng-Keong Lee - for finding a few bugs and for extensively testing ID3Lib
+ 2.xx.
+ * James Lin - for his 'ID3v2 Programming Guidelines', and many helpful
+ suggestions
+ * Michael Mutschler - for prompting me to write the Unicode support and for
+ his input on the ID3Lib calling convention.
+ * Martin Nilsson - for ID3v2, his support of the ID3Lib web page, for many,
+ many suggestions, debates, pointers, URLs, documents, and brightly coloured
+ fish.
+ * Chris Nunn - for the 3D animated ID3v2 logos which appear in the ID3Lib web
+ page and in the distribution.
+ * Lachlan Pitts - for general implementation ideas and his brief but helpful
+ work on the up-coming genre tree.
+ * Jukka Poikolainen - for prompting to implement error handling via the C++
+ exception handling mechanism instead of the old 2.xx-style of using an
+ error handling function.
+ * Carson Puchol - for his help with some minor Linux compilation hassles.
+ * Andreas Sigfridsson - for his initial code for the unsync/resync support
+ and for his very valuable input in long brainstorming sessions.
+ * Michael Robertson - for helping support ID3Lib by posting announcements on
+ MP3.com.
+ * Ilana Rudnik - for bug finding and suggestions.
+ * Chuck Zenkus - for his support of ID3v2 and ID3Lib by providing us with a
+ mirror in the United States and for his bug finding and suggestions.
+ * And last but by no means least, all the others who support ID3Lib by
+ subscribing to the mailing list and to the contributors to the discussions
+ and debates in the ID3v2 discussion group.
+
+ Without the help of all these people, ID3Lib would not be as good as it is,
+ and I dare say might not even exist if they all weren't around to provide
+ motivation to continue to write the thing!
+
+ - Dirk Mahoney
+ 22 November 1998
+ Brisbane, Australia
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..bd63dde
--- /dev/null
+++ b/TODO
@@ -0,0 +1,42 @@
+$Id: TODO,v 1.4 2000/04/17 05:11:09 eldamitri Exp $
+
+id3lib still requires the following work:
+
+* testing testing testing
+* The interface for file access is muddled. It has been separated out from the
+ next unstable release (3.9.x), but perhaps it can be cleaned up for 3.7.x
+* id3lib needs a C interface. Badly.
+* Some of the limitations present in 3.05a have been fixed, but many still
+ exist. See below for the original list and what has been updated.
+
+Version 3.05a of ID3Lib has some known limitations...
+
+* Firstly, contrary to good programming ideas and contrary to the 'ID3v2
+ Programming Guidelines', ID3Lib will explode in a ball of brilliant blue
+ flame if asked to parse an invalid ID3v2 tag. This will change.
+ + Update for 3.7.0: this has been improved, but still requires more testing.
+
+* Incorrect handling of unknown frames. This means that when ID3Lib encounters
+ an unknown frame, it is currently ignored. It is neither re-written to the
+ tag when re-rendered nor are the file or tag alter frame flags observed.
+ + 3.7.0 adds nominal support for all remaining known frames (as defined in
+ the spec for id3v2.2.0 and id3v2.3.0 at www.id3.org). Unknown frames are
+ now parsed and re-rendered, but the file and tag alter frame flags are not
+ yet observed
+
+* No support for the read-only frame flag. It is currently ignored---such
+ frames can be altered at will.
+
+* No support as yet for the verification of frames before rendering.
+
+* Does not yet render 3.0 extended headers. Although the functionality for
+ selecting this is present, the setting is ignored for now.
+
+* Does not yet parse 3.0 extended headers. They are quite adequately ignored
+ and the rest of the tag is parsed correctly.
+
+* ID3Lib currently has no direct support for things like the language and
+ currency fields. It is up to the application to generate the data for these
+ fields manually. Soon, ID3Lib will have these things assigned to IDs so that
+ the applications programmer will not have to remember the ISO tables for the
+ actual strings. \ No newline at end of file
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..cfd284f
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,105 @@
+/*
+** This file has been automatically generated by 'acconfig' from aclocal.m4
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+@TOP@
+/* This is the template section */
+
+/* These are standard for all packages using Automake */
+#undef PACKAGE
+#undef VERSION
+
+/* And now the rest of the boys */
+#undef CXX_HAS_BUGGY_FOR_LOOPS
+#undef CXX_HAS_NO_BOOL
+#undef ID3_ENABLE_DEBUG
+#undef ID3_DISABLE_ASSERT
+#undef ID3_DISABLE_CHECKS
+#undef ID3_ICONV_FORMAT_UTF16BE
+#undef ID3_ICONV_FORMAT_UTF16
+#undef ID3_ICONV_FORMAT_UTF8
+#undef ID3_ICONV_FORMAT_ASCII
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+#undef HAVE_ZLIB
+#undef HAVE_GETOPT_LONG
+#undef _ID3LIB_NAME
+#undef _ID3LIB_VERSION
+#undef _ID3LIB_FULLNAME
+#undef _ID3LIB_MAJOR_VERSION
+#undef _ID3LIB_MINOR_VERSION
+#undef _ID3LIB_PATCH_VERSION
+#undef _ID3LIB_INTERFACE_AGE
+#undef _ID3LIB_BINARY_AGE
+#undef _ID3_COMPILED_WITH_DEBUGGING
+/* */
+
+@BOTTOM@
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+#undef for
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..e49b53f
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,4598 @@
+# aclocal.m4 generated automatically by aclocal 1.6.2 -*- Autoconf -*-
+
+# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
+
+# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_PREREQ([2.52])
+
+# serial 6
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. We must strip everything past the first ":",
+# and everything past the last "/".
+
+# _AM_DIRNAME(PATH)
+# -----------------
+# Like AS_DIRNAME, only do it during macro expansion
+AC_DEFUN([_AM_DIRNAME],
+ [m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1,
+ m4_if(regexp([$1], [^//\([^/]\|$\)]), -1,
+ m4_if(regexp([$1], [^/.*]), -1,
+ [.],
+ patsubst([$1], [^\(/\).*], [\1])),
+ patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
+ patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
+])# _AM_DIRNAME
+
+
+# The stamp files are numbered to have different names.
+# We could number them on a directory basis, but that's additional
+# complications, let's have a unique counter.
+m4_define([_AM_STAMP_Count], [0])
+
+
+# _AM_STAMP(HEADER)
+# -----------------
+# The name of the stamp file for HEADER.
+AC_DEFUN([_AM_STAMP],
+[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl
+AS_ESCAPE(_AM_DIRNAME(patsubst([$1],
+ [:.*])))/stamp-h[]_AM_STAMP_Count])
+
+
+# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS)
+# ------------------------------------------------------------
+# We used to try to get a real timestamp in stamp-h. But the fear is that
+# that will cause unnecessary cvs conflicts.
+AC_DEFUN([_AM_CONFIG_HEADER],
+[# Add the stamp file to the list of files AC keeps track of,
+# along with our hook.
+AC_CONFIG_HEADERS([$1],
+ [# update the timestamp
+echo 'timestamp for $1' >"_AM_STAMP([$1])"
+$2],
+ [$3])
+])# _AM_CONFIG_HEADER
+
+
+# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS)
+# --------------------------------------------------------------
+AC_DEFUN([AM_CONFIG_HEADER],
+[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])])
+])# AM_CONFIG_HEADER
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+AC_PREREQ([2.52])
+
+# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow
+# the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl
+ AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG(AMTAR, tar)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_][CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_][CC],
+ defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_][CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_][CXX],
+ defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+# Copyright 2002 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.6.2])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright 2001, 2002 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# -*- Autoconf -*-
+
+
+# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+# Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_AUX_DIR_EXPAND], [
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# serial 4 -*- Autoconf -*-
+
+# Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ echo '#include "conftest.h"' > conftest.c
+ echo 'int i;' > conftest.h
+ echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=conftest.c object=conftest.o \
+ depfile=conftest.Po tmpdepfile=conftest.TPo \
+ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
+ grep conftest.h conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[rm -f .deps 2>/dev/null
+mkdir .deps 2>/dev/null
+if test -d .deps; then
+ DEPDIR=.deps
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ DEPDIR=_deps
+fi
+rmdir .deps 2>/dev/null
+AC_SUBST([DEPDIR])
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking Speeds up one-time builds
+ --enable-dependency-tracking Do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue
+ # Extract the definition of DEP_FILES from the Makefile without
+ # running `make'.
+ DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n -e '/^U = / s///p' < "$mf"`
+ test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
+ # We invoke sed twice because it is the simplest approach to
+ # changing $(DEPDIR) to its actual value in the expansion.
+ for file in `sed -n -e '
+ /^DEP_FILES = .*\\\\$/ {
+ s/^DEP_FILES = //
+ :loop
+ s/\\\\$//
+ p
+ n
+ /\\\\$/ b loop
+ p
+ }
+ /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*-
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+doit:
+ @echo done
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST(am__include)
+AC_SUBST(am__quote)
+AC_MSG_RESULT($_am_result)
+rm -f confinc confmf
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright 1997, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 5
+
+AC_PREREQ(2.52)
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([conditional \"$1\" was never defined.
+Usually this means the macro was only invoked conditionally.])
+fi])])
+
+# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-
+
+# serial 46 AC_PROG_LIBTOOL
+
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])
+
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+_LT_AC_PROG_ECHO_BACKSLASH
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE(libtool-lock,
+ [ --disable-libtool-lock avoid locking (might break parallel builds)])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_SAVE
+ AC_LANG_C
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_RESTORE])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+
+ # recent cygwin and mingw systems supply a stub DllMain which the user
+ # can override, but on older systems we have to supply one
+ AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain,
+ [AC_TRY_LINK([],
+ [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*);
+ DllMain (0, 0, 0);],
+ [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])])
+
+ case $host/$CC in
+ *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*)
+ # old mingw systems require "-dll" to link a DLL, while more recent ones
+ # require "-mdll"
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -mdll"
+ AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch,
+ [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])])
+ CFLAGS="$SAVE_CFLAGS" ;;
+ *-*-cygwin* | *-*-pw32*)
+ # cygwin systems need to pass --dll to the linker, and not link
+ # crt.o which will require a WinMain@16 definition.
+ lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;;
+ esac
+ ;;
+ ])
+esac
+
+_LT_AC_LTCONFIG_HACK
+
+])
+
+# AC_LIBTOOL_HEADER_ASSERT
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT],
+[AC_CACHE_CHECK([whether $CC supports assert without backlinking],
+ [lt_cv_func_assert_works],
+ [case $host in
+ *-*-solaris*)
+ if test "$GCC" = yes && test "$with_gnu_ld" != yes; then
+ case `$CC --version 2>/dev/null` in
+ [[12]].*) lt_cv_func_assert_works=no ;;
+ *) lt_cv_func_assert_works=yes ;;
+ esac
+ fi
+ ;;
+ esac])
+
+if test "x$lt_cv_func_assert_works" = xyes; then
+ AC_CHECK_HEADERS(assert.h)
+fi
+])# AC_LIBTOOL_HEADER_ASSERT
+
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)
+])# _LT_AC_CHECK_DLFCN
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+irix*)
+ symcode='[[BCDEGRST]]'
+ ;;
+solaris* | sysv5*)
+ symcode='[[BDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ symcode='[[ABCDGISTW]]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ pipe_works=yes
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+ else
+ echo "$progname: failed program was:" >&AC_FD_CC
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ global_symbol_to_cdecl=
+ global_symbol_to_c_name_address=
+else
+ global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+ global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
+then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+# ---------------------------------
+AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR],
+[# Find the correct PATH separator. Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+ UNAME=${UNAME-`uname 2>/dev/null`}
+ case X$UNAME in
+ *-DOS) lt_cv_sys_path_separator=';' ;;
+ *) lt_cv_sys_path_separator=':' ;;
+ esac
+ PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+AC_DIVERT_POP
+])# _LT_AC_PROG_ECHO_BACKSLASH
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_unknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+AC_DEFUN([_LT_AC_LTCONFIG_HACK],
+[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+ ;;
+ *)
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="[$]2"
+
+AC_MSG_CHECKING([for objdir])
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+AC_MSG_RESULT($objdir)
+
+
+AC_ARG_WITH(pic,
+[ --with-pic try to use only PIC/non-PIC objects [default=use both]],
+pic_mode="$withval", pic_mode=default)
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+AC_CACHE_VAL(lt_cv_prog_cc_pic,
+[ lt_cv_prog_cc_pic=
+ lt_cv_prog_cc_shlib=
+ lt_cv_prog_cc_wl=
+ lt_cv_prog_cc_static=
+ lt_cv_prog_cc_no_builtin=
+ lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+ if test "$GCC" = yes; then
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-static'
+
+ case $host_os in
+ aix*)
+ # Below there is a dirty hack to force normal static linking with -ldl
+ # The problem is because libdl dynamically linked with both libc and
+ # libC (AIX C++ library), which obviously doesn't included in libraries
+ # list by gcc. This cause undefined symbols with -static flags.
+ # This hack allows C programs to be linked with "-static -ldl", but
+ # not sure about C++ programs.
+ lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_cv_prog_cc_pic='-fno-common'
+ ;;
+ cygwin* | mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_cv_prog_cc_pic='-DDLL_EXPORT'
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_cv_prog_cc_pic=-Kconform_pic
+ fi
+ ;;
+ *)
+ lt_cv_prog_cc_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for PIC flags for the system compiler.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ lt_cv_prog_cc_wl='-Wl,'
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_cv_prog_cc_static='-Bstatic'
+ else
+ lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+ lt_cv_prog_cc_pic='+Z'
+ ;;
+
+ irix5* | irix6*)
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-non_shared'
+ # PIC (with -KPIC) is the default.
+ ;;
+
+ cygwin* | mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_cv_prog_cc_pic='-DDLL_EXPORT'
+ ;;
+
+ newsos6)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ # All OSF/1 code is PIC.
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ lt_cv_prog_cc_pic='-Kpic'
+ lt_cv_prog_cc_static='-dn'
+ lt_cv_prog_cc_shlib='-belf'
+ ;;
+
+ solaris*)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ lt_cv_prog_cc_wl='-Wl,'
+ ;;
+
+ sunos4*)
+ lt_cv_prog_cc_pic='-PIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ lt_cv_prog_cc_wl='-Qoption ld '
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ if test "x$host_vendor" = xsni; then
+ lt_cv_prog_cc_wl='-LD'
+ else
+ lt_cv_prog_cc_wl='-Wl,'
+ fi
+ ;;
+
+ uts4*)
+ lt_cv_prog_cc_pic='-pic'
+ lt_cv_prog_cc_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_cv_prog_cc_pic='-Kconform_pic'
+ lt_cv_prog_cc_static='-Bstatic'
+ fi
+ ;;
+
+ *)
+ lt_cv_prog_cc_can_build_shared=no
+ ;;
+ esac
+ fi
+])
+if test -z "$lt_cv_prog_cc_pic"; then
+ AC_MSG_RESULT([none])
+else
+ AC_MSG_RESULT([$lt_cv_prog_cc_pic])
+
+ # Check to make sure the pic_flag actually works.
+ AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works])
+ AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+ AC_TRY_COMPILE([], [], [dnl
+ case $host_os in
+ hpux9* | hpux10* | hpux11*)
+ # On HP-UX, both CC and GCC only warn that PIC is supported... then
+ # they create non-PIC objects. So, if there were any warnings, we
+ # assume that PIC is not supported.
+ if test -s conftest.err; then
+ lt_cv_prog_cc_pic_works=no
+ else
+ lt_cv_prog_cc_pic_works=yes
+ fi
+ ;;
+ *)
+ lt_cv_prog_cc_pic_works=yes
+ ;;
+ esac
+ ], [dnl
+ lt_cv_prog_cc_pic_works=no
+ ])
+ CFLAGS="$save_CFLAGS"
+ ])
+
+ if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+ lt_cv_prog_cc_pic=
+ lt_cv_prog_cc_can_build_shared=no
+ else
+ lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+ fi
+
+ AC_MSG_RESULT([$lt_cv_prog_cc_pic_works])
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+ AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries])
+ if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then :
+ else
+ AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure])
+ lt_cv_prog_cc_can_build_shared=no
+ fi
+fi
+
+AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works])
+AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl
+ lt_cv_prog_cc_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+ AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes])
+ LDFLAGS="$save_LDFLAGS"
+])
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+AC_MSG_RESULT([$lt_cv_prog_cc_static_works])
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext])
+AC_CACHE_VAL([lt_cv_compiler_c_o], [
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory. Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s out/conftest.err; then
+ lt_cv_compiler_c_o=no
+ else
+ lt_cv_compiler_c_o=yes
+ fi
+else
+ # Append any errors to the config.log.
+ cat out/conftest.err 1>&AC_FD_CC
+ lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+])
+compiler_c_o=$lt_cv_compiler_c_o
+AC_MSG_RESULT([$compiler_c_o])
+
+if test x"$compiler_c_o" = x"yes"; then
+ # Check to see if we can write to a .lo
+ AC_MSG_CHECKING([if $compiler supports -c -o file.lo])
+ AC_CACHE_VAL([lt_cv_compiler_o_lo], [
+ lt_cv_compiler_o_lo=no
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -c -o conftest.lo"
+ save_objext="$ac_objext"
+ ac_objext=lo
+ AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ lt_cv_compiler_o_lo=no
+ else
+ lt_cv_compiler_o_lo=yes
+ fi
+ ])
+ ac_objext="$save_objext"
+ CFLAGS="$save_CFLAGS"
+ ])
+ compiler_o_lo=$lt_cv_compiler_o_lo
+ AC_MSG_RESULT([$compiler_o_lo])
+else
+ compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+if test "$GCC" = yes; then
+ # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+ AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions])
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+ compiler_rtti_exceptions=no
+ AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ compiler_rtti_exceptions=no
+ else
+ compiler_rtti_exceptions=yes
+ fi
+ ])
+ CFLAGS="$save_CFLAGS"
+ AC_MSG_RESULT([$compiler_rtti_exceptions])
+
+ if test "$compiler_rtti_exceptions" = "yes"; then
+ no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+ else
+ no_builtin_flag=' -fno-builtin'
+ fi
+fi
+
+# See if the linker supports building shared libraries.
+AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries])
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced. Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX, the GNU linker is very broken
+ # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+
+ extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+ sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+ test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+ if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+ else $CC -o impgen impgen.c ; fi)~
+ $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+ old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+ # cygwin and mingw dlls have different entry points and sets of symbols
+ # to exclude.
+ # FIXME: what about values for MSVC?
+ dll_entry=__cygwin_dll_entry@12
+ dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+ case $host_os in
+ mingw*)
+ # mingw values
+ dll_entry=_DllMainCRTStartup@12
+ dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+ ;;
+ esac
+
+ # mingw and cygwin differ, and it's simplest to just exclude the union
+ # of the two symbol sets.
+ dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+ # recent cygwin and mingw systems supply a stub DllMain which the user
+ # can override, but on older systems we have to supply one (in ltdll.c)
+ if test "x$lt_cv_need_dllmain" = "xyes"; then
+ ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+ ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
+ test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+ else
+ ltdll_obj=
+ ltdll_cmds=
+ fi
+
+ # Extract the symbol export list from an `--export-all' def file,
+ # then regenerate the def file from the symbol export list, so that
+ # the compiled dll only exports the symbol export list.
+ # Be careful not to strip the DATA tag left be newer dlltools.
+ export_symbols_cmds="$ltdll_cmds"'
+ $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+ sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
+
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is.
+ # If DATA tags from a recent dlltool are present, honour them!
+ archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname-def;
+ else
+ echo EXPORTS > $output_objdir/$soname-def;
+ _lt_hint=1;
+ cat $export_symbols | while read symbol; do
+ set dummy \$symbol;
+ case \[$]# in
+ 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+ *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;;
+ esac;
+ _lt_hint=`expr 1 + \$_lt_hint`;
+ done;
+ fi~
+ '"$ltdll_cmds"'
+ $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+ $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+ $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # dlltool doesn't understand --whole-archive et. al.
+ whole_archive_flag_spec=
+ ;;
+ *)
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ ;;
+ esac
+ fi
+else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ hardcode_direct=yes
+ archive_cmds=''
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ esac
+
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ shared_flag='${wl}-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall can do strange things, so it is better to
+ # generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='${wl}-berok'
+ # This is a bit strange, but is similar to how AIX traditionally builds
+ # it's shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ ;;
+
+ darwin* | rhapsody*)
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ allow_undefined_flag='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ ;;
+ esac
+ # FIXME: Relying on posixy $() will cause problems for
+ # cross-compilation, but unfortunately the echo tests do not
+ # yet detect zsh echo's removal of \ escapes.
+ archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+ # We need to add '_' to the symbols in $export_symbols first
+ #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ whole_archive_flag_spec='-all_load $convenience'
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ case $host_os in
+ hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+ *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+ esac
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_minus_L=yes # Not in the search PATH, but as the default
+ # location of the library.
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ irix5* | irix6*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case "$host_os" in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ #Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ ;;
+
+ solaris*)
+ # gcc --version < 3.0 without binutils cannot create self contained
+ # shared libraries reliably, requiring libgcc.a to resolve some of
+ # the object symbols generated in some cases. Libraries that use
+ # assert need libgcc.a to resolve __eprintf, for example. Linking
+ # a copy of libgcc.a into every shared library to guarantee resolving
+ # such symbols causes other problems: According to Tim Van Holder
+ # <tim.van.holder@pandora.be>, C++ libraries end up with a separate
+ # (to the application) exception stack for one thing.
+ no_undefined_flag=' -z defs'
+ if test "$GCC" = yes; then
+ case `$CC --version 2>/dev/null` in
+ [[12]].*)
+ cat <<EOF 1>&2
+
+*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
+*** create self contained shared libraries on Solaris systems, without
+*** introducing a dependency on libgcc.a. Therefore, libtool is disabling
+*** -no-undefined support, which will at least allow you to build shared
+*** libraries. However, you may find that when you link such libraries
+*** into an application without using GCC, you have to manually add
+*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to
+*** upgrade to a newer version of GCC. Another option is to rebuild your
+*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
+
+EOF
+ no_undefined_flag=
+ ;;
+ esac
+ fi
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ if test "x$host_vendor" = xsno; then
+ archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ else
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv5*)
+ no_undefined_flag=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec=
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5uw7* | unixware7*)
+ no_undefined_flag='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+AC_MSG_RESULT([$ld_shlibs])
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+AC_MSG_CHECKING([how to hardcode library paths into programs])
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var"; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$hardcode_shlibpath_var" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+AC_MSG_RESULT([$hardcode_action])
+
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}.so$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can
+ # not hardcode correct soname into executable. Probably we can
+ # add versioning support to collect2, so additional links can
+ # be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}.so$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}.so'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ export_dynamic_flag_spec=-rdynamic
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ need_version=no
+ need_lib_prefix=no
+ case $GCC,$host_os in
+ yes,cygwin*)
+ library_names_spec='$libname.dll.a'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
+ postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog .libs/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ ;;
+ yes,mingw*)
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+ ;;
+ yes,pw32*)
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+ ;;
+ *)
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ # FIXME: Relying on posixy $() will cause problems for
+ # cross-compilation, but unfortunately the echo tests do not
+ # yet detect zsh echo's removal of \ escapes.
+ library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+ soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ *)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ dynamic_linker="$host_os dld.sl"
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+ soname_spec='${libname}${release}.sl$major'
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6*)
+ version_type=irix
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}.so$major'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+ case $host_os in
+ irix5*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case "$host_os" in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+os2*)
+ libname_spec='$name'
+ need_lib_prefix=no
+ library_names_spec='$libname.dll $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_version=no
+ soname_spec='${libname}${release}.so'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}.so$major'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+ soname_spec='$libname.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+AC_LIBTOOL_DLOPEN_SELF
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ AC_CACHE_VAL([lt_cv_archive_cmds_need_lc],
+ [$rm conftest*
+ echo 'static int dummy;' > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile); then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_cv_prog_cc_wl
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi])
+ AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc])
+ ;;
+ esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ :
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+ trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+ $rm -f "${ofile}T"
+
+ echo creating $ofile
+
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS \
+ AR AR_FLAGS CC LD LN_S NM SHELL \
+ reload_flag reload_cmds wl \
+ pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+ thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+ library_names_spec soname_spec \
+ RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+ old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+ postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+ old_striplib striplib file_magic_cmd export_symbols_cmds \
+ deplibs_check_method allow_undefined_flag no_undefined_flag \
+ finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+ global_symbol_to_c_name_address \
+ hardcode_libdir_flag_spec hardcode_libdir_separator \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+ case $var in
+ reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+ extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ cat <<'EOF' >> "${ofile}T"
+ # This is a source program that is used to create dlls on Windows
+ # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+ # This is a source program that is used to create import libraries
+ # on Windows for dlls which lack them. Don't remove nor modify the
+ # starting and closing comments
+# /* impgen.c starts here */
+# /* Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+# This file is part of GNU libtool.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# */
+#
+# #include <stdio.h> /* for printf() */
+# #include <unistd.h> /* for open(), lseek(), read() */
+# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
+# #include <string.h> /* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+# int fd;
+# int offset;
+# {
+# unsigned char b[2];
+# lseek (fd, offset, SEEK_SET);
+# read (fd, b, 2);
+# return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+# int fd;
+# int offset;
+# {
+# unsigned char b[4];
+# lseek (fd, offset, SEEK_SET);
+# read (fd, b, 4);
+# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+# void *ptr;
+# {
+# unsigned char *b = ptr;
+# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+# int argc;
+# char *argv[];
+# {
+# int dll;
+# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+# unsigned long export_rva, export_size, nsections, secptr, expptr;
+# unsigned long name_rvas, nexp;
+# unsigned char *expdata, *erva;
+# char *filename, *dll_name;
+#
+# filename = argv[1];
+#
+# dll = open(filename, O_RDONLY|O_BINARY);
+# if (dll < 1)
+# return 1;
+#
+# dll_name = filename;
+#
+# for (i=0; filename[i]; i++)
+# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
+# dll_name = filename + i +1;
+#
+# pe_header_offset = pe_get32 (dll, 0x3c);
+# opthdr_ofs = pe_header_offset + 4 + 20;
+# num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+# if (num_entries < 1) /* no exports */
+# return 1;
+#
+# export_rva = pe_get32 (dll, opthdr_ofs + 96);
+# export_size = pe_get32 (dll, opthdr_ofs + 100);
+# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+# secptr = (pe_header_offset + 4 + 20 +
+# pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+# expptr = 0;
+# for (i = 0; i < nsections; i++)
+# {
+# char sname[8];
+# unsigned long secptr1 = secptr + 40 * i;
+# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+# lseek(dll, secptr1, SEEK_SET);
+# read(dll, sname, 8);
+# if (vaddr <= export_rva && vaddr+vsize > export_rva)
+# {
+# expptr = fptr + (export_rva - vaddr);
+# if (export_rva + export_size > vaddr + vsize)
+# export_size = vsize - (export_rva - vaddr);
+# break;
+# }
+# }
+#
+# expdata = (unsigned char*)malloc(export_size);
+# lseek (dll, expptr, SEEK_SET);
+# read (dll, expdata, export_size);
+# erva = expdata - export_rva;
+#
+# nexp = pe_as32 (expdata+24);
+# name_rvas = pe_as32 (expdata+32);
+#
+# printf ("EXPORTS\n");
+# for (i = 0; i<nexp; i++)
+# {
+# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+# }
+#
+# return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+ mv -f "${ofile}T" "$ofile" || \
+ (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+ chmod +x "$ofile"
+fi
+
+])# _LT_AC_LTCONFIG_HACK
+
+# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
+
+# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case $enableval in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)])
+
+# AC_LIBTOOL_PICMODE - implement the --with-pic flag
+# Usage: AC_LIBTOOL_PICMODE[(MODE)]
+# Where MODE is either `yes' or `no'. If omitted, it defaults to
+# `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)])
+
+
+# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+ /*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+ ;;
+ *)
+ ac_save_MAGIC_CMD="$MAGIC_CMD"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ egrep "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ MAGIC_CMD="$ac_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])
+
+
+# AC_PATH_MAGIC - find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
+AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])
+
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | [[A-Za-z]]:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])
+
+# AC_PROG_LD_GNU -
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ lt_cv_prog_gnu_ld=yes
+else
+ lt_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])
+
+# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag,
+[lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+])
+
+# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependant libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi4*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin* | mingw* | pw32*)
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+ ;;
+ *) # Darwin 1.3 on
+ lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+ ;;
+ esac
+ ;;
+
+freebsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20*|hpux11*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+
+irix5* | irix6*)
+ case $host_os in
+ irix5*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1"
+ ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ case $host_cpu in
+ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+openbsd*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'
+ else
+ lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sco3.2v5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+
+sysv5uw[[78]]* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ esac
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+])
+
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
+AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/${ac_tool_prefix}nm
+ if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ else
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+AC_MSG_RESULT([$NM])
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32*)
+ # These system don't have libm
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, main, LIBM="-lm")
+ ;;
+esac
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-convenience to the
+# configure arguments. Note that LIBLTDL and INCLTDL are not
+# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not
+# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed
+# with '${top_builddir}/' and INCLTDL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-install to the configure
+# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed
+# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will
+# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# with '${top_srcdir}/' (note the single quotes!). If your package is
+# not flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, main,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ INCLTDL=
+ fi
+])
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# Copyright 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+dnl Autoconf support for C++
+
+AC_DEFUN([ID3_CXX_WARNINGS],[
+ AC_ARG_ENABLE(cxx-warnings,
+ [ --enable-cxx-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_cxx_warnings=minimum)
+
+ AC_MSG_CHECKING(what warning flags to pass to the C++ compiler)
+ warnCXXFLAGS=
+ if test "x$GCC" != xyes; then
+ enable_compile_warnings=no
+ fi
+ if test "x$enable_cxx_warnings" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) warnCXXFLAGS="-Wall -Wno-unused -Wno-inline -Woverloaded-virtual -Wmissing-declarations" ;;
+ esac
+
+ ## -W is not all that useful. And it cannot be controlled
+ ## with individual -Wno-xxx flags, unlike -Wall
+ if test "x$enable_cxx_warnings" = "xyes"; then
+ warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Woverloaded-virtual"
+ fi
+ fi
+ fi
+ AC_MSG_RESULT($warnCXXFLAGS)
+
+ AC_ARG_ENABLE(iso-cxx,
+ [ --enable-iso-cxx Try to warn if code is not ISO C++ ],,
+ enable_iso_cxx=no)
+
+ AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler)
+ complCXXFLAGS=
+ if test "x$enable_iso_cxx" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *[\ \ ]-ansi[\ \ ]*) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
+ esac
+
+ case " $CXXFLAGS " in
+ *[\ \ ]-pedantic[\ \ ]*) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
+ esac
+ fi
+ fi
+ AC_MSG_RESULT($complCXXFLAGS)
+ if test "x$cxxflags_set" != "xyes"; then
+ CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
+ cxxflags_set=yes
+ AC_SUBST(cxxflags_set)
+ fi
+])
+
+
+# -----------------------------------------------------------------------
+# This macro tests the C++ compiler for various portability problem.
+# 1. Defines CXX_HAS_NO_BOOL if the compiler does not support the bool
+# data type
+# 2. Defines CXX_HAS_BUGGY_FOR_LOOPS if the compiler has buggy
+# scoping for the for-loop
+# Seperately we provide some config.h.bot code to be added to acconfig.h
+# that implements work-arounds for these problems.
+# -----------------------------------------------------------------------
+
+dnl ACCONFIG TEMPLATE
+dnl #undef CXX_HAS_BUGGY_FOR_LOOPS
+dnl #undef CXX_HAS_NO_BOOL
+dnl END ACCONFIG
+
+AC_DEFUN(ID3_CXX_PORTABILITY,[
+
+ AC_PROVIDE([$0])
+
+ dnl
+ dnl Check for common C++ portability problems
+ dnl
+
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ dnl Check whether we have bool
+ AC_MSG_CHECKING(whether C++ has bool)
+ AC_TRY_RUN([main() { bool b1=true; bool b2=false; }],
+ [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no)
+ AC_DEFINE(CXX_HAS_NO_BOOL) ],
+ [ AC_MSG_WARN(Don't cross-compile)]
+ )
+
+ dnl Test whether C++ has buggy for-loops
+ AC_MSG_CHECKING(whether C++ has correct scoping in for-loops)
+ AC_TRY_COMPILE([#include <iostream.h>], [
+ for (int i=0;i<10;i++) { }
+ for (int i=0;i<10;i++) { }
+], [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no)
+ AC_DEFINE(CXX_HAS_BUGGY_FOR_LOOPS) ])
+
+ dnl Done with the portability checks
+ AC_LANG_RESTORE
+])
+
+dnl ACCONFIG BOTTOM
+dnl
+dnl // This file defines portability work-arounds for various proprietory
+dnl // C++ compilers
+dnl
+dnl // Workaround for compilers with buggy for-loop scoping
+dnl // That's quite a few compilers actually including recent versions of
+dnl // Dec Alpha cxx, HP-UX CC and SGI CC.
+dnl // The trivial "if" statement provides the correct scoping to the
+dnl // for loop
+dnl
+dnl #ifdef CXX_HAS_BUGGY_FOR_LOOPS
+dnl #undef for
+dnl #define for if(1) for
+dnl #endif
+dnl
+dnl //
+dnl // If the C++ compiler we use doesn't have bool, then
+dnl // the following is a near-perfect work-around.
+dnl // You must make sure your code does not depend on "int" and "bool"
+dnl // being two different types, in overloading for instance.
+dnl //
+dnl
+dnl #ifdef CXX_HAS_NO_BOOL
+dnl #define bool int
+dnl #define true 1
+dnl #define false 0
+dnl #endif
+dnl
+dnl END ACCONFIG
+
+
+AC_DEFUN([ID3_DEBUG],[
+ AC_ARG_ENABLE(debug, [ --enable-debug=[no/minimum/yes] turn on debugging [default=$debug_default]],,enable_debug=$debug_default)
+
+ if test "x$enable_debug" = "xyes"; then
+ test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
+ AC_DEFINE(ID3_ENABLE_DEBUG)
+ else
+ if test "x$enable_debug" = "xno"; then
+ AC_DEFINE(ID3_DISABLE_ASSERT)
+ AC_DEFINE(ID3_DISABLE_CHECKS)
+ fi
+ fi
+])
+
+dnl ACCONFIG TEMPLATE
+dnl #undef ID3_ENABLE_DEBUG
+dnl #undef ID3_DISABLE_ASSERT
+dnl #undef ID3_DISABLE_CHECKS
+dnl END ACCONFIG
+dnl ACCONFIG BOTTOM
+dnl #if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+dnl
+dnl #define DEBUG
+dnl
+dnl #include <libcw/sys.h>
+dnl #include <libcw/debug.h>
+dnl
+dnl #define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+dnl #define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+dnl #define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+dnl #define ID3D_NOTICE(x) Dout( dc::notice, x )
+dnl #define ID3D_WARNING(x) Dout( dc::warning, x )
+dnl
+dnl #else
+dnl
+dnl # define ID3D_INIT_DOUT()
+dnl # define ID3D_INIT_WARNING()
+dnl # define ID3D_INIT_NOTICE()
+dnl # define ID3D_NOTICE(x)
+dnl # define ID3D_WARNING(x)
+dnl
+dnl #endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+dnl
+dnl END ACCONFIG
+
+
+dnl ACCONFIG TEMPLATE
+dnl #undef ID3_ICONV_FORMAT_UTF16BE
+dnl #undef ID3_ICONV_FORMAT_UTF16
+dnl #undef ID3_ICONV_FORMAT_UTF8
+dnl #undef ID3_ICONV_FORMAT_ASCII
+dnl END ACCONFIG
+
+AC_DEFUN(ID3_CHECK_ICONV_FORMAT,[
+ if eval "test \"x\$$1\" = \"xno\""; then
+ AC_MSG_CHECKING(whether iconv supports $2)
+ AC_TRY_RUN([#include <iconv.h>
+ int main() { return iconv_open("$2", "$2") == -1; } ],
+ [ eval $1=yes
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED($1, "$2") ],
+ [ AC_MSG_RESULT(no) ],
+ [ AC_MSG_WARN(Don't cross-compile) ])
+ fi
+])
+
+AC_DEFUN([ID3_UNICODE],[
+ if test "x$ac_cv_header_iconv_h" = "xyes"; then
+ ID3_ICONV_FORMAT_UTF8=no
+ ID3_ICONV_FORMAT_UTF16=no
+ ID3_ICONV_FORMAT_UTF16BE=no
+ ID3_ICONV_FORMAT_ASCII=no
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8, UTF-8)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8, UTF8)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UTF-16BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UTF16BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UCS-2BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UCS2BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UNICODEBIG)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16, UTF-16)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16, UTF16)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16, UNICODE)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII, ISO-8859-1)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII, ASCII)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII, US-ASCII)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII, US)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII)
+ fi
+])
+
+
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..cc726cd
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1388 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-02-22'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvmeppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mipseb-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OSF1:*:*)
+ if test $UNAME_RELEASE = "V4.0"; then
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ fi
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit 0;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ DRS?6000:UNIX_SV:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7 && exit 0 ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit 0 ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c \
+ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && exit 0
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit 0 ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ # avoid double evaluation of $set_cc_for_build
+ test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ *:UNICOS/mp:*:*)
+ echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ # Determine whether the default compiler uses glibc.
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #if __GLIBC__ >= 2
+ LIBC=gnu
+ #else
+ LIBC=
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit 0 ;;
+ x86:Interix*:3*)
+ echo i586-pc-interix3
+ exit 0 ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit 0 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit 0 ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit 0 ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit 0 ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit 0 ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit 0 ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit 0 ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit 0 ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit 0 ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit 0 ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0 ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0 ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit 0 ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+ test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit 0 ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit 0 ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit 0 ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit 0 ;;
+ i*86:*:5:[78]*)
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit 0 ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit 0 ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Darwin:*:*)
+ case `uname -p` in
+ *86) UNAME_PROCESSOR=i686 ;;
+ powerpc) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit 0 ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit 0 ;;
+ NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit 0 ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit 0 ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit 0 ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit 0 ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit 0 ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit 0 ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit 0 ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit 0 ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit 0 ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit 0 ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100755
index 0000000..82ca228
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,217 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+/*
+** This file has been automatically generated by 'acconfig' from aclocal.m4
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+/* This is the template section */
+
+/* These are standard for all packages using Automake */
+#undef PACKAGE
+#undef VERSION
+
+/* And now the rest of the boys */
+#undef CXX_HAS_BUGGY_FOR_LOOPS
+/* the following is added due to a bug in autoconf, checking for booleans in gcc while g++ is used for compiling */
+#ifndef __cplusplus
+#undef CXX_HAS_NO_BOOL
+#endif
+#undef ID3_ENABLE_DEBUG
+#undef ID3_DISABLE_ASSERT
+#undef ID3_DISABLE_CHECKS
+#undef ID3_ICONV_FORMAT_UTF16BE
+#undef ID3_ICONV_FORMAT_UTF16
+#undef ID3_ICONV_FORMAT_UTF8
+#undef ID3_ICONV_FORMAT_ASCII
+#undef ID3LIB_ICONV_OLDSTYLE
+#undef ID3LIB_ICONV_CAST_OK
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+#undef HAVE_ZLIB
+#undef HAVE_GETOPT_LONG
+#undef _ID3LIB_NAME
+#undef _ID3LIB_VERSION
+#undef _ID3LIB_FULLNAME
+#undef _ID3LIB_MAJOR_VERSION
+#undef _ID3LIB_MINOR_VERSION
+#undef _ID3LIB_PATCH_VERSION
+#undef _ID3LIB_INTERFACE_AGE
+#undef _ID3LIB_BINARY_AGE
+#undef _ID3_COMPILED_WITH_DEBUGGING
+/* */
+
+
+/* Define if you have the <cctype> header file. */
+#undef HAVE_CCTYPE
+
+/* Define if you have the <climits> header file. */
+#undef HAVE_CLIMITS
+
+/* Define if you have the <cstdio> header file. */
+#undef HAVE_CSTDIO
+
+/* Define if you have the <cstdlib> header file. */
+#undef HAVE_CSTDLIB
+
+/* Define if you have the <cstring> header file. */
+#undef HAVE_CSTRING
+
+/* Define if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define if you have the <fstream> header file. */
+#undef HAVE_FSTREAM
+
+/* Define if you have the <fstream.h> header file. */
+#undef HAVE_FSTREAM_H
+
+/* Define if you have the `getopt_long' function. */
+#undef HAVE_GETOPT_LONG
+
+/* Define if you have the <iconv.h> header file. */
+#undef HAVE_ICONV_H
+
+/* Define if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have the <iomanip> header file. */
+#undef HAVE_IOMANIP
+
+/* Define if you have the <iomanip.h> header file. */
+#undef HAVE_IOMANIP_H
+
+/* Define if you have the <iostream> header file. */
+#undef HAVE_IOSTREAM
+
+/* Define if you have the <iostream.h> header file. */
+#undef HAVE_IOSTREAM_H
+
+/* Define if you have the <libcw/sys.h> header file. */
+#undef HAVE_LIBCW_SYS_H
+
+/* Define if you have the <bitset> header file. */
+#undef HAVE_BITSET
+
+/* Define if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the <string> header file. */
+#undef HAVE_STRING
+
+/* Define if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the `truncate' function. */
+#undef HAVE_TRUNCATE
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define if you need to in order for stat and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+#undef for
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
+
diff --git a/config.h.win32 b/config.h.win32
new file mode 100755
index 0000000..406d254
--- /dev/null
+++ b/config.h.win32
@@ -0,0 +1,181 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+/*
+** This file has been automatically generated by 'acconfig' from aclocal.m4
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+/* Define if you need to in order for stat and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* And now the rest of the boys */
+#define CXX_HAS_BUGGY_FOR_LOOPS 1
+/* #undef CXX_HAS_NO_BOOL */
+/* #undef ID3_ENABLE_DEBUG */
+/* #undef ID3_DISABLE_ASSERT */
+/* #undef ID3_DISABLE_CHECKS */
+/* #undef ID3_ICONV_FORMAT_UTF16BE */
+/* #undef ID3_ICONV_FORMAT_UTF16 */
+/* #undef ID3_ICONV_FORMAT_UTF8 */
+/* #undef ID3_ICONV_FORMAT_ASCII */
+/* #undef ID3LIB_ICONV_OLDSTYLE */
+/* #undef ID3LIB_ICONV_CAST_OK */
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+/* #undef HAVE_ZLIB */
+/* #undef HAVE_GETOPT_LONG */
+#define _ID3LIB_NAME "id3lib"
+#define _ID3LIB_VERSION "3.8.3"
+#define _ID3LIB_VERSION0 "3.8.3\0"
+#define _ID3LIB_FULLNAME "id3lib-3.8.3"
+#define _ID3LIB_MAJOR_VERSION 3
+#define _ID3LIB_MINOR_VERSION 8
+#define _ID3LIB_PATCH_VERSION 3
+#define _ID3LIB_INTERFACE_AGE 0
+#define _ID3LIB_BINARY_AGE 0
+/* #undef ID3_COMPILED_WITH_DEBUGGING */
+/* */
+
+/* Define if you have the getopt_long function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define if you have the mkstemp function. */
+/* #undef HAVE_MKSTEMP */
+
+/* Define if you have the ftruncate function. */
+/* #undef HAVE_TRUNCATE */
+
+/* Define if you have the <cctype> header file. */
+#define HAVE_CCTYPE 1
+
+/* Define if you have the <climits> header file. */
+#define HAVE_CLIMITS 1
+
+/* Define if you have the <cstdio> header file. */
+#define HAVE_CSTDIO 1
+
+/* Define if you have the <cstdlib> header file. */
+#define HAVE_CSTDLIB 1
+
+/* Define if you have the <cstring> header file. */
+#define HAVE_CSTRING 1
+
+/* Define if you have the <fstream> header file. */
+#define HAVE_FSTREAM 1
+
+/* Define if you have the <fstream.h> header file. */
+#define HAVE_FSTREAM_H 1
+
+/* Define if you have the <iconv.h> header file. */
+/* #undef HAVE_ICONV_H */
+
+/* Define if you have the <iomanip> header file. */
+#define HAVE_IOMANIP 1
+
+/* Define if you have the <iomanip.h> header file. */
+#define HAVE_IOMANIP_H 1
+
+/* Define if you have the <iostream> header file. */
+#define HAVE_IOSTREAM 1
+
+/* Define if you have the <iostream.h> header file. */
+#define HAVE_IOSTREAM_H 1
+
+/* Define if you have the <libcw/sys.h> header file. */
+/* #undef HAVE_LIBCW_SYS_H */
+
+/* Define if you have the <bitset> header file. */
+#define HAVE_BITSET 1
+
+/* Define if you have the <string> header file. */
+#define HAVE_STRING 1
+
+/* Define if you have the <sys/param.h> header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define if you have the <unistd.h> header file. */
+/* #undef HAVE_UNISTD_H */
+
+/* Define if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define if you have the <zlib.h> header file. */
+/* #undef HAVE_ZLIB_H */
+
+/* Name of package */
+#define PACKAGE "id3lib"
+
+/* Version number of package */
+#define VERSION _ID3LIB_VERSION
+
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+/* #undef for */
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
diff --git a/config.h.win32.in b/config.h.win32.in
new file mode 100755
index 0000000..1fbc30e
--- /dev/null
+++ b/config.h.win32.in
@@ -0,0 +1,181 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+/*
+** This file has been automatically generated by 'acconfig' from aclocal.m4
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+/* Define if you need to in order for stat and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* And now the rest of the boys */
+#define CXX_HAS_BUGGY_FOR_LOOPS 1
+/* #undef CXX_HAS_NO_BOOL */
+/* #undef ID3_ENABLE_DEBUG */
+/* #undef ID3_DISABLE_ASSERT */
+/* #undef ID3_DISABLE_CHECKS */
+/* #undef ID3_ICONV_FORMAT_UTF16BE */
+/* #undef ID3_ICONV_FORMAT_UTF16 */
+/* #undef ID3_ICONV_FORMAT_UTF8 */
+/* #undef ID3_ICONV_FORMAT_ASCII */
+/* #undef ID3LIB_ICONV_OLDSTYLE */
+/* #undef ID3LIB_ICONV_CAST_OK */
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+/* #undef HAVE_ZLIB */
+/* #undef HAVE_GETOPT_LONG */
+#define _ID3LIB_NAME "@ID3LIB_NAME@"
+#define _ID3LIB_VERSION "@ID3LIB_VERSION@"
+#define _ID3LIB_VERSION0 "@ID3LIB_VERSION@\0"
+#define _ID3LIB_FULLNAME "@ID3LIB_FULLNAME@"
+#define _ID3LIB_MAJOR_VERSION @ID3LIB_MAJOR_VERSION@
+#define _ID3LIB_MINOR_VERSION @ID3LIB_MINOR_VERSION@
+#define _ID3LIB_PATCH_VERSION @ID3LIB_PATCH_VERSION@
+#define _ID3LIB_INTERFACE_AGE @ID3LIB_INTERFACE_AGE@
+#define _ID3LIB_BINARY_AGE @ID3LIB_BINARY_AGE@
+/* #undef ID3_COMPILED_WITH_DEBUGGING */
+/* */
+
+/* Define if you have the getopt_long function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define if you have the mkstemp function. */
+/* #undef HAVE_MKSTEMP */
+
+/* Define if you have the ftruncate function. */
+/* #undef HAVE_TRUNCATE */
+
+/* Define if you have the <cctype> header file. */
+#define HAVE_CCTYPE 1
+
+/* Define if you have the <climits> header file. */
+#define HAVE_CLIMITS 1
+
+/* Define if you have the <cstdio> header file. */
+#define HAVE_CSTDIO 1
+
+/* Define if you have the <cstdlib> header file. */
+#define HAVE_CSTDLIB 1
+
+/* Define if you have the <cstring> header file. */
+#define HAVE_CSTRING 1
+
+/* Define if you have the <fstream> header file. */
+#define HAVE_FSTREAM 1
+
+/* Define if you have the <fstream.h> header file. */
+#define HAVE_FSTREAM_H 1
+
+/* Define if you have the <iconv.h> header file. */
+/* #undef HAVE_ICONV_H */
+
+/* Define if you have the <iomanip> header file. */
+#define HAVE_IOMANIP 1
+
+/* Define if you have the <iomanip.h> header file. */
+#define HAVE_IOMANIP_H 1
+
+/* Define if you have the <iostream> header file. */
+#define HAVE_IOSTREAM 1
+
+/* Define if you have the <iostream.h> header file. */
+#define HAVE_IOSTREAM_H 1
+
+/* Define if you have the <libcw/sys.h> header file. */
+/* #undef HAVE_LIBCW_SYS_H */
+
+/* Define if you have the <bitset> header file. */
+#define HAVE_BITSET 1
+
+/* Define if you have the <string> header file. */
+#define HAVE_STRING 1
+
+/* Define if you have the <sys/param.h> header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define if you have the <unistd.h> header file. */
+/* #undef HAVE_UNISTD_H */
+
+/* Define if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define if you have the <zlib.h> header file. */
+/* #undef HAVE_ZLIB_H */
+
+/* Name of package */
+#define PACKAGE "@PACKAGE@"
+
+/* Version number of package */
+#define VERSION _ID3LIB_VERSION
+
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+/* #undef for */
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..9772e87
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1489 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-02-22'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit 0;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k \
+ | m32r | m68000 | m68k | m88k | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | msp430 \
+ | ns16k | ns32k \
+ | openrisc | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* \
+ | m32r-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | msp430-* \
+ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+ | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ mmix*)
+ basic_machine=mmix-knuth
+ os=-mmixware
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nv1)
+ basic_machine=nv1-cray
+ os=-unicosmp
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ or32 | or32-*)
+ basic_machine=or32-unknown
+ os=-coff
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i686-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic4x | c4x*)
+ basic_machine=tic4x-unknown
+ os=-coff
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparc | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config_Linux32.h b/config_Linux32.h
new file mode 100755
index 0000000..48fad1e
--- /dev/null
+++ b/config_Linux32.h
@@ -0,0 +1,218 @@
+/* config.h. Generated by configure. */
+/* config.h.in. Generated from configure.in by autoheader. */
+/*
+** This file has been automatically generated by 'acconfig' from aclocal.m4
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+/* This is the template section */
+
+/* These are standard for all packages using Automake */
+#define PACKAGE "id3lib"
+#define VERSION "3.8.3"
+
+/* And now the rest of the boys */
+/* #undef CXX_HAS_BUGGY_FOR_LOOPS */
+/* the following is added due to a bug in autoconf, checking for booleans in gcc while g++ is used for compiling */
+#ifndef __cplusplus
+/* #undef CXX_HAS_NO_BOOL */
+#endif
+/* #undef ID3_ENABLE_DEBUG */
+/* #undef ID3_DISABLE_ASSERT */
+/* #undef ID3_DISABLE_CHECKS */
+#define ID3_ICONV_FORMAT_UTF16BE "UTF-16BE"
+#define ID3_ICONV_FORMAT_UTF16 "UTF-16"
+#define ID3_ICONV_FORMAT_UTF8 "UTF-8"
+#define ID3_ICONV_FORMAT_ASCII "ISO-8859-1"
+/* #undef ID3LIB_ICONV_OLDSTYLE */
+/* #undef ID3LIB_ICONV_CAST_OK */
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+#define HAVE_ZLIB 1
+#define HAVE_GETOPT_LONG 1
+#define _ID3LIB_NAME "id3lib"
+#define _ID3LIB_VERSION "3.8.3"
+#define _ID3LIB_FULLNAME "id3lib-3.8.3"
+#define _ID3LIB_MAJOR_VERSION 3
+#define _ID3LIB_MINOR_VERSION 8
+#define _ID3LIB_PATCH_VERSION 3
+#define _ID3LIB_INTERFACE_AGE 0
+#define _ID3LIB_BINARY_AGE 0
+#define _ID3_COMPILED_WITH_DEBUGGING "minimum"
+/* */
+
+
+/* Define if you have the <cctype> header file. */
+#define HAVE_CCTYPE 1
+
+/* Define if you have the <climits> header file. */
+#define HAVE_CLIMITS 1
+
+/* Define if you have the <cstdio> header file. */
+#define HAVE_CSTDIO 1
+
+/* Define if you have the <cstdlib> header file. */
+#define HAVE_CSTDLIB 1
+
+/* Define if you have the <cstring> header file. */
+#define HAVE_CSTRING 1
+
+/* Define if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define if you have the <fstream> header file. */
+#define HAVE_FSTREAM 1
+
+/* Define if you have the <fstream.h> header file. */
+/* #undef HAVE_FSTREAM_H */
+
+/* Define if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define if you have the <iconv.h> header file. */
+#define HAVE_ICONV_H 1
+
+/* Define if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if you have the <iomanip> header file. */
+#define HAVE_IOMANIP 1
+
+/* Define if you have the <iomanip.h> header file. */
+#define HAVE_IOMANIP_H 1
+
+/* Define if you have the <iostream> header file. */
+#define HAVE_IOSTREAM 1
+
+/* Define if you have the <iostream.h> header file. */
+/* #undef HAVE_IOSTREAM_H */
+
+/* Define if you have the <libcw/sys.h> header file. */
+/* #undef HAVE_LIBCW_SYS_H */
+
+/* Define if you have the <bitset> header file. */
+#define HAVE_BITSET 1
+
+/* Define if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string> header file. */
+#define HAVE_STRING 1
+
+/* Define if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the `truncate' function. */
+#define HAVE_TRUNCATE 1
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define if you have the <zlib.h> header file. */
+#define HAVE_ZLIB_H 1
+
+/* Name of package */
+#define PACKAGE "id3lib"
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "3.8.3"
+
+/* Define if you need to in order for stat and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+/* #undef size_t */
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+/* #undef for */
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..37b66f3
--- /dev/null
+++ b/configure
@@ -0,0 +1,13092 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.53a.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+ { $as_unset LANG || test "${LANG+set}" != set; } ||
+ { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+ { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+ { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+ { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+ { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+ { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+ { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+ { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+ { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+ { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+ { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+ { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+ { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+ { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+ { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conftest.sh
+ echo "exit 0" >>conftest.sh
+ chmod +x conftest.sh
+ if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conftest.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+
+
+# Making releases:
+# ID3LIB_PATCH_VERSION += 1;
+# ID3LIB_INTERFACE_AGE += 1;
+# ID3LIB_BINARY_AGE += 1;
+# if any functions have been added, set ID3LIB_INTERFACE_AGE to 0.
+# if backwards compatibility has been broken,
+# set ID3LIB_BINARY_AGE _and_ ID3LIB_INTERFACE_AGE to 0.
+#
+
+ID3LIB_MAJOR_VERSION=3
+ID3LIB_MINOR_VERSION=8
+ID3LIB_PATCH_VERSION=3
+ID3LIB_ADDED_VERSION=
+ID3LIB_VERSION=$ID3LIB_MAJOR_VERSION.$ID3LIB_MINOR_VERSION.$ID3LIB_PATCH_VERSION$ID3LIB_ADDED_VERSION
+
+ID3LIB_INTERFACE_AGE=0
+ID3LIB_BINARY_AGE=0
+
+# Find the correct PATH separator. Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+ UNAME=${UNAME-`uname 2>/dev/null`}
+ case X$UNAME in
+ *-DOS) lt_cv_sys_path_separator=';' ;;
+ *) lt_cv_sys_path_separator=':' ;;
+ esac
+ PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+if test `expr $ID3LIB_MINOR_VERSION \% 2` = 1 ; then
+ debug_default=yes
+else
+ debug_default=minimum
+fi
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="reconf"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subdirs_all="$ac_subdirs_all zlib"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking Speeds up one-time builds
+ --enable-dependency-tracking Do not reject slow dependency extractors
+ --enable-shared=PKGS build shared libraries default=yes
+ --enable-static=PKGS build static libraries default=yes
+ --enable-fast-install=PKGS optimize for fast installation default=yes
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --enable-ansi turn on strict ansi default=no
+ --enable-cxx-warnings=no/minimum/yes Turn on compiler warnings.
+ --enable-iso-cxx Try to warn if code is not ISO C++
+ --enable-debug=no/minimum/yes turn on debugging default=$debug_default
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld default=no
+ --with-pic try to use only PIC/non-PIC objects default=use both
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.53a. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+ case $ac_arg in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n ) continue ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ ac_sep=" " ;;
+ esac
+ # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core core.* *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ID3LIB_NAME=id3lib
+
+#AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
+
+
+
+
+
+
+
+
+
+# for documentation purposes
+DOX_DIR_HTML=api
+DOX_DIR_LATEX=latex
+DOX_DIR_MAN=man
+DOX_DIR_RTF=rtf
+
+
+
+
+
+
+# libtool versioning
+LT_RELEASE=$ID3LIB_MAJOR_VERSION.$ID3LIB_MINOR_VERSION
+LT_CURRENT=`expr $ID3LIB_PATCH_VERSION - $ID3LIB_INTERFACE_AGE`
+LT_REVISION=$ID3LIB_INTERFACE_AGE
+LT_AGE=`expr $ID3LIB_BINARY_AGE - $ID3LIB_INTERFACE_AGE`
+
+
+
+
+
+VERSION=$ID3LIB_VERSION
+PACKAGE=$ID3LIB_NAME
+
+ID3LIB_FULLNAME=$ID3LIB_NAME-$ID3LIB_VERSION
+
+
+
+# Add the stamp file to the list of files AC keeps track of,
+# along with our hook.
+ ac_config_headers="$ac_config_headers config.h"
+
+
+
+
+am__api_version="1.6"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ # test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# Define the identity of the package.
+ PACKAGE=$PACKAGE
+ VERSION=$VERSION
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+
+
+
+
+rm -f .deps 2>/dev/null
+mkdir .deps 2>/dev/null
+if test -d .deps; then
+ DEPDIR=.deps
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ DEPDIR=_deps
+fi
+rmdir .deps 2>/dev/null
+
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+doit:
+ @echo done
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
+ ls a.out conftest 2>/dev/null;
+ ls a.* conftest.* 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ a.out ) # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ echo '#include "conftest.h"' > conftest.c
+ echo 'int i;' > conftest.h
+ echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=conftest.c object=conftest.o \
+ depfile=conftest.Po tmpdepfile=conftest.TPo \
+ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
+ grep conftest.h conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+if test "${ac_cv_search_strerror+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+ac_cv_search_strerror=no
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strerror ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_strerror="none required"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_strerror" = no; then
+ for ac_lib in cposix; do
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strerror ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+strerror ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_search_strerror="-l$ac_lib"
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+ done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6
+if test "$ac_cv_search_strerror" != no; then
+ test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+
+fi
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case $enableval in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi;
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case $enableval in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=yes
+fi;
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+case $enableval in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_fast_install=yes
+fi;
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+# Find the correct PATH separator. Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+ UNAME=${UNAME-`uname 2>/dev/null`}
+ case X$UNAME in
+ *-DOS) lt_cv_sys_path_separator=';' ;;
+ *) lt_cv_sys_path_separator=':' ;;
+ esac
+ PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ lt_cv_prog_gnu_ld=yes
+else
+ lt_cv_prog_gnu_ld=no
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/${ac_tool_prefix}nm
+ if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ else
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+
+NM="$lt_cv_path_NM"
+echo "$as_me:$LINENO: result: $NM" >&5
+echo "${ECHO_T}$NM" >&6
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5
+echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi4*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin* | mingw* | pw32*)
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+ ;;
+ *) # Darwin 1.3 on
+ lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+ ;;
+ esac
+ ;;
+
+freebsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20*|hpux11*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+
+irix5* | irix6*)
+ case $host_os in
+ irix5*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
+ ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ case $host_cpu in
+ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+openbsd*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+ else
+ lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sco3.2v5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+
+sysv5uw[78]* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ esac
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+
+
+
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output" >&5
+echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+irix*)
+ symcode='[BCDEGRST]'
+ ;;
+solaris* | sysv5*)
+ symcode='[BDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest; then
+ pipe_works=yes
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ global_symbol_to_cdecl=
+ global_symbol_to_c_name_address=
+else
+ global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+ global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
+then
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+ /*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+ ;;
+ *)
+ ac_save_MAGIC_CMD="$MAGIC_CMD"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="/usr/bin:$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ egrep "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ MAGIC_CMD="$ac_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+ /*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+ ;;
+ *)
+ ac_save_MAGIC_CMD="$MAGIC_CMD"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="/usr/bin:$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ egrep "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ MAGIC_CMD="$ac_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 4471 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+ ;;
+ *)
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$as_me:$LINENO: result: $objdir" >&5
+echo "${ECHO_T}$objdir" >&6
+
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+if test "${lt_cv_prog_cc_pic+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_cc_pic=
+ lt_cv_prog_cc_shlib=
+ lt_cv_prog_cc_wl=
+ lt_cv_prog_cc_static=
+ lt_cv_prog_cc_no_builtin=
+ lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+ if test "$GCC" = yes; then
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-static'
+
+ case $host_os in
+ aix*)
+ # Below there is a dirty hack to force normal static linking with -ldl
+ # The problem is because libdl dynamically linked with both libc and
+ # libC (AIX C++ library), which obviously doesn't included in libraries
+ # list by gcc. This cause undefined symbols with -static flags.
+ # This hack allows C programs to be linked with "-static -ldl", but
+ # not sure about C++ programs.
+ lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_cv_prog_cc_pic='-fno-common'
+ ;;
+ cygwin* | mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_cv_prog_cc_pic='-DDLL_EXPORT'
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_cv_prog_cc_pic=-Kconform_pic
+ fi
+ ;;
+ *)
+ lt_cv_prog_cc_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for PIC flags for the system compiler.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ lt_cv_prog_cc_wl='-Wl,'
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_cv_prog_cc_static='-Bstatic'
+ else
+ lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+ lt_cv_prog_cc_pic='+Z'
+ ;;
+
+ irix5* | irix6*)
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-non_shared'
+ # PIC (with -KPIC) is the default.
+ ;;
+
+ cygwin* | mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_cv_prog_cc_pic='-DDLL_EXPORT'
+ ;;
+
+ newsos6)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ # All OSF/1 code is PIC.
+ lt_cv_prog_cc_wl='-Wl,'
+ lt_cv_prog_cc_static='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ lt_cv_prog_cc_pic='-Kpic'
+ lt_cv_prog_cc_static='-dn'
+ lt_cv_prog_cc_shlib='-belf'
+ ;;
+
+ solaris*)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ lt_cv_prog_cc_wl='-Wl,'
+ ;;
+
+ sunos4*)
+ lt_cv_prog_cc_pic='-PIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ lt_cv_prog_cc_wl='-Qoption ld '
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ lt_cv_prog_cc_pic='-KPIC'
+ lt_cv_prog_cc_static='-Bstatic'
+ if test "x$host_vendor" = xsni; then
+ lt_cv_prog_cc_wl='-LD'
+ else
+ lt_cv_prog_cc_wl='-Wl,'
+ fi
+ ;;
+
+ uts4*)
+ lt_cv_prog_cc_pic='-pic'
+ lt_cv_prog_cc_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_cv_prog_cc_pic='-Kconform_pic'
+ lt_cv_prog_cc_static='-Bstatic'
+ fi
+ ;;
+
+ *)
+ lt_cv_prog_cc_can_build_shared=no
+ ;;
+ esac
+ fi
+
+fi
+
+if test -z "$lt_cv_prog_cc_pic"; then
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+else
+ echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6
+
+ # Check to make sure the pic_flag actually works.
+ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6
+ if test "${lt_cv_prog_cc_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ case $host_os in
+ hpux9* | hpux10* | hpux11*)
+ # On HP-UX, both CC and GCC only warn that PIC is supported... then
+ # they create non-PIC objects. So, if there were any warnings, we
+ # assume that PIC is not supported.
+ if test -s conftest.err; then
+ lt_cv_prog_cc_pic_works=no
+ else
+ lt_cv_prog_cc_pic_works=yes
+ fi
+ ;;
+ *)
+ lt_cv_prog_cc_pic_works=yes
+ ;;
+ esac
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ lt_cv_prog_cc_pic_works=no
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$save_CFLAGS"
+
+fi
+
+
+ if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+ lt_cv_prog_cc_pic=
+ lt_cv_prog_cc_can_build_shared=no
+ else
+ lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+ fi
+
+ echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5
+echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;}
+ if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then :
+ else
+ { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5
+echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;}
+ lt_cv_prog_cc_can_build_shared=no
+ fi
+fi
+
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6
+if test "${lt_cv_prog_cc_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_cc_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_prog_cc_static_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5
+echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory. Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:5007: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s out/conftest.err; then
+ lt_cv_compiler_c_o=no
+ else
+ lt_cv_compiler_c_o=yes
+ fi
+else
+ # Append any errors to the config.log.
+ cat out/conftest.err 1>&5
+ lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+fi
+
+compiler_c_o=$lt_cv_compiler_c_o
+echo "$as_me:$LINENO: result: $compiler_c_o" >&5
+echo "${ECHO_T}$compiler_c_o" >&6
+
+if test x"$compiler_c_o" = x"yes"; then
+ # Check to see if we can write to a .lo
+ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6
+ if test "${lt_cv_compiler_o_lo+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ lt_cv_compiler_o_lo=no
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -c -o conftest.lo"
+ save_objext="$ac_objext"
+ ac_objext=lo
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+int some_variable = 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ lt_cv_compiler_o_lo=no
+ else
+ lt_cv_compiler_o_lo=yes
+ fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ ac_objext="$save_objext"
+ CFLAGS="$save_CFLAGS"
+
+fi
+
+ compiler_o_lo=$lt_cv_compiler_o_lo
+ echo "$as_me:$LINENO: result: $compiler_o_lo" >&5
+echo "${ECHO_T}$compiler_o_lo" >&6
+else
+ compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+if test "$GCC" = yes; then
+ # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+ compiler_rtti_exceptions=no
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+int some_variable = 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ compiler_rtti_exceptions=no
+ else
+ compiler_rtti_exceptions=yes
+ fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ CFLAGS="$save_CFLAGS"
+ echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$compiler_rtti_exceptions" >&6
+
+ if test "$compiler_rtti_exceptions" = "yes"; then
+ no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+ else
+ no_builtin_flag=' -fno-builtin'
+ fi
+fi
+
+# See if the linker supports building shared libraries.
+echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced. Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX, the GNU linker is very broken
+ # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+
+ extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+ sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+ test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+ if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+ else $CC -o impgen impgen.c ; fi)~
+ $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+ old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+ # cygwin and mingw dlls have different entry points and sets of symbols
+ # to exclude.
+ # FIXME: what about values for MSVC?
+ dll_entry=__cygwin_dll_entry@12
+ dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+ case $host_os in
+ mingw*)
+ # mingw values
+ dll_entry=_DllMainCRTStartup@12
+ dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+ ;;
+ esac
+
+ # mingw and cygwin differ, and it's simplest to just exclude the union
+ # of the two symbol sets.
+ dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+ # recent cygwin and mingw systems supply a stub DllMain which the user
+ # can override, but on older systems we have to supply one (in ltdll.c)
+ if test "x$lt_cv_need_dllmain" = "xyes"; then
+ ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+ ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
+ test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+ else
+ ltdll_obj=
+ ltdll_cmds=
+ fi
+
+ # Extract the symbol export list from an `--export-all' def file,
+ # then regenerate the def file from the symbol export list, so that
+ # the compiled dll only exports the symbol export list.
+ # Be careful not to strip the DATA tag left be newer dlltools.
+ export_symbols_cmds="$ltdll_cmds"'
+ $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+ sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
+
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is.
+ # If DATA tags from a recent dlltool are present, honour them!
+ archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname-def;
+ else
+ echo EXPORTS > $output_objdir/$soname-def;
+ _lt_hint=1;
+ cat $export_symbols | while read symbol; do
+ set dummy \$symbol;
+ case \$# in
+ 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+ *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
+ esac;
+ _lt_hint=`expr 1 + \$_lt_hint`;
+ done;
+ fi~
+ '"$ltdll_cmds"'
+ $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+ $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+ $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # dlltool doesn't understand --whole-archive et. al.
+ whole_archive_flag_spec=
+ ;;
+ *)
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ ;;
+ esac
+ fi
+else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ hardcode_direct=yes
+ archive_cmds=''
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ esac
+
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ shared_flag='${wl}-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall can do strange things, so it is better to
+ # generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='${wl}-berok'
+ # This is a bit strange, but is similar to how AIX traditionally builds
+ # it's shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ ;;
+
+ darwin* | rhapsody*)
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ ;;
+ esac
+ # FIXME: Relying on posixy $() will cause problems for
+ # cross-compilation, but unfortunately the echo tests do not
+ # yet detect zsh echo's removal of \ escapes.
+ archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+ # We need to add '_' to the symbols in $export_symbols first
+ #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ whole_archive_flag_spec='-all_load $convenience'
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ case $host_os in
+ hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+ *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+ esac
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_minus_L=yes # Not in the search PATH, but as the default
+ # location of the library.
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ irix5* | irix6*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ #Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ ;;
+
+ solaris*)
+ # gcc --version < 3.0 without binutils cannot create self contained
+ # shared libraries reliably, requiring libgcc.a to resolve some of
+ # the object symbols generated in some cases. Libraries that use
+ # assert need libgcc.a to resolve __eprintf, for example. Linking
+ # a copy of libgcc.a into every shared library to guarantee resolving
+ # such symbols causes other problems: According to Tim Van Holder
+ # <tim.van.holder@pandora.be>, C++ libraries end up with a separate
+ # (to the application) exception stack for one thing.
+ no_undefined_flag=' -z defs'
+ if test "$GCC" = yes; then
+ case `$CC --version 2>/dev/null` in
+ [12].*)
+ cat <<EOF 1>&2
+
+*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
+*** create self contained shared libraries on Solaris systems, without
+*** introducing a dependency on libgcc.a. Therefore, libtool is disabling
+*** -no-undefined support, which will at least allow you to build shared
+*** libraries. However, you may find that when you link such libraries
+*** into an application without using GCC, you have to manually add
+*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to
+*** upgrade to a newer version of GCC. Another option is to rebuild your
+*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
+
+EOF
+ no_undefined_flag=
+ ;;
+ esac
+ fi
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ if test "x$host_vendor" = xsno; then
+ archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ else
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv5*)
+ no_undefined_flag=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec=
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5uw7* | unixware7*)
+ no_undefined_flag='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var"; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$hardcode_shlibpath_var" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}.so$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can
+ # not hardcode correct soname into executable. Probably we can
+ # add versioning support to collect2, so additional links can
+ # be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}.so$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}.so'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ export_dynamic_flag_spec=-rdynamic
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ need_version=no
+ need_lib_prefix=no
+ case $GCC,$host_os in
+ yes,cygwin*)
+ library_names_spec='$libname.dll.a'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+ postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog .libs/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ ;;
+ yes,mingw*)
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+ ;;
+ yes,pw32*)
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
+ ;;
+ *)
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ # FIXME: Relying on posixy $() will cause problems for
+ # cross-compilation, but unfortunately the echo tests do not
+ # yet detect zsh echo's removal of \ escapes.
+ library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+ soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ *)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ dynamic_linker="$host_os dld.sl"
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+ soname_spec='${libname}${release}.sl$major'
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6*)
+ version_type=irix
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}.so$major'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+ case $host_os in
+ irix5*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case "$host_os" in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+os2*)
+ libname_spec='$name'
+ need_lib_prefix=no
+ library_names_spec='$libname.dll $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_version=no
+ soname_spec='${libname}${release}.so'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}.so$major'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+ soname_spec='$libname.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+f = shl_load;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+f = dlopen;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 6800 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 6898 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ if test "${lt_cv_archive_cmds_need_lc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ $rm conftest*
+ echo 'static int dummy;' > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_cv_prog_cc_wl
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+fi
+
+ echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5
+echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6
+ ;;
+ esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ :
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+ trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+ $rm -f "${ofile}T"
+
+ echo creating $ofile
+
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS \
+ AR AR_FLAGS CC LD LN_S NM SHELL \
+ reload_flag reload_cmds wl \
+ pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+ thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+ library_names_spec soname_spec \
+ RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+ old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+ postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+ old_striplib striplib file_magic_cmd export_symbols_cmds \
+ deplibs_check_method allow_undefined_flag no_undefined_flag \
+ finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+ global_symbol_to_c_name_address \
+ hardcode_libdir_flag_spec hardcode_libdir_separator \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+ case $var in
+ reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+ extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ cat <<'EOF' >> "${ofile}T"
+ # This is a source program that is used to create dlls on Windows
+ # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+ # This is a source program that is used to create import libraries
+ # on Windows for dlls which lack them. Don't remove nor modify the
+ # starting and closing comments
+# /* impgen.c starts here */
+# /* Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+# This file is part of GNU libtool.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# */
+#
+# #include <stdio.h> /* for printf() */
+# #include <unistd.h> /* for open(), lseek(), read() */
+# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
+# #include <string.h> /* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+# int fd;
+# int offset;
+# {
+# unsigned char b[2];
+# lseek (fd, offset, SEEK_SET);
+# read (fd, b, 2);
+# return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+# int fd;
+# int offset;
+# {
+# unsigned char b[4];
+# lseek (fd, offset, SEEK_SET);
+# read (fd, b, 4);
+# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+# void *ptr;
+# {
+# unsigned char *b = ptr;
+# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+# int argc;
+# char *argv[];
+# {
+# int dll;
+# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+# unsigned long export_rva, export_size, nsections, secptr, expptr;
+# unsigned long name_rvas, nexp;
+# unsigned char *expdata, *erva;
+# char *filename, *dll_name;
+#
+# filename = argv[1];
+#
+# dll = open(filename, O_RDONLY|O_BINARY);
+# if (dll < 1)
+# return 1;
+#
+# dll_name = filename;
+#
+# for (i=0; filename[i]; i++)
+# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
+# dll_name = filename + i +1;
+#
+# pe_header_offset = pe_get32 (dll, 0x3c);
+# opthdr_ofs = pe_header_offset + 4 + 20;
+# num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+# if (num_entries < 1) /* no exports */
+# return 1;
+#
+# export_rva = pe_get32 (dll, opthdr_ofs + 96);
+# export_size = pe_get32 (dll, opthdr_ofs + 100);
+# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+# secptr = (pe_header_offset + 4 + 20 +
+# pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+# expptr = 0;
+# for (i = 0; i < nsections; i++)
+# {
+# char sname[8];
+# unsigned long secptr1 = secptr + 40 * i;
+# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+# lseek(dll, secptr1, SEEK_SET);
+# read(dll, sname, 8);
+# if (vaddr <= export_rva && vaddr+vsize > export_rva)
+# {
+# expptr = fptr + (export_rva - vaddr);
+# if (export_rva + export_size > vaddr + vsize)
+# export_size = vsize - (export_rva - vaddr);
+# break;
+# }
+# }
+#
+# expdata = (unsigned char*)malloc(export_size);
+# lseek (dll, expptr, SEEK_SET);
+# read (dll, expdata, export_size);
+# erva = expdata - export_rva;
+#
+# nexp = pe_as32 (expdata+24);
+# name_rvas = pe_as32 (expdata+32);
+#
+# printf ("EXPORTS\n");
+# for (i = 0; i<nexp; i++)
+# {
+# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+# }
+#
+# return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+ mv -f "${ofile}T" "$ofile" || \
+ (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+ chmod +x "$ofile"
+fi
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+#AC_CANONICAL_HOST
+
+
+# Check whether --enable-ansi or --disable-ansi was given.
+if test "${enable_ansi+set}" = set; then
+ enableval="$enable_ansi"
+
+else
+ enable_ansi=no
+fi;
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ echo '#include "conftest.h"' > conftest.c
+ echo 'int i;' > conftest.h
+ echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=conftest.c object=conftest.o \
+ depfile=conftest.Po tmpdepfile=conftest.TPo \
+ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
+ grep conftest.h conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ echo '#include "conftest.h"' > conftest.c
+ echo 'int i;' > conftest.h
+ echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=conftest.c object=conftest.o \
+ depfile=conftest.Po tmpdepfile=conftest.TPo \
+ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
+ grep conftest.h conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+
+
+echo "$as_me:$LINENO: checking for uncompress in -lz" >&5
+echo $ECHO_N "checking for uncompress in -lz... $ECHO_C" >&6
+if test "${ac_cv_lib_z_uncompress+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char uncompress ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+uncompress ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_z_uncompress=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_z_uncompress=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_z_uncompress" >&5
+echo "${ECHO_T}$ac_cv_lib_z_uncompress" >&6
+if test $ac_cv_lib_z_uncompress = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ZLIB 1
+_ACEOF
+
+fi
+#,,
+# AC_MSG_ERROR([id3lib requires zlib to process compressed frames]))
+
+
+
+if test x$ac_cv_lib_z_uncompress = xno; then
+ ID3_NEEDZLIB_TRUE=
+ ID3_NEEDZLIB_FALSE='#'
+else
+ ID3_NEEDZLIB_TRUE='#'
+ ID3_NEEDZLIB_FALSE=
+fi
+
+
+
+if test x$enable_debug = xyes; then
+ ID3_NEEDDEBUG_TRUE=
+ ID3_NEEDDEBUG_FALSE='#'
+else
+ ID3_NEEDDEBUG_TRUE='#'
+ ID3_NEEDDEBUG_FALSE=
+fi
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+
+
+
+for ac_header in zlib.h wchar.h sys/param.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in iconv.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ has_iconv=1
+else
+ has_iconv=0
+fi
+
+done
+
+
+
+ICONV_LIB=
+if test $has_iconv = 1; then
+ echo "$as_me:$LINENO: checking where to find iconv_open" >&5
+echo $ECHO_N "checking where to find iconv_open... $ECHO_C" >&6
+ exec 6>/dev/null
+
+for ac_func in iconv_open
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+ iconv_in_libc=1
+else
+ iconv_in_libc=0
+fi
+done
+
+ echo "$as_me:$LINENO: checking for iconv_open in -liconv" >&5
+echo $ECHO_N "checking for iconv_open in -liconv... $ECHO_C" >&6
+if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char iconv_open ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+iconv_open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_iconv_iconv_open=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_iconv_iconv_open=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_iconv_open" >&5
+echo "${ECHO_T}$ac_cv_lib_iconv_iconv_open" >&6
+if test $ac_cv_lib_iconv_iconv_open = yes; then
+ iconv_in_iconv=1
+else
+ iconv_in_iconv=0
+fi
+
+ echo "$as_me:$LINENO: checking for libiconv_open in -liconv" >&5
+echo $ECHO_N "checking for libiconv_open in -liconv... $ECHO_C" >&6
+if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char libiconv_open ();
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+libiconv_open ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_iconv_libiconv_open=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_iconv_libiconv_open=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_iconv_libiconv_open" >&5
+echo "${ECHO_T}$ac_cv_lib_iconv_libiconv_open" >&6
+if test $ac_cv_lib_iconv_libiconv_open = yes; then
+ libiconv_in_iconv=1
+else
+ libiconv_in_iconv=0
+fi
+
+ if test ! x$silent = xyes; then
+ exec 6>&1
+ fi
+ #standalone library rules over libc
+ if test $iconv_in_iconv = 1 -o $libiconv_in_iconv = 1; then
+ echo "$as_me:$LINENO: result: libiconv" >&5
+echo "${ECHO_T}libiconv" >&6
+ ICONV_LIB=-liconv
+ elif test $iconv_in_libc = 1; then
+ echo "$as_me:$LINENO: result: libc" >&5
+echo "${ECHO_T}libc" >&6
+ else
+ echo "$as_me:$LINENO: result: not found (panic)" >&5
+echo "${ECHO_T}not found (panic)" >&6
+ { { echo "$as_me:$LINENO: error: iconv.h found, while iconv library not found" >&5
+echo "$as_me: error: iconv.h found, while iconv library not found" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ #we have iconv at this moment, better check which call to use
+ echo "$as_me:$LINENO: checking whether iconv takes const char ** or char **" >&5
+echo $ECHO_N "checking whether iconv takes const char ** or char **... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ {
+ size_t iconv (iconv_t a, const char ** b, size_t *c, char **d, size_t *e);
+ }
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ iconv_oldstyle=1
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+iconv_oldstyle=0
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ if test $iconv_oldstyle = 1; then
+ echo "$as_me:$LINENO: result: const char **" >&5
+echo "${ECHO_T}const char **" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define ID3LIB_ICONV_OLDSTYLE 1
+_ACEOF
+
+ #we'll check out the need of
+ #typecast in the call of iconv_open
+ echo "$as_me:$LINENO: checking whether to typecast in iconv" >&5
+echo $ECHO_N "checking whether to typecast in iconv... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ {
+ const char *src = "nothing";
+ char *outbuf;
+ size_t insize = 0;
+ size_t outsize = 0;
+ iconv_t cd;
+ iconv(cd, &src, &insize, &outbuf, &outsize);
+ }
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ iconv_cast=0
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+iconv_cast=1
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ if test $iconv_cast = 1; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define ID3LIB_ICONV_CAST_OK 1
+_ACEOF
+
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ fi
+
+ else
+ echo "$as_me:$LINENO: result: char **" >&5
+echo "${ECHO_T}char **" >&6
+ #we'll check out the need of
+ #typecast in the call of iconv_open
+ echo "$as_me:$LINENO: checking whether to typecast in iconv" >&5
+echo $ECHO_N "checking whether to typecast in iconv... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ {
+ char *src = "nothing";
+ char *outbuf;
+ size_t insize = 0;
+ size_t outsize = 0;
+ iconv_t cd;
+ iconv(cd, &src, &insize, &outbuf, &outsize);
+ }
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ iconv_cast=0
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+iconv_cast=1
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ if test $iconv_cast = 1; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define ID3LIB_ICONV_CAST_OK 1
+_ACEOF
+
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ fi
+ fi
+
+fi
+if test "x$ICONV_LIB" != "x"; then
+ LIBS="$LIBS $ICONV_LIB"
+fi
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+for ac_header in libcw/sys.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+for ac_header in cctype climits cstdio cstdlib bitset cstring
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+for ac_header in fstream iostream iomanip vector \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { echo "$as_me:$LINENO: error: Missing a vital header file for id3lib - download them here: http://gcc.gnu.org/libstdc++/ or better - compile a newer compiler like gcc3.x" >&5
+echo "$as_me: error: Missing a vital header file for id3lib - download them here: http://gcc.gnu.org/libstdc++/ or better - compile a newer compiler like gcc3.x" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+
+done
+
+
+
+for ac_header in \
+ string \
+ iomanip.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { echo "$as_me:$LINENO: error: Missing a vital header file for id3lib" >&5
+echo "$as_me: error: Missing a vital header file for id3lib" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+ ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+ echo "$as_me:$LINENO: checking whether C++ has bool" >&5
+echo $ECHO_N "checking whether C++ has bool... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+main() { bool b1=true; bool b2=false; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define CXX_HAS_NO_BOOL 1
+_ACEOF
+
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+ echo "$as_me:$LINENO: checking whether C++ has correct scoping in for-loops" >&5
+echo $ECHO_N "checking whether C++ has correct scoping in for-loops... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iostream.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ for (int i=0;i<10;i++) { }
+ for (int i=0;i<10;i++) { }
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ cat >>confdefs.h <<\_ACEOF
+#define CXX_HAS_BUGGY_FOR_LOOPS 1
+_ACEOF
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+
+ ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+ # Check whether --enable-cxx-warnings or --disable-cxx-warnings was given.
+if test "${enable_cxx_warnings+set}" = set; then
+ enableval="$enable_cxx_warnings"
+
+else
+ enable_cxx_warnings=minimum
+fi;
+
+ echo "$as_me:$LINENO: checking what warning flags to pass to the C++ compiler" >&5
+echo $ECHO_N "checking what warning flags to pass to the C++ compiler... $ECHO_C" >&6
+ warnCXXFLAGS=
+ if test "x$GCC" != xyes; then
+ enable_compile_warnings=no
+ fi
+ if test "x$enable_cxx_warnings" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *\ \ -Wall\ \ *) ;;
+ *) warnCXXFLAGS="-Wall -Wno-unused -Wno-inline -Woverloaded-virtual -Wmissing-declarations" ;;
+ esac
+
+ ## -W is not all that useful. And it cannot be controlled
+ ## with individual -Wno-xxx flags, unlike -Wall
+ if test "x$enable_cxx_warnings" = "xyes"; then
+ warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Woverloaded-virtual"
+ fi
+ fi
+ fi
+ echo "$as_me:$LINENO: result: $warnCXXFLAGS" >&5
+echo "${ECHO_T}$warnCXXFLAGS" >&6
+
+ # Check whether --enable-iso-cxx or --disable-iso-cxx was given.
+if test "${enable_iso_cxx+set}" = set; then
+ enableval="$enable_iso_cxx"
+
+else
+ enable_iso_cxx=no
+fi;
+
+ echo "$as_me:$LINENO: checking what language compliance flags to pass to the C++ compiler" >&5
+echo $ECHO_N "checking what language compliance flags to pass to the C++ compiler... $ECHO_C" >&6
+ complCXXFLAGS=
+ if test "x$enable_iso_cxx" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *\ \ -ansi\ \ *) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
+ esac
+
+ case " $CXXFLAGS " in
+ *\ \ -pedantic\ \ *) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
+ esac
+ fi
+ fi
+ echo "$as_me:$LINENO: result: $complCXXFLAGS" >&5
+echo "${ECHO_T}$complCXXFLAGS" >&6
+ if test "x$cxxflags_set" != "xyes"; then
+ CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
+ cxxflags_set=yes
+
+ fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ # Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+ enableval="$enable_debug"
+
+else
+ enable_debug=$debug_default
+fi;
+
+ if test "x$enable_debug" = "xyes"; then
+ test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
+ cat >>confdefs.h <<\_ACEOF
+#define ID3_ENABLE_DEBUG 1
+_ACEOF
+
+ else
+ if test "x$enable_debug" = "xno"; then
+ cat >>confdefs.h <<\_ACEOF
+#define ID3_DISABLE_ASSERT 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define ID3_DISABLE_CHECKS 1
+_ACEOF
+
+ fi
+ fi
+
+
+ if test "x$ac_cv_header_iconv_h" = "xyes"; then
+ ID3_ICONV_FORMAT_UTF8=no
+ ID3_ICONV_FORMAT_UTF16=no
+ ID3_ICONV_FORMAT_UTF16BE=no
+ ID3_ICONV_FORMAT_ASCII=no
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF8\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF-8" >&5
+echo $ECHO_N "checking whether iconv supports UTF-8... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF-8", "UTF-8") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF8=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF8 "UTF-8"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF8\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF8" >&5
+echo $ECHO_N "checking whether iconv supports UTF8... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF8", "UTF8") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF8=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF8 "UTF8"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8)
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16BE\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF-16BE" >&5
+echo $ECHO_N "checking whether iconv supports UTF-16BE... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF-16BE", "UTF-16BE") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16BE=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16BE "UTF-16BE"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16BE\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF16BE" >&5
+echo $ECHO_N "checking whether iconv supports UTF16BE... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF16BE", "UTF16BE") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16BE=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16BE "UTF16BE"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16BE\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UCS-2BE" >&5
+echo $ECHO_N "checking whether iconv supports UCS-2BE... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UCS-2BE", "UCS-2BE") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16BE=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16BE "UCS-2BE"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16BE\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UCS2BE" >&5
+echo $ECHO_N "checking whether iconv supports UCS2BE... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UCS2BE", "UCS2BE") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16BE=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16BE "UCS2BE"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16BE\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UNICODEBIG" >&5
+echo $ECHO_N "checking whether iconv supports UNICODEBIG... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UNICODEBIG", "UNICODEBIG") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16BE=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16BE "UNICODEBIG"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE)
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF-16" >&5
+echo $ECHO_N "checking whether iconv supports UTF-16... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF-16", "UTF-16") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16 "UTF-16"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UTF16" >&5
+echo $ECHO_N "checking whether iconv supports UTF16... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UTF16", "UTF16") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16 "UTF16"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_UTF16\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports UNICODE" >&5
+echo $ECHO_N "checking whether iconv supports UNICODE... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("UNICODE", "UNICODE") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_UTF16=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_UTF16 "UNICODE"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16)
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_ASCII\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports ISO-8859-1" >&5
+echo $ECHO_N "checking whether iconv supports ISO-8859-1... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("ISO-8859-1", "ISO-8859-1") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_ASCII=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_ASCII "ISO-8859-1"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_ASCII\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports ASCII" >&5
+echo $ECHO_N "checking whether iconv supports ASCII... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("ASCII", "ASCII") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_ASCII=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_ASCII "ASCII"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_ASCII\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports US-ASCII" >&5
+echo $ECHO_N "checking whether iconv supports US-ASCII... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("US-ASCII", "US-ASCII") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_ASCII=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_ASCII "US-ASCII"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+
+ if eval "test \"x\$ID3_ICONV_FORMAT_ASCII\" = \"xno\""; then
+ echo "$as_me:$LINENO: checking whether iconv supports US" >&5
+echo $ECHO_N "checking whether iconv supports US... $ECHO_C" >&6
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:$LINENO: WARNING: Don't cross-compile" >&5
+echo "$as_me: WARNING: Don't cross-compile" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <iconv.h>
+ int main() { return iconv_open("US", "US") == -1; }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval ID3_ICONV_FORMAT_ASCII=yes
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<_ACEOF
+#define ID3_ICONV_FORMAT_ASCII "US"
+_ACEOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+ fi
+
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII)
+ fi
+
+
+
+# AC_FUNC_MEMCMP
+
+for ac_func in getopt_long
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+if test x$ac_cv_func_getopt_long = xno; then
+ ID3_NEEDGETOPT_LONG_TRUE=
+ ID3_NEEDGETOPT_LONG_FALSE='#'
+else
+ ID3_NEEDGETOPT_LONG_TRUE='#'
+ ID3_NEEDGETOPT_LONG_FALSE=
+fi
+
+
+
+for ac_func in mkstemp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in truncate \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { echo "$as_me:$LINENO: error: Missing a vital function for id3lib" >&5
+echo "$as_me: error: Missing a vital function for id3lib" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+done
+
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_size_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_NAME "$ID3LIB_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_VERSION "$ID3LIB_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_FULLNAME "$ID3LIB_FULLNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_MAJOR_VERSION $ID3LIB_MAJOR_VERSION
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_MINOR_VERSION $ID3LIB_MINOR_VERSION
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_PATCH_VERSION $ID3LIB_PATCH_VERSION
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_INTERFACE_AGE $ID3LIB_INTERFACE_AGE
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3LIB_BINARY_AGE $ID3LIB_BINARY_AGE
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define _ID3_COMPILED_WITH_DEBUGGING "${enable_debug}"
+_ACEOF
+
+
+CONDITIONAL_SUBDIRS=
+if test "x$ac_cv_lib_z_uncompress" = "xno"; then
+ CONDITIONAL_SUBDIRS="$CONDITIONAL_SUBDIRS zlib"
+fi
+
+
+subdirs="$subdirs zlib"
+
+
+CFLAGS="$CFLAGS -Wall"
+
+ ac_config_files="$ac_config_files Makefile doc/Makefile m4/Makefile include/Makefile include/id3/Makefile id3com/Makefile id3com/Sample/Makefile src/Makefile examples/Makefile prj/Makefile libprj/Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${ID3_NEEDZLIB_TRUE}" && test -z "${ID3_NEEDZLIB_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ID3_NEEDZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ID3_NEEDZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${ID3_NEEDDEBUG_TRUE}" && test -z "${ID3_NEEDDEBUG_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ID3_NEEDDEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ID3_NEEDDEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${ID3_NEEDGETOPT_LONG_TRUE}" && test -z "${ID3_NEEDGETOPT_LONG_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ID3_NEEDGETOPT_LONG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ID3_NEEDGETOPT_LONG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+ { $as_unset LANG || test "${LANG+set}" != set; } ||
+ { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+ { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+ { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+ { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+ { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+ { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+ { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+ { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+ { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+ { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+ { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+ { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+ { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+ { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+ { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conftest.sh
+ echo "exit 0" >>conftest.sh
+ chmod +x conftest.sh
+ if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conftest.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.53a. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.53a,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+ exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+ "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
+ "include/id3/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/id3/Makefile" ;;
+ "id3com/Makefile" ) CONFIG_FILES="$CONFIG_FILES id3com/Makefile" ;;
+ "id3com/Sample/Makefile" ) CONFIG_FILES="$CONFIG_FILES id3com/Sample/Makefile" ;;
+ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+ "prj/Makefile" ) CONFIG_FILES="$CONFIG_FILES prj/Makefile" ;;
+ "libprj/Makefile" ) CONFIG_FILES="$CONFIG_FILES libprj/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=$TMPDIR/cs$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@ID3LIB_NAME@,$ID3LIB_NAME,;t t
+s,@ID3LIB_MAJOR_VERSION@,$ID3LIB_MAJOR_VERSION,;t t
+s,@ID3LIB_MINOR_VERSION@,$ID3LIB_MINOR_VERSION,;t t
+s,@ID3LIB_PATCH_VERSION@,$ID3LIB_PATCH_VERSION,;t t
+s,@ID3LIB_VERSION@,$ID3LIB_VERSION,;t t
+s,@ID3LIB_INTERFACE_AGE@,$ID3LIB_INTERFACE_AGE,;t t
+s,@ID3LIB_BINARY_AGE@,$ID3LIB_BINARY_AGE,;t t
+s,@DOX_DIR_HTML@,$DOX_DIR_HTML,;t t
+s,@DOX_DIR_LATEX@,$DOX_DIR_LATEX,;t t
+s,@DOX_DIR_MAN@,$DOX_DIR_MAN,;t t
+s,@DOX_DIR_RTF@,$DOX_DIR_RTF,;t t
+s,@LT_RELEASE@,$LT_RELEASE,;t t
+s,@LT_CURRENT@,$LT_CURRENT,;t t
+s,@LT_REVISION@,$LT_REVISION,;t t
+s,@LT_AGE@,$LT_AGE,;t t
+s,@ID3LIB_FULLNAME@,$ID3LIB_FULLNAME,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@LN_S@,$LN_S,;t t
+s,@ECHO@,$ECHO,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@ID3LIB_DEBUG_FLAGS@,$ID3LIB_DEBUG_FLAGS,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@ID3_NEEDZLIB_TRUE@,$ID3_NEEDZLIB_TRUE,;t t
+s,@ID3_NEEDZLIB_FALSE@,$ID3_NEEDZLIB_FALSE,;t t
+s,@ID3_NEEDDEBUG_TRUE@,$ID3_NEEDDEBUG_TRUE,;t t
+s,@ID3_NEEDDEBUG_FALSE@,$ID3_NEEDDEBUG_FALSE,;t t
+s,@cxxflags_set@,$cxxflags_set,;t t
+s,@ID3_NEEDGETOPT_LONG_TRUE@,$ID3_NEEDGETOPT_LONG_TRUE,;t t
+s,@ID3_NEEDGETOPT_LONG_FALSE@,$ID3_NEEDGETOPT_LONG_FALSE,;t t
+s,@subdirs@,$subdirs,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # egrep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+ # Run the commands associated with the file.
+ case $ac_file in
+ config.h ) # update the timestamp
+echo 'timestamp for config.h' >"./stamp-h1"
+ ;;
+ esac
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
+ # Extract the definition of DEP_FILES from the Makefile without
+ # running `make'.
+ DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n -e '/^U = / s///p' < "$mf"`
+ test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
+ # We invoke sed twice because it is the simplest approach to
+ # changing $(DEPDIR) to its actual value in the expansion.
+ for file in `sed -n -e '
+ /^DEP_FILES = .*\\\\$/ {
+ s/^DEP_FILES = //
+ :loop
+ s/\\\\$//
+ p
+ n
+ /\\\\$/ b loop
+ p
+ }
+ /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d $srcdir/$ac_dir || continue
+
+ { echo "$as_me:$LINENO: configuring in $ac_dir" >&5
+echo "$as_me: configuring in $ac_dir" >&6;}
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+ cd $ac_dir
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'"
+ elif test -f $ac_srcdir/configure; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure'"
+ elif test -f $ac_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
+echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file=$ac_top_builddir$cache_file ;;
+ esac
+
+ { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval $ac_sub_configure $ac_sub_configure_args \
+ --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir ||
+ { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
+echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100755
index 0000000..c857735
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,319 @@
+# $Id: configure.in,v 1.68 2003/03/02 16:37:12 t1mpy Exp $
+
+# Copyright 1999, 2000 Scott Thomas Haug <eldamitri@users.sourceforge.net>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# require autoconf 2.13
+AC_PREREQ(2.13)
+
+# init autoconf (and check for presence fo reconf)
+AC_INIT(reconf)
+
+ID3LIB_NAME=id3lib
+
+dnl The following has been adapted from glib (http://www.gtk.org)
+dnl
+dnl we need to AC_DIVERT_PUSH/AC_DIVERT_POP these variable definitions so they
+dnl are available for $ac_help expansion (don't we all *love* autoconf?)
+#AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
+ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+
+# Making releases:
+# ID3LIB_PATCH_VERSION += 1;
+# ID3LIB_INTERFACE_AGE += 1;
+# ID3LIB_BINARY_AGE += 1;
+# if any functions have been added, set ID3LIB_INTERFACE_AGE to 0.
+# if backwards compatibility has been broken,
+# set ID3LIB_BINARY_AGE _and_ ID3LIB_INTERFACE_AGE to 0.
+#
+
+ID3LIB_MAJOR_VERSION=3
+ID3LIB_MINOR_VERSION=8
+ID3LIB_PATCH_VERSION=3
+ID3LIB_ADDED_VERSION=
+ID3LIB_VERSION=$ID3LIB_MAJOR_VERSION.$ID3LIB_MINOR_VERSION.$ID3LIB_PATCH_VERSION$ID3LIB_ADDED_VERSION
+
+ID3LIB_INTERFACE_AGE=0
+ID3LIB_BINARY_AGE=0
+AC_DIVERT_POP()dnl
+
+AC_SUBST(ID3LIB_NAME)
+AC_SUBST(ID3LIB_MAJOR_VERSION)
+AC_SUBST(ID3LIB_MINOR_VERSION)
+AC_SUBST(ID3LIB_PATCH_VERSION)
+AC_SUBST(ID3LIB_VERSION)
+AC_SUBST(ID3LIB_INTERFACE_AGE)
+AC_SUBST(ID3LIB_BINARY_AGE)
+
+# for documentation purposes
+DOX_DIR_HTML=api
+DOX_DIR_LATEX=latex
+DOX_DIR_MAN=man
+DOX_DIR_RTF=rtf
+
+AC_SUBST(DOX_DIR_HTML)
+AC_SUBST(DOX_DIR_LATEX)
+AC_SUBST(DOX_DIR_MAN)
+AC_SUBST(DOX_DIR_RTF)
+
+# libtool versioning
+LT_RELEASE=$ID3LIB_MAJOR_VERSION.$ID3LIB_MINOR_VERSION
+LT_CURRENT=`expr $ID3LIB_PATCH_VERSION - $ID3LIB_INTERFACE_AGE`
+LT_REVISION=$ID3LIB_INTERFACE_AGE
+LT_AGE=`expr $ID3LIB_BINARY_AGE - $ID3LIB_INTERFACE_AGE`
+AC_SUBST(LT_RELEASE)
+AC_SUBST(LT_CURRENT)
+AC_SUBST(LT_REVISION)
+AC_SUBST(LT_AGE)
+
+VERSION=$ID3LIB_VERSION
+PACKAGE=$ID3LIB_NAME
+
+dnl This is a hack to get the release date using cvs checkin macros
+ID3LIB_FULLNAME=$ID3LIB_NAME-$ID3LIB_VERSION
+
+AC_SUBST(ID3LIB_FULLNAME)
+
+AM_CONFIG_HEADER(config.h)
+
+AM_INIT_AUTOMAKE($PACKAGE,$VERSION)
+
+AC_ISC_POSIX
+
+dnl Initialize libtool
+AM_PROG_LIBTOOL
+
+dnl Initialize maintainer mode
+AM_MAINTAINER_MODE
+
+#AC_CANONICAL_HOST
+
+dnl figure debugging default, prior to $ac_help setup
+dnl
+ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+if test `expr $ID3LIB_MINOR_VERSION \% 2` = 1 ; then
+ debug_default=yes
+else
+ debug_default=minimum
+fi
+AC_DIVERT_POP()dnl
+
+dnl declare --enable-* args and collect ac_help strings
+AC_ARG_ENABLE(ansi, [ --enable-ansi turn on strict ansi [default=no]], , enable_ansi=no)
+dnl
+AC_SUBST(ID3LIB_DEBUG_FLAGS)
+
+dnl Checks for programs
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_INSTALL
+
+dnl for executable extensions
+AC_EXEEXT
+
+dnl Checks for libraries.
+AC_CHECK_LIB(z,uncompress,AC_DEFINE_UNQUOTED(HAVE_ZLIB))#,,
+# AC_MSG_ERROR([id3lib requires zlib to process compressed frames]))
+
+AM_CONDITIONAL(ID3_NEEDZLIB, test x$ac_cv_lib_z_uncompress = xno)
+AM_CONDITIONAL(ID3_NEEDDEBUG, test x$enable_debug = xyes)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(zlib.h wchar.h sys/param.h unistd.h )
+
+dnl check wheter iconv is the part of libc.
+AC_CHECK_HEADERS( iconv.h, has_iconv=1, has_iconv=0)
+
+dnl if we have iconv library, we have to decide if it
+dnl is present in libc
+
+ICONV_LIB=
+if test $has_iconv = 1; then
+ AC_MSG_CHECKING(where to find iconv_open)
+ exec 6>/dev/null
+ AC_CHECK_FUNCS(iconv_open, iconv_in_libc=1, iconv_in_libc=0)
+ AC_CHECK_LIB(iconv, iconv_open, iconv_in_iconv=1, iconv_in_iconv=0)
+ AC_CHECK_LIB(iconv, libiconv_open, libiconv_in_iconv=1, libiconv_in_iconv=0)
+ if test ! x$silent = xyes; then
+ exec 6>&1
+ fi
+ #standalone library rules over libc
+ if test $iconv_in_iconv = 1 -o $libiconv_in_iconv = 1; then
+ AC_MSG_RESULT(libiconv)
+ ICONV_LIB=-liconv
+ elif test $iconv_in_libc = 1; then
+ AC_MSG_RESULT(libc)
+ else
+ AC_MSG_RESULT(not found (panic))
+ AC_MSG_ERROR([iconv.h found, while iconv library not found])
+ fi
+ #we have iconv at this moment, better check which call to use
+ AC_MSG_CHECKING(whether iconv takes const char ** or char **)
+ AC_TRY_COMPILE([#include <iconv.h>],[
+ {
+ size_t iconv (iconv_t a, const char ** b, size_t *c, char **d, size_t *e);
+ }],
+ iconv_oldstyle=1, iconv_oldstyle=0)
+ if test $iconv_oldstyle = 1; then
+ AC_MSG_RESULT(const char **)
+ AC_DEFINE(ID3LIB_ICONV_OLDSTYLE)
+ #we'll check out the need of
+ #typecast in the call of iconv_open
+ AC_MSG_CHECKING(whether to typecast in iconv)
+ AC_TRY_COMPILE([#include <iconv.h>],[
+ {
+ const char *src = "nothing";
+ char *outbuf;
+ size_t insize = 0;
+ size_t outsize = 0;
+ iconv_t cd;
+ iconv(cd, &src, &insize, &outbuf, &outsize);
+ }],
+ iconv_cast=0, iconv_cast=1)
+ if test $iconv_cast = 1; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ID3LIB_ICONV_CAST_OK)
+ else
+ AC_MSG_RESULT(no)
+ fi
+
+ else
+ AC_MSG_RESULT(char **)
+ #we'll check out the need of
+ #typecast in the call of iconv_open
+ AC_MSG_CHECKING(whether to typecast in iconv)
+ AC_TRY_COMPILE([#include <iconv.h>],[
+ {
+ char *src = "nothing";
+ char *outbuf;
+ size_t insize = 0;
+ size_t outsize = 0;
+ iconv_t cd;
+ iconv(cd, &src, &insize, &outbuf, &outsize);
+ }],
+ iconv_cast=0, iconv_cast=1)
+ if test $iconv_cast = 1; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ID3LIB_ICONV_CAST_OK)
+ else
+ AC_MSG_RESULT(no)
+ fi
+ fi
+
+fi
+if test "x$ICONV_LIB" != "x"; then
+ LIBS="$LIBS $ICONV_LIB"
+fi
+
+dnl Check for c++ features
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS(libcw/sys.h)
+AC_CHECK_HEADERS(cctype climits cstdio cstdlib bitset cstring)
+AC_CHECK_HEADERS(fstream iostream iomanip vector \
+ ,,AC_MSG_ERROR([Missing a vital header file for id3lib - download them here: http://gcc.gnu.org/libstdc++/ or better - compile a newer compiler like gcc3.x])
+)
+AC_CHECK_HEADERS( \
+ string \
+ iomanip.h \
+ ,,AC_MSG_ERROR([Missing a vital header file for id3lib])
+)
+
+dnl Checks for the portability of certain c++ features: the bool type and
+dnl for-loop scoping
+ID3_CXX_PORTABILITY
+
+ID3_CXX_WARNINGS
+
+AC_LANG_RESTORE
+
+ID3_DEBUG
+ID3_UNICODE
+
+dnl Check for functions.
+
+# AC_FUNC_MEMCMP
+AC_CHECK_FUNCS(getopt_long)
+AM_CONDITIONAL(ID3_NEEDGETOPT_LONG, test x$ac_cv_func_getopt_long = xno)
+
+AC_CHECK_FUNCS(mkstemp)
+AC_CHECK_FUNCS(
+ truncate \
+ ,,AC_MSG_ERROR([Missing a vital function for id3lib])
+)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_TYPE_SIZE_T
+
+dnl
+dnl Checks with local macros
+dnl
+
+dnl Provides a --honor-std option to the configure script that honors the
+dnl std namespace. Must be used AFTER configuring ALL compilers.
+dnl LF_HONOR_STD
+
+dnl ACCONFIG TEMPLATE
+dnl
+dnl /* config.h defines these preprocesser symbols to be used by id3lib for
+dnl * determining internal versioning information. The intent is that these
+dnl * macros will be made available in the library via constants, functions,
+dnl * or static methods.
+dnl */
+dnl #undef HAVE_ZLIB
+dnl #undef HAVE_GETOPT_LONG
+dnl #undef _ID3LIB_NAME
+dnl #undef _ID3LIB_VERSION
+dnl #undef _ID3LIB_FULLNAME
+dnl #undef _ID3LIB_MAJOR_VERSION
+dnl #undef _ID3LIB_MINOR_VERSION
+dnl #undef _ID3LIB_PATCH_VERSION
+dnl #undef _ID3LIB_INTERFACE_AGE
+dnl #undef _ID3LIB_BINARY_AGE
+dnl #undef _ID3_COMPILED_WITH_DEBUGGING
+dnl /* */
+dnl END ACCONFIG
+
+AC_DEFINE_UNQUOTED(_ID3LIB_NAME, "$ID3LIB_NAME")
+AC_DEFINE_UNQUOTED(_ID3LIB_VERSION, "$ID3LIB_VERSION")
+AC_DEFINE_UNQUOTED(_ID3LIB_FULLNAME, "$ID3LIB_FULLNAME")
+AC_DEFINE_UNQUOTED(_ID3LIB_MAJOR_VERSION, $ID3LIB_MAJOR_VERSION)
+AC_DEFINE_UNQUOTED(_ID3LIB_MINOR_VERSION, $ID3LIB_MINOR_VERSION)
+AC_DEFINE_UNQUOTED(_ID3LIB_PATCH_VERSION, $ID3LIB_PATCH_VERSION)
+AC_DEFINE_UNQUOTED(_ID3LIB_INTERFACE_AGE, $ID3LIB_INTERFACE_AGE)
+AC_DEFINE_UNQUOTED(_ID3LIB_BINARY_AGE, $ID3LIB_BINARY_AGE)
+AC_DEFINE_UNQUOTED(_ID3_COMPILED_WITH_DEBUGGING, "${enable_debug}")
+
+CONDITIONAL_SUBDIRS=
+if test "x$ac_cv_lib_z_uncompress" = "xno"; then
+ CONDITIONAL_SUBDIRS="$CONDITIONAL_SUBDIRS zlib"
+fi
+AC_CONFIG_SUBDIRS(zlib)
+
+CFLAGS="$CFLAGS -Wall"
+
+AC_OUTPUT( \
+ Makefile \
+ doc/Makefile \
+ m4/Makefile \
+ include/Makefile \
+ include/id3/Makefile \
+ id3com/Makefile \
+ id3com/Sample/Makefile \
+ src/Makefile \
+ examples/Makefile \
+ prj/Makefile \
+ libprj/Makefile
+)
diff --git a/depcomp b/depcomp
new file mode 100644
index 0000000..6589965
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,411 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. This file always lives in the current directory.
+ # Also, the AIX compiler puts `$object:' at the start of each line;
+ # $object doesn't have directory information.
+ stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ outname="$stripped.o"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 AIX compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+
+ tmpdepfile1="$object.d"
+ tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'`
+ if test "$libtool" = yes; then
+ "$@" -Wc,-MD
+ else
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ else
+ tmpdepfile="$tmpdepfile2"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a space and a tab in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ test -z "$dashmflag" && dashmflag=-M
+ ( IFS=" "
+ case " $* " in
+ *" --mode=compile "*) # this is libtool, let us make it quiet
+ for arg
+ do # cycle over the arguments
+ case "$arg" in
+ "--mode=compile")
+ # insert --quiet before "--mode=compile"
+ set fnord "$@" --quiet
+ shift # fnord
+ ;;
+ esac
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # "$arg"
+ done
+ ;;
+ esac
+ "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ ) &
+ proc=$!
+ "$@"
+ stat=$?
+ wait "$proc"
+ if test "$stat" != 0; then exit $stat; fi
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ # X makedepend
+ (
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in no)
+ set ""; shift
+ cleared=yes
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift;;
+ -*)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ ) &
+ proc=$!
+ "$@"
+ stat=$?
+ wait "$proc"
+ if test "$stat" != 0; then exit $stat; fi
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tail +3 "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ ( IFS=" "
+ case " $* " in
+ *" --mode=compile "*)
+ for arg
+ do # cycle over the arguments
+ case $arg in
+ "--mode=compile")
+ # insert --quiet before "--mode=compile"
+ set fnord "$@" --quiet
+ shift # fnord
+ ;;
+ esac
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # "$arg"
+ done
+ ;;
+ esac
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ ) &
+ proc=$!
+ "$@"
+ stat=$?
+ wait "$proc"
+ if test "$stat" != 0; then exit $stat; fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ ( IFS=" "
+ case " $* " in
+ *" --mode=compile "*)
+ for arg
+ do # cycle over the arguments
+ case $arg in
+ "--mode=compile")
+ # insert --quiet before "--mode=compile"
+ set fnord "$@" --quiet
+ shift # fnord
+ ;;
+ esac
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # "$arg"
+ done
+ ;;
+ esac
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ ) &
+ proc=$!
+ "$@"
+ stat=$?
+ wait "$proc"
+ if test "$stat" != 0; then exit $stat; fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/doc/3d-logo.gif b/doc/3d-logo.gif
new file mode 100644
index 0000000..3f95829
--- /dev/null
+++ b/doc/3d-logo.gif
Binary files differ
diff --git a/doc/Doxyfile b/doc/Doxyfile
new file mode 100644
index 0000000..72478b3
--- /dev/null
+++ b/doc/Doxyfile
@@ -0,0 +1,723 @@
+# Doxyfile 1.2.2
+
+# This file describes the settings to be used by doxygen for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = id3lib
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 3.8.3
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
+# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and
+# Portuguese.
+
+OUTPUT_LANGUAGE = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these class will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH = ..
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a class diagram (in Html and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off.
+
+CLASS_DIAGRAMS = YES
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower case letters. If set to YES upper case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the Javadoc-style will
+# behave just like the Qt-style comments.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = YES
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# The ENABLE_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ../src \
+ ../include/id3/field.h \
+ ../include/id3/frame.h \
+ ../include/id3/globals.h \
+ ../include/id3/misc_support.h \
+ ../include/id3/reader.h \
+ ../include/id3/readers.h \
+ ../include/id3/sized_types.h \
+ ../include/id3/tag.h \
+ ../include/id3/tag.h \
+ ../include/id3/writer.h \
+ ../include/id3/writers.h
+
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+FILE_PATTERNS = *.cpp \
+ *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = ../examples
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *.cpp \
+ *.c \
+ *.h
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH = .
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = api
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET = id3lib.css
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = letter
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using a WORD or other.
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Warning: This feature
+# is still experimental and very incomplete.
+
+GENERATE_XML = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED = __cplusplus
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other
+# documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented header file showing
+# the documented files that directly or indirectly include this file
+
+INCLUDED_BY_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME = search.cgi
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH = /usr/local/bin/
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
new file mode 100644
index 0000000..7298cd5
--- /dev/null
+++ b/doc/Doxyfile.in
@@ -0,0 +1,723 @@
+# Doxyfile 1.2.2
+
+# This file describes the settings to be used by doxygen for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = @PACKAGE@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
+# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and
+# Portuguese.
+
+OUTPUT_LANGUAGE = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these class will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH = ..
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a class diagram (in Html and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off.
+
+CLASS_DIAGRAMS = YES
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower case letters. If set to YES upper case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the Javadoc-style will
+# behave just like the Qt-style comments.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = YES
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# The ENABLE_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ../src \
+ ../include/id3/field.h \
+ ../include/id3/frame.h \
+ ../include/id3/globals.h \
+ ../include/id3/misc_support.h \
+ ../include/id3/reader.h \
+ ../include/id3/readers.h \
+ ../include/id3/sized_types.h \
+ ../include/id3/tag.h \
+ ../include/id3/tag.h \
+ ../include/id3/writer.h \
+ ../include/id3/writers.h
+
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+FILE_PATTERNS = *.cpp \
+ *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = ../examples
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *.cpp \
+ *.c \
+ *.h
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH = .
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = @DOX_DIR_HTML@
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET = id3lib.css
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = @DOX_DIR_LATEX@
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = letter
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = @DOX_DIR_RTF@
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using a WORD or other.
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = @DOX_DIR_MAN@
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Warning: This feature
+# is still experimental and very incomplete.
+
+GENERATE_XML = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED = __cplusplus
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other
+# documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
+# YES then doxygen will generate a graph for each documented header file showing
+# the documented files that directly or indirectly include this file
+
+INCLUDED_BY_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME = search.cgi
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH = /usr/local/bin/
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..50eda87
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,51 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EXTRA_DIST = \
+ Doxyfile \
+ Doxyfile.in \
+ 3d-logo.gif \
+ attilas_id3logo.jpg \
+ fillpx.gif \
+ id3guide.html \
+ id3lib-manual.php \
+ id3lib.css \
+ id3v2.3.0.html \
+ id3v2.3.0.txt \
+ id3v2.gif \
+ id3v2.ico \
+ id3v2.png \
+ index.html \
+ index.html.in \
+ musicmatch.txt
+
+Doxyfile: $(srcdir)/Doxyfile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+index.html: $(srcdir)/index.html.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+docsdistdir = $(PACKAGE)-doc-$(VERSION)
+
+dox: Doxyfile
+ -rm -rf @DOX_DIR_HTML@ @DOX_DIR_LATEX@
+ cd $(srcdir) && doxygen Doxyfile
+
+docs: dox index.html id3lib.css
+ -rm -rf $(docsdistdir).*
+ cd $(srcdir)/@DOX_DIR_LATEX@ && \
+ make pdf && \
+ (cp *.pdf ../$(docsdistdir).pdf || true) && \
+ cp *.ps ../$(docsdistdir).ps && \
+ gzip -9 ../$(docsdistdir).ps
+ -rm -rf $(srcdir)/@DOX_DIR_LATEX@
+
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..59db1ca
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,289 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+EXTRA_DIST = \
+ Doxyfile \
+ Doxyfile.in \
+ 3d-logo.gif \
+ attilas_id3logo.jpg \
+ fillpx.gif \
+ id3guide.html \
+ id3lib-manual.php \
+ id3lib.css \
+ id3v2.3.0.html \
+ id3v2.3.0.txt \
+ id3v2.gif \
+ id3v2.ico \
+ id3v2.png \
+ index.html \
+ index.html.in \
+ musicmatch.txt
+
+
+docsdistdir = $(PACKAGE)-doc-$(VERSION)
+subdir = doc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+
+Doxyfile: $(srcdir)/Doxyfile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+index.html: $(srcdir)/index.html.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+dox: Doxyfile
+ -rm -rf @DOX_DIR_HTML@ @DOX_DIR_LATEX@
+ cd $(srcdir) && doxygen Doxyfile
+
+docs: dox index.html id3lib.css
+ -rm -rf $(docsdistdir).*
+ cd $(srcdir)/@DOX_DIR_LATEX@ && \
+ make pdf && \
+ (cp *.pdf ../$(docsdistdir).pdf || true) && \
+ cp *.ps ../$(docsdistdir).ps && \
+ gzip -9 ../$(docsdistdir).ps
+ -rm -rf $(srcdir)/@DOX_DIR_LATEX@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/attilas_id3logo.jpg b/doc/attilas_id3logo.jpg
new file mode 100644
index 0000000..20238cc
--- /dev/null
+++ b/doc/attilas_id3logo.jpg
Binary files differ
diff --git a/doc/fillpx.gif b/doc/fillpx.gif
new file mode 100644
index 0000000..bdf7a77
--- /dev/null
+++ b/doc/fillpx.gif
Binary files differ
diff --git a/doc/id3guide.html b/doc/id3guide.html
new file mode 100644
index 0000000..18c2dca
--- /dev/null
+++ b/doc/id3guide.html
@@ -0,0 +1,636 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+ <HEAD>
+ <TITLE>ID3v2.3 Programming Guidelines</TITLE>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+ <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (WinNT; I) [Netscape]">
+ <link href="id3lib.css" rel="stylesheet" type="text/css">
+ </HEAD>
+<BODY>
+
+<h1>ID3v2.3 Programming Guidelines</h1>
+
+<center><IMG SRC="id3v2.gif" HEIGHT=50 WIDTH=52></centeR>
+
+<P>Applies to: ID3v2.3<BR>
+Old versions:&nbsp;<A HREF="id3g-2.htm">ID3v2.2 Guidelines</A> (ID3v2.2 is obsolete
+and should not be used for new tags.)</P>
+
+<H2>Table of Contents</H2>
+
+<P>1. <A HREF="#Intro">Introduction</A> <BR>
+1.1. <A HREF="#Usage">Use of this document</A> <BR>
+2. <A HREF="#id3v23new">What's new</A> in ID3v2.3? <BR>
+3. Programming Considerations <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.1 <A HREF="#padding">Padding</A> <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.2 <A HREF="#ROmedia">Read-only media</A> <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.3 <A HREF="#SmallFrames">&quot;Insignificant&quot;
+frames</A> <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.4 <A HREF="#iformat">Preferred image formats</A>
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.5 <A HREF="#manytags">Multiple tags</A> <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 3.6 <A HREF="#unsync">Unsynchronization</A> <BR>
+4. Pitfalls &amp; General Advice <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 4.1 <A HREF="#rtfm">RTFM</A> and yes, the details
+matter! <BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 4.2 <A HREF="#cB4e">Compression before encryption</A>
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp; 4.3 <A HREF="#userErr">Validating user input</A>
+<BR>
+5. <A HREF="#Credit">Credits</A> <BR>
+6. <A HREF="#Refs">References</A> <BR>
+7. <A HREF="#copyright">Copyright &amp; Legal Notices</A> </P>
+
+<P>
+<HR></P>
+
+<H2><A NAME="Intro"></A>Introduction</H2>
+
+<P>There are many people who enjoy .MP3 compressed music. The MP3 specification
+only defined the storage of musical data and did not provide the storage
+of metadata related to the musical composition; e.g., title, composer and
+artist, publisher, etc. The ID3 tag standard was created to remedy this
+need... </P>
+
+<P><B>Rationale:</B> Specifications are like grammar: they provide the
+rules of formatting data but few clues as to how to speak concisely and
+efficiently. The goal of this document is to answer the &quot;Should I
+do...&quot; and &quot;Would doing X make it easier/faster/smaller...&quot;
+type questions. </P>
+
+<P><B>Audience:</B> This document is geared toward programmers dealing
+directly with ID3v2.3 tags. There is a heavy slant towards writing tags
+correctly since decoding is relatively straightforward. You should familiarize
+yourself with the <A HREF="http://www.id3.org/develop.html">ID3v2 and related
+standards</A> since this document refers to and uses the terminology from
+those documents.</P>
+
+<P><B>Coverage:</B>&nbsp;Although ID3v2 tags were created for use with
+MPEG&nbsp;Layer-3 audio streams, flexibility was a goal from the start.
+Even though much of this document refers to .MP3 files, the principles
+are generally applicable to other formats.</P>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="Usage"></A>Use of this document</H2>
+
+<P>These are merely Guidelines and as such they are not part of the ID3v2
+standard. </P>
+
+<OL>
+<LI>If anything in this document contradicts the published ID3v2 standard,
+then the standard shall prevail. The ID3v2 standard always has the final
+word.
+
+<LI>These Guidelines are not binding on anyone (whereas the standard <I>is</I>
+binding, for obvious reasons.) This means you, as a programmer, should
+never assume anyone else will abide by these guidelines. A protocol designer
+once said:
+
+<OL>
+<P><I>&quot;Be flexible in what you accept, but strict in what you write.&quot;</I>
+</P>
+</OL>
+
+<LI>Use your judgement and common sense.</LI>
+</OL>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="id3v23new"></A>What's new in ID3v2.3?</H2>
+
+<P>For starters, the naming convention changed. &quot;ID3v2&quot; now refers
+to the family of frame-based tagging methods which utilize the 10-byte
+header beginning with &quot;ID3&quot; followed by version information.
+&quot;ID3v2<B>.3.0</B>&quot; refers to the informal standard dated September
+1998. The informal standard formerly known as &quot;ID3v2&quot; has been
+renamed to &quot;ID3v2.2&quot;</P>
+
+<P>This document concentrates on ID3v2.3. The previous standard, ID3v2.2, is now
+obsolete; the Guidelines for ID3v2.2 may still be found <A HREF="id3g-2.htm">here</A>.</P>
+
+<P>A summary of the differences between ID3v2.3.0 and v2.2 is listed below.
+Section numbers match the
+<A HREF="http://www.lysator.liu.se/id3v2/id3v2.3.0.txt">ID3v2.3.0 Informal Standard</A>.</P>
+
+<H3>Structural changes:</H3>
+
+<UL>
+<LI>The <B>Frame Header</B> has been expanded. The Frame ID and Frame Size
+fields are now four bytes long. Two bytes of Flags have been added. See
+&sect;3.3.</LI>
+
+<LI>An optional <B>Extended Header</B> can follow the ID3v2 tag header
+&sect;3.2. Among other things, the extended header can store a CRC of the
+entire tag.</LI>
+</UL>
+
+<H3>Clarifications:</H3>
+
+<UL>
+<LI>Pre-defined Frame IDs have been renamed to four characters long.</LI>
+
+<LI>Unicode strings are now <I>required</I> to start with the Byte Order Mark (BOM)
+character. See&nbsp;&sect;3.3.</LI>
+
+<LI>Compression and encryption are done on a frame-by-frame basis. The
+compression algorithm are those offered in zlib.&nbsp;&sect;3.3</LI>
+
+<LI>Attached Picture [APIC] frame:&nbsp;the Image Format field has been
+replaced MIME&nbsp;Type &sect;4.15.</LI>
+</UL>
+
+<P><B>New frames:</B> </P>
+
+<UL>
+<LI>Position Synchronization frame [POSS] &sect;4.22</LI>
+
+<LI>Terms of Use frame [USER] &sect;4.23</LI>
+
+<LI>Ownership frame [OWNE] &sect;4.24</LI>
+
+<LI>Commercial frame [COMR] &sect;4.25</LI>
+
+<LI>Private frame [PRIV] &sect;4.28</LI>
+
+<LI>Encryption Method Registration [ENCR] &sect;4.25</LI>
+
+<LI>Group ID&nbsp;Registration [GRID] &sect;4.26.Used in conjunction with
+new frame features described in &sect;3.3</LI>
+
+<LI>Text frames:&nbsp;Internet Radio Station Name [TRSN] and Internet Radio
+Station Owner [TRSO]</LI>
+
+<LI>URL&nbsp;link frames:&nbsp;Official internet radio station homepage
+[WORS] and Payment [WPAY]</LI>
+</UL>
+
+<P><B>Deleted frames:</B> Encrypted meta-frame.</P>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="padding"></A>3.1 Padding</H2>
+
+<P>The use of padding and how much should be used has been a matter of
+debate ever since the first draft of ID3v2. (Take a look in the mailing
+list <A HREF="http://www.id3.org/maillist.html">archives</A> for arguments.)</P>
+
+<P>Before making recommendations let's quantify the issue:</P>
+
+<UL>
+<LI>A two minute song compressed at 44Khz and 128Kb/sec takes about 1990K&nbsp;(slightly
+less than 2MB)&nbsp;of disk space. The average size of .MP3 files in my
+collection is 3.5MB</LI>
+
+<LI>ID3v1 and Lyrics3 tags are only 128 bytes and 3K, respectively - and
+they served most songs just fine.</LI>
+
+<LI>An ID3v2 tag with basic information (title, artist/composer, copyright)&nbsp;is
+typically less than 1K in size. Toss in publisher information and lyrics
+and it comes out to 3K or so.</LI>
+
+<LI>Adding a 3K tag to a 2MB song will increase its size by 0.15%</LI>
+
+<LI>Adding a 10K tag to a 2MB song increases its size by 0.5%</LI>
+
+<LI>Suppose a&nbsp;CD-ROM holds 160 songs. Tagging all of them with 3K
+tags requires less than a megabyte.</LI>
+</UL>
+
+<P>So in reality tags are tiny compared to the amount of audio data accompanying
+it. A few KB of padding will not increase the file size noticeably. Remember
+also the padding is required to be 0's, which means on a slow modem link
+the padding is compressed significantly.</P>
+
+<P>There is but one reason to use padding: since ID3v2 tags are stored
+at the beginning of the file, it would be a major pain to rewrite the entire
+multi-megabyte file to add a 50-byte frame. Padding reserves space in advance.</P>
+
+<P>The issue then is how much padding should be used. </P>
+
+<P><B>James's</B> recommendations:</P>
+
+<UL>
+<LI>What do most people care about?&nbsp;Probably title, artist, composer,
+band, publisher, lyrics and copyright. 4K will usually be enough for all
+that plus some miscellaneous information such as media type, file size,
+playcounter, time codes, etc.</LI>
+
+<LI>If you are editing an existing tag and run out of room (meaning you
+must rewrite the entire file) then double the amount of space reserved
+for the tag. For example, a file has a 4K tag filled with 3K of data. User
+wants to add 2K of data, so you rewrite the file reserving 8K at the beginning;
+then save the 5K of data and leaving 3K of padding. </LI>
+
+<P>Obviously there should be an upper bound on doubling; a reasonable number
+would be 16K or 32K. For example, a file has a 25K tag but only 4K of padding
+left and the user wants to add 7K of new data. Rewrite the file and reserve
+41K: save 28K of tag data and leave 13K of padding.</P>
+
+<LI>Pictures are large and vary in size. If there are pictures then you
+should add more padding; use your judgement here.</LI>
+
+<LI>Do not forgo padding in files destined for read-only media or streaming
+applications. The user may want to save the file to another location and
+edit the tag.</LI>
+
+<LI>Include an option to let the user disable padding if (s)he <I>really</I>
+wants to.</LI>
+</UL>
+
+<P><B>Martin</B> has a good idea: Add enough padding to round out the file
+to a full cluster. Obviously a minimum amount of padding has to be added
+to be useful, but beyond the minimum, everything up to the next cluster
+size will not occupy additional disk space. (Each operating system has
+its own terminology; Microsoft uses <I>cluster,</I> Apple uses <I>allocation
+block</I>. How files are stored on disk is beyond the scope of this document;
+consult an OS&nbsp;book and API reference for details.)</P>
+
+<P>Here are some common cluster sizes:</P>
+
+<TABLE BORDER=1 >
+<TR>
+<TH ROWSPAN="2" NOWRAP>Operating system<BR>
+(file system type)</TH>
+
+<TH ALIGN=CENTER COLSPAN="7" NOWRAP>Disk size </TH>
+</TR>
+
+<TR>
+<TD>&lt; 256MB</TD>
+
+<TD>up to 512MB</TD>
+
+<TD>up to 1GB</TD>
+
+<TD>up to 2GB</TD>
+
+<TD>up to 8GB</TD>
+
+<TD>up to 16GB</TD>
+
+<TD>&gt; 16GB</TD>
+</TR>
+
+<TR>
+<TD>DOS&nbsp;&amp;&nbsp;Windows 95<BR>
+(FAT16)</TD>
+
+<TD ALIGN=CENTER>4K</TD>
+
+<TD ALIGN=CENTER>8K</TD>
+
+<TD ALIGN=CENTER>16K</TD>
+
+<TD ALIGN=CENTER>32K</TD>
+
+<TD ALIGN=CENTER COLSPAN="3">N/A<BR>
+(FAT16 can't handle drives&nbsp;&gt;&nbsp;4GB)</TD>
+</TR>
+
+<TR>
+<TD>Win95 OSR2 &amp;&nbsp;Win98<BR>
+(FAT32)</TD>
+
+<TD ALIGN=CENTER>N/A</TD>
+
+<TD ALIGN=CENTER COLSPAN="4">4K</TD>
+
+<TD ALIGN=CENTER>8K</TD>
+
+<TD ALIGN=CENTER>16K or 32K</TD>
+</TR>
+
+<TR>
+<TD>Windows NT<BR>
+(NTFS)</TD>
+
+<TD ALIGN=CENTER COLSPAN="7">0.5K to 64K<BR>
+(0.5K to 4K clusters are most common)</TD>
+</TR>
+
+<TR>
+<TD>MacOS pre-8.1<BR>
+(HFS)</TD>
+
+<TD ALIGN=CENTER>0.5K - 4K</TD>
+
+<TD ALIGN=CENTER>4.5K - 8K</TD>
+
+<TD ALIGN=CENTER>8.5K - 16K</TD>
+
+<TD ALIGN=CENTER>16.5K - 32K</TD>
+
+<TD ALIGN=CENTER COLSPAN="3">N/A<BR>
+(HFS&nbsp;can't handle disks&nbsp;&gt;&nbsp;2GB)</TD>
+</TR>
+
+<TR>
+<TD>MacOS 8.1 and later<BR>
+(HFS+)</TD>
+
+<TD ALIGN=CENTER>0.5K</TD>
+
+<TD ALIGN=CENTER>1K</TD>
+
+<TD ALIGN=CENTER>2K</TD>
+
+<TD ALIGN=CENTER COLSPAN="4">Default is 4K; user-selectable up to 4K</TD>
+</TR>
+
+<TR>
+<TD>CD-ROM, 650MB<BR>
+(ISO&nbsp;9660)</TD>
+
+<TD ALIGN=CENTER COLSPAN="3">always 2K</TD>
+</TR>
+
+<TR>
+<TD>DVD-ROM<BR>
+(UDF)</TD>
+
+<TD ALIGN=CENTER COLSPAN="7">always 2K</TD>
+</TR>
+</TABLE>
+
+<P>Advanced operating systems employ tricks to optimize disk space. For
+example, Novell NetWare 4 uses 64K disk blocks but can split a block into
+0.5K pieces, thus creating the illusion of 512-byte blocks. UNIX&nbsp;file
+systems have their own methods to utilize disk space efficiently.</P>
+
+<P><B>James's</B> shortcut on choosing an appropriate cluster size: 2K
+(Nice even number, not too big, not too small)</P>
+
+<H2><A NAME="ROmedia"></A>3.2 Read-only media</H2>
+
+<P>Never assume a .MP3 file is writable unless the user is specifically
+editing the tag. MP3 files can be stored on read-only media such as a CD-ROM
+or a network share. If the user is editing the tag, it is an error if the
+file is write-protected because the user's changes cannot be saved. If
+a player is merely updating the playcounter or popularity-meter, it should
+not pop up a message complaining the file cannot be written to. </P>
+
+<P><B>James</B>: Include a visual cue to indicate whether the file is write-protected.
+For example, a small icon similar in size and color to the stereo indicator
+in WinAMP. A quick glance will determine whether certain settings will
+be saved. </P>
+
+<H2><A NAME="SmallFrames"></A>3.3 &quot;Insignificant&quot; frames</H2>
+
+<P>&quot;Insignificant&quot; frames are small frames that don't necessarily
+have meaning when a ID3v2 tag is created. The issue is whether the tag
+editor should add these frames when they do not already exist. </P>
+
+<P>For example, if Joe is adding tags to a fresh batch of .MP3 files, should
+the tag editor include a playcounter [PCNT] frame in the tag? The tag editor
+has no idea how many times the particular file has been played; unless
+Joe tells it otherwise, the editor has to create a [PCNT] frame with a
+count of 0. </P>
+
+<P>There are two ways to look at this. On the one hand, the frame is so
+small it takes almost no effort to include it. Since there will usually
+be a few hundred bytes of padding, the ten bytes used by the counter frame
+is in a sense &quot;free.&quot; A player will probably add it later anyway
+when the file is used. </P>
+
+<P>On the other hand, if the frame is not holding useful information, why
+bother adding it? Padding, if used, effectively reserves space for these
+frames. Consider also the absence of a frame can be meaningful: the lack
+of a playcounter frame may indicate &quot;I do not know how many times
+this piece has been played&quot; as opposed to a count of 0, which
+indicates &quot;This song has never been played.&quot; </P>
+
+<P>These can be considered &quot;insignificant&quot; frames: </P>
+
+<UL>
+<LI>Playcounter [PCNT]<BR>
+(<B>James</B>: an integrated ripper-encoder-tagger can include a playcount
+of 0 in newly created files, since by definition they have never been used..)
+</LI>
+
+<LI>Others, anyone?</LI>
+</UL>
+
+<P><B>Martin</B>: It is considered good manner to allow the user to disable
+writing of frames (s)he doesn't want. At least in an advanced menu in a
+hidden place. Perhaps the user doesn't want the TSI, TLE, TMT and MLL frame
+to be added automatically, even though it might be the default setting.</P>
+
+<H2><A NAME="iformat"></A>3.4 Preferred image formats</H2>
+
+<P>A question Martin gets often is why the ID3v2 document says &quot;...
+PNG&nbsp;and JPEG picture format should be used...&quot; Interoperability
+means it is almost guaranteed another ID3v2 tag/picture decoder can handle
+the PNG and JPEG formats. The chances a Macintosh application can display
+BMP files are slim; likewise, the complexities of EPS and TIFF are best
+left out.</P>
+
+<P>Consider these other arguments favoring PNG and JPEG:</P>
+
+<UL>
+<LI>PNG compresses better than BMP, GIF and most other lossless formats.</LI>
+
+<LI>JPEG has superior compression to most formats, especially for photographic
+pictures. (JPEG is not suitable for line-art and computer-generated graphics
+- use PNG for these.)</LI>
+
+<LI>Both formats are patent- and royalty-free (which is not the case with
+GIF, whose LZW compression algorithm is patented by Unisys.) </LI>
+</UL>
+
+<P><B>Martin</B>: The freedom to use whatever format you like in the picture
+frame is of course a freedom under responsibility. Do you want to make
+cross platform tags? Do you want to avoid legal trouble, at least for the
+principle? If so, use PNG and JPEG.</P>
+
+<P><B>Dirk</B>: Applications may want to convert the incoming picture type
+to PNG or JPEG first, or failing that, at least inform the user that they
+<I>should</I> be using PNG or JPEG, but allow the user to override this
+if they insist on using, say, a PCX.</P>
+
+<H2><A NAME="manytags"></A>3.5 Multiple tags</H2>
+
+<P>Decoders should be prepared to handle multiple ID3v2 tags per stream.
+This is especially important for players/decoders wanting to handle netradio-type
+applications since the notion of distinct files may not apply. </P>
+
+<P><B>Dirk</B>: An easy way to achieve this would be to use a central 'frame
+dispatch' routine, kind of like a demultiplexer. </P>
+
+<H2><A NAME="unsync"></A>3.6 Unsynchronization</H2>
+
+<P>The ID3v2 standard states&nbsp;&quot;The only purpose of the 'unsychronisation
+scheme' is to make the ID3v2 tag as compatible as possible with existing
+software <I>[at the time the ID3v2.2 standard was drafted]</I>&quot; What
+are the implications?</P>
+
+<OL>
+<LI>.MP3 decoders, regardless of age, will not be affected by extraneous
+data (i.e., tags)&nbsp;that does not contain a MPEG&nbsp;sync sequence.</LI>
+
+<LI>There is minimal impact if a decoder does not recognize ID3v2 tags
+but encounters something with a sync sequence. At worst a click or pop
+will be heard at the beginning of the piece, as if some data corruption
+has occurred.</LI>
+
+<LI>New software is expected to take advantage of ID3v2. Unsynchronization
+is not necessary with ID3v2 compliant software.</LI>
+</OL>
+
+<P>(Software which does not behave according to items 1 and 2 above are
+categorically deemed &quot;broken.&quot; Microsoft's Media Player is an
+example of such software.)</P>
+
+<P><B>Martin</B>: I believe that unsynchronization should be done as seldom
+as possible since it increases the size of the tag as well as the parsing
+time. In other words, I think unsynchronization should be turned off as
+default.</P>
+
+<P>However, it is important to be able to undo unsynchronization when reading
+tags; otherwise unsynchronized tags will not be read correctly.</P>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="rtfm"></A>4.1 RTFM (details are important!)</H2>
+
+<P>When the ID3v2 document refers to another standard it is assumed that
+the implementor is familiar with that standard as well. When it says URL
+it does not mean 'www.buymusic.com', it means 'http://www.buymusic.com/'
+A&nbsp;&quot;URL&nbsp;containing an e-mail address&quot; must include the
+'mailto:' qualifier. Those who at least take a quick look at the related
+standards will not make these kinds of mistakes.</P>
+
+<P>If these details are so important, why aren't they spelled out in the
+ID3v2 standard? According to Martin, &quot;There has been people who said
+to me, 'You must write these kind of things in the document, or else people
+will make these mistakes.' The latest ID3 v2.01 draft is <I>only</I> 74,657
+bytes of pure text because I did not. Guess why there are references to
+the standards in the document!&quot; </P>
+
+<H2><A NAME="cB4e"></A>4.2 Compression before encryption</H2>
+
+<P>Encryption works by scrambling data to produce what amounts to random
+bits for an attacker. Data compression works by replacing or removing redundant
+information. It follows that the output of any decent crypto algorithm
+will not be compressible; therefore if you wish to use both compression
+and encryption, you must compress the data before encrypting it. </P>
+
+<P>Compressing before encryption also affords better security, since predictable
+headers and such will be hidden by compression. </P>
+
+<P>Remember: <I>compression</I> comes before <I>encryption</I> in the dictionary
+(at least in English) and that is how it should be in your application.
+</P>
+
+<H2><A NAME="userErr"></A>4.3 Validating user input</H2>
+
+<P>Never trust the input from the user to be sensible or formatted correctly.
+Is the ISRC a valid one? Does the month 13 exist? Could this piece of music
+be from disc 5 out of a 3 disc set?</P>
+
+<P><B>Dirk</B>:&nbsp;Personally, I think having input validation occur
+when the user signifies that the tag is &quot;finished&quot; is a good
+way of going about it, if only because I know I'll get half way through
+something and want to stop and do something else before I forget.</P>
+
+<P><B>James</B>:&nbsp;Extremely strict validation becomes restrictions
+on versatility and usability. An option to turn off or accept potentially
+invalid data can be included somewhere. For example, by default Microsoft
+Visual Basic checks for syntax errors as code is entered; however, users
+can disable that feature if they wish to delay syntax checking until compile
+time. </P>
+
+<P>Things to watch out for (this is by no means an all-inclusive list):</P>
+
+<UL>
+<LI>Properly formatted URLs (see <A HREF="#rtfm">RTFM</A>, above.)&nbsp;But
+should your application verify whether the URL actually exists? That may
+be too complicated; Martin and James's opinion is no verification.</LI>
+
+<LI>Proper MIME types.</LI>
+
+<LI>Are characters valid?&nbsp;Most text fields forbid control characters,
+even newlines. NULs are not allowed except in Unicode strings or to indicate
+end-of-string for terminated strings.</LI>
+
+<LI>Numerical strings must consist solely of the characters '0' through
+'9'</LI>
+
+<LI>Are lists handled properly?&nbsp;The list separator is a slash:&nbsp;/
+What happens if the user enters a / in an item?</LI>
+
+<LI>Are characters such as ( escaped where necessary?</LI>
+
+<LI>Do dates and times make sense? Years must be four digits long and be
+in the right century.&nbsp;(No Y2K problems here!)</LI>
+
+<LI>Is an image really the format the user claims it is? Some people believe
+renaming a .BMP file to .PNG will change its format accordingly.</LI>
+</UL>
+
+<P>Your application should never crash because the user does something
+stupid. Likewise, your application should not crash because of erroneous
+or malformed data in a tag. It is particularly important your application
+can recognize Unicode text frames and ignore them if the operating system
+or your program cannot handle Unicode.</P>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="Credit"></A>Credits &amp; Contributors</H2>
+
+<UL>
+<LI><A HREF="mailto:dirk@id3.org">Dirk Mahoney</A>, creator of the <A HREF="http://www.id3.org/id3lib/">ID3Lib</A>
+C++ tag processing library.</LI>
+
+<LI><A HREF="mailto:merlin@starr.econ.nyu.edu">James Lin</A>, author of
+these Guidelines.</LI>
+
+<LI><A HREF="mailto:nilsson@id3.org">Martin Nilsson</A>, author of the
+ID3v2 standard.</LI>
+</UL>
+
+<H2><A NAME="Refs"></A>References</H2>
+
+<UL>
+<LI><A HREF="http://www.id3.org/">www.id3.org</A>: Home of the <A HREF="http://www.id3.org/develop.html">ID3v2
+Informal Standard</A> and lots of other useful material.</LI>
+</UL>
+
+<P>
+<HR WIDTH="85%"></P>
+
+<H2><A NAME="copyright"></A>Copyright &amp; Legal Notice</H2>
+
+<P>Copyright &copy; 1998 James Lin and Merlin's Workshop. </P>
+
+<P>The goal of this document is to provide hints on how to implement the
+ID3v2 standard(s) correctly and efficiently. Distribution of this document
+is unlimited as long as no changes are made to its content: </P>
+
+<P><B>This document and translations of it may be copied and furnished
+to others, in any format or medium, provided no modifications are made
+to the content unless written permission has been obtained from the author.</B>
+</P>
+
+<P><B>This document is provided &quot;AS IS&quot; without warranty of any
+kind, either expressed or implied, including but not limited to, the implied
+warranties of merchantability and fitness for a particular purpose.</B>
+</P>
+
+<P><B>In no event unless required by applicable law will the author of
+this document be liable for damages, including any general, special, incidental
+or consequential damages arising out of the use or inability to use any
+information (including but not limited to loss or corruption of data or
+losses sustained by third parties), even if the author has been advised
+of the possibility of such damages.</B> </P>
+
+<HR WIDTH="100%"></hr><p>Copyright &copy; 1998 Merlin's
+Workshop. <I>Last updated October 22, 1998</I> </P>
+
+</BODY>
+</HTML>
diff --git a/doc/id3lib-manual.php b/doc/id3lib-manual.php
new file mode 100644
index 0000000..0530bd0
--- /dev/null
+++ b/doc/id3lib-manual.php
@@ -0,0 +1,1029 @@
+<?php
+$subsection=0;
+
+function printHeader($string) {
+ global $subsection;
+ echo "<FONT SIZE=\"+";
+ echo 3-$subsection ;
+ echo "\">$string</FONT>\n";
+ echo "<P>";
+ $subsection++;
+ return;
+}
+
+function startSection() {
+ $subsection++;
+ echo "<OL>\n";
+}
+
+function endSection() {
+ global $subsection;
+ echo "</OL>\n";
+ echo "<P>\n";
+ $subsection--;
+}
+
+function startCode() {
+ global $subsection;
+
+/*
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="0" CELLPADDING="3"><TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">navigator</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial">
+*/
+
+ echo "<TABLE WIDTH=\"";
+ echo 100-(($subsection+1)*5);
+ echo "%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\"><TR><TD BGCOLOR=\"000000\" align=center>";
+ echo "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"1\" CELLPADDING=\"3\"><TR><TD BGCOLOR=\"b0b0b0\">\n";
+ echo "<TT><PRE>";
+}
+
+function endCode() {
+ global $subsection;
+ echo "</PRE></TT>\n";
+ echo "</TD></TR></TABLE>";
+ echo "</TD></TR></TABLE>\n";
+}
+
+?>
+<HEAD>
+<TITLE>Documentation for ID3Lib 3.05</TITLE>
+</HEAD>
+<BODY BGCOLOR="#ffffff">
+<CENTER>
+<FONT SIZE="+3">
+Documentation for<BR>
+ID3Lib 3.05<P>
+</FONT>
+
+<FONT SIZE="+1">
+Copyright Dirk Mahoney<BR>
+22 November 1998
+</FONT>
+</CENTER>
+
+<BLOCKQUOTE>
+ID3Lib is a C++ class library for manipulating ID3v2 tags. ID3Lib 3.05 conforms to all ID3v2 standards up to and including the ID3v2-3.0 informal standard.
+</BLOCKQUOTE>
+
+<P>
+<?php printHeader( "Introduction"); ?>
+<?php startSection() ?>
+ No intro. Let's go!
+<?php endSection() ?>
+
+<?php printHeader( "License Agreement"); ?>
+<?php startSection() ?>
+The authors have released ID3Lib as Public Domain (PD) and claim no copyright, patent or other intellectual property protection in this work. This means that it may be modified, redistributed and used in commercial and non-commercial software or hardware without restrictions. ID3Lib is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
+<P>
+The ID3Lib authors encourage improvements and optimisations to be sent to the ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org). Approved submissions may be altered, and will be included and released under these terms.
+<?php endSection() ?>
+
+<?php printHeader( "The ID3_Tag Class"); ?>
+<?php startSection() ?>
+<P>
+This is the "container" class for everything else. It is through an ID3_Tag object that most of the productive stuff happens. Let's look at what's required to start using ID3v2 tags.
+
+<?php startCode(); ?>
+#include "id3_tag.h"
+<?php endCode(); ?>
+
+This simple #include does it all. In order to read an existing tag
+
+<?php startCode(); ?>
+ID3_Tag myTag;
+
+myTag.Link ( "something.mp3" );
+<?php endCode(); ?>
+
+That is all there is to it. Now all you have to do is use the ::Find() member function to locate the frames you are interested in:
+
+<?php startCode(); ?>
+ID3_Frame *myFrame;
+
+if ( myFrame = myTag.Find ( ID3FID_TITLE ) )
+{
+ char title[ 1024 ];
+
+ myFrame->Field ( ID3FN_TEXT ).Get ( title, 1024 );
+
+ cout << "Title: " << title << endl;
+}
+<?php endCode(); ?>
+
+This code snippet locates the TITLE frame and copies the contents of the text field into a buffer and displays the buffer. Not difficult eh?
+
+When using the ::Link() facility of an ID3_Tag object, you automatically gain access to any ID3v1/1.1, ID3v2 and Lyrics3 v2.0 tags present in the file. The class will automatically parse and convert any of these foreign tag formats into ID3v2 tags. Also, ID3Lib will correctly parse any correctly formatted 'CDM' frames from the unreleased 2.01 draft that ID3Lib 2.16 supports.
+<P>
+Okay, let's analyse the ID3_Tag class function-by-function to see what an application can do with it.
+<P>
+<?php printHeader( "The ID3_Tag Constructor"); ?>
+<?php startSection() ?>
+The ID3_Tag constructor can be called without any parameters. Alternatively, it can accept a single parameter that is a pointer to a file name. If this file exists, it will be opened and all ID3Lib-supported tags will be parsed and converted to ID3v2 if necessary. After the conversion, the file will remain unchanged, and will continue to do so until you use the ID3_Tag::Update() function on the tag (if you choose to ID3_Tag::Update() at all). This will be discussed later.
+<?php endSection() ?>
+
+<?php printHeader( "ID3_Tag::Clear()"); ?>
+<?php startSection() ?>
+This function takes no parameters and simply clears the object and disassociates it from any files. It frees any resources for which the object is responsible, and the object is now free to be used again for any new or existing tag.
+<?php endSection() ?>
+
+<?php printHeader( "ID3_Tag::HasChanged()"); ?>
+<?php startSection() ?>
+This function takes no parameters but returns a boolean indicating whether the tag has been altered since the last parse, render or update. If you have a tag linked to a file, you do not need this function since the ID3_Tag::Update() function will check for changes before writing the tag.
+<P>
+This function is primarily intended as a status indicator for applications and for applications that use the ID3_Tag::Parse() and ID3_Tag::Render() functions.
+<P>
+Setting a field, changing the ID of an attached frame, setting or changing grouping or encryption IDs and clearing a frame or field all constitute a change to the tag, as do calls to the ID3_Tag::SetUnsync(), ID3_Tag::SetExtendedHeader() and ID3_Tag::SetPadding() and ID3_Tag::SetCompression() functions.
+
+<?php startCode(); ?>
+if ( myTag.HasChanged() )
+{
+ // render and output the tag
+ ...
+}
+<?php endCode(); ?>
+<?php endSection() ?>
+
+<?php printHeader( "ID3_Tag::SetVersion()"); ?>
+<?php startSection(); ?>
+This function has been removed from 3.05. ID3Lib will now always create tags using the latest version of the standard.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::SetUnsync()"); ?>
+<?php startSection(); ?>
+This call takes a single boolean parameter and tells the object whether you wish the resulting binary tag to be unsynchronised if unsync is required. If you call this function with 'false' as the parameter, the binary tag will not be unsync'ed, regardless of whether the tag should be. This option is useful when the file is only going to be used by ID3v2-compliant software. See the ID3v2 standard document for further details on unsync.
+<P>
+By default, tags are created without unsync.
+
+<?php startCode(); ?>
+myTag.SetUnsync ( false );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::SetExtendedHeader()"); ?>
+<?php startSection(); ?>
+This function tells the tag whether to create an extended header when rendering the tag. This option is currently ignored as ID3Lib doesn't yet create extended headers. This option only applies when rendering tags for ID3v2 versions that support extended headers.
+<P>
+By default, ID3Lib will generate extended headers for all tags in which extended headers are supported.
+
+<?php startCode(); ?>
+myTag.SetExtendedHeader ( true );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::SetCompression()"); ?>
+<?php startSection(); ?>
+Under ID3v2-3.0, there is support for the compression of data in tags. The current standard defines compression on a frame-by-frame basis using the zlib data compression standard. Using this call, you tell the object whether to attempt to compress frames or not. If a frame doesn't compress well, it will not be compressed, regardless of this setting. This function takes a single boolean parameter. By default, ID3Lib will attempt to compress all the frames in a tag.
+
+<?php startCode(); ?>
+myTag.SetCompression ( true );
+<?php endCode(); ?>
+
+When creating tags for a version of ID3v2 in which compression isn't defined, the tags are simply rendered without compression to ensure compliance to the relevant version of the standard.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::SetPadding()"); ?>
+<?php startSection(); ?>
+When using ID3v2 tags in association with files, ID3Lib can optionally add padding to the tags to ensure minimal file write times when updating the tag in the future.
+<P>
+When the padding option is switched on, ID3Lib automatically creates padding according the 'ID3v2 Programming Guidelines'. Specifically, enough padding will be added to round out the entire file (song plus tag) to an even multiple of 2K. Padding will only be created when the tag is attached to a file and that file is not empty (aside from a pre-existing tag).
+<P>
+My own addition to the guidelines for padding, and that which ID3Lib follows is that if frames are removed from a pre-existing tag (or the tag simply shrinks because of other reasons), the new tag will continue to stay the same size as the old tag (with padding making the difference of course) until such time as the padding is greater than 4K. When this happens, the padding will be reduced and the new tag will be smaller than the old.
+<P>
+By default, padding is switched on.
+<P>
+<?php startCode(); ?>
+myTag.SetPadding ( false );
+<?php endCode(); ?>
+
+An alternate form of the SetPadding() function has been removed from 3.05.
+
+<?php startCode(); ?>
+myTag.SetPadding ( true ); // switch padding on
+myTag.SetPadding ( 1024 ); // add 1K of padding
+<?php endCode(); ?>
+
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::SetFileSize()"); ?>
+<?php startSection(); ?>
+This function has been removed from 3.05.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::AddFrame() and operator<<()"); ?>
+<?php startSection(); ?>
+To attach a frame object (see later) to a tag object, you can use the ID3_Tag::AddFrame() function or the << operator. To use the ID3_Tag::AddFrame() function, simply supply as it's sole parameter a pointer to the ID3_Frame object you wish to attach. Even though the 'id3_tag.h' file says that ID3_Tag::AddFrame also takes a boolean parameter, this parameter is for internal use only – do not use it.
+<P>
+<?php startCode(); ?>
+ID3_Frame myFrame;
+myTag.AddFrame ( &myFrame );
+<?php endCode(); ?>
+
+Alternatively, use the << operator to attach a frame to a tag. The << operator supports the addition of a pointer to a frame object, or the frame object itself.
+
+<?php startCode(); ?>
+ID3_Frame *framePoint, frameObj;
+myTag << framePoint;
+myTag << frameObj;
+<?php endCode(); ?>
+
+Both these functions simply attach the frames to the tag – the tag does not create it's own copy of the frame. Frames created by an application must exist until the frame is removed or the tag is finished with.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::AddFrames()"); ?>
+<?php startSection(); ?>
+This function takes a pointer to an array of ID3_Frame objects and a number that specifies the number of objects in the array. ID3Lib will then go and add all the frames to the tag. Even though the 'id3_tag.h' file says that ID3_Tag::AddFrames also takes a boolean parameter, this parameter is for internal use only – do not use it.
+
+<?php startCode(); ?>
+ID3_Frame myFrame[ 10 ];
+myTag.AddFrames ( myFrame, 10 );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::RemoveFrame()"); ?>
+<?php StartSection(); ?>
+If you wish to remove a frame from a tag, use this function. If you already own the frame object in question, then you should already have a pointer to the frame you want to delete. If not, or if you wish to delete a pre-existing frame (from a tag you have parsed, for example), then use one of the ID3_Tag::Find() functions to obtain a frame pointer to pass to this function.
+
+<?php startCode(); ?>
+ID3_Frame *someFrame;
+
+if ( ( someFrame = myTag.Find ( ID3FID_TITLE ) )
+ myTag.RemoveFrame ( someFrame );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::Size()"); ?>
+<?php startSection(); ?>
+This function returns an over estimate of the number of bytes required to store a binary version of a tag. When using ID3_Tag::Render() to render a binary tag to a memory buffer, first use the result of this call to allocate a buffer of unsigned chars.
+
+<?php startCode(); ?>
+luint tagSize;
+uchar *buffer;
+
+if ( myTag.HasChanged() )
+{
+ if ( ( tagSize = myTag.Size() ) > 0 )
+ {
+ if ( buffer = new uchar[ tagSize ] )
+ {
+ luint actualSize;
+
+ actualSize = myTag.Render ( buffer );
+
+ // do something useful with the first
+ // 'actualSize' bytes of the buffer,
+ // like push it down a socket
+ ...
+
+ delete[] buffer;
+ }
+ }
+}
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::Render()"); ?>
+<?php startSection(); ?>
+This renders a binary image of the tag into the supplied buffer. See ID3_Tag::Size() for an example. This function returns the actual number of the bytes of the buffer used to store the tag. This will be less that the size of the buffer itself, because ID3_Tag::Size() over estimates the required buffer size.
+<P>
+Before calling this function, it is advisable to call ID3_Tag::HasChanged() first as this will let you know whether you should bother rendering the tag.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_IsTagHeader()"); ?>
+<?php startSection(); ?>
+This function isn't a member of the ID3_Tag class, but is presented here because it is used before the actual ID3_Tag::Parse() function when parsing a tag from a memory buffer.
+<P>
+When you are scanning a stream for a tag, you should pass ID3_TAGHEADERSIZE bytes of unsigned chars into this function and it will return the number of extra bytes to read in order to obtain the rest of the tag. If the supplied ID3_TAGHEADERSIZE bytes don't constitute a valid ID3v2 tag header, this function will return –1.
+<P>
+Use this function only if you are using ID3_Tag::Parse()/Render() instead of ID3_Tag::Link()/Update().
+
+<?php startCode(); ?>
+uchar buffer[ ID3_TAGHEADERSIZE ];
+
+// get ID3_TAGHEADERSIZE bytes from a socket or somewhere
+...
+
+luint tagSize;
+
+if ( ( tagSize = ID3_IsTagHeader ( buffer ) ) > -1 )
+{
+ // read a further 'tagSize' bytes in
+ // from our data source
+ ...
+
+ // now we will call ID3_Tag::Parse()
+ // with these values (explained later)
+ ...
+}
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "ID3_Tag::Parse()") ?>
+<?php startSection(); ?>
+This will turn a binary tag into a series of ID3_Frame objects attached to the specified tag. This function takes two parameters, the first is the ID3_TAGHEADERSIZE byte header you read in from your data source. The second is a pointer to an unsigned char buffer which is the rest of the tag (not including the header) you read from the data source.
+
+<?php startCode(); ?>
+ID3_Tag myTag;
+uchar header[ ID3_TAGHEADERSIZE ];
+uchar *buffer;
+luint tagSize;
+
+// get ID3_TAGHEADERSIZE from a socket or somewhere
+...
+
+if ( ( tagSize = ID3_IsTagHeader ( ourSourceBuffer ) ) > -1 )
+{
+ // read a further 'tagSize' bytes in
+ // from our data source
+ ...
+
+ if ( buffer = new uchar[ tagSize ] )
+ {
+ // now we will call ID3_Tag::Parse()
+ // with these values (explained later)
+ myTag.Parse ( header, buffer );
+
+ // do something with the objects,
+ // like look for titles, artists etc
+ ...
+
+ // free the buffer
+ delete[] buffer;
+ }
+}
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::Link()");; ?>
+<?php startSection(); ?>
+If you created your ID3_Tag object without supplying a parameter to the constructor (maybe you create an array of ID3_Tag pointers), you can use this function to attach the tag to a file. This is the preferred method of interacting with files, since ID3Lib can automatically do things like parse foreign tag formats and handle padding when linked to a file. When a tag is linked to a file, you do not need to use the ::Size(), ::Render(), ::Parse() or ID3_IsTagHeader() functions – ID3Lib will take care of all that stuff for you. The single parameter is a pointer to a file name.
+<P>
+Link() returns a 'luint' which is the byte position within the file that the audio starts (ie. where the ID3v2 tag ends).
+
+<?php startCode(); ?>
+ID3_Tag *myTag;
+
+if ( myTag = new ID3_Tag )
+{
+ myTag->Link ( "mysong.mp3" );
+
+ // do whatever we want with the tag
+ ...
+
+ // setup all our rendering parameters
+ myTag->SetUnsync ( false );
+ myTag->SetExtendedHeader ( true );
+ myTag->SetCompression ( true );
+ myTag->SetPadding ( true );
+
+ // write any changes to the file
+ myTag->Update();
+
+ // free the tag
+ delete myTag;
+}
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "ID3_Tag::Update()");; ?>
+<?php startSection(); ?>
+This little function takes no parameters, returns no results and simply renders the tag and writes it to the file to which this tag is attached. Make sure you setup your rendering parameters (including version number) before calling this function. See ID3_Tag::Link() for an example of this function.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::Strip()");; ?>
+<?php startSection(); ?>
+This function takes no parameters and returns no results. When attached to a file, this function will strip any ID3v2 tag from the file. If you supply a 'true' boolean parameter then this tells the tag to strip any ID3v1/1.1 and Lyrics3 v2.0 tags from the file as well.
+<?php startCode(); ?>
+myTag.Strip()
+myTag.Strip ( true );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::Find()");; ?>
+<?php startSection(); ?>
+This function takes a required ID3_FrameID parameter that specifies the ID of the frame you wish to locate. If present in the tag, the first such frame will be returned as a pointer to an ID3_Frame object. If no frame is found, this returns NULL. If there are multiple frames in the tag with the same ID (which, for some frames, is allowed), then subsequent calls to ::Find() will return subsequent frame pointers, until it wraps around again.
+
+<?php startCode(); ?>
+ID3_Frame *myFrame;
+
+if ( myFrame = myTag.Find ( ID3FID_TITLE ) )
+{
+ // do something with the frame, like copy
+ // the contents into a buffer, display the
+ // contents in a window etc
+ ...
+}
+<?php endCode(); ?>
+
+You may optionally supply two more parameters to this function, being an ID3_FieldID and a value of some sort. Depending on the field name/ID you supply, you may supply an integer, a char * or a wchar_t * as the third parameter. If you supply an ID3_FrameID, you must also supply a data value to compare with.
+<P>
+This function will then return the first frame that has a matching frame ID, and which has a field with the same name as that which you supplied in the second parameter, whose value matches that which you supplied as the third parameter. For example:
+
+<?php startCode(); ?>
+ID3_Frame *myFrame;
+
+if ( myFrame = myTag.Find ( ID3FID_TITLE, ID3FN_TEXT, "Nirvana" ) )
+{
+ // found it, do something with it
+ ...
+}
+<?php endCode(); ?>
+
+This example with return the first frame that is a TITLE frame and whose TEXT field is 'Nirvana'. I emphasis 'is' because currently there is no provision for things like 'contains', 'greater than' or 'less than'. If there happens to be more than one of these frames, subsequent calls to the ::Find() function will return subsequent frames and will wrap around to the beginning.
+<P>
+Another example:
+
+<?php startCode(); ?>
+ID3_Frame *myFrame;
+
+if ( myFrame = myTag.Find ( ID3FID_COMMENT, ID3FN_TEXTENC, (luint) ID3TE_UNICODE ) )
+{
+ // do something
+ ...
+}
+
+<?php endCode(); ?>
+This returns the first COMMENT frame that uses Unicode as it's text encoding.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::NumFrames()");; ?>
+<?php startSection(); ?>
+This returns the number of frames present in the tag object. This includes only those frames that ID3Lib recognises. This is used as the upper bound on calls to the ID3_Tag::GetFrame() and operator[] functions.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Tag::GetFrameNum() and operator[]");; ?>
+<?php startSection(); ?>
+In 3.04 and earlier, this function was called ::GetFrame().
+<P>
+These return pointers to the given frame number, or NULL if the specified frame number doesn't exist. Numbering starts at 0 (that is, the first frame is number 0, and the last frame in a tag that holds 34 frames is 33).
+<P>
+If you wish to have a more complex searching facility, then at least for now, you will have to devise it yourself and implement it using these functions.
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "The ID3_Frame Class");; ?>
+<?php startSection(); ?>
+
+ID3Lib defines frames in a funny way. Using some nice C++ conventions, ID3_Frame class objects appear to be quite polymorphic, that is, they can take on many forms. The same ID3_Frame class provides the facilities for the implementation of a complex APIC frame and for a simple text frame. Here's how to use an ID3_Frame object:
+<P>
+<?php printHeader( "The ID3_Frame Constructor");; ?>
+<?php startSection(); ?>
+The optional parameter to the ID3_Frame constructor is of the type ID3_FrameID, which will internally set the frame's structure. See ID3_Frame::SetID() for more details.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Frame::Clear()");; ?>
+<?php startSection(); ?>
+Like it's ID3_Tag counterpart, ID3_Frame::Clear() takes no parameters and returns nothing. It just clears the frame of all data and resets the frame such that it can take on the form of any ID3v2 frame that ID3Lib supports.
+<?php endSection(); ?>
+
+
+<?php printHeader( "ID3_Frame::SetID()");; ?>
+<?php startSection(); ?>
+This function sets up the internal structure of an ID3_Frame object so that it represents any ID3v2 frame that ID3Lib supports. Given an ID3_FrameID (a list of which is found in 'id3_field.h'), ::SetID() will structure the object according to the frame you wish to implement.
+<P>
+Either using this call or via the constructor, this must be the first command performed on an ID3_Frame object.
+<?php startCode(); ?>
+myFrame.SetID ( ID3FID_TITLE );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Frame::GetID()");; ?>
+<?php startSection(); ?>
+Useful in conjunction with the ID3_Tag::GetFrame() function, this function returns the type of frame that the object represents, just so you know what to expect.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Frame::Field()");; ?>
+<?php startSection(); ?>
+This is a go-between function that returns a pointer to one of the frame's internal fields. A list of fields that are in given frames appears in 'id3_field.cpp'. This function returns a reference to the field in question, so that the result can be used as though it were a field itself:
+
+<?php startCode(); ?>
+ID3_TextEnc enc;
+enc = (ID3_TextEnc) myFrame.Field ( ID3FN_TEXTENC ).Get();
+<?php endCode(); ?>
+
+As far as frames go, that's all there is. The next step is to find out how to manipulate the fields contained in the frames.
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "The ID3_Field Class");; ?>
+<?php startSection(); ?>
+As a general rule, you need never create an object of this type. ID3Lib uses them internally as part of the ID3_Frame class. You must know how to interact with these objects though, and that's what this section is about.
+<P>
+The ID3_Field contains many overloaded functions to provide these facilities for four different data types.
+<P>
+As a general implementation note, you should be prepared to support all fields in an ID3Lib frame, even if all fields in the ID3Lib version of the frame aren't present in the ID3v2 version. This is because of frames like the picture frame, which changed slightly from one version of the ID3v2 standard to the next (the IMAGEFORMAT field in 2.0 changed to a MIMETYPE in 3.0). If you support all ID3Lib fields in a given frame, ID3Lib can generate the correct ID3v2 frame for the ID3v2 version you wish to support. Alternatively, just support the fields you know will be used in, say, 3.0 if you only plan to generate 3.0 tags.
+<P>
+<?php printHeader( "ID3_Field::Clear()");; ?>
+<?php startSection(); ?>
+Regardless of the type of field, this function will clear any data and free any memory associated with the field. This function takes no parameters and returns no results.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::Size()");; ?>
+<?php startSection(); ?>
+This function returns the size of a field.
+<P>
+The value returned is dependent on the type of the field. For ASCII strings, this returns the number of characters in the field, not including any NULL-terminator. The same holds true for Unicode – it returns the number of characters in the field, not bytes and this does not include the Unicode BOM, which isn't put in a Unicode string obtained by the ::Get() function anyway. For binary and integer fields, this returns the number of bytes in the field.
+
+<?php startCode(); ?>
+luint howBig;
+howBig = myFrame.Field ( ID3FN_DATA ).Size();
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "Integer Fields");; ?>
+<?php startSection(); ?>
+This next bit talks about the ID3_Field class as it relates to integers only.
+<P>
+<?php printHeader( "ID3_Field::Set()");; ?>
+<?php startSection(); ?>
+This function takes a single parameter that is an integer. It sets the value of this field to the specified integer.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_PICTURETYPE ).Set ( 0x0B );
+ID3_Field::Get()
+<?php endCode(); ?>
+
+Taking no parameters, this function returns the value of the integer field.
+
+<?php startCode(); ?>
+luint picType;
+picType = myFrame.Field ( ID3FN_PICTURETYPE ).Get();
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::operator=()"); ?>
+<?php startSection(); ?>
+
+This functions as you would expect.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_PICTURETYPE ) = 0x0B;
+<?php endCode(); ?>
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "General String Fields"); ?>
+<?php startSection(); ?>
+<?php printHeader( "ID3_Field::GetNumTextItems()");; ?>
+<?php startSection(); ?>
+In 3.04 and earlier, this function was called ::GetNumItems().
+<P>
+This function returns the number of items in a text list. The numbering of items in the list begins at one (1).
+<?php startCode(); ?>
+luint numItems;
+numItems = myFrame.Field ( ID3FN_TEXT ).GetNumItems();
+<?php endCode(); ?>
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ASCII String Fields"); ?>
+<?php startSection(); ?>
+This next bit talks about ID3_Field objects in reference to ASCII strings.
+<P>
+<?php printHeader( "ID3_Field::Set()");; ?>
+<?php startSection(); ?>
+This function takes a single parameter that is a pointer to an ASCII string. It copies the supplied string (as opposed to simply keeping a pointer to it), so you may dispose of the source string after a call to this function.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_TEXT ).Set ( "ID3Lib is very cool!" );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::operator=()");; ?>
+<?php startSection(); ?>
+This functions much as you would expect;
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_TEXT ) = "ID3Lib is very cool!";
+<?php endCode(); ?>
+
+Like ID3_Field::Set(), this function copies the supplied string.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::Add()");; ?>
+<?php startSection(); ?>
+This adds a string to the list of strings currently in the field. This useful for using ID3v2 frames such as the involved people list, composer and part of set. You can use the ID3_Field::GetNumItems() to find out how many such items are in a list.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_TEXT ).Add ( "this is a test" );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::Get()");; ?>
+<?php startSection(); ?>
+This takes a pointer to a char buffer and an integer that says how big (in characters) the supplied buffer is. Optionally as the third parameter is the item number you wish to retrieve. This is useful when using text lists (see ID3_Field::Add() for more details). The default value for this third parameter is 1, which returns the entire string if the field contains only one item.
+<P>
+It returns the number of characters (not bytes necessarily, and not including any NULL terminator) of the supplied buffer that are now used.
+
+<?php startCode(); ?>
+char myBuffer[ 1024 ];
+luint charsUsed;
+
+charUsed = myFrame.Field ( ID3FN_TEXT ).Get ( buffer, 1024 );
+<?php endCode(); ?>
+
+It fills the buffer with as much data from the field as is present in the field, or as large as the buffer, whichever is smaller.
+
+<?php startCode(); ?>
+char myBuffer[ 1024 ];
+luint charsUsed;
+
+charUsed = myFrame.Field ( ID3FN_TEXT ).Get ( buffer, 1024, 3 );
+<?php endCode(); ?>
+
+This fills the buffer with up to the first 1024 characters from the third element of the text list.
+<?php endSection(); ?>
+<?php endSection();; ?>
+
+
+
+<?php printHeader( "Unicode String Fields"); ?>
+<?php startSection(); ?>
+Without elaborating, the Unicode functions behave exactly as it's ASCII counterparts, taking wchar_t pointers in place of char pointers. The ::Get() function still takes a max size in characters (not bytes).
+
+<?php startCode(); ?>
+wchar_t buffer[ 1024 ];
+char charsUsed;
+
+charsUsed = myFrame.Field ( ID3FN_TEXT ).Get ( buffer, 1024 );
+<?php endCode(); ?>
+
+All strings in ID3Lib are handled internally as Unicode. This means that when you set a field with an ASCII source type, it will be converted and stored internally as a Unicode string. ID3Lib will handle all necessary conversions when parsing, rendering and ::Get()ing. If you set a field as an ASCII string, then try to read the string into a wchar_t buffer, ID3Lib will automatically convert the string into Unicode so this will function as expected. The same holds true in reverse.
+<P>
+Of course, when converting from Unicode to ASCII, you will experience problems when the Unicode string contains characters that don't map to ISO-8859-1.
+<?php endSection(); ?>
+
+<?php printHeader( "Binary Fields"); ?>
+<?php startSection(); ?>
+The last type field that ID3Lib provides support for is a binary field. This holds miscellaneous data that can't be easily described any other way, such a JPEG image.
+<P>
+<?php printHeader( "ID3_Field::Set()");; ?>
+<?php startSection(); ?>
+This takes a pointer to an unsigned char buffer and an integer that specifies how big the data is in bytes. Again, like the string types, the binary ::Set() function copies the data so you may dispose of the source data after a call to this function.
+
+<?php startCode(); ?>
+uchar myBuffer[ 1024 ];
+myFrame.Field ( ID3FN_DATA ).Set ( myBuffer, 1024 );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::Get()");; ?>
+<?php startSection(); ?>
+This takes the same parameters as the ::Set function. It copies the data in the field into the buffer, for as many bytes as the field contains, or the size of buffer, whichever is smaller.
+
+<?php startCode(); ?>
+uchar buffer[ 1024 ];
+myFrame.Field ( ID3FN_DATA ).Get ( buffer, sizeof ( buffer ) );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::FromFile()");; ?>
+<?php startSection(); ?>
+Taking a single char pointer as a parameter, this function takes the data in the specified file and stores it in the field. The file may be deleted after a call to this function as the source data is copied into the field.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_DATA ).FromFile ( "mypic.jpg" );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Field::ToFile()");; ?>
+<?php startSection(); ?>
+The exact reverse of ::FromFile(), this function copies the data in the field to the specified file.
+
+<?php startCode(); ?>
+myFrame.Field ( ID3FN_DATA ).ToFile ( "output.bin" );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "The ID3_Error Class and ID3Lib Exceptions"); ?>
+<?php startSection(); ?>
+When ID3Lib encounters a nasty error, it throws an exception of type ID3_Error. A function that calls an ID3Lib routine can place the call in a try block and provide an appropriate catch block.
+
+<?php startCode(); ?>
+try
+{
+ // call some ID3Lib routine
+ ID3_Tag myTag ( "mySong.mp3" );
+ ID3_Frame *myFrame = NULL;
+
+ // this will generate an exception
+ myTag << myFrame;
+}
+
+catch ( ID3_Error err )
+{
+ // handle the error
+ ...
+}
+<?php endCode(); ?>
+
+Let's have a look at the error handling functions provided by the ID3_Error class.
+<P>
+<?php printHeader( "ID3_Error::GetErrorID()");; ?>
+<?php startSection(); ?>
+This function takes no parameters but returns an ID3_Err value, which represents the ID of the error that caused the exception.
+<?php endSection(); ?>
+
+
+<?php printHeader( "ID3_Error::GetErrorDesc()");; ?>
+<?php startSection(); ?>
+Again, this function takes no parameters but returns a character pointer that is an English string that describes the error.
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Error::GetErrorFile()");; ?>
+<?php startSection(); ?>
+This function returns a pointer to a string of characters that is the name of the ID3Lib source file that generated the exception. When submitting bug reports, it is useful to include this.
+
+<?php startCode(); ?>
+cout << "Exception in file '" << err.GetErrorFile() << "'" << endl;
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "ID3_Error::GetErrorLine()");; ?>
+<?php startSection(); ?>
+This function returns the line number in the ID3Lib source file that threw the exception.
+
+<?php startCode(); ?>
+cout << "Line # " << err.GetErrorLine() << endl;
+<?php endCode(); ?>
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "Known Bugs and Limitations");; ?>
+<?php startSection(); ?>
+Version 3.05 of ID3Lib has some known limitations:
+<P>
+
+<LI>Firstly, contrary to good programming ideas and contrary to the 'ID3v2 Programming Guidelines', ID3Lib will explode in a ball of brilliant blue frame if asked to parse an invalid ID3v2 tag. This will change.
+<LI>Incorrect handling of unknown frames. This means that when ID3Lib encounters an unknown frame, it is currently ignored. It is neither re-written to the tag when re-rendered nor are the file or tag alter frame flags observed.
+<LI>No support for the read-only frame flag. It is currently ignored – such frames can be altered at will.
+<LI>No support as yet for the verification of frames before rendering.
+<LI>Does not yet render 3.0 extended headers, although the function to select this is present but the setting is ignored for now.
+<LI>Does not yet parse 3.0 extended headers. They are quite adequately ignored and the rest of the tag is parsed correctly.
+<LI>ID3Lib currently has no direct support for things like the language and currency fields. It is up to the application to generate the data for these fields manually. Soon, ID3Lib will have these things assigned to IDs so that the applications programmer will not have to remember the ISO tables for the actual strings.
+<?php endSection(); ?>
+
+<?php printHeader( "Appendix A - Class Reference");; ?>
+<?php startSection(); ?>
+<?php printHeader( "Application Useable Definitions");; ?>
+<?php startSection(); ?>
+ID3Lib defines some preprocessor symbols that applications are free to use. They are used to identify the version and date of the ID3Lib that is currently being used. All these definitions are strings, defined in 'id3_version.h'.
+
+<?php startCode(); ?>
+ID3LIB_NAME defines the name of ID3Lib
+ID3LIB_VERSION defines which version of ID3Lib is being used (string)
+ID3LIB_VER defines which version of ID3Lib is being used (int)
+ID3LIB_REV defines which revision of ID3Lib is being used (int)
+ID3LIB_DATE the date which this version of ID3Lib was released
+ID3LIB_VERSTRING an amalgamation of most of the above
+<?php endCode(); ?>
+
+For example:
+
+<?php startCode(); ?>
+cout << "Using " << ID3LIB_VERSTRING << endl;
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "The ID3_Tag Class");; ?>
+<?php startSection(); ?>
+<?php startCode(); ?>
+lsint ID3_IsTagHeader ( uchar header[ ID3_TAGHEADERSIZE ] );
+
+ ID3_Tag ( char *fileName = NULL );
+void Clear ( void );
+bool HasChanged ( void );
+void SetUnsync ( bool newSync );
+void SetExtendedHeader ( bool ext );
+void SetCompression ( bool comp );
+void SetPadding ( bool pad );
+void SetPadding ( luint fixedPaddingSize );
+void AddFrame ( ID3_Frame *newFrame );
+void AddFrames
+( ID3_Frame *newFrames, luint numFrames, bool
+freeWhenDone = false );
+
+void RemoveFrame ( ID3_Frame *oldFrame );
+luint Size ( void );
+luint Render ( uchar *buffer );
+void Parse
+( uchar header[ ID3_TAGHEADERSIZE ], uchar *buffer );
+
+luint Link ( char *name );
+void Update ( void );
+void Strip ( bool v1Also = true );
+ID3_Frame *Find ( ID3_FrameID id );
+ID3_Frame *Find
+( ID3_FrameID id, ID3_FieldID fld, luint data );
+
+ID3_Frame *Find
+ ( ID3_FrameID id, ID3_FieldID fld, char *data );
+
+ID3_Frame *Find
+ ( ID3_FrameID id, ID3_FieldID fld, wchar_t *data );
+
+luint NumFrames ( void );
+ID3_Frame *GetFrameNum ( luint num );
+ID3_Frame *operator[] ( luint num );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+
+<?php printHeader( "The ID3_Frame Class");; ?>
+<?php startSection(); ?>
+<?php startCode(); ?>
+ID3_Frame ( ID3_FrameID id = ID3FID_NOFRAME );
+
+void Clear ( void );
+
+void SetID ( ID3_FrameID id );
+ID3_FrameID GetID ( void );
+
+ID3_Field& Field ( ID3_FieldID name );
+
+<?php endCode(); ?>
+<?php endSection(); ?>
+<?php printHeader( "The ID3_Field Class");; ?>
+<?php startSection(); ?>
+<?php startCode(); ?>
+void Clear ( void );
+luint Size ( void );
+luint GetNumTextItems ( void );
+
+// integer field functions
+ID3_Field& operator= ( luint newData );
+void Set ( luint newData );
+luint Get ( void );
+
+// Unicode string field functions
+ID3_Field& operator= ( wchar_t *string );
+void Set ( wchar_t *string );
+luint Get
+( wchar_t *buffer, luint maxChars, luint itemNum = 1 );
+
+void Add ( wchar_t *string );
+
+// ASCII string field functions
+ID3_Field& operator= ( char *string );
+void Set ( char *string );
+luint Get
+( wchar_t *buffer, luint maxChars, luint itemNum = 1 );
+
+void Add ( char *string );
+
+// binary field functions
+void Set ( uchar *newData, luint newSize );
+void Get ( uchar *buffer, luint buffLength );
+void FromFile ( char *fileName );
+void ToFile ( char *fileName );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "The ID3_Error Class");; ?>
+<?php startSection(); ?>
+<?php startCode(); ?>
+ID3_Err GetErrorID ( void );
+char *GetErrorDesc ( void );
+char *GetErrorFile ( void );
+luint GetErrorLine ( void );
+<?php endCode(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "The ID3Lib DLL (C-wrapper functions)");; ?>
+<?php startSection(); ?>
+<?php startCode(); ?>
+void ID3_GetVersionInfo ( ID3_VerInfo *info );
+
+lsint ID3_IsTagHeader ( uchar header[ ID3_TAGHEADERSIZE ] );
+
+ID3_Tag *ID3Tag_New ( void );
+void ID3Tag_Delete ( ID3_Tag *tag );
+void ID3Tag_Clear ( ID3_Tag *tag );
+bool ID3Tag_HasChanged ( ID3_Tag *tag );
+void ID3Tag_SetUnsync ( ID3_Tag *tag, bool unsync );
+void ID3Tag_SetExtendedHeader
+( ID3_Tag *tag, bool ext );
+
+void ID3Tag_SetCompression
+( ID3_Tag *tag, bool comp );
+
+void ID3Tag_SetPadding ( ID3_Tag *tag, bool pad );
+void ID3Tag_AddFrame ( ID3_Tag *tag, ID3_Frame *frame );
+void ID3Tag_AddFrames
+( ID3_Tag *tag, ID3_Frame *frames, luint num );
+
+void ID3Tag_RemoveFrame ( ID3_Tag *tag, ID3_Frame *frame );
+void ID3Tag_Parse
+( ID3_Tag *tag, uchar header[ ID3_TAGHEADERSIZE ],
+uchar *buffer );
+
+luint ID3Tag_Link ( ID3_Tag *tag, char *fileName );
+void ID3Tag_Update ( ID3_Tag *tag );
+void ID3Tag_Strip ( ID3_Tag *tag, bool v1Also );
+ID3_Frame *ID3Tag_FindFrameWithID
+ ( ID3_Tag *tag, ID3_FrameID id );
+
+ID3_Frame *ID3Tag_FindFrameWithINT
+( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld,
+luint data );
+
+ID3_Frame *ID3Tag_FindFrameWithASCII
+( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld,
+char *data );
+
+ID3_Frame *ID3Tag_FindFrameWithUNICODE
+( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld,
+wchar_t *data );
+
+luint ID3Tag_NumFrames ( ID3_Tag *tag );
+ID3_Frame *ID3Tag_GetFrameNum ( ID3_Tag *tag, luint num );
+
+void ID3Frame_Clear ( ID3_Frame *frame );
+void ID3Frame_SetID ( ID3_Frame *frame, ID3_FrameID id );
+ID3_FrameID ID3Frame_GetID ( ID3_Frame *frame );
+ID3_Field *ID3Frame_GetField ( ID3_Frame *frame, ID3_FieldID name );
+
+void ID3Field_Clear ( ID3_Field *field );
+luint ID3Field_Size ( ID3_Field *field );
+luint ID3Field_GetNumTextItems
+ ( ID3_Field *field );
+void ID3Field_SetINT ( ID3_Field *field, luint data );
+luint ID3Field_GetINT ( ID3_Field *field );
+void ID3Field_SetUNICODE ( ID3_Field *field, wchar_t *string );
+luint ID3Field_GetUNICODE
+( ID3_Field *field, wchar_t *buffer, luint maxChars,
+luint itemNum );
+
+void ID3Field_AddUNICODE ( ID3_Field *field, wchar_t *string );
+
+void ID3Field_SetASCII ( ID3_Field *field, char *string );
+luint ID3Field_GetASCII ( ID3_Field *field, char *buffer,
+luint maxChars, luint itemNum );
+
+void ID3Field_AddASCII ( ID3_Field *field, char *string );
+void ID3Field_SetBINARY
+ ( ID3_Field *field, uchar *data, luint size );
+
+void ID3Field_GetBINARY
+( ID3_Field *field, uchar *buffer, luint buffLength );
+
+void ID3Field_FromFile ( ID3_Field *field, char *fileName );
+void ID3Field_ToFile ( ID3_Field *field, char *fileName );
+<?php endCode(); ?>
+<?php endSection(); ?>
+<?php endSection(); ?>
+
+<?php printHeader( "Contact Information");; ?>
+<?php startSection(); ?>
+I can be contacted by e-mail at dirk@id3.org or on ICQ UIN 808 7113.
+<P>
+The ID3Lib mailing list is a general ID3Lib announcements list. To subscribe to it, send an e-mail message to dirk@id3.org with ID3LibSub as the subject and the automatic newsletter software will add you to the list. Same again but with ID3LibUnsub as the subject will remove you from the list.
+<P>
+When you subscribe, please include a brief message about why you are subscribing. If you are writing software, tell me what you are writing and what platforms you will support. If ID3Lib is lacking in a certain area, I can look to see who is doing what and can ask for advice and ideas from the appropriate people.
+<?php endSection(); ?>
+
+<?php printHeader( "Special Thanks and Credits");; ?>
+<?php startSection(); ?>
+I would like to extend my many thanks to the people who have contributed to the ID3Lib project. The show of support has been tremendous. I consider ID3Lib to be a very 'international' product, as contributions have come from almost literally every corner of the globe. If I have missed you, please forgive my lapse of memory.
+
+<UL>
+<LI>Jean-loup Gailly and Mark Adler – for their great zlib compression library and for making it free.
+<LI>Tord Jansson – for much help with teaching me how to make and use DLLs.
+<LI>Slava Karpenko – for creating the MacOS static link libraries for the PowerPC and CodeWarrior.
+<LI>Bob Kohn – for his advice, input and generally creating the ID3Lib licence agreement.
+<LI>Eng-Keong Lee – for finding a few bugs and for extensively testing ID3Lib 2.xx.
+<LI>James Lin – for his 'ID3v2 Programming Guidelines', and many helpful suggestions.
+<LI>Michael Mutschler – for prompting me to write the Unicode support and for his input on the ID3Lib calling convention.
+<LI>Martin Nilsson – for ID3v2, his support of the ID3Lib web page, for many, many suggestions, debates, pointers, URLs, documents and brightly coloured fish.
+<LI>Chris Nunn – for the 3D animated ID3v2 logos which appear in the ID3Lib web page and in the distribution.
+<LI>Lachlan Pitts – for general implementation ideas and his brief but helpful work on the up-coming genre tree.
+<LI>Jukka Poikolainen – for prompting to implement error handling via the C++ exception handling mechanism instead of the old 2.xx-style of using an error handling function. Also for compiling the Borland static link libraries and greatly helping with the DLL.
+<LI>Carlos Puchol – for his help with some minor Linux compilation hassles.
+<LI>Andreas Sigfridsson – for his initial code for the unsync/resync support and for his very valuable input in long brainstorming sessions.
+<LI>Michael Robertson – for helping support ID3Lib by posting announcements on MP3.com.
+<LI>Ilana Rudnik – for bug finding and suggestions.
+<LI>Chuck Zenkus – for his support of ID3v2 and ID3Lib by providing us with a mirror in the United States and for his bug finding and suggestions.
+</UL>
+<P>
+And last but by no means least, all the others who support ID3Lib by subscribing to the mailing list and to the contributors to the discussions and debates in the ID3v2 discussion group.
+<P>
+Without the help of all these people, ID3Lib would not be as good as it is, and I dare say might not even exist if they all weren't around to provide motivation to continue to write the thing!
+<P>
+- Dirk Mahoney<BR>
+22 November 1998<BR>
+Brisbane, Australia
+<?php endSection(); ?>
+
+
+
+
+
+</BODY>
+</HTML>
diff --git a/doc/id3lib.css b/doc/id3lib.css
new file mode 100644
index 0000000..369c1aa
--- /dev/null
+++ b/doc/id3lib.css
@@ -0,0 +1,28 @@
+/** $Id: id3lib.css,v 1.1 2000/04/17 04:55:04 eldamitri Exp $
+ **/
+
+body, p, h2, b, a, ol, ul {font-family: Arial, Helvetica, sans-serif;}
+body { background-color: white; }
+pre {font-family: monospace; font-size: small;}
+h1 { text-align: center; font-size: x-large; }
+h2 { font-size: large; font-weight: bold; }
+h3 { font-size: large; }
+a {color: #DD6600; text-decoration: none;}
+A.qindex {}
+A.qindexRef {}
+A.el { text-decoration: none; font-weight: bold; }
+A.elRef { font-weight: bold; }
+A.code { text-decoration: none; font-weight: normal; /*color: #4444ee;*/ }
+A.codeRef { font-weight: normal; color: #4444ee; }
+DL.el { margin-left: -1cm; }
+DIV.fragment { width: 100%; border: none; background-color: #eeeeee; }
+DIV.in { margin-left: 16; }
+DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3; }
+TD.md { background-color: #f2f2ff; }
+DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold; }
+DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller; }
+td.h1 {font: 43px Arial, Helvetica;}
+td.h2 {font: 27px Arial, Helvetica;}
+div.h5 {font: 14px Arial, Helvetica;}
+td {font: 14px Arial, Helvetica;}
+b {font-weight: bold;}
diff --git a/doc/id3v2.3.0.html b/doc/id3v2.3.0.html
new file mode 100644
index 0000000..2aee39d
--- /dev/null
+++ b/doc/id3v2.3.0.html
@@ -0,0 +1,2257 @@
+<html><head><title>ID3v2 - Informal standard</title>
+<style type="text/css">
+body {font: 16px times}
+h1 {font: 34px times}
+h3 {font: 20px times; margin-left: 5%}
+div.h5 {font: 16px times; font-weight: bold; margin-left: 8%}
+div.t {margin-left: 10%; margin-right: 10%}
+p.t {margin-left: 10%; margin-right: 10%}
+p.ind {margin-left: 15%; margin-right: 15%}
+pre {font: 16px times}
+pre {margin-left: 40px}
+a {font: 15px arial, helvetica; color: #CC5500; text-decoration: none}
+</style>
+<META name="description" content="ID3v2 informal standard.">
+<META name="keywords" content="ID3v2">
+</head><body bgcolor=white text=black>
+
+<a name="top"> </a>
+
+<br>&nbsp;
+<p><table border=0 width=100%><tr><td>Informal standard<br>Document: id3v2.3.0.html</td><td align=right>
+M. Nilsson<br>3rd February 1999</td></tr></table></p>
+
+<h1 align=center>ID3 tag version 2.3.0</h1>
+
+<a name="status"> </a>
+<h3>Status of this document</h3>
+<p class=t>
+This document is an informal standard and replaces the <a href="#ID3v2">ID3v2.2.0</a>
+standard. The informal standard is released so that
+implementors could have a set standard before a formal standard is
+set. The formal standard will use another version or revision number
+if not identical to what is described in this document. The contents
+in this document may change for clarifications but never for added or
+altered functionallity.
+</p><p class=t>
+Distribution of this document is unlimited.
+</p>
+
+<a name="abstract"> </a>
+<h3>Abstract</h3>
+<p class=t>
+This document describes the <a href="#ID3v2">ID3v2.3.0</a>, which is a more developed
+version of the ID3v2 informal standard (version 2.2.0),
+evolved from the ID3 tagging system. The ID3v2 offers a flexible way
+of storing information about an audio file within itself to determine
+its origin and contents. The information may be technical
+information, such as equalisation curves, as well as related meta
+information, such as title, performer, copyright etc.
+</p>
+
+<a name="sec1"> </a>
+<h3>1.Table of contents</h3>
+
+<p><center><table border=0 width="80%"><tr><td>
+<dl>
+<dt>2. <a href="#sec2">Conventions in this document</a></dt>
+<dt>3. <a href="#sec3">ID3v2 overview</a>
+ <dd> 3.1. <a href="#sec3.1">ID3v2 header</a></dd>
+ <dd> 3.2. <a href="#sec3.2">ID3v2 extended header</a></dd>
+ <dd> 3.3. <a href="#sec3.3">ID3v2 frames overview</a></dd>
+ <dl><dd> 3.3.1. <a href="#sec3.3.1">Frame header flags</a></dd>
+ <dd> 3.3.2. <a href="#sec3.3.2">Default flags</a></dd></dl></dt>
+<dt>4. <a href="#sec4">Declared ID3v2 frames</a>
+ <dd> 4.1. <a href="#sec4.1">Unique file identifier</a></dd>
+ <dd> 4.2. <a href="#sec4.2">Text information frames</a>
+ <dl><dd> 4.2.1. <a href="#sec4.2.1">Text information frames - details</a></dd>
+ <dd> 4.2.2. <a href="#sec4.2.2">User defined text information frame</a></dd></dl></dd>
+ <dd> 4.3. <a href="#sec4.3">URL link frames</a>
+ <dl><dd>4.3.1. <a href="#sec4.3.1">URL link frames - details</a></dd>
+ <dd>4.3.2. <a href="#sec4.3.2">User defined URL link frame</a></dd></dl></dd>
+ <dd> 4.4. <a href="#sec4.4">Involved people list</a></dd>
+ <dd> 4.5. <a href="#sec4.5">Music CD Identifier</a></dd>
+ <dd> 4.6. <a href="#sec4.6">Event timing codes</a></dd>
+ <dd> 4.7. <a href="#sec4.7">MPEG location lookup table</a></dd>
+ <dd> 4.8. <a href="#sec4.8">Synced tempo codes</a></dd>
+ <dd> 4.9. <a href="#sec4.9">Unsychronised lyrics/text transcription</a></dd>
+ <dd> 4.10. <a href="#sec4.10">Synchronised lyrics/text</a></dd>
+ <dd> 4.11. <a href="#sec4.11">Comments</a></dd>
+ <dd> 4.12. <a href="#sec4.12">Relative volume adjustment</a></dd>
+ <dd> 4.13. <a href="#sec4.13">Equalisation</a></dd>
+ <dd> 4.14. <a href="#sec4.14">Reverb</a></dd>
+ <dd> 4.15. <a href="#sec4.15">Attached picture</a></dd>
+ <dd> 4.16. <a href="#sec4.16">General encapsulated object</a></dd>
+ <dd> 4.17. <a href="#sec4.17">Play counter</a></dd>
+ <dd> 4.18. <a href="#sec4.18">Popularimeter</a></dd>
+ <dd> 4.19. <a href="#sec4.19">Recommended buffer size</a></dd>
+ <dd> 4.20. <a href="#sec4.20">Audio encryption</a></dd>
+ <dd> 4.21. <a href="#sec4.21">Linked information</a></dd>
+ <dd> 4.22. <a href="#sec4.22">Position synchronisation frame</a></dd>
+ <dd> 4.23. <a href="#sec4.23">Terms of use</a></dd>
+ <dd> 4.24. <a href="#sec4.24">Ownership frame</a></dd>
+ <dd> 4.25. <a href="#sec4.25">Commercial frame</a></dd>
+ <dd> 4.26. <a href="#sec4.26">Encryption method registration</a></dd>
+ <dd> 4.27. <a href="#sec4.27">Group identification registration</a></dd>
+ <dd> 4.28. <a href="#sec4.28">Private frame</a></dd></dt>
+<dt>5. <a href="#sec5">The 'unsynchronisation scheme'</a></dt>
+<dt>6. <a href="#sec6">Copyright</a></dt>
+<dt>7. <a href="#sec7">References</a></dt>
+<dt>8. <a href="#sec8">Appendix</a>
+ <dd> A. <a href="#secA">Appendix A - Genre List from ID3v1</a></dd></dt>
+<dt>9. <a href="#sec9">Author's Address</a></dt>
+</dl>
+</td></tr></table></center></p>
+
+<a name="sec2"> </a>
+<h3>2.Conventions in this document</h3>
+<p class=t>
+In the examples, text within "" is a text string exactly as it
+appears in a file. Numbers preceded with $ are hexadecimal and
+numbers preceded with % are binary. $xx is used to indicate a byte
+with unknown content. %x is used to indicate a bit with unknown
+content. The most significant bit (MSB) of a byte is called 'bit 7'
+and the least significant bit (LSB) is called 'bit 0'.
+</p><p class=t>
+A tag is the whole tag described in this document. A frame is a block
+of information in the tag. The tag consists of a header, frames and
+optional padding. A field is a piece of information; one value, a
+string etc. A numeric string is a string that consists of the
+characters 0-9 only.
+</p>
+
+<a name="sec3"> </a>
+<h3>3.ID3v2 overview</h3>
+<p class=t>
+The two biggest design goals were to be able to implement ID3v2
+without disturbing old software too much and that ID3v2 should be
+as flexible and expandable as possible.
+</p><p class=t>
+The first criterion is met by the simple fact that the <a href="#MPEG">MPEG</a>
+decoding software uses a syncsignal, embedded in the audiostream, to
+'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid
+syncsignal, no software will attempt to play the tag. If, for any
+reason, coincidence make a syncsignal appear within the tag it will
+be taken care of by the 'unsynchronisation scheme' described in
+<a href="#sec5">section 5</a>.
+</p><p class=t>
+The second criterion has made a more noticeable impact on the design
+of the ID3v2 tag. It is constructed as a container for several
+information blocks, called frames, whose format need not be known to
+the software that encounters them. At the start of every frame there
+is an identifier that explains the frames' format and content, and a
+size descriptor that allows software to skip unknown frames.
+</p><p class=t>
+If a total revision of the ID3v2 tag should be needed, there is a
+version number and a size descriptor in the ID3v2 header.
+</p><p class=t>
+The ID3 tag described in this document is mainly targeted at files
+encoded with <a href="#MPEG">MPEG</a>-1/2 layer I, <a href="#MPEG">MPEG</a>-1/2 layer II, <a href="#MPEG">MPEG</a>-1/2 layer III
+and MPEG-2.5, but may work with other types of encoded audio.
+</p><p class=t>
+The bitorder in ID3v2 is most significant bit first (MSB). The
+byteorder in multibyte numbers is most significant byte first (e.g.
+$12345678 would be encoded $12 34 56 78).
+</p><p class=t>
+It is permitted to include padding after all the final frame (at the
+end of the ID3 tag), making the size of all the frames together
+smaller than the size given in the head of the tag. A possible
+purpose of this padding is to allow for adding a few additional
+frames or enlarge existing frames within the tag without having to
+rewrite the entire file. The value of the padding bytes must be $00.
+</p>
+
+<a name="sec3.1"> </a>
+<h3>3.1.ID3v2 header</h3>
+<p class=t>
+The ID3v2 tag header, which should be the first information in the
+file, is 10 bytes as follows:
+</p>
+<p><center><table border=0 width="70%">
+<tr><td nowrap>ID3v2/file identifier</td><td rowspan=4>&nbsp;</td><td width="100%">"ID3"</td></tr>
+<tr><td>ID3v2 version</td><td>$03 00</td></tr>
+<tr><td>ID3v2 flags</td><td>%abc00000</td></tr>
+<tr><td>ID3v2 size</td><td>4 * %0xxxxxxx</td></tr>
+</table></center></p>
+<p class=t>
+The first three bytes of the tag are always "ID3" to indicate that
+this is an ID3v2 tag, directly followed by the two version bytes. The
+first byte of ID3v2 version is it's major version, while the second
+byte is its revision number. In this case this is ID3v2.3.0. All
+revisions are backwards compatible while major versions are not. If
+software with ID3v2.2.0 and below support should encounter version
+three or higher it should simply ignore the whole tag. Version and
+revision will never be $FF.
+</p><p class=t>
+The version is followed by one the ID3v2 flags field, of which
+currently only three flags are used.
+</p>
+<p class=t>
+a - Unsynchronisation
+</p><p class=ind>
+Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see <a href="#sec5">section 5</a> for details); a set bit indicates usage.</p>
+<p class=t>
+b - Extended header
+</p><p class=ind>
+ The second bit (bit 6) indicates whether or not the header is
+ followed by an extended header. The extended header is described in
+ <a href="#sec3.2">section 3.2</a>.
+</p>
+<p class=t>
+c - Experimental indicator
+</p><p class=ind>
+ The third bit (bit 5) should be used as an 'experimental
+ indicator'. This flag should always be set when the tag is in an
+ experimental stage.
+</p><p class=t>
+All the other flags should be cleared. If one of these undefined
+flags are set that might mean that the tag is not readable for a
+parser that does not know the flags function.
+</p><p class=t>
+The ID3v2 tag size is encoded with four bytes where the most
+significant bit (bit 7) is set to zero in every byte, making a total
+of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is
+represented as $00 00 02 01.
+</p><p class=t>
+The ID3v2 tag size is the size of the complete tag after
+unsychronisation, including padding, excluding the header but not
+excluding the extended header (total tag size - 10). Only 28 bits
+(representing up to 256MB) are used in the size description to avoid
+the introducuction of 'false syncsignals'.
+</p><p class=t>
+An ID3v2 tag can be detected with the following pattern:<br>
+ $49 44 33 yy yy xx zz zz zz zz<br>
+Where yy is less than $FF, xx is the 'flags' byte and zz is less than
+$80.
+</p>
+
+<a name="sec3.2"> </a>
+<h3>3.2.ID3v2 extended header</h3>
+<p class=t>
+The extended header contains information that is not vital to the
+correct parsing of the tag information, hence the extended header is
+optional.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td nowrap> Extended header size</td><td rowspan=3>&nbsp;</td><td width=100%>$xx xx xx xx</td></tr>
+<tr><td>Extended Flags</td><td>$xx xx</td></tr>
+<tr><td>Size of padding</td><td>$xx xx xx xx</tr>
+</table></center></p>
+<p class=t>
+Where the 'Extended header size', currently 6 or 10 bytes, excludes
+itself. The 'Size of padding' is simply the total tag size excluding
+the frames and the headers, in other words the padding. The extended
+header is considered separate from the header proper, and as such is
+subject to unsynchronisation.
+</p><p class=t>
+The extended flags are a secondary flag set which describes further
+attributes of the tag. These attributes are currently defined as
+follows
+</p><p class=ind>
+ %x0000000 00000000
+</p>
+<p class=t>
+x - CRC data present
+</p><p class=ind>
+ If this flag is set four bytes of CRC-32 data is appended to the
+ extended header. The CRC should be calculated before
+ unsynchronisation on the data between the extended header and the
+ padding, i.e. the frames and only the frames.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td nowrap> Total frame CRC</td><td>&nbsp;</td><td>$xx xx xx xx</td></tr>
+</table></center></p>
+
+
+<a name="sec3.3"> </a>
+<h3>3.3.ID3v2 frame overview</h3>
+<p class=t>
+As the tag consists of a tag header and a tag body with one or more
+frames, all the frames consists of a frame header followed by one or
+more fields containing the actual information. The layout of the
+frame header:
+</p>
+<p><center><table border=0 width="70%">
+<tr><td nowrap> Frame ID</td><td rowspan=3>&nbsp;</td><td width="100%">$xx xx xx xx (four characters)</td></tr>
+<tr><td>Size</td><td>$xx xx xx xx</td></tr>
+<tr><td>Flags</td><td>$xx xx</td></tr>
+</table></center></p>
+<p class=t>
+The frame ID made out of the characters capital A-Z and 0-9.
+Identifiers beginning with "X", "Y" and "Z" are for experimental use
+and free for everyone to use, without the need to set the
+experimental bit in the tag header. Have in mind that someone else
+might have used the same identifier as you. All other identifiers are
+either used or reserved for future use.
+</p><p class=t>
+The frame ID is followed by a size descriptor, making a total header
+size of ten bytes in every frame. The size is calculated as frame
+size excluding frame header (frame size - 10).
+</p><p class=t>
+In the frame header the size descriptor is followed by two flags
+bytes. These flags are described in <a href="#sec3.3.1">section 3.3.1.</a>
+</p><p class=t>
+There is no fixed order of the frames' appearance in the tag,
+although it is desired that the frames are arranged in order of
+significance concerning the recognition of the file. An example of
+such order: <a href="#sec4.1">UFID</a>, <a href="#TIT2">TIT2</a>, <a href="#sec4.5">MCDI</a>, <a href="#TRCK">TRCK</a> ...
+</p><p class=t>
+A tag must contain at least one frame. A frame must be at least 1
+byte big, excluding the header.
+</p><p class=t>
+If nothing else is said a string is represented as
+<a href="#ISO-8859-1">ISO-8859-1</a> characters in the range $20 - $FF. Such strings are
+represented as &lt;text string&gt;, or &lt;full text string&gt; if newlines are
+allowed, in the frame descriptions. All <a href="#UNICODE">Unicode</a> strings use
+16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings
+must begin with the Unicode BOM ($FF FE or $FE FF) to identify the
+byte order.
+</p><p class=t>
+All numeric strings and <a href="#URL">URLs</a> are always encoded as <a href="#ISO-8859-1">ISO-8859-1</a>.
+Terminated strings are terminated with $00 if encoded with <a href="#ISO-8859-1">ISO-8859-1</a>
+and $00 00 if encoded as unicode. If nothing else is said newline
+character is forbidden. In <a href="#ISO-8859-1">ISO-8859-1</a> a new line is represented, when
+allowed, with $0A only. Frames that allow different types of text
+encoding have a text encoding description byte directly after the
+frame size. If <a href="#ISO-8859-1">ISO-8859-1</a> is used this byte should be $00, if Unicode
+is used it should be $01. Strings dependent on encoding is
+represented as &lt;text string according to encoding&gt;, or &lt;full text
+string according to encoding&gt; if newlines are allowed. Any empty
+<a href="#UNICODE">Unicode</a> strings which are NULL-terminated may have the Unicode BOM
+followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00).
+</p><p class=t>
+The three byte language field is used to describe the language of the
+frame's content, according to <a href="#ISO-639-2">ISO-639-2</a>.
+</p><p class=t>
+All <a href="#URL">URLs</a> may be relative, e.g. "picture.png", "../doc.txt".
+</p><p class=t>
+If a frame is longer than it should be, e.g. having more fields than
+specified in this document, that indicates that additions to the
+frame have been made in a later version of the ID3v2 standard. This
+is reflected by the revision number in the header of the tag.
+</p>
+
+<a name="sec3.3.1"> </a>
+<h3>3.3.1.Frame header flags</h3>
+<p class=t>
+In the frame header the size descriptor is followed by two flags
+bytes. All unused flags must be cleared. The first byte is for
+'status messages' and the second byte is for encoding purposes. If an
+unknown flag is set in the first byte the frame may not be changed
+without the bit cleared. If an unknown flag is set in the second byte
+it is likely to not be readable. The flags field is defined as
+follows.
+</p><p class=ind>
+ %abc00000 %ijk00000
+</p>
+<p class=t>
+a - Tag alter preservation
+</p><p class=ind>
+ This flag tells the software what to do with this frame if it is
+ unknown and the tag is altered in any way. This applies to all
+ kinds of alterations, including adding more padding and reordering
+ the frames.</p>
+<p><center><table border=0 width="70%">
+<tr><td>0&nbsp;</td><td>Frame should be preserved.</td></tr>
+<tr><td>1</td><td>Frame should be discarded.</td></tr>
+</table></center>
+</p>
+<p class=t>
+b - File alter preservation
+</p><p class=ind>
+ This flag tells the software what to do with this frame if it is
+ unknown and the file, excluding the tag, is altered. This does not
+ apply when the audio is completely replaced with other audio data.</p>
+<p><center><table border=0 width="70%">
+<tr><td>0&nbsp;</td><td>Frame should be preserved.</td></tr>
+<tr><td>1</td><td>Frame should be discarded.</td></tr>
+</table></center>
+</p>
+<p class=t>
+c - Read only
+</p><p class=ind>
+This flag, if set, tells the software that the contents of this
+frame is intended to be read only. Changing the contents might
+break something, e.g. a signature. If the contents are changed,
+without knowledge in why the frame was flagged read only and
+without taking the proper means to compensate, e.g. recalculating
+the signature, the bit should be cleared.
+</p>
+<p class=t>
+i - Compression
+</p>
+<p class=ind>This flag indicates whether or not the frame is compressed.</p>
+<p><center><table border=0 width="70%">
+<tr><td>0&nbsp;</td><td>Frame is not compressed.</td></tr>
+<tr><td>1</td><td>Frame is compressed using <a href="#ZLIB">zlib</a> with 4 bytes for 'decompressed size' appended to the frame header.</td></tr>
+</table></center>
+</p>
+<p class=t>
+j - Encryption
+</p><p class=ind>
+This flag indicates wether or not the frame is enrypted. If set
+one byte indicating with which method it was encrypted will be
+appended to the frame header. See <a href="#sec4.26">section 4.26.</a> for more
+information about encryption method registration.
+</p><p><center><table border=0 width="70%">
+<tr><td>0&nbsp;</td><td>Frame is not encrypted.</td></tr>
+<tr><td>1</td><td>Frame is encrypted.</td></tr>
+</table></center>
+</p>
+<p class=t>
+k - Grouping identity
+</p><p class=ind>
+This flag indicates whether or not this frame belongs in a group
+with other frames. If set a group identifier byte is added to the
+frame header. Every frame with the same group identifier belongs
+to the same group.
+</p><p><center><table border=0 width="70%">
+<tr><td>0&nbsp;</td><td>Frame does not contain group information</td></tr>
+<tr><td>1</td><td>Frame contains group information</td></tr>
+</table></center>
+</p>
+<p class=t>
+Some flags indicates that the frame header is extended with
+additional information. This information will be added to the frame
+header in the same order as the flags indicating the additions. I.e.
+the four bytes of decompressed size will preceed the encryption
+method byte. These additions to the frame header, while not included
+in the frame header size but are included in the 'frame size' field,
+are not subject to encryption or compression.
+</p>
+
+<a name="sec3.3.2"> </a>
+<h3>3.3.2.Default flags</h3>
+<p class=t>
+The default settings for the frames described in this document can be
+divided into the following classes. The flags may be set differently
+if found more suitable by the software.
+</p><p class=t>
+ 1. Discarded if tag is altered, discarded if file is altered.
+</p><p class=ind>
+ None.
+</p><p class=t>
+ 2. Discarded if tag is altered, preserved if file is altered.
+</p><p class=ind>
+ None.
+</p><p class=t>
+ 3. Preserved if tag is altered, discarded if file is altered.
+</p><p class=ind>
+ <a href="#sec4.21>AENC</a>, <a href="#sec4.6">ETCO</a>, <a href="#sec4.13">EQUA</a>, <a href="#sec4.7">MLLT</a>, <a href="#sec4.22">POSS</a>, <a href="#4.10">SYLT</a>, <a href="#sec4.8">SYTC</a>, <a href="#4.12">RVAD</a>, <a href="#TENC">TENC</a>, <a href="#TLEN">TLEN</a>, <a href="#TSIZ">TSIZ</a>
+</p><p class=t>
+ 4. Preserved if tag is altered, preserved if file is altered.
+</p><p class=ind>
+ The rest of the frames.
+</p>
+
+<a name="sec4"> </a>
+<h3>4.Declared ID3v2 frames</h3>
+</p><p class=t>
+The following frames are declared in this draft.
+</p><p><center><table border=0 width="70%">
+<tr><td>4.20</td><td>AENC</td><td width="100%"><a href="#sec4.20"> Audio encryption</a></td></tr>
+<tr><td>4.15</td><td>APIC</td><td><a href="#sec4.15">Attached picture</a></td></tr>
+
+<tr><td>4.11</td><td>COMM</td><td><a href="#sec4.11">Comments</a></td></tr>
+<tr><td>4.25</td><td>COMR</td><td><a href="#sec4.25">Commercial frame</a></td></tr>
+
+<tr><td>4.26</td><td>ENCR</td><td><a href="#sec4.26">Encryption method registration</a></td></tr>
+<tr><td>4.13</td><td>EQUA</td><td><a href="#sec4.13">Equalization</a></td></tr>
+<tr><td>4.6 </td><td>ETCO</td><td><a href="#sec4.6">Event timing codes</a></td></tr>
+
+<tr><td>4.16</td><td>GEOB</td><td><a href="#sec4.16">General encapsulated object</a></td></tr>
+<tr><td>4.27</td><td>GRID</td><td><a href="#sec4.27">Group identification registration</a></td></tr>
+
+<tr><td>4.4 </td><td>IPLS</td><td><a href="#sec4.4">Involved people list</a></td></tr>
+
+<tr><td>4.21</td><td>LINK</td><td><a href="#sec4.21">Linked information</a></td></tr>
+
+<tr><td>4.5 </td><td>MCDI</td><td><a href="#sec4.5">Music CD identifier</a></td></tr>
+<tr><td>4.7 </td><td>MLLT</td><td><a href="#sec4.7">MPEG location lookup table</a></td></tr>
+
+<tr><td>4.24</td><td>OWNE</td><td><a href="#sec4.24">Ownership frame</a></td></tr>
+
+<tr><td>4.28</td><td>PRIV</td><td><a href="#sec4.28">Private frame</a></td></tr>
+<tr><td>4.17</td><td>PCNT</td><td><a href="#sec4.17">Play counter</a></td></tr>
+<tr><td>4.18</td><td>POPM</td><td><a href="#sec4.18">Popularimeter</a></td></tr>
+<tr><td>4.22</td><td>POSS</td><td><a href="#sec4.22">Position synchronisation frame</a></td></tr>
+
+<tr><td>4.19</td><td>RBUF</td><td><a href="#sec4.19">Recommended buffer size</a></td></tr>
+<tr><td>4.12</td><td>RVAD</td><td><a href="#sec4.12">Relative volume adjustment</a></td></tr>
+<tr><td>4.14</td><td>RVRB</td><td><a href="#sec4.14">Reverb</a></td></tr>
+
+<tr><td>4.10</td><td>SYLT</td><td><a href="#sec4.10">Synchronized lyric/text</a></td></tr>
+<tr><td>4.8 </td><td>SYTC</td><td><a href="#sec4.8">Synchronized tempo codes</a></td></tr>
+
+<tr><td>4.2.1</td><td>TALB</td><td><a href="#TALB">Album/Movie/Show title</a></td></tr>
+<tr><td>4.2.1</td><td>TBPM</td><td><a href="#TBPM">BPM (beats per minute)</a></td></tr>
+<tr><td>4.2.1</td><td>TCOM</td><td><a href="#TCOM">Composer</a></td></tr>
+<tr><td>4.2.1</td><td>TCON</td><td><a href="#TCON">Content type</a></td></tr>
+<tr><td>4.2.1</td><td>TCOP</td><td><a href="#TCOP">Copyright message</a></td></tr>
+<tr><td>4.2.1</td><td>TDAT</td><td><a href="#TDAT">Date</a></td></tr>
+<tr><td>4.2.1</td><td>TDLY</td><td><a href="#TDLY">Playlist delay</a></td></tr>
+<tr><td>4.2.1</td><td>TENC</td><td><a href="#TENC">Encoded by</a></td></tr>
+<tr><td>4.2.1</td><td>TEXT</td><td><a href="#TEXT">Lyricist/Text writer</a></td></tr>
+<tr><td>4.2.1</td><td>TFLT</td><td><a href="#TFLT">File type</a></td></tr>
+<tr><td>4.2.1</td><td>TIME</td><td><a href="#TIME">Time</a></td></tr>
+<tr><td>4.2.1</td><td>TIT1</td><td><a href="#TIT1">Content group description</a></td></tr>
+<tr><td>4.2.1</td><td>TIT2</td><td><a href="#TIT2">Title/songname/content description</a></td></tr>
+<tr><td>4.2.1</td><td>TIT3</td><td><a href="#TIT3">Subtitle/Description refinement</a></td></tr>
+<tr><td>4.2.1</td><td>TKEY</td><td><a href="#TKEY">Initial key</a></td></tr>
+<tr><td>4.2.1</td><td>TLAN</td><td><a href="#TLAN">Language(s)</a></td></tr>
+<tr><td>4.2.1</td><td>TLEN</td><td><a href="#TLEN">Length</a></td></tr>
+<tr><td>4.2.1</td><td>TMED</td><td><a href="#TMED">Media type</a></td></tr>
+<tr><td>4.2.1</td><td>TOAL</td><td><a href="#TOAL">Original album/movie/show title</a></td></tr>
+<tr><td>4.2.1</td><td>TOFN</td><td><a href="#TOFN">Original filename</a></td></tr>
+<tr><td>4.2.1</td><td>TOLY</td><td><a href="#TOLY">Original lyricist(s)/text writer(s)</a></td></tr>
+<tr><td>4.2.1</td><td>TOPE</td><td><a href="#TOPE">Original artist(s)/performer(s)</a></td></tr>
+<tr><td>4.2.1</td><td>TORY</td><td><a href="#TORY">Original release year</a></td></tr>
+<tr><td>4.2.1</td><td>TOWN</td><td><a href="#TOWN">File owner/licensee</a></td></tr>
+<tr><td>4.2.1</td><td>TPE1</td><td><a href="#TPE1">Lead performer(s)/Soloist(s)</a></td></tr>
+<tr><td>4.2.1</td><td>TPE2</td><td><a href="#TPE2">Band/orchestra/accompaniment</a></td></tr>
+<tr><td>4.2.1</td><td>TPE3</td><td><a href="#TPE3">Conductor/performer refinement</a></td></tr>
+<tr><td>4.2.1</td><td>TPE4</td><td><a href="#TPE4">Interpreted, remixed, or otherwise modified by</a></td></tr>
+<tr><td>4.2.1</td><td>TPOS</td><td><a href="#TPOS">Part of a set</a></td></tr>
+<tr><td>4.2.1</td><td>TPUB</td><td><a href="#TPUB">Publisher</a></td></tr>
+<tr><td>4.2.1</td><td>TRCK</td><td><a href="#TRCK">Track number/Position in set</a></td></tr>
+<tr><td>4.2.1</td><td>TRDA</td><td><a href="#TRDA">Recording dates</a></td></tr>
+<tr><td>4.2.1</td><td>TRSN</td><td><a href="#TRSN">Internet radio station name</a></td></tr>
+<tr><td>4.2.1</td><td>TRSO</td><td><a href="#TRSO">Internet radio station owner</a></td></tr>
+<tr><td>4.2.1</td><td>TSIZ</td><td><a href="#TSIZ">Size</a></td></tr>
+<tr><td>4.2.1</td><td>TSRC</td><td><a href="#TSRC">ISRC (international standard recording code)</a></td></tr>
+<tr><td>4.2.1</td><td>TSSE</td><td><a href="#TSSE">Software/Hardware and settings used for encoding</a></td></tr>
+<tr><td>4.2.1</td><td>TYER</td><td><a href="#TYER">Year</a></td></tr>
+<tr><td>4.2.2</td><td>TXXX</td><td><a href="#TXXX">User defined text information frame</a></td></tr>
+
+<tr><td>4.1 </td><td>UFID</td><td><a href="#sec4.1">Unique file identifier</td></tr>
+<tr><td>4.23</td><td>USER</td><td><a href="#sec4.23">Terms of use</td></tr>
+<tr><td>4.9 </td><td>USLT</td><td><a href="#sec4.9">Unsychronized lyric/text transcription</td></tr>
+
+<tr><td>4.3.1</td><td>WCOM</td><td><a href="#WCOM">Commercial information</a></td></tr>
+<tr><td>4.3.1</td><td>WCOP</td><td><a href="#WCOP">Copyright/Legal information</a></td></tr>
+<tr><td>4.3.1</td><td>WOAF</td><td><a href="#WOAF">Official audio file webpage</a></td></tr>
+<tr><td>4.3.1</td><td>WOAR</td><td><a href="#WOAR">Official artist/performer webpage</a></td></tr>
+<tr><td>4.3.1</td><td>WOAS</td><td><a href="#WOAS">Official audio source webpage</a></td></tr>
+<tr><td>4.3.1</td><td>WORS</td><td><a href="#WORS">Official internet radio station homepage</a></td></tr>
+<tr><td>4.3.1</td><td>WPAY</td><td><a href="#WPAY">Payment</a></td></tr>
+<tr><td>4.3.1</td><td>WPUB</td><td><a href="#WPUB">Publishers official webpage</a></td></tr>
+<tr><td>4.3.2</td><td>WXXX</td><td><a href="#WXXX">User defined URL link frame</a></td></tr>
+</table></center>
+</p>
+
+<a name="sec4.1"> </a>
+<h3>4.1.Unique file identifier</h3>
+<p class=t>
+This frame's purpose is to be able to identify the audio file in a
+database that may contain more information relevant to the content.
+Since standardisation of such a database is beyond this document, all
+frames begin with a null-terminated string with a <a href="#URL">URL</a>
+containing an email address, or a link to a location where an email
+address can be found, that belongs to the organisation responsible
+for this specific database implementation. Questions regarding the
+database should be sent to the indicated email address. The <a href="#URL">URL</a>
+should not be used for the actual database queries. The string
+"http://www.id3.org/dummy/ufid.html" should be used for tests.
+Software that isn't told otherwise may safely remove such frames. The
+'Owner identifier' must be non-empty (more than just a termination).
+The 'Owner identifier' is then followed by the actual identifier,
+which may be up to 64 bytes. There may be more than one "UFID" frame
+in a tag, but only one with the same 'Owner identifier'.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Unique file identifier', ID: "UFID"&gt;</td></tr>
+<tr><td>Owner identifier</td><td width="80%">&lt;text string&gt; $00</td></tr>
+<tr><td>Identifier</td><td>&lt;up to 64 bytes binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.2"> </a>
+<h3>4.2.Text information frames</h3>
+<p class=t>
+The text information frames are the most important frames, containing
+information like artist, album and more. There may only be one text
+information frame of its kind in an tag. If the textstring is
+followed by a termination ($00 (00)) all the following information
+should be ignored and not be displayed. All text frame identifiers
+begin with "T". Only text frame identifiers begin with "T", with the
+exception of the "<a href="#sec4.2.2">TXXX</a>" frame. All the text information frames have
+the following format:
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Text information frame', ID: "T000" - "TZZZ", excluding "TXXX" described in 4.2.2.&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>Information </td><td>&lt;text string according to encoding&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.2.1"> </a>
+<h3>4.2.1.Text information frames - details</h3>
+<p>
+<a name="TALB"> </a>
+<div class=h5>TALB</div>
+<div class=t>
+The 'Album/Movie/Show title' frame is intended for the title of the
+recording(/source of sound) which the audio in the file is taken
+from.
+</div>
+</p>
+
+<p>
+<a name="TBPM"> </a>
+<div class=h5>TBPM</div>
+<div class=t>The 'BPM' frame contains the number of beats per minute in the
+mainpart of the audio. The BPM is an integer and represented as a
+numerical string.</div>
+</p>
+
+<p>
+<a name="TCOM"> </a>
+<div class=h5>TCOM</div>
+<div class=t>The 'Composer(s)' frame is intended for the name of the composer(s).
+They are seperated with the "/" character.</div>
+</p>
+
+<p>
+<a name="TCON"> </a>
+<div class=h5>TCON</div>
+<div class=t>The 'Content type', which previously was
+stored as a one byte numeric value only, is now a numeric string. You
+may use one or several of the types as ID3v1.1 did or, since the
+category list would be impossible to maintain with accurate and up to
+date categories, define your own.
+</div></p>
+<p><div class=t>
+References to the ID3v1 genres can be made by, as first byte, enter
+"(" followed by a number from the genres list (<a href="#secA">appendix A</a>) and
+ended with a ")" character. This is optionally followed by a
+refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be
+made in the same frame, e.g. "(51)(39)". If the refinement should
+begin with a "(" character it should be replaced with "((", e.g. "((I
+can figure out any genre)" or "(55)((I think...)". The following new
+content types is defined in ID3v2 and is implemented in the same way
+as the numerig content types, e.g. "(RX)".</div>
+</p>
+<p><center><table border=0 width="70%">
+<tr><td>RX</td><td width="100%">Remix</td></tr>
+<tr><td>CR</td><td>Cover</td></tr>
+</table></center>
+</p>
+
+<p>
+<a name="TCOP"> </a>
+<div class=h5>TCOP</div>
+<div class=t>The 'Copyright message' frame, which must begin with a year and a
+space character (making five characters), is intended for the
+copyright holder of the original sound, not the audio file itself.
+The absence of this frame means only that the copyright information
+is unavailable or has been removed, and must not be interpreted to
+mean that the sound is public domain. Every time this field is
+displayed the field must be preceded with "Copyright &copy; ".</div>
+</p>
+
+<p>
+<a name="TDAT"> </a>
+<div class=h5>TDAT</div>
+<div class=t>The 'Date' frame is a numeric string in the DDMM format containing
+the date for the recording. This field is always four characters
+long.</div>
+</p>
+
+<p>
+<a name="TDLY"> </a>
+<div class=h5>TDLY</div>
+<div class=t>The 'Playlist delay' defines the numbers of milliseconds of silence
+between every song in a playlist. The player should use the "ETC"
+frame, if present, to skip initial silence and silence at the end of
+the audio to match the 'Playlist delay' time. The time is represented
+as a numeric string.</div>
+</p>
+
+<p>
+<a name="TENC"> </a>
+<div class=h5>TENC</div>
+<div class=t>The 'Encoded by' frame contains the name of the person or
+organisation that encoded the audio file. This field may contain a
+copyright message, if the audio file also is copyrighted by the
+encoder.</div>
+</p>
+
+<p>
+<a name="TEXT"> </a>
+<div class=h5>TEXT</div>
+<div class=t>The 'Lyricist(s)/Text writer(s)' frame is intended for the writer(s)
+of the text or lyrics in the recording. They are seperated with the
+"/" character.</div>
+</p>
+
+<p>
+<a name="TFLT"> </a>
+<div class=h5>TFLT</div>
+<div class=t>The 'File type' frame indicates which type of audio this tag defines.
+The following type and refinements are defined:
+</div></p>
+<p><center><table border=0 width="70%">
+<tr><td>MPG</td><td rowspan=8>&nbsp;</td><td width="100%">MPEG Audio</td></tr>
+<tr><td align=right>/1</td><td>MPEG 1/2 layer I</td></tr>
+<tr><td align=right>/2</td><td>MPEG 1/2 layer II</td></tr>
+<tr><td align=right>/3</td><td>MPEG 1/2 layer III</td></tr>
+<tr><td align=right>/2.5</td><td>MPEG 2.5</td></tr>
+<tr><td align=right>&nbsp;/AAC</td><td>Advanced audio compression</td></tr>
+<tr><td>VQF</td><td>Transform-domain Weighted Interleave Vector Quantization</td></tr>
+<tr><td>PCM</td><td>Pulse Code Modulated audio</td></tr>
+</table></center></p>
+<p><div class=t>
+but other types may be used, not for these types though. This is used
+in a similar way to the predefined types in the "TMED" frame, but
+without parentheses. If this frame is not present audio type is
+assumed to be "MPG".</div>
+</p>
+
+<p>
+<a name="TIME"> </a>
+<div class=h5>TIME</div>
+<div class=t>The 'Time' frame is a numeric string in the HHMM format containing
+the time for the recording. This field is always four characters
+long.</div>
+</p>
+
+<p>
+<a name="TIT1"> </a>
+<div class=h5>TIT1</div>
+<div class=t>The 'Content group description' frame is used if the sound belongs to
+a larger category of sounds/music. For example, classical music is
+often sorted in different musical sections (e.g. "Piano Concerto",
+"Weather - Hurricane").</div>
+</p>
+
+<p>
+<a name="TIT2"> </a>
+<div class=h5>TIT2</div>
+<div class=t>The 'Title/Songname/Content description' frame is the actual name of
+the piece (e.g. "Adagio", "Hurricane Donna").</div>
+</p>
+
+<p>
+<a name="TIT3"> </a>
+<div class=h5>TIT3</div>
+<div class=t>The 'Subtitle/Description refinement' frame is used for information
+directly related to the contents title (e.g. "Op. 16" or "Performed
+live at Wembley").</div>
+</p>
+
+<p>
+<a name="TKEY"> </a>
+<div class=h5>TKEY</div>
+<div class=t>The 'Initial key' frame contains the musical key in which the sound
+starts. It is represented as a string with a maximum length of three
+characters. The ground keys are represented with "A","B","C","D","E",
+"F" and "G" and halfkeys represented with "b" and "#". Minor is
+represented as "m". Example "Cbm". Off key is represented with an "o"
+only.</div>
+</p>
+
+<p>
+<a name="TLAN"> </a>
+<div class=h5>TLAN</div>
+<div class=t>The 'Language(s)' frame should contain the languages of the text or
+lyrics spoken or sung in the audio. The language is represented with
+three characters according to <a href="#ISO-639-2">ISO-639-2</a>. If more than one language is
+used in the text their language codes should follow according to
+their usage.</div>
+</p>
+
+<p>
+<a name="TLEN"> </a>
+<div class=h5>TLEN</div>
+<div class=t>The 'Length' frame contains the length of the audiofile in
+milliseconds, represented as a numeric string.</div>
+</p>
+
+<p>
+<a name="TMED"> </a>
+<div class=h5>TMED</div>
+<div class=t>The 'Media type' frame describes from which media the sound
+originated. This may be a text string or a reference to the
+predefined media types found in the list below. References are made
+within "(" and ")" and are optionally followed by a text refinement,
+e.g. "(MC) with four channels". If a text refinement should begin
+with a "(" character it should be replaced with "((" in the same way
+as in the "TCO" frame. Predefined refinements is appended after the
+media type, e.g. "(CD/A)" or "(VID/PAL/VHS)".</div>
+</p>
+<p><center><table border=0 width="70%">
+<tr><td>DIG</td><td rowspan=67>&nbsp;</td><td width="100%">Other digital media</td></tr>
+<tr valign=top><td align=right>/A<br>&nbsp;</td><td>Analog transfer from media</td></tr>
+
+<tr><td>ANA</td><td>Other analog media</td></tr>
+<tr><td align=right>/WAC</td><td>Wax cylinder</td></tr>
+<tr valign=top><td align=right>/8CA<br>&nbsp;</td><td>8-track tape cassette</td></tr>
+
+<tr><td>CD</td><td>CD</td></tr>
+<tr><td align=right>/A</td><td>Analog transfer from media</td></tr>
+<tr><td align=right>/DD</td><td>DDD</td></tr>
+<tr><td align=right>/AD</td><td>ADD</td></tr>
+<tr valign=top><td align=right>/AA<br>&nbsp;</td><td>AAD</td></tr>
+
+<tr><td>LD</td><td>Laserdisc</td></tr>
+<tr valign=top><td align=right>/A<br>&nbsp;</td><td>Analog transfer from media</td></tr>
+
+<tr><td>TT</td><td>Turntable records</td></tr>
+<tr><td align=right>/33</td><td>33.33 rpm</td></tr>
+<tr><td align=right>/45</td><td>45 rpm</td></tr>
+<tr><td align=right>/71</td><td>71.29 rpm</td></tr>
+<tr><td align=right>/76</td><td>76.59 rpm</td></tr>
+<tr><td align=right>/78</td><td>78.26 rpm</td></tr>
+<tr valign=top><td align=right>/80<br>&nbsp;</td><td>80 rpm</td></tr>
+
+<tr><td>MD</td><td>MiniDisc</td></tr>
+<tr valign=top><td align=right>/A<br>&nbsp;</td><td>Analog transfer from media</td></tr>
+
+<tr><td>DAT</td><td>DAT</td></tr>
+<tr><td align=right>/A</td><td>Analog transfer from media</td></tr>
+<tr><td align=right>/1</td><td>standard, 48 kHz/16 bits, linear</td></tr>
+<tr><td align=right>/2</td><td>mode 2, 32 kHz/16 bits, linear</td></tr>
+<tr><td align=right>/3</td><td>mode 3, 32 kHz/12 bits, nonlinear, low speed</td></tr>
+<tr><td align=right>/4</td><td>mode 4, 32 kHz/12 bits, 4 channels</td></tr>
+<tr><td align=right>/5</td><td>mode 5, 44.1 kHz/16 bits, linear</td></tr>
+<tr valign=top><td align=right>/6<br>&nbsp;</td><td>mode 6, 44.1 kHz/16 bits, 'wide track' play</td></tr>
+
+<tr><td>DCC</td><td>DCC</td></tr>
+<tr valign=top><td align=right>/A<br>&nbsp;</td><td>Analog transfer from media</td></tr>
+
+<tr><td>DVD</td><td>DVD</td></tr>
+<tr valign=top><td align=right>/A<br>&nbsp;</td><td>Analog transfer from media</td></tr>
+
+<tr><td>TV</td><td>Television</td></tr>
+<tr><td align=right>/PAL</td><td>PAL</td></tr>
+<tr><td align=right>/NTSC</td><td>NTSC</td></tr>
+<tr valign=top><td align=right>&nbsp;/SECAM<br>&nbsp;</td><td>SECAM</td></tr>
+
+<tr><td>VID</td><td>Video</td></tr>
+<tr><td align=right>/PAL</td><td>PAL</td></tr>
+<tr><td align=right>/NTSC</td><td>NTSC</td></tr>
+<tr><td align=right>/SECAM</td><td>SECAM</td></tr>
+<tr><td align=right>/VHS</td><td>VHS</td></tr>
+<tr><td align=right>/SVHS</td><td>S-VHS</td></tr>
+<tr valign=top><td align=right>/BETA<br>&nbsp;</td><td>BETAMAX</td></tr>
+
+<tr><td>RAD</td><td>Radio</td></tr>
+<tr><td align=right>/FM</td><td>FM</td></tr>
+<tr><td align=right>/AM</td><td>AM</td></tr>
+<tr><td align=right>/LW</td><td>LW</td></tr>
+<tr valign=top><td align=right>/MW<br>&nbsp;</td><td>MW</td></tr>
+
+<tr><td>TEL</td><td>Telephone</td></tr>
+<tr valign=top><td align=right>/I<br>&nbsp;</td><td>ISDN</td></tr>
+
+<tr><td>MC</td><td>MC (normal cassette)</td></tr>
+<tr><td align=right>/4</td><td>4.75 cm/s (normal speed for a two sided cassette)</td></tr>
+<tr><td align=right>/9</td><td>9.5 cm/s</td></tr>
+<tr><td align=right>/I</td><td>Type I cassette (ferric/normal)</td></tr>
+<tr><td align=right>/II</td><td>Type II cassette (chrome)</td></tr>
+<tr><td align=right>/III</td><td>Type III cassette (ferric chrome)</td></tr>
+<tr valign=top><td align=right>/IV<br>&nbsp;</td><td>Type IV cassette (metal)</td></tr>
+
+<tr><td>REE</td><td>Reel</td></tr>
+<tr><td align=right>/9</td><td>9.5 cm/s</td></tr>
+<tr><td align=right>/19</td><td>19 cm/s</td></tr>
+<tr><td align=right>/38</td><td>38 cm/s</td></tr>
+<tr><td align=right>/76</td><td>76 cm/s</td></tr>
+<tr><td align=right>/I</td><td>Type I cassette (ferric/normal)</td></tr>
+<tr><td align=right>/II</td><td>Type II cassette (chrome)</td></tr>
+<tr><td align=right>/III</td><td>Type III cassette (ferric chrome)</td></tr>
+<tr><td align=right>/IV<br>&nbsp;</td><td>Type IV cassette (metal)</td></tr>
+</table></center>
+</p>
+
+<p>
+<a name="TOAL"> </a>
+<div class=h5>TOAL</div>
+<div class=t>The 'Original album/movie/show title' frame is intended for the title
+of the original recording (or source of sound), if for example the
+music in the file should be a cover of a previously released song.
+</p></div>
+
+<p>
+<a name="TOFN"> </a>
+<div class=h5>TOFN</div>
+<div class=t>The 'Original filename' frame contains the preferred filename for the
+file, since some media doesn't allow the desired length of the
+filename. The filename is case sensitive and includes its suffix.</div>
+</p>
+
+<p>
+<a name="TOLY"> </a>
+<div class=h5>TOLY</div>
+<div class=t>The 'Original lyricist(s)/text writer(s)' frame is intended for the
+text writer(s) of the original recording, if for example the music in
+the file should be a cover of a previously released song. The text
+writers are seperated with the "/" character.</div>
+</p>
+
+<p>
+<a name="TOPE"> </a>
+<div class=h5>TOPE</div>
+<div class=t>The 'Original artist(s)/performer(s)' frame is intended for the
+performer(s) of the original recording, if for example the music in
+the file should be a cover of a previously released song. The
+performers are seperated with the "/" character.</div>
+</p>
+
+<p>
+<a name="TORY"> </a>
+<div class=h5>TORY</div>
+<div class=t>The 'Original release year' frame is intended for the year when the
+original recording, if for example the music in the file should be a
+cover of a previously released song, was released. The field is
+formatted as in the "TYER" frame.</div>
+</p>
+
+<p>
+<a name="TOWN"> </a>
+<div class=h5>TOWN</div>
+<div class=t>The 'File owner/licensee' frame contains the name of the owner or
+licensee of the file and it's contents.</div>
+</p>
+
+<p>
+<a name="TPE1"> </a>
+<div class=h5>TPE1</div>
+<div class=t>The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is
+used for the main artist(s). They are seperated with the "/"
+character.</div>
+</p>
+
+<p>
+<a name="TPE2"> </a>
+<div class=h5>TPE2</div>
+<div class=t>The 'Band/Orchestra/Accompaniment' frame is used for additional
+information about the performers in the recording.</div>
+</p>
+
+<p>
+<a name="TPE3"> </a>
+<div class=h5>TPE3</div>
+<div class=t>The 'Conductor' frame is used for the name of the conductor.</div>
+</p>
+
+<p>
+<a name="TPE4"> </a>
+<div class=h5>TPE4</div>
+<div class=t>The 'Interpreted, remixed, or otherwise modified by' frame contains
+more information about the people behind a remix and similar
+interpretations of another existing piece.</div>
+</p>
+
+<p>
+<a name="TPOS"> </a>
+<div class=h5>TPOS</div>
+<div class=t>The 'Part of a set' frame is a numeric string that describes which
+part of a set the audio came from. This frame is used if the source
+described in the "<a href="#TALB">TALB</a>" frame is divided into several mediums, e.g. a
+double CD. The value may be extended with a "/" character and a
+numeric string containing the total number of parts in the set. E.g.
+"1/2".</div>
+</p>
+
+<p>
+<a name="TPUB"> </a>
+<div class=h5>TPUB</div>
+<div class=t>The 'Publisher' frame simply contains the name of the label or
+publisher.</div>
+</p>
+
+<p>
+<a name="TRCK"> </a>
+<div class=h5>TRCK</div>
+<div class=t>The 'Track number/Position in set' frame is a numeric string
+containing the order number of the audio-file on its original
+recording. This may be extended with a "/" character and a numeric
+string containing the total numer of tracks/elements on the original
+recording. E.g. "4/9".</div>
+</p>
+
+<p>
+<a name="TRDA"> </a>
+<div class=h5>TRDA</div>
+<div class=t>The 'Recording dates' frame is a intended to be used as complement to
+the "<a href="#TYER">TYER</a>", "<a href="#TDAT">TDAT</a>" and "<a href="#TIME">TIME</a>" frames. E.g. "4th-7th June, 12th June"
+in combination with the "<a href="#TYER">TYER</a>" frame.</div>
+</p>
+
+<p>
+<a name="TRSN"> </a>
+<div class=h5>TRSN</div>
+<div class=t>The 'Internet radio station name' frame contains the name of the
+internet radio station from which the audio is streamed.</div>
+</p>
+
+<p>
+<a name="TRSO"> </a>
+<div class=h5>TRSO</div>
+<div class=t>The 'Internet radio station owner' frame contains the name of the
+owner of the internet radio station from which the audio is
+streamed.</div>
+</p>
+
+<p>
+<a name="TSIZ"> </a>
+<div class=h5>TSIZ</div>
+<div class=t>The 'Size' frame contains the size of the audiofile in bytes,
+excluding the ID3v2 tag, represented as a numeric string.</div>
+</p>
+
+<p>
+<a name="TSRC"> </a>
+<div class=h5>TSRC</div>
+<div class=t>The 'ISRC' frame should contain the International Standard Recording
+Code (<a href="#ISRC">ISRC</a>) (12 characters).</div>
+</p>
+
+<p>
+<a name="TSSE"> </a>
+<div class=h5>TSSE</div>
+<div class=t>The 'Software/Hardware and settings used for encoding' frame
+includes the used audio encoder and its settings when the file was
+encoded. Hardware refers to hardware encoders, not the computer on
+which a program was run.</div>
+</p>
+
+<p>
+<a name="TYER"> </a>
+<div class=h5>TYER</div>
+<div class=t>The 'Year' frame is a numeric string with a year of the recording.
+This frames is always four characters long (until the year 10000).</div>
+</p>
+
+<h3>4.2.2.User defined text information frame</h3>
+<p class=t>
+<div class=t>This frame is intended for one-string text information concerning the
+audiofile in a similar way to the other "T"-frames. The frame body
+consists of a description of the string, represented as a terminated
+string, followed by the actual string. There may be more than one
+"TXXX" frame in each tag, but only one with the same description.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'User defined text information frame', ID: "TXXX"&gt;
+<tr><td>Text encoding</td><td>$xx</td></tr>
+<tr><td>Description</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Value</td><td>&lt;text string according to encoding&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.3"> </a>
+<h3>4.3.URL link frames</h3>
+<p class=t>
+With these frames dynamic data such as webpages with touring
+information, price information or plain ordinary news can be added to
+the tag. There may only be one <a href="#URL">URL</a> link frame of its kind in an
+tag, except when stated otherwise in the frame description. If the
+textstring is followed by a termination ($00 (00)) all the following
+information should be ignored and not be displayed. All <a href="#URL">URL</a> link
+frame identifiers begins with "W". Only <a href="#URL">URL</a> link frame identifiers
+begins with "W". All <a href="#URL">URL</a> link frames have the following format:
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" described in 4.3.2.&gt;</td></tr>
+<tr><td>URL</td><td width="80%">&lt;text string&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.3.1"> </a>
+<h3>4.3.1.URL link frames - details</h3>
+<p>
+<a name="WCOM"> </a>
+<div class=h5>WCOM</div>
+<div class=t>The 'Commercial information' frame is a <a href="#URL">URL</a> pointing at a webpage
+with information such as where the album can be bought. There may be
+more than one "WCOM" frame in a tag, but not with the same content.</div>
+</p>
+
+<p>
+<a name="WCOP"> </a>
+<div class=h5>WCOP</div>
+<div class=t>The 'Copyright/Legal information' frame is a <a href="#URL">URL</a> pointing at a
+webpage where the terms of use and ownership of the file is
+described.</div>
+</p>
+
+<p>
+<a name="WOAF"> </a>
+<div class=h5>WOAF</div>
+<div class=t>The 'Official audio file webpage' frame is a <a href="#URL">URL</a> pointing at a file
+specific webpage.</div>
+</p>
+
+<p>
+<a name="WOAR"> </a>
+<div class=h5>WOAR</div>
+<div class=t>The 'Official artist/performer webpage' frame is a <a href="#URL">URL</a> pointing at
+the artists official webpage. There may be more than one "WOAR" frame
+in a tag if the audio contains more than one performer, but not with
+the same content.</div>
+</p>
+
+<p>
+<a name="WOAS"> </a>
+<div class=h5>WOAS</div>
+<div class=t>The 'Official audio source webpage' frame is a <a href="#URL">URL</a> pointing at the
+official webpage for the source of the audio file, e.g. a movie.</div>
+</p>
+
+<p>
+<a name="WORS"> </a>
+<div class=h5>WORS</div>
+<div class=t>The 'Official internet radio station homepage' contains a <a href="#URL">URL</a>
+pointing at the homepage of the internet radio station.</div>
+</p>
+
+<p>
+<a name="WPAY"> </a>
+<div class=h5>WPAY</div>
+<div class=t>The 'Payment' frame is a <a href="#URL">URL</a> pointing at a webpage that will handle
+the process of paying for this file.</div>
+</p>
+
+<p>
+<a name="WPUB"> </a>
+<div class=h5>WPUB</div>
+<div class=t>The 'Publishers official webpage' frame is a <a href="#URL">URL</a> pointing at the
+official wepage for the publisher.</div>
+</p>
+
+<a name="sec4.3.2"> </a>
+<h3>4.3.2.User defined URL link frame</h3>
+<p class=t>
+This frame is intended for <a href="#URL">URL</a> links concerning the audiofile
+in a similar way to the other "W"-frames. The frame body consists
+of a description of the string, represented as a terminated string,
+followed by the actual <a href="#URL">URL</a>. The <a href="#URL">URL</a> is always encoded with <a href="#ISO-8859-1">ISO-8859-1</a>. There may be more than one "WXXX" frame in each tag,
+but only one with the same description.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'User defined URL link frame', ID: "WXXX"&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>Description </td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>URL </td><td>&lt;text string&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.4"> </a>
+<h3>4.4.Involved people list</h3>
+<p class=t>
+Since there might be a lot of people contributing to an audio file in
+various ways, such as musicians and technicians, the 'Text
+information frames' are often insufficient to list everyone involved
+in a project. The 'Involved people list' is a frame containing the
+names of those involved, and how they were involved. The body simply
+contains a terminated string with the involvement directly followed
+by a terminated string with the involvee followed by a new
+involvement and so on. There may only be one "IPLS" frame in each
+tag.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Involved people list', ID: "IPLS"&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>People list strings</td><td>&lt;text strings according to encoding&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.5"> </a>
+<h3>4.5.Music CD identifier</h3>
+<p class=t>
+This frame is intended for music that comes from a CD, so that the CD
+can be identified in databases such as the <a href="#CDDB">CDDB</a>. The frame
+consists of a binary dump of the Table Of Contents, TOC, from the CD,
+which is a header of 4 bytes and then 8 bytes/track on the CD plus 8
+bytes for the 'lead out' making a maximum of 804 bytes. The offset to
+the beginning of every track on the CD should be described with a
+four bytes absolute CD-frame address per track, and not with absolute
+time. This frame requires a present and valid "<a href="#TRCK">TRCK</a>" frame, even if
+the CD's only got one track. There may only be one "MCDI" frame in
+each tag.
+</p>
+<p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Music CD identifier', ID: "MCDI"&gt;</td></tr>
+<tr><td>CD TOC</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.6"> </a>
+<h3>4.6.Event timing codes</h3>
+<p class=t>
+This frame allows synchronisation with key events in a song or sound.
+The header is:
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Event timing codes', ID: "ETCO"&gt;</td></tr>
+<tr><td>Time stamp format</td><td width="80%">$xx</td></tr>
+</table></center>
+</p><p class=t>
+Where time stamp format is:
+</p><p class=ind>
+ $01 Absolute time, 32 bit sized, using <a href="#MPEG">MPEG</a> frames as unit<br>
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+</p><p class=t>
+Abolute time means that every stamp contains the time from the
+beginning of the file.
+</p><p class=t>
+Followed by a list of key events in the following format:
+</p><p><center><table border=0 width="70%">
+<tr><td>Type of event</td><td width="80%">$xx</td></tr>
+<tr><td>Time stamp</td><td>$xx (xx ...)</td></tr>
+</table></center>
+</p><p class=t>
+The 'Time stamp' is set to zero if directly at the beginning of the
+sound or after the previous event. All events should be sorted in
+chronological order. The type of event is as follows:
+</p><p><center><table border=0 width="70%">
+<tr><td>$00</td><td width="80%">padding (has no meaning)</td></tr>
+<tr><td>$01</td><td>end of initial silence</td></tr>
+<tr><td>$02</td><td>intro start</td></tr>
+<tr><td>$03</td><td>mainpart start</td></tr>
+<tr><td>$04</td><td>outro start</td></tr>
+<tr><td>$05</td><td>outro end</td></tr>
+<tr><td>$06</td><td>verse start</td></tr>
+<tr><td>$07</td><td>refrain start</td></tr>
+<tr><td>$08</td><td>interlude start</td></tr>
+<tr><td>$09</td><td>theme start</td></tr>
+<tr><td>$0A</td><td>variation start</td></tr>
+<tr><td>$0B</td><td>key change</td></tr>
+<tr><td>$0C</td><td>time change</td></tr>
+<tr><td>$0D</td><td>momentary unwanted noise (Snap, Crackle & Pop)</td></tr>
+<tr><td>$0E</td><td>sustained noise</td></tr>
+<tr><td>$0F</td><td>sustained noise end</td></tr>
+<tr><td>$10</td><td>intro end</td></tr>
+<tr><td>$11</td><td>mainpart end</td></tr>
+<tr><td>$12</td><td>verse end</td></tr>
+<tr><td>$13</td><td>refrain end</td></tr>
+<tr><td>$14</td><td>theme end</td></tr>
+
+<tr><td>$15-$DF</td><td>reserved for future use</td></tr>
+
+<tr><td>$E0-$EF</td><td>not predefined sync 0-F</td></tr>
+
+<tr><td>$F0-$FC</td><td>reserved for future use</td></tr>
+
+<tr><td>$FD</td><td>audio end (start of silence)</td></tr>
+<tr><td>$FE</td><td>audio file ends</td></tr>
+<tr><td>$FF</td><td>one more byte of events follows (all the following bytes with the value $FF have the same function)</td></tr>
+</table></center>
+</p><p class=t>
+Terminating the start events such as "intro start" is not required.
+The 'Not predefined sync's ($E0-EF) are for user events. You might
+want to synchronise your music to something, like setting of an
+explosion on-stage, turning on your screensaver etc.
+</p>
+<p class=t>There may only be one "ETCO" frame in each tag.</p>
+
+<a name="sec4.7"> </a>
+<h3>4.7.MPEG location lookup table</h3>
+<p class=t>
+To increase performance and accuracy of jumps within a <a href="#MPEG">MPEG</a>
+audio file, frames with timecodes in different locations in the file
+might be useful. The ID3v2 frame includes references that the
+software can use to calculate positions in the file. After the frame
+header is a descriptor of how much the 'frame counter' should
+increase for every reference. If this value is two then the first
+reference points out the second frame, the 2nd reference the 4th
+frame, the 3rd reference the 6th frame etc. In a similar way the
+'bytes between reference' and 'milliseconds between reference' points
+out bytes and milliseconds respectively.
+</p><p class=t>
+Each reference consists of two parts; a certain number of bits, as
+defined in 'bits for bytes deviation', that describes the difference
+between what is said in 'bytes between reference' and the reality and
+a certain number of bits, as defined in 'bits for milliseconds
+deviation', that describes the difference between what is said in
+'milliseconds between reference' and the reality. The number of bits
+in every reference, i.e. 'bits for bytes deviation'+'bits for
+milliseconds deviation', must be a multiple of four. There may only
+be one "MLLT" frame in each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Location lookup table', ID: "MLLT"&gt;</td></tr>
+<tr><td nowrap>MPEG frames between reference</td><td width="80%">$xx xx</td></tr>
+<tr><td>Bytes between reference</td><td>$xx xx xx</td></tr>
+<tr><td>Milliseconds between reference</td><td>$xx xx xx</td></tr>
+<tr><td>Bits for bytes deviation</td><td>$xx</td></tr>
+<tr><td>Bits for milliseconds dev.</td><td>$xx</td></tr>
+</table></center>
+</p><p class=t>
+Then for every reference the following data is included;
+</p><p><center><table border=0 width="70%">
+<tr><td>Deviation in bytes</td><td width="80%">%xxx....</td></tr>
+<tr><td>Deviation in milliseconds</td><td>%xxx....</td></tr>
+</table></center>
+</p>
+
+<a name="sec4.8"> </a>
+<h3>4.8.Synchronised tempo codes</h3>
+<p class=t>
+For a more accurate description of the tempo of a musical piece this
+frame might be used. After the header follows one byte describing
+which time stamp format should be used. Then follows one or more
+tempo codes. Each tempo code consists of one tempo part and one time
+part. The tempo is in BPM described with one or two bytes. If the
+first byte has the value $FF, one more byte follows, which is added
+to the first giving a range from 2 - 510 BPM, since $00 and $01 is
+reserved. $00 is used to describe a beat-free time period, which is
+not the same as a music-free time period. $01 is used to indicate one
+single beat-stroke followed by a beat-free period.
+</p><p class=t>
+The tempo descriptor is followed by a time stamp. Every time the
+tempo in the music changes, a tempo descriptor may indicate this for
+the player. All tempo descriptors should be sorted in chronological
+order. The first beat-stroke in a time-period is at the same time as
+the beat description occurs. There may only be one "SYTC" frame in
+each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Synchronised tempo codes', ID: "SYTC"&gt;</td></tr>
+<tr><td>Time stamp format</td><td width="80%">$xx</td></tr>
+<tr><td>Tempo data </td><td>&lt;binary data&gt;</td></tr>
+</table></center>
+</p><p class=t>
+Where time stamp format is:
+</p><p class=ind>
+ $01 Absolute time, 32 bit sized, using <a href="#MPEG">MPEG</a> frames as unit<br>
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+</p><p class=t>
+Abolute time means that every stamp contains the time from the
+beginning of the file.
+</p>
+
+<a name="sec4.9"> </a>
+<h3>4.9.Unsychronised lyrics/text transcription</h3>
+<p class=t>
+This frame contains the lyrics of the song or a text transcription of
+other vocal activities. The head includes an encoding descriptor and
+a content descriptor. The body consists of the actual text. The
+'Content descriptor' is a terminated string. If no descriptor is
+entered, 'Content descriptor' is $00 (00) only. Newline characters
+are allowed in the text. There may be more than one 'Unsynchronised
+lyrics/text transcription' frame in each tag, but only one with the
+same language and content descriptor.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>Language</td><td>$xx xx xx</td></tr>
+<tr><td>Content descriptor</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Lyrics/text</td><td>&lt;full text string according to encoding&gt;</td></tr>
+</table></center>
+</p>
+
+<a name="sec4.10"> </a>
+<h3>4.10.Synchronised lyrics/text</h3>
+<p class=t>
+This is another way of incorporating the words, said or sung lyrics,
+in the audio file as text, this time, however, in sync with the
+audio. It might also be used to describing events e.g. occurring on a
+stage or on the screen in sync with the audio. The header includes a
+content descriptor, represented with as terminated textstring. If no
+descriptor is entered, 'Content descriptor' is $00 (00) only.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Synchronised lyrics/text', ID: "SYLT"&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>Language</td><td>$xx xx xx</td></tr>
+<tr><td>Time stamp format</td><td>$xx</td></tr>
+<tr><td>Content type</td><td>$xx</td></tr>
+<tr><td>Content descriptor</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+</table></center>
+</p>
+<p><center><table border=0 width="70%">
+<tr><td rowspan=2 valign=top>Encoding:</td><td>$00</td><td><a href="#ISO-8859-1">ISO-8859-1</a> character set is used => $00
+ is sync identifier.</td></tr>
+<tr><td>$01</td><td><a href="#UNICODE">Unicode</a> character set is used => $00 00 is
+ sync identifier.</td></tr>
+</table></center></p>
+
+<p><center><table border=0 width="70%">
+<tr><td rowspan=7 valign=top>Content type:</td><td>$00</td><td width="80%">is other</td></tr>
+<tr><td>$01</td><td>is lyrics</td></tr>
+<tr><td>$02</td><td>is text transcription</td></tr>
+<tr><td>$03</td><td>is movement/part name (e.g. "Adagio")</td></tr>
+<tr><td>$04</td><td>is events (e.g. "Don Quijote enters the stage")</td></tr>
+<tr><td>$05</td><td>is chord (e.g. "Bb F Fsus")</td></tr>
+<tr><td>$06</td><td>is trivia/'pop up' information</td></tr>
+</table></center></p>
+<p class=t>
+Time stamp format is:
+</p><p class=ind>
+ $01 Absolute time, 32 bit sized, using <a href="#MPEG">MPEG</a> frames as unit<br>
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+</p>
+<p class=t>
+Abolute time means that every stamp contains the time from the
+beginning of the file.
+</p><p class=t>
+The text that follows the frame header differs from that of the
+unsynchronised lyrics/text transcription in one major way. Each
+syllable (or whatever size of text is considered to be convenient by
+the encoder) is a null terminated string followed by a time stamp
+denoting where in the sound file it belongs. Each sync thus has the
+following structure:
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>Terminated text to be synced (typically a syllable)</td></tr>
+<tr><td nowrap>Sync identifier (terminator to above string)</td><td width="80%">$00 (00)</td></tr>
+<tr><td>Time stamp</td><td>$xx (xx ...)</td></tr>
+</table></center>
+<p class=t>
+The 'time stamp' is set to zero or the whole sync is omitted if
+located directly at the beginning of the sound. All time stamps
+should be sorted in chronological order. The sync can be considered
+as a validator of the subsequent string.
+</p><p class=t>
+Newline ($0A) characters are allowed in all "SYLT" frames and should
+be used after every entry (name, event etc.) in a frame with the
+content type $03 - $04.
+</p><p class=t>
+A few considerations regarding whitespace characters: Whitespace
+separating words should mark the beginning of a new word, thus
+occurring in front of the first syllable of a new word. This is also
+valid for new line characters. A syllable followed by a comma should
+not be broken apart with a sync (both the syllable and the comma
+should be before the sync).</p>
+<p class=t>An example: The "USLT" passage</p>
+<p class=ind>"Strangers in the night" $0A "Exchanging glances"</p>
+<p class=t>would be "SYLT" encoded as:</p>
+<p class=ind>
+ "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx
+ " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx
+ xx "glan" $00 xx xx "ces" $00 xx xx
+</p>
+<p class=t>There may be more than one "SYLT" frame in each tag, but only one
+with the same language and content descriptor.</p>
+
+<a name="sec4.11"> </a>
+<h3>4.11.Comments</h3>
+<p class=t>
+This frame is indended for any kind of full text information that
+does not fit in any other frame. It consists of a frame header
+followed by encoding, language and content descriptors and is ended
+with the actual comment as a text string. Newline characters are
+allowed in the comment text string. There may be more than one
+comment frame in each tag, but only one with the same language and
+content descriptor.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Comment', ID: "COMM"&gt;</td></tr>
+<tr><td>Text encoding</td><td width="80%">$xx</td></tr>
+<tr><td>Language </td><td>$xx xx xx</td></tr>
+<tr><td>Short content descrip.</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>The actual text </td><td>&lt;full text string according to encoding&gt;</td></tr>
+</table></center>
+</p>
+
+<a name="sec4.12"> </a>
+<h3>4.12.Relative volume adjustment</h3>
+<p class=t>
+This is a more subjective function than the previous ones. It allows
+the user to say how much he wants to increase/decrease the volume on
+each channel while the file is played. The purpose is to be able to
+align all files to a reference volume, so that you don't have to
+change the volume constantly. This frame may also be used to balance
+adjust the audio. If the volume peak levels are known then this could
+be described with the 'Peak volume right' and 'Peak volume left'
+field. If Peakvolume is not known these fields could be left zeroed
+or, if no other data follows, be completely omitted. There may only
+be one "RVAD" frame in each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Relative volume adjustment', ID: "RVAD"&gt;</td></tr>
+<tr><td>Increment/decrement</td><td width="80%">%00xxxxxx</td></tr>
+<tr><td>Bits used for volume descr.</td><td>$xx</td></tr>
+<tr><td>Relative volume change, right</td><td>$xx xx (xx ...)</td></tr>
+<tr><td>Relative volume change, left</td><td>$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume right</td><td>$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume left</td><td>$xx xx (xx ...)</td></tr>
+</table></center></p>
+<p class=t>
+In the increment/decrement field bit 0 is used to indicate the right
+channel and bit 1 is used to indicate the left channel. 1 is
+increment and 0 is decrement.
+</p><p class=t>
+The 'bits used for volume description' field is normally $10 (16
+bits) for <a href="#MPEG">MPEG</a> 2 layer I, II and III and MPEG 2.5. This value
+may not be $00. The volume is always represented with whole bytes,
+padded in the beginning (highest bits) when 'bits used for volume
+description' is not a multiple of eight.
+</p><p class=t>
+This datablock is then optionally followed by a volume definition for
+the left and right back channels. If this information is appended to
+the frame the first two channels will be treated as front channels.
+In the increment/decrement field bit 2 is used to indicate the right
+back channel and bit 3 for the left back channel.
+</p><p><center><table border=0 width="70%">
+<tr><td nowrap>Relative volume change, right back</td><td width="80%">$xx xx (xx ...)</td></tr>
+<tr><td>Relative volume change, left back</td><td>$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume right back</td><td>$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume left back</td><td>$xx xx (xx ...)</td></tr>
+</table></center></p>
+<p class=t>
+If the center channel adjustment is present the following is appended
+to the existing frame, after the left and right back channels. The
+center channel is represented by bit 4 in the increase/decrease
+field.
+</p><p><center><table border=0 width="70%">
+<tr><td nowrap>Relative volume change, center</td><td width="80%">$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume center</td><td>$xx xx (xx ...)</td></tr>
+</table></center></p>
+<p class=t>
+If the bass channel adjustment is present the following is appended
+to the existing frame, after the center channel. The bass channel is
+represented by bit 5 in the increase/decrease field.
+</p><p><center><table border=0 width="70%">
+<tr><td nowrap>Relative volume change, bass</td><td width="80%">$xx xx (xx ...)</td></tr>
+<tr><td>Peak volume bass</td><td>$xx xx (xx ...)</td></tr>
+</table></center></p>
+
+<a name="sec4.13"> </a>
+<h3>4.13.Equalisation</h3>
+<p class=t>
+This is another subjective, alignment frame. It allows the user to
+predefine an equalisation curve within the audio file. There may only
+be one "EQUA" frame in each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header of 'Equalisation', ID: "EQUA"&gt;</td></tr>
+<tr><td>Adjustment bits</td><td width="80%">$xx</td></tr>
+</table></center></p>
+<p class=t>
+The 'adjustment bits' field defines the number of bits used for
+representation of the adjustment. This is normally $10 (16 bits) for
+<a href="#MPEG">MPEG</a> 2 layer I, II and III and MPEG 2.5. This value may not be
+$00.
+</p><p class=t>
+This is followed by 2 bytes + ('adjustment bits' rounded up to the
+nearest byte) for every equalisation band in the following format,
+giving a frequency range of 0 - 32767Hz:
+</p><p><center><table border=0 width="70%">
+<tr><td>Increment/decrement</td><td width="80%">%x (MSB of the Frequency)</td></tr>
+<tr><td>Frequency </td><td>(lower 15 bits)</td></tr>
+<tr><td>Adjustment</td><td>$xx (xx ...)</td></tr>
+</Table></center></p>
+<p class=t>
+The increment/decrement bit is 1 for increment and 0 for decrement.
+The equalisation bands should be ordered increasingly with reference
+to frequency. All frequencies don't have to be declared. The
+equalisation curve in the reading software should be interpolated
+between the values in this frame. Three equal adjustments for three
+subsequent frequencies. A frequency should only be described once in
+the frame.
+</p>
+
+<a name="sec4.14"> </a>
+<h3>4.14.Reverb</h3>
+<p class=t>
+Yet another subjective one. You may here adjust echoes of different
+kinds. Reverb left/right is the delay between every bounce in ms.
+Reverb bounces left/right is the number of bounces that should be
+made. $FF equals an infinite number of bounces. Feedback is the
+amount of volume that should be returned to the next echo bounce. $00
+is 0%, $FF is 100%. If this value were $7F, there would be 50% volume
+reduction on the first bounce, 50% of that on the second and so on.
+Left to left means the sound from the left bounce to be played in the
+left speaker, while left to right means sound from the left bounce to
+be played in the right speaker.
+</p><p class=t>
+'Premix left to right' is the amount of left sound to be mixed in the
+right before any reverb is applied, where $00 id 0% and $FF is 100%.
+'Premix right to left' does the same thing, but right to left.
+Setting both premix to $FF would result in a mono output (if the
+reverb is applied symmetric). There may only be one "RVRB" frame in
+each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Reverb', ID: "RVRB"&gt;</td></tr>
+<tr><td>Reverb left (ms) </td><td>$xx xx</td></tr>
+<tr><td>Reverb right (ms) </td><td>$xx xx</td></tr>
+<tr><td>Reverb bounces, left </td><td>$xx</td></tr>
+<tr><td>Reverb bounces, right</td><td>$xx</td></tr>
+<tr><td>Reverb feedback, left to left </td><td>$xx</td></tr>
+<tr><td>Reverb feedback, left to right</td><td>$xx</td></tr>
+<tr><td>Reverb feedback, right to right </td><td>$xx</td></tr>
+<tr><td>Reverb feedback, right to left</td><td>$xx</td></tr>
+<tr><td>Premix left to right </td><td>$xx</td></tr>
+<tr><td>Premix right to left </td><td>$xx</td></tr>
+</table></center></p>
+
+<a name="sec4.15"> </a>
+<h3>4.15.Attached picture</h3>
+<p class=t>
+This frame contains a picture directly related to the audio file.
+Image format is the <a href="#MIME">MIME</a> type and subtype for the image. In
+the event that the <a href="#MIME">MIME</a> media type name is omitted, "image/" will be
+implied. The "<a href="#PNG">image/png</a>" or "<a href="#JFIF">image/jpeg</a>" picture format
+should be used when interoperability is wanted. Description is a
+short description of the picture, represented as a terminated
+textstring. The description has a maximum length of 64 characters,
+but may be empty. There may be several pictures attached to one file,
+each in their individual "APIC" frame, but only one with the same
+content descriptor. There may only be one picture with the picture
+type declared as picture type $01 and $02 respectively. There is the
+possibility to put only a link to the image file by using the '<a href="#MIME">MIME</a>
+type' "-->" and having a complete <a href="#URL">URL</a> instead of picture data.
+The use of linked files should however be used sparingly since there
+is the risk of separation of files.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Attached picture', ID: "APIC"&gt;</td></tr>
+<tr><td>Text encoding</td><td>$xx</td></tr>
+<tr><td>MIME type </td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Picture type </td><td>$xx</td></tr>
+<tr><td>Description </td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Picture data </td><td>&lt;binary data&gt;</td></tr>
+</table>
+</center></p>
+<p><center><table border=0 width="70%">
+<tr><td rowspan=21 valign=top>Picture type:</td><td>$00</td><td>Other</td></tr>
+<tr><td>$01</td><td>32x32 pixels 'file icon' (PNG only)</td></tr>
+<tr><td>$02</td><td>Other file icon</td></tr>
+<tr><td>$03</td><td>Cover (front)</td></tr>
+<tr><td>$04</td><td>Cover (back)</td></tr>
+<tr><td>$05</td><td>Leaflet page</td></tr>
+<tr><td>$06</td><td>Media (e.g. lable side of CD)</td></tr>
+<tr><td>$07</td><td>Lead artist/lead performer/soloist</td></tr>
+<tr><td>$08</td><td>Artist/performer</td></tr>
+<tr><td>$09</td><td>Conductor</td></tr>
+<tr><td>$0A</td><td>Band/Orchestra</td></tr>
+<tr><td>$0B</td><td>Composer</td></tr>
+<tr><td>$0C</td><td>Lyricist/text writer</td></tr>
+<tr><td>$0D</td><td>Recording Location</td></tr>
+<tr><td>$0E</td><td>During recording</td></tr>
+<tr><td>$0F</td><td>During performance</td></tr>
+<tr><td>$10</td><td>Movie/video screen capture</td></tr>
+<tr><td>$11</td><td>A bright coloured fish</td></tr>
+<tr><td>$12</td><td>Illustration</td></tr>
+<tr><td>$13</td><td>Band/artist logotype</td></tr>
+<tr><td>$14</td><td>Publisher/Studio logotype</td></tr>
+</table></center></p>
+
+<a name="sec4.16"> </a>
+<h3>4.16.General encapsulated object</h3>
+<p class=t>
+In this frame any type of file can be encapsulated. After the header,
+'Frame size' and 'Encoding' follows '<a href="#MIME">MIME</a> type' represented as
+as a terminated string encoded with <a href="#ISO-8859-1">ISO-8859-1</a>. The
+filename is case sensitive and is encoded as 'Encoding'. Then follows
+a content description as terminated string, encoded as 'Encoding'.
+The last thing in the frame is the actual object. The first two
+strings may be omitted, leaving only their terminations. There may be more than one "GEOB"
+frame in each tag, but only one with the same content descriptor.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'General encapsulated object', ID: "GEOB"&gt;</td></tr>
+<tr><td>Text encoding </td><td>$xx</td></tr>
+<tr><td>MIME type </td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Filename</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Content description </td><td><text string according to encóding> $00 (00)</td></tr>
+<tr><td>Encapsulated object </td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.17"> </a>
+<h3>4.17.Play counter</h3>
+<p class=t>
+This is simply a counter of the number of times a file has been
+played. The value is increased by one every time the file begins to
+play. There may only be one "PCNT" frame in each tag. When the
+counter reaches all one's, one byte is inserted in front of the
+counter thus making the counter eight bits bigger. The counter must
+be at least 32-bits long to begin with.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Play counter', ID: "PCNT"&gt;</td></tr>
+<tr><td>Counter </td><td>$xx xx xx xx (xx ...)</td></tr>
+</table></center></p>
+
+
+<a name="sec4.18"> </a>
+<h3>4.18.Popularimeter</h3>
+<p class=t>
+The purpose of this frame is to specify how good an audio file is.
+Many interesting applications could be found to this frame such as a
+playlist that features better audiofiles more often than others or it
+could be used to profile a person's taste and find other 'good' files
+by comparing people's profiles. The frame is very simple. It contains
+the email address to the user, one rating byte and a four byte play
+counter, intended to be increased with one for every time the file is
+played. The email is a terminated string. The rating is 1-255 where
+1 is worst and 255 is best. 0 is unknown. If no personal counter is
+wanted it may be omitted. When the counter reaches all one's, one
+byte is inserted in front of the counter thus making the counter
+eight bits bigger in the same away as the play counter ("PCNT").
+There may be more than one "POPM" frame in each tag, but only one
+with the same email address.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Popularimeter', ID: "POPM"&gt;</td></tr>
+<tr><td>Email to user</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Rating </td><td>$xx</td></tr>
+<tr><td>Counter</td><td>$xx xx xx xx (xx ...)</td></tr>
+</table></center></p>
+
+<a name="sec4.19"> </a>
+<h3>4.19.Recommended buffer size</h3>
+<p class=t>
+Sometimes the server from which a audio file is streamed is aware of
+transmission or coding problems resulting in interruptions in the
+audio stream. In these cases, the size of the buffer can be
+recommended by the server using this frame. If the 'embedded info
+flag' is true (1) then this indicates that an ID3 tag with the
+maximum size described in 'Buffer size' may occur in the audiostream.
+In such case the tag should reside between two <a href="#MPEG">MPEG</a> frames, if
+the audio is <a href="#MPEG">MPEG</a> encoded. If the position of the next tag is known,
+'offset to next tag' may be used. The offset is calculated from the
+end of tag in which this frame resides to the first byte of the
+header in the next. This field may be omitted. Embedded tags are
+generally not recommended since this could render unpredictable
+behaviour from present software/hardware.
+</p><p class=t>
+For applications like streaming audio it might be an idea to embed
+tags into the audio stream though. If the clients connects to
+individual connections like HTTP and there is a possibility to begin
+every transmission with a tag, then this tag should include a
+'recommended buffer size' frame. If the client is connected to a
+arbitrary point in the stream, such as radio or multicast, then the
+'recommended buffer size' frame should be included in every tag.
+Every tag that is picked up after the initial/first tag is to be
+considered as an update of the previous one. E.g. if there is a
+"<a href="#TIT2">TIT2</a>" frame in the first received tag and one in the second tag,
+then the first should be 'replaced' with the second.
+</p><p class=t>
+The 'Buffer size' should be kept to a minimum. There may only be one
+"RBUF" frame in each tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Recommended buffer size', ID: "RBUF"&gt;</td></tr>
+<tr><td>Buffer size</td><td>$xx xx xx</td></tr>
+<tr><td>Embedded info flag</td><td>%0000000x</td></tr>
+<tr><td>Offset to next tag</td><td>$xx xx xx xx</td></tr>
+</table></center></p>
+
+<a name="sec4.20"> </a>
+<h3>4.20.Audio encryption</h3>
+<p class=t>
+This frame indicates if the actual audio stream is encrypted, and by
+whom. Since standardisation of such encrypion scheme is beyond this
+document, all "AENC" frames begin with a terminated string with a
+URL containing an email address, or a link to a location where an
+email address can be found, that belongs to the organisation
+responsible for this specific encrypted audio file. Questions
+regarding the encrypted audio should be sent to the email address
+specified. If a $00 is found directly after the 'Frame size' and the
+audiofile indeed is encrypted, the whole file may be considered
+useless.
+</p><p class=t>
+After the 'Owner identifier', a pointer to an unencrypted part of the
+audio can be specified. The 'Preview start' and 'Preview length' is
+described in frames. If no part is unencrypted, these fields should
+be left zeroed. After the 'preview length' field follows optionally a
+datablock required for decryption of the audio. There may be more
+than one "AENC" frames in a tag, but only one with the same 'Owner
+identifier'.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Audio encryption', ID: "AENC"&gt;</td></tr>
+<tr><td>Owner identifier</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Preview start</td><td>$xx xx</td></tr>
+<tr><td>Preview length</td><td>$xx xx</td></tr>
+<tr><td>Encryption info</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.21"> </a>
+<h3>4.21.Linked information</h3>
+<p class=t>
+To keep space waste as low as possible this frame may be used to link
+information from another ID3v2 tag that might reside in another audio
+file or alone in a binary file. It is recommended that this method is
+only used when the files are stored on a CD-ROM or other
+circumstances when the risk of file seperation is low. The frame
+contains a frame identifier, which is the frame that should be linked
+into this tag, a <a href="#URL">URL</a> field, where a reference to the file where
+the frame is given, and additional ID data, if needed. Data should be
+retrieved from the first tag found in the file to which this link
+points. There may be more than one "LINK" frame in a tag, but only
+one with the same contents. A linked frame is to be considered as
+part of the tag and has the same restrictions as if it was a physical
+part of the tag (i.e. only one "RVRB" frame allowed, whether it's
+linked or not).
+</p><p><center><table border=0 width="70%">
+<tr><td>&lt;Header for 'Linked information', ID: "LINK"&gt;</td></tr>
+<tr><td>Frame identifier</td><td>$xx xx xx</td></tr>
+<tr><td>URL</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>ID and additional data</td><td>&lt;text string(s)&gt;</td></tr>
+</table></center></p>
+<p class=t>
+Frames that may be linked and need no additional data are "IPLS",
+"MCID", "ETCO", "MLLT", "SYTC", "RVAD", "EQUA", "RVRB", "RBUF", the
+text information frames and the URL link frames.
+</p><p class=t>
+The "TXXX", "APIC", "GEOB" and "AENC" frames may be linked with
+the content descriptor as additional ID data.
+</p><p class=t>
+The "COMM", "SYLT" and "USLT" frames may be linked with three bytes
+of language descriptor directly followed by a content descriptor as
+additional ID data.
+</p>
+
+<a name="sec4.22"> </a>
+<h3>4.22.Position synchronisation frame</h3>
+<p class=t>
+This frame delivers information to the listener of how far into the
+audio stream he picked up; in effect, it states the time offset of
+the first frame in the stream. The frame layout is:
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Head for 'Position synchronisation', ID: "POSS"&gt;</td></tr>
+<tr><td>Time stamp format</td><td>$xx</td></tr>
+<tr><td>Position</td><td>$xx (xx ...)</td></tr>
+</table></center></p>
+<p class=t>
+Where time stamp format is:
+</p><p class=ind>
+$01 Absolute time, 32 bit sized, using <a href="#MPEG">MPEG</a> frames as unit<br>
+$02 Absolute time, 32 bit sized, using milliseconds as unit
+</p><p class=t>
+and position is where in the audio the listener starts to receive,
+i.e. the beginning of the next frame. If this frame is used in the
+beginning of a file the value is always 0. There may only be one
+"POSS" frame in each tag.
+</p>
+
+<a name="sec4.23"> </a>
+<h3>4.23.Terms of use frame</h3>
+<p class=t>
+This frame contains a brief description of the terms of use and
+ownership of the file. More detailed information concerning the legal
+terms might be available through the "WCOP" frame. Newlines are
+allowed in the text. There may only be one "USER" frame in a tag.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Terms of use frame', ID: "USER"&gt;</td></tr>
+<tr><td>Text encoding</td><td>$xx</td></tr>
+<tr><td>Language</td><td>$xx xx xx</td></tr>
+<tr><td>The actual text</td><td>&lt;text string according to encoding&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.24"> </a>
+<h3>4.24.Ownership frame</h3>
+<p class=t>
+The ownership frame might be used as a reminder of a made transaction
+or, if signed, as proof. Note that the "USER" and "TOWN" frames are
+good to use in conjunction with this one. The frame begins, after the
+frame ID, size and encoding fields, with a 'price payed' field. The
+first three characters of this field contains the currency used for
+the transaction, encoded according to <a href="#ISO-4217">ISO-4217</a> alphabetic
+currency code. Concatenated to this is the actual price payed, as a
+numerical string using "." as the decimal separator. Next is an 8
+character date string (YYYYMMDD) followed by a string with the name
+of the seller as the last field in the frame. There may only be one
+"OWNE" frame in a tag.
+</p><p><center><table border=0 width="70%">
+<tr><td>&lt;Header for 'Ownership frame', ID: "OWNE"&gt;</td></tr>
+<tr><td>Text encoding</td><td>$xx</td></tr>
+<tr><td>Price payed</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Date of purch.</td><td>&lt;text string&gt;</td></tr>
+<tr><td>Seller</td><td>&lt;text string according to encoding&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.25"> </a>
+<h3>4.25.Commercial frame</h3>
+<p class=t>
+This frame enables several competing offers in the same tag by
+bundling all needed information. That makes this frame rather complex
+but it's an easier solution than if one tries to achieve the same
+result with several frames. The frame begins, after the frame ID,
+size and encoding fields, with a price string field. A price is
+constructed by one three character currency code, encoded according
+to <a href="#ISO-4217">ISO-4217</a> alphabetic currency code, followed by a
+numerical value where "." is used as decimal seperator. In the price
+string several prices may be concatenated, seperated by a "/"
+character, but there may only be one currency of each type.
+</p><p class=t>
+The price string is followed by an 8 character date string in the
+format YYYYMMDD, describing for how long the price is valid. After
+that is a contact <a href="#URL">URL</a>, with which the user can contact the seller,
+followed by a one byte 'received as' field. It describes how the
+audio is delivered when bought according to the following list:
+</p><p><center><table border=0 width="70%">
+<tr><td>$00</td><td>Other</td></tr>
+<tr><td>$01</td><td>Standard CD album with other songs</td></tr>
+<tr><td>$02</td><td>Compressed audio on CD</td></tr>
+<tr><td>$03</td><td>File over the Internet</td></tr>
+<tr><td>$04</td><td>Stream over the Internet</td></tr>
+<tr><td>$05</td><td>As note sheets</td></tr>
+<tr><td>$06</td><td>As note sheets in a book with other sheets</td></tr>
+<tr><td>$07</td><td>Music on other media</td></tr>
+<tr><td>$08</td><td>Non-musical merchandise</td></tr>
+</table></center></p>
+<p class=t>
+Next follows a terminated string with the name of the seller followed
+by a terminated string with a short description of the product. The
+last thing is the ability to include a company logotype. The first of
+them is the 'Picture MIME type' field containing information about
+which picture format is used. In the event that the <a href="#MIME">MIME</a> media type
+name is omitted, "image/" will be implied. Currently only "<a href="#PNG">image/png</a>"
+and "<a href="#JFIF">image/jpeg</a>" are allowed. This format string is followed by the
+binary picture data. This two last fields may be omitted if no
+picture is to attach.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2> &lt;Header for 'Commercial frame', ID: "COMR"&gt;</td></tr>
+<tr><td>Text encoding</td><td>$xx</td></tr>
+<tr><td>Price string</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Valid until</td><td>&lt;text string&gt;</td></tr>
+<tr><td>Contact URL</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Received as</td><td>$xx</td></tr>
+<tr><td>Name of seller</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Description</td><td>&lt;text string according to encoding&gt; $00 (00)</td></tr>
+<tr><td>Picture MIME type</td><td>&lt;string&gt; $00</td></tr>
+<tr><td>Seller logo</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.26"> </a>
+<h3>4.26.Encryption method registration</h3>
+<p class=t>
+To identify with which method a frame has been encrypted the
+encryption method must be registered in the tag with this frame. The
+'Owner identifier' is a null-terminated string with a <a href="#URL">URL</a>
+containing an email address, or a link to a location where an email
+address can be found, that belongs to the organisation responsible
+for this specific encryption method. Questions regarding the
+encryption method should be sent to the indicated email address. The
+'Method symbol' contains a value that is associated with this method
+throughout the whole tag. Values below $80 are reserved. The 'Method
+symbol' may optionally be followed by encryption specific data. There
+may be several "ENCR" frames in a tag but only one containing the
+same symbol and only one containing the same owner identifier. The
+method must be used somewhere in the tag. See <a href="#sec3.3.1">section 3.3.1</a>, flag j
+for more information.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Encryption method registration', ID: "ENCR"&gt;</td></tr>
+<tr><td>Owner identifier</td><td width="80%">&lt;text string&gt; $00</td></tr>
+<tr><td>Method symbol</td><td>$xx</td></tr>
+<tr><td>Encryption data</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.27"> </a>
+<h3>4.27.Group identification registration</h3>
+<p class=t>
+This frame enables grouping of otherwise unrelated frames. This can
+be used when some frames are to be signed. To identify which frames
+belongs to a set of frames a group identifier must be registered in
+the tag with this frame. The 'Owner identifier' is a null-terminated
+string with a <a href="#URL">URL</a> containing an email address, or a link to a
+location where an email address can be found, that belongs to the
+organisation responsible for this grouping. Questions regarding the
+grouping should be sent to the indicated email address. The 'Group
+symbol' contains a value that associates the frame with this group
+throughout the whole tag. Values below $80 are reserved. The 'Group
+symbol' may optionally be followed by some group specific data, e.g.
+a digital signature. There may be several "GRID" frames in a tag but
+only one containing the same symbol and only one containing the same
+owner identifier. The group symbol must be used somewhere in the tag.
+See <a href="#sec3.3.1">section 3.3.1</a>, flag j for more information.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Group ID registration', ID: "GRID"&gt;</td></tr>
+<tr><td>Owner identifier</td><td>&lt;text string&gt; $00</td></tr>
+<tr><td>Group symbol</td><td width="80%">$xx</td></tr>
+<tr><td>Group dependent data</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec4.28"> </a>
+<h3>4.28.Private frame</h3>
+<p class=t>
+This frame is used to contain information from a software producer
+that its program uses and does not fit into the other frames. The
+frame consists of an 'Owner identifier' string and the binary data.
+The 'Owner identifier' is a null-terminated string with a <a href="#URL">URL</a>
+containing an email address, or a link to a location where an email
+address can be found, that belongs to the organisation responsible
+for the frame. Questions regarding the frame should be sent to the
+indicated email address. The tag may contain more than one "PRIV"
+frame but only with different contents. It is recommended to keep the
+number of "PRIV" frames as low as possible.
+</p><p><center><table border=0 width="70%">
+<tr><td colspan=2>&lt;Header for 'Private frame', ID: "PRIV"&gt;</td></tr>
+<tr><td>Owner identifier</td><td width="80%">&lt;text string&gt; $00</td></tr>
+<tr><td>The private data</td><td>&lt;binary data&gt;</td></tr>
+</table></center></p>
+
+<a name="sec5"> </a>
+<h3>5.The 'unsynchronisation scheme'</h3>
+<p class=t>
+The only purpose of the 'unsynchronisation scheme' is to make the
+ID3v2 tag as compatible as possible with existing software. There is
+no use in 'unsynchronising' tags if the file is only to be processed
+by new software. Unsynchronisation may only be made with MPEG 2 layer
+I, II and III and MPEG 2.5 files.
+</p><p class=t>
+Whenever a false synchronisation is found within the tag, one zeroed
+byte is inserted after the first false synchronisation byte. The
+format of a correct sync that should be altered by ID3 encoders is as
+follows:
+</p><p class=ind>
+%11111111 111xxxxx
+</p><p class=t>
+And should be replaced with:
+</p><p class=ind>
+%11111111 00000000 111xxxxx
+</p><p class=t>
+This has the side effect that all $FF 00 combinations have to be
+altered, so they won't be affected by the decoding process. Therefore
+all the $FF 00 combinations have to be replaced with the $FF 00 00
+combination during the unsynchronisation.
+</p><p class=t>
+To indicate usage of the unsynchronisation, the first bit in 'ID3
+flags' should be set. This bit should only be set if the tag
+contains a, now corrected, false synchronisation. The bit should
+only be clear if the tag does not contain any false synchronisations.
+</p><p class=t>
+Do bear in mind, that if a compression scheme is used by the encoder,
+the unsynchronisation scheme should be applied *afterwards*. When
+decoding a compressed, 'unsynchronised' file, the 'unsynchronisation
+scheme' should be parsed first, decompression afterwards.
+</p><p class=t>
+If the last byte in the tag is $FF, and there is a need to eliminate
+false synchronisations in the tag, at least one byte of padding
+should be added.
+</p>
+
+<a name="sec6"> </a>
+<h3>6.Copyright</h3>
+<p class=t>
+Copyright &copy; Martin Nilsson 1998. All Rights Reserved.
+</p><p class=t>
+This document and translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it
+or assist in its implementation may be prepared, copied, published
+and distributed, in whole or in part, without restriction of any
+kind, provided that a reference to this document is included on all
+such copies and derivative works. However, this document itself may
+not be modified in any way and reissued as the original document.
+</p><p class=t>
+The limited permissions granted above are perpetual and will not be revoked.
+</p><p class=t>
+This document and the information contained herein is provided on an
+"AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+</p>
+
+
+<a name="sec7"> </a>
+<h3>7.References</h3>
+
+<a name="CDDB"> </a>
+<p class=t>[CDDB] Compact Disc Data Base</p>
+<p class=ind>&lt;url:<a href="http://www.cddb.com">http://www.cddb.com</a>&gt;</p>
+
+<a name="ID3v2"> </a>
+<p class=t>[ID3v2] Martin Nilsson, "ID3v2 informal standard".</p>
+<p class=ind>&lt;url:<a href="http://www.id3.org/id3v2-00.txt">http://www.id3.org/id3v2-00.txt</a>&gt;</p>
+
+<a name="ISO-639-2"> </a>
+<p class=t>[ISO-639-2] ISO/FDIS 639-2.<br>
+Codes for the representation of names of languages, Part 2: Alpha-3 code. Technical committee / subcommittee: TC 37 / SC 2</p>
+
+<a name="ISO-4217"> </a>
+<p class=t>[ISO-4217] ISO 4217:1995.<br>
+Codes for the representation of currencies and funds. Technical committee / subcommittee: TC 68</p>
+
+<a name="ISO-8859-1"> </a>
+<p class=t>[ISO-8859-1] ISO/IEC DIS 8859-1.<br>
+8-bit single-byte coded graphic character sets, Part 1: Latin alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2</p>
+
+<a name="ISRC"> </a>
+<p class=t>[ISRC] ISO 3901:1986<br>
+International Standard Recording Code (ISRC). Technical committee / subcommittee: TC 46 / SC 9</p>
+
+<a name="JFIF"> </a>
+<p class=t>[JFIF] JPEG File Interchange Format, version 1.02</p>
+<p class=ind>&lt;url:<a href="http://www.w3.org/Graphics/JPEG/jfif.txt">http://www.w3.org/Graphics/JPEG/jfif.txt</a>&gt;</p>
+
+<a name="MIME"> </a>
+<p class=t>[MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996.</p>
+<p class=ind>&lt;url:<a href="ftp://ftp.isi.edu/in-notes/rfc2045.txt">ftp://ftp.isi.edu/in-notes/rfc2045.txt</a>&gt;</p>
+
+<a name="MPEG"> </a>
+<p class=t>[MPEG] ISO/IEC 11172-3:1993.<br>
+Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29<br>
+&nbsp;and<br>
+ISO/IEC 13818-3:1995<br>
+Generic coding of moving pictures and associated audio information, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29<br>
+&nbsp;and<br>
+ISO/IEC DIS 13818-3<br>
+Generic coding of moving pictures and associated audio information, Part 3: Audio (Revision of ISO/IEC 13818-3:1995)</p>
+
+<a name="PNG"> </a>
+<p class=t>[PNG] Portable Network Graphics, version 1.0</p>
+<p class=ind>&lt;url:<a href="http://www.w3.org/TR/REC-png-multi.html">http://www.w3.org/TR/REC-png-multi.html</a>&gt;</p>
+
+<a name="UNICODE"> </a>
+<p class=t>[UNICODE] ISO/IEC 10646-1:1993.<br>
+Universal Multiple-Octet Coded Character Set (UCS), Part 1: Architecture and Basic Multilingual Plane. Technical committee / subcommittee: JTC 1 / SC 2</p>
+<p class=ind>&lt;url:<a href="http://www.unicode.org">http://www.unicode.org</a>&gt;</p>
+
+<a name="URL"> </a>
+<p class=t>[URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource Locators (URL).", RFC 1738, December 1994.</p>
+<p class=ind>&lt;url:<a href="ftp://ftp.isi.edu/in-notes/rfc1738.txt">ftp://ftp.isi.edu/in-notes/rfc1738.txt</a>&gt;</p>
+
+<a name="ZLIB"> </a>
+<p class=t>[ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB Compressed Data Format Specification version 3.3", RFC 1950, May 1996.</p>
+<p class=ind>&lt;url:<a href="ftp://ftp.isi.edu/in-notes/rfc1950.txt">ftp://ftp.isi.edu/in-notes/rfc1950.txt</a>&gt;</p>
+
+
+<a name="sec8"> </a>
+<h3>8.Appendix</h3>
+
+<a name="secA"> </a>
+<h3>A.Appendix A - Genre List from ID3v1</h3>
+<center><table border=0 width="70%"><tr valign=top><td>
+The following genres is defined in ID3v1
+<pre>
+ 0.Blues
+ 1.Classic Rock
+ 2.Country
+ 3.Dance
+ 4.Disco
+ 5.Funk
+ 6.Grunge
+ 7.Hip-Hop
+ 8.Jazz
+ 9.Metal
+ 10.New Age
+ 11.Oldies
+ 12.Other
+ 13.Pop
+ 14.R&B
+ 15.Rap
+ 16.Reggae
+ 17.Rock
+ 18.Techno
+ 19.Industrial
+ 20.Alternative
+ 21.Ska
+ 22.Death Metal
+ 23.Pranks
+ 24.Soundtrack
+ 25.Euro-Techno
+ 26.Ambient
+ 27.Trip-Hop
+ 28.Vocal
+ 29.Jazz+Funk
+ 30.Fusion
+ 31.Trance
+ 32.Classical
+ 33.Instrumental
+ 34.Acid
+ 35.House
+ 36.Game
+ 37.Sound Clip
+ 38.Gospel
+ 39.Noise
+ 40.AlternRock
+ 41.Bass
+ 42.Soul
+ 43.Punk
+ 44.Space
+ 45.Meditative
+ 46.Instrumental Pop
+ 47.Instrumental Rock
+ 48.Ethnic
+ 49.Gothic
+ 50.Darkwave
+ 51.Techno-Industrial
+ 52.Electronic
+ 53.Pop-Folk
+ 54.Eurodance
+ 55.Dream
+ 56.Southern Rock
+ 57.Comedy
+ 58.Cult
+ 59.Gangsta
+ 60.Top 40
+ 61.Christian Rap
+ 62.Pop/Funk
+ 63.Jungle
+ 64.Native American
+ 65.Cabaret
+ 66.New Wave
+ 67.Psychadelic
+ 68.Rave
+ 69.Showtunes
+ 70.Trailer
+ 71.Lo-Fi
+ 72.Tribal
+ 73.Acid Punk
+ 74.Acid Jazz
+ 75.Polka
+ 76.Retro
+ 77.Musical
+ 78.Rock & Roll
+ 79.Hard Rock
+</pre>
+</td><td>
+The following genres are Winamp extensions
+<pre>
+ 80.Folk
+ 81.Folk-Rock
+ 82.National Folk
+ 83.Swing
+ 84.Fast Fusion
+ 85.Bebob
+ 86.Latin
+ 87.Revival
+ 88.Celtic
+ 89.Bluegrass
+ 90.Avantgarde
+ 91.Gothic Rock
+ 92.Progressive Rock
+ 93.Psychedelic Rock
+ 94.Symphonic Rock
+ 95.Slow Rock
+ 96.Big Band
+ 97.Chorus
+ 98.Easy Listening
+ 99.Acoustic
+100.Humour
+101.Speech
+102.Chanson
+103.Opera
+104.Chamber Music
+105.Sonata
+106.Symphony
+107.Booty Bass
+108.Primus
+109.Porn Groove
+110.Satire
+111.Slow Jam
+112.Club
+113.Tango
+114.Samba
+115.Folklore
+116.Ballad
+117.Power Ballad
+118.Rhythmic Soul
+119.Freestyle
+120.Duet
+121.Punk Rock
+122.Drum Solo
+123.A capella
+124.Euro-House
+125.Dance Hall
+</pre></td></tr></table></center>
+
+<a name="sec9"> </a>
+<h3>9.Author's Address</h3>
+<p class=t>
+Written by
+</p><p class=ind>
+Martin Nilsson<br>
+Rydsvägen 246 C. 30<br>
+S-584 34 Linköping<br>
+Sweden<br>
+</p><p class=ind>
+Email: <a href="mailto:nilsson@id3.org">nilsson@id3.org</a>
+</p>
+
+<p class=t>
+Edited by
+</p><p class=ind>
+Dirk Mahoney<br>
+57 Pechey Street<br>
+Chermside Q<br>
+Australia 4032<br>
+</p><p class=ind>
+Email: <a href="mailto:dirk@id3.org">dirk@id3.org</a>
+</p>
+<p class=ind>
+Johan Sundström<br>
+Alsättersgatan 5 A. 34<br>
+S-584 35 Linköping<br>
+Sweden<br>
+</p><p class=ind>
+Email: <a href="mailto:johan@id3.org">johan@id3.org</a>
+</p>
+
+</body></html> \ No newline at end of file
diff --git a/doc/id3v2.3.0.txt b/doc/id3v2.3.0.txt
new file mode 100644
index 0000000..dee1ed9
--- /dev/null
+++ b/doc/id3v2.3.0.txt
@@ -0,0 +1,2025 @@
+
+Informal standard M. Nilsson
+Document: id3v2.3.0.txt 3rd February 1999
+
+
+ ID3 tag version 2.3.0
+
+Status of this document
+
+ This document is an informal standard and replaces the ID3v2.2.0
+ standard [ID3v2]. The informal standard is released so that
+ implementors could have a set standard before a formal standard is
+ set. The formal standard will use another version or revision number
+ if not identical to what is described in this document. The contents
+ in this document may change for clarifications but never for added or
+ altered functionallity.
+
+ Distribution of this document is unlimited.
+
+
+Abstract
+
+ This document describes the ID3v2.3.0, which is a more developed
+ version of the ID3v2 informal standard [ID3v2] (version 2.2.0),
+ evolved from the ID3 tagging system. The ID3v2 offers a flexible way
+ of storing information about an audio file within itself to determine
+ its origin and contents. The information may be technical
+ information, such as equalisation curves, as well as related meta
+ information, such as title, performer, copyright etc.
+
+
+1. Table of contents
+
+ 2. Conventions in this document
+ 3. ID3v2 overview
+ 3.1. ID3v2 header
+ 3.2. ID3v2 extended header
+ 3.3. ID3v2 frames overview
+ 3.3.1. Frame header flags
+ 3.3.2. Default flags
+ 4. Declared ID3v2 frames
+ 4.1. Unique file identifier
+ 4.2. Text information frames
+ 4.2.1. Text information frames - details
+ 4.2.2. User defined text information frame
+ 4.3. URL link frames
+ 4.3.1. URL link frames - details
+ 4.3.2. User defined URL link frame
+ 4.4. Involved people list
+ 4.5. Music CD Identifier
+ 4.6. Event timing codes
+ 4.7. MPEG location lookup table
+ 4.8. Synced tempo codes
+ 4.9. Unsychronised lyrics/text transcription
+ 4.10. Synchronised lyrics/text
+ 4.11. Comments
+ 4.12. Relative volume adjustment
+ 4.13. Equalisation
+ 4.14. Reverb
+ 4.15. Attached picture
+ 4.16. General encapsulated object
+ 4.17. Play counter
+ 4.18. Popularimeter
+ 4.19. Recommended buffer size
+ 4.20. Audio encryption
+ 4.21. Linked information
+ 4.22. Position synchronisation frame
+ 4.23. Terms of use
+ 4.24. Ownership frame
+ 4.25. Commercial frame
+ 4.26. Encryption method registration
+ 4.27. Group identification registration
+ 4.28. Private frame
+ 5. The 'unsynchronisation scheme'
+ 6. Copyright
+ 7. References
+ 8. Appendix
+ A. Appendix A - Genre List from ID3v1
+ 9. Author's Address
+
+
+2. Conventions in this document
+
+ In the examples, text within "" is a text string exactly as it
+ appears in a file. Numbers preceded with $ are hexadecimal and
+ numbers preceded with % are binary. $xx is used to indicate a byte
+ with unknown content. %x is used to indicate a bit with unknown
+ content. The most significant bit (MSB) of a byte is called 'bit 7'
+ and the least significant bit (LSB) is called 'bit 0'.
+
+ A tag is the whole tag described in this document. A frame is a block
+ of information in the tag. The tag consists of a header, frames and
+ optional padding. A field is a piece of information; one value, a
+ string etc. A numeric string is a string that consists of the
+ characters 0-9 only.
+
+
+3. ID3v2 overview
+
+ The two biggest design goals were to be able to implement ID3v2
+ without disturbing old software too much and that ID3v2 should be
+ as flexible and expandable as possible.
+
+ The first criterion is met by the simple fact that the MPEG [MPEG]
+ decoding software uses a syncsignal, embedded in the audiostream, to
+ 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid
+ syncsignal, no software will attempt to play the tag. If, for any
+ reason, coincidence make a syncsignal appear within the tag it will
+ be taken care of by the 'unsynchronisation scheme' described in
+ section 5.
+
+ The second criterion has made a more noticeable impact on the design
+ of the ID3v2 tag. It is constructed as a container for several
+ information blocks, called frames, whose format need not be known to
+ the software that encounters them. At the start of every frame there
+ is an identifier that explains the frames' format and content, and a
+ size descriptor that allows software to skip unknown frames.
+
+ If a total revision of the ID3v2 tag should be needed, there is a
+ version number and a size descriptor in the ID3v2 header.
+
+ The ID3 tag described in this document is mainly targeted at files
+ encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III
+ and MPEG-2.5, but may work with other types of encoded audio.
+
+ The bitorder in ID3v2 is most significant bit first (MSB). The
+ byteorder in multibyte numbers is most significant byte first (e.g.
+ $12345678 would be encoded $12 34 56 78).
+
+ It is permitted to include padding after all the final frame (at the
+ end of the ID3 tag), making the size of all the frames together
+ smaller than the size given in the head of the tag. A possible
+ purpose of this padding is to allow for adding a few additional
+ frames or enlarge existing frames within the tag without having to
+ rewrite the entire file. The value of the padding bytes must be $00.
+
+
+3.1. ID3v2 header
+
+ The ID3v2 tag header, which should be the first information in the
+ file, is 10 bytes as follows:
+
+ ID3v2/file identifier "ID3"
+ ID3v2 version $03 00
+ ID3v2 flags %abc00000
+ ID3v2 size 4 * %0xxxxxxx
+
+ The first three bytes of the tag are always "ID3" to indicate that
+ this is an ID3v2 tag, directly followed by the two version bytes. The
+ first byte of ID3v2 version is it's major version, while the second
+ byte is its revision number. In this case this is ID3v2.3.0. All
+ revisions are backwards compatible while major versions are not. If
+ software with ID3v2.2.0 and below support should encounter version
+ three or higher it should simply ignore the whole tag. Version and
+ revision will never be $FF.
+
+ The version is followed by one the ID3v2 flags field, of which
+ currently only three flags are used.
+
+
+ a - Unsynchronisation
+
+ Bit 7 in the 'ID3v2 flags' indicates whether or not
+ unsynchronisation is used (see section 5 for details); a set bit
+ indicates usage.
+
+
+ b - Extended header
+
+ The second bit (bit 6) indicates whether or not the header is
+ followed by an extended header. The extended header is described in
+ section 3.2.
+
+
+ c - Experimental indicator
+
+ The third bit (bit 5) should be used as an 'experimental
+ indicator'. This flag should always be set when the tag is in an
+ experimental stage.
+
+ All the other flags should be cleared. If one of these undefined
+ flags are set that might mean that the tag is not readable for a
+ parser that does not know the flags function.
+
+ The ID3v2 tag size is encoded with four bytes where the most
+ significant bit (bit 7) is set to zero in every byte, making a total
+ of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is
+ represented as $00 00 02 01.
+
+ The ID3v2 tag size is the size of the complete tag after
+ unsychronisation, including padding, excluding the header but not
+ excluding the extended header (total tag size - 10). Only 28 bits
+ (representing up to 256MB) are used in the size description to avoid
+ the introducuction of 'false syncsignals'.
+
+ An ID3v2 tag can be detected with the following pattern:
+ $49 44 33 yy yy xx zz zz zz zz
+ Where yy is less than $FF, xx is the 'flags' byte and zz is less than
+ $80.
+
+
+3.2. ID3v2 extended header
+
+ The extended header contains information that is not vital to the
+ correct parsing of the tag information, hence the extended header is
+ optional.
+
+ Extended header size $xx xx xx xx
+ Extended Flags $xx xx
+ Size of padding $xx xx xx xx
+
+ Where the 'Extended header size', currently 6 or 10 bytes, excludes
+ itself. The 'Size of padding' is simply the total tag size excluding
+ the frames and the headers, in other words the padding. The extended
+ header is considered separate from the header proper, and as such is
+ subject to unsynchronisation.
+
+ The extended flags are a secondary flag set which describes further
+ attributes of the tag. These attributes are currently defined as
+ follows
+
+ %x0000000 00000000
+
+
+ x - CRC data present
+
+ If this flag is set four bytes of CRC-32 data is appended to the
+ extended header. The CRC should be calculated before
+ unsynchronisation on the data between the extended header and the
+ padding, i.e. the frames and only the frames.
+
+ Total frame CRC $xx xx xx xx
+
+
+3.3. ID3v2 frame overview
+
+ As the tag consists of a tag header and a tag body with one or more
+ frames, all the frames consists of a frame header followed by one or
+ more fields containing the actual information. The layout of the
+ frame header:
+
+ Frame ID $xx xx xx xx (four characters)
+ Size $xx xx xx xx
+ Flags $xx xx
+
+ The frame ID made out of the characters capital A-Z and 0-9.
+ Identifiers beginning with "X", "Y" and "Z" are for experimental use
+ and free for everyone to use, without the need to set the
+ experimental bit in the tag header. Have in mind that someone else
+ might have used the same identifier as you. All other identifiers are
+ either used or reserved for future use.
+
+ The frame ID is followed by a size descriptor, making a total header
+ size of ten bytes in every frame. The size is calculated as frame
+ size excluding frame header (frame size - 10).
+
+ In the frame header the size descriptor is followed by two flags
+ bytes. These flags are described in section 3.3.1.
+
+ There is no fixed order of the frames' appearance in the tag,
+ although it is desired that the frames are arranged in order of
+ significance concerning the recognition of the file. An example of
+ such order: UFID, TIT2, MCDI, TRCK ...
+
+ A tag must contain at least one frame. A frame must be at least 1
+ byte big, excluding the header.
+
+ If nothing else is said a string is represented as ISO-8859-1
+ [ISO-8859-1] characters in the range $20 - $FF. Such strings are
+ represented as <text string>, or <full text string> if newlines are
+ allowed, in the frame descriptions. All Unicode strings [UNICODE] use
+ 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings
+ must begin with the Unicode BOM ($FF FE or $FE FF) to identify the
+ byte order.
+
+ All numeric strings and URLs [URL] are always encoded as ISO-8859-1.
+ Terminated strings are terminated with $00 if encoded with ISO-8859-1
+ and $00 00 if encoded as unicode. If nothing else is said newline
+ character is forbidden. In ISO-8859-1 a new line is represented, when
+ allowed, with $0A only. Frames that allow different types of text
+ encoding have a text encoding description byte directly after the
+ frame size. If ISO-8859-1 is used this byte should be $00, if Unicode
+ is used it should be $01. Strings dependent on encoding is
+ represented as <text string according to encoding>, or <full text
+ string according to encoding> if newlines are allowed. Any empty
+ Unicode strings which are NULL-terminated may have the Unicode BOM
+ followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00).
+
+ The three byte language field is used to describe the language of the
+ frame's content, according to ISO-639-2 [ISO-639-2].
+
+ All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt".
+
+ If a frame is longer than it should be, e.g. having more fields than
+ specified in this document, that indicates that additions to the
+ frame have been made in a later version of the ID3v2 standard. This
+ is reflected by the revision number in the header of the tag.
+
+
+3.3.1. Frame header flags
+
+ In the frame header the size descriptor is followed by two flags
+ bytes. All unused flags must be cleared. The first byte is for
+ 'status messages' and the second byte is for encoding purposes. If an
+ unknown flag is set in the first byte the frame may not be changed
+ without the bit cleared. If an unknown flag is set in the second byte
+ it is likely to not be readable. The flags field is defined as
+ follows.
+
+ %abc00000 %ijk00000
+
+
+ a - Tag alter preservation
+
+ This flag tells the software what to do with this frame if it is
+ unknown and the tag is altered in any way. This applies to all
+ kinds of alterations, including adding more padding and reordering
+ the frames.
+
+ 0 Frame should be preserved.
+ 1 Frame should be discarded.
+
+
+ b - File alter preservation
+
+ This flag tells the software what to do with this frame if it is
+ unknown and the file, excluding the tag, is altered. This does not
+ apply when the audio is completely replaced with other audio data.
+
+ 0 Frame should be preserved.
+ 1 Frame should be discarded.
+
+
+ c - Read only
+
+ This flag, if set, tells the software that the contents of this
+ frame is intended to be read only. Changing the contents might
+ break something, e.g. a signature. If the contents are changed,
+ without knowledge in why the frame was flagged read only and
+ without taking the proper means to compensate, e.g. recalculating
+ the signature, the bit should be cleared.
+
+
+ i - Compression
+
+ This flag indicates whether or not the frame is compressed.
+
+ 0 Frame is not compressed.
+ 1 Frame is compressed using zlib [zlib] with 4 bytes for
+ 'decompressed size' appended to the frame header.
+
+
+ j - Encryption
+
+ This flag indicates wether or not the frame is enrypted. If set
+ one byte indicating with which method it was encrypted will be
+ appended to the frame header. See section 4.26. for more
+ information about encryption method registration.
+
+ 0 Frame is not encrypted.
+ 1 Frame is encrypted.
+
+
+ k - Grouping identity
+
+ This flag indicates whether or not this frame belongs in a group
+ with other frames. If set a group identifier byte is added to the
+ frame header. Every frame with the same group identifier belongs
+ to the same group.
+
+ 0 Frame does not contain group information
+ 1 Frame contains group information
+
+
+ Some flags indicates that the frame header is extended with
+ additional information. This information will be added to the frame
+ header in the same order as the flags indicating the additions. I.e.
+ the four bytes of decompressed size will preceed the encryption
+ method byte. These additions to the frame header, while not included
+ in the frame header size but are included in the 'frame size' field,
+ are not subject to encryption or compression.
+
+
+3.3.2. Default flags
+
+ The default settings for the frames described in this document can be
+ divided into the following classes. The flags may be set differently
+ if found more suitable by the software.
+
+ 1. Discarded if tag is altered, discarded if file is altered.
+
+ None.
+
+ 2. Discarded if tag is altered, preserved if file is altered.
+
+ None.
+
+ 3. Preserved if tag is altered, discarded if file is altered.
+
+ AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN, TSIZ
+
+ 4. Preserved if tag is altered, preserved if file is altered.
+
+ The rest of the frames.
+
+
+4. Declared ID3v2 frames
+
+ The following frames are declared in this draft.
+
+ 4.21 AENC Audio encryption
+ 4.15 APIC Attached picture
+
+ 4.11 COMM Comments
+ 4.25 COMR Commercial frame
+
+ 4.26 ENCR Encryption method registration
+ 4.13 EQUA Equalization
+ 4.6 ETCO Event timing codes
+
+ 4.16 GEOB General encapsulated object
+ 4.27 GRID Group identification registration
+
+ 4.4 IPLS Involved people list
+
+ 4.21 LINK Linked information
+
+ 4.5 MCDI Music CD identifier
+ 4.7 MLLT MPEG location lookup table
+
+ 4.24 OWNE Ownership frame
+
+ 4.28. PRIV Private frame
+ 4.17 PCNT Play counter
+ 4.18 POPM Popularimeter
+ 4.22 POSS Position synchronisation frame
+
+ 4.19 RBUF Recommended buffer size
+ 4.12 RVAD Relative volume adjustment
+ 4.14 RVRB Reverb
+
+ 4.10 SYLT Synchronized lyric/text
+ 4.8 SYTC Synchronized tempo codes
+
+ 4.2.1 TALB Album/Movie/Show title
+ 4.2.1 TBPM BPM (beats per minute)
+ 4.2.1 TCOM Composer
+ 4.2.1 TCON Content type
+ 4.2.1 TCOP Copyright message
+ 4.2.1 TDAT Date
+ 4.2.1 TDLY Playlist delay
+ 4.2.1 TENC Encoded by
+ 4.2.1 TEXT Lyricist/Text writer
+ 4.2.1 TFLT File type
+ 4.2.1 TIME Time
+ 4.2.1 TIT1 Content group description
+ 4.2.1 TIT2 Title/songname/content description
+ 4.2.1 TIT3 Subtitle/Description refinement
+ 4.2.1 TKEY Initial key
+ 4.2.1 TLAN Language(s)
+ 4.2.1 TLEN Length
+ 4.2.1 TMED Media type
+ 4.2.1 TOAL Original album/movie/show title
+ 4.2.1 TOFN Original filename
+ 4.2.1 TOLY Original lyricist(s)/text writer(s)
+ 4.2.1 TOPE Original artist(s)/performer(s)
+ 4.2.1 TORY Original release year
+ 4.2.1 TOWN File owner/licensee
+ 4.2.1 TPE1 Lead performer(s)/Soloist(s)
+ 4.2.1 TPE2 Band/orchestra/accompaniment
+ 4.2.1 TPE3 Conductor/performer refinement
+ 4.2.1 TPE4 Interpreted, remixed, or otherwise modified by
+ 4.2.1 TPOS Part of a set
+ 4.2.1 TPUB Publisher
+ 4.2.1 TRCK Track number/Position in set
+ 4.2.1 TRDA Recording dates
+ 4.2.1 TRSN Internet radio station name
+ 4.2.1 TRSO Internet radio station owner
+ 4.2.1 TSIZ Size
+ 4.2.1 TSRC ISRC (international standard recording code)
+ 4.2.1 TSSE Software/Hardware and settings used for encoding
+ 4.2.1 TYER Year
+ 4.2.2 TXXX User defined text information frame
+
+ 4.1 UFID Unique file identifier
+ 4.23 USER Terms of use
+ 4.9 USLT Unsychronized lyric/text transcription
+
+ 4.3.1 WCOM Commercial information
+ 4.3.1 WCOP Copyright/Legal information
+ 4.3.1 WOAF Official audio file webpage
+ 4.3.1 WOAR Official artist/performer webpage
+ 4.3.1 WOAS Official audio source webpage
+ 4.3.1 WORS Official internet radio station homepage
+ 4.3.1 WPAY Payment
+ 4.3.1 WPUB Publishers official webpage
+ 4.3.2 WXXX User defined URL link frame
+
+
+4.1. Unique file identifier
+
+ This frame's purpose is to be able to identify the audio file in a
+ database that may contain more information relevant to the content.
+ Since standardisation of such a database is beyond this document, all
+ frames begin with a null-terminated string with a URL [URL]
+ containing an email address, or a link to a location where an email
+ address can be found, that belongs to the organisation responsible
+ for this specific database implementation. Questions regarding the
+ database should be sent to the indicated email address. The URL
+ should not be used for the actual database queries. The string
+ "http://www.id3.org/dummy/ufid.html" should be used for tests.
+ Software that isn't told otherwise may safely remove such frames. The
+ 'Owner identifier' must be non-empty (more than just a termination).
+ The 'Owner identifier' is then followed by the actual identifier,
+ which may be up to 64 bytes. There may be more than one "UFID" frame
+ in a tag, but only one with the same 'Owner identifier'.
+
+ <Header for 'Unique file identifier', ID: "UFID">
+ Owner identifier <text string> $00
+ Identifier <up to 64 bytes binary data>
+
+
+4.2. Text information frames
+
+ The text information frames are the most important frames, containing
+ information like artist, album and more. There may only be one text
+ information frame of its kind in an tag. If the textstring is
+ followed by a termination ($00 (00)) all the following information
+ should be ignored and not be displayed. All text frame identifiers
+ begin with "T". Only text frame identifiers begin with "T", with the
+ exception of the "TXXX" frame. All the text information frames have
+ the following format:
+
+ <Header for 'Text information frame', ID: "T000" - "TZZZ",
+ excluding "TXXX" described in 4.2.2.>
+ Text encoding $xx
+ Information <text string according to encoding>
+
+
+4.2.1. Text information frames - details
+
+ TALB
+ The 'Album/Movie/Show title' frame is intended for the title of the
+ recording(/source of sound) which the audio in the file is taken
+ from.
+
+ TBPM
+ The 'BPM' frame contains the number of beats per minute in the
+ mainpart of the audio. The BPM is an integer and represented as a
+ numerical string.
+
+ TCOM
+ The 'Composer(s)' frame is intended for the name of the composer(s).
+ They are seperated with the "/" character.
+
+ TCON
+ The 'Content type', which previously was stored as a one byte numeric
+ value only, is now a numeric string. You may use one or several of
+ the types as ID3v1.1 did or, since the category list would be
+ impossible to maintain with accurate and up to date categories,
+ define your own.
+
+ References to the ID3v1 genres can be made by, as first byte, enter
+ "(" followed by a number from the genres list (appendix A.) and
+ ended with a ")" character. This is optionally followed by a
+ refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be
+ made in the same frame, e.g. "(51)(39)". If the refinement should
+ begin with a "(" character it should be replaced with "((", e.g. "((I
+ can figure out any genre)" or "(55)((I think...)". The following new
+ content types is defined in ID3v2 and is implemented in the same way
+ as the numerig content types, e.g. "(RX)".
+
+ RX Remix
+ CR Cover
+
+ TCOP
+ The 'Copyright message' frame, which must begin with a year and a
+ space character (making five characters), is intended for the
+ copyright holder of the original sound, not the audio file itself.
+ The absence of this frame means only that the copyright information
+ is unavailable or has been removed, and must not be interpreted to
+ mean that the sound is public domain. Every time this field is
+ displayed the field must be preceded with "Copyright " (C) " ", where
+ (C) is one character showing a C in a circle.
+
+ TDAT
+ The 'Date' frame is a numeric string in the DDMM format containing
+ the date for the recording. This field is always four characters
+ long.
+
+ TDLY
+ The 'Playlist delay' defines the numbers of milliseconds of silence
+ between every song in a playlist. The player should use the "ETC"
+ frame, if present, to skip initial silence and silence at the end of
+ the audio to match the 'Playlist delay' time. The time is represented
+ as a numeric string.
+
+ TENC
+ The 'Encoded by' frame contains the name of the person or
+ organisation that encoded the audio file. This field may contain a
+ copyright message, if the audio file also is copyrighted by the
+ encoder.
+
+ TEXT
+ The 'Lyricist(s)/Text writer(s)' frame is intended for the writer(s)
+ of the text or lyrics in the recording. They are seperated with the
+ "/" character.
+
+ TFLT
+ The 'File type' frame indicates which type of audio this tag defines.
+ The following type and refinements are defined:
+
+ MPG MPEG Audio
+ /1 MPEG 1/2 layer I
+ /2 MPEG 1/2 layer II
+ /3 MPEG 1/2 layer III
+ /2.5 MPEG 2.5
+ /AAC Advanced audio compression
+ VQF Transform-domain Weighted Interleave Vector Quantization
+ PCM Pulse Code Modulated audio
+
+ but other types may be used, not for these types though. This is used
+ in a similar way to the predefined types in the "TMED" frame, but
+ without parentheses. If this frame is not present audio type is
+ assumed to be "MPG".
+
+ TIME
+ The 'Time' frame is a numeric string in the HHMM format containing
+ the time for the recording. This field is always four characters
+ long.
+
+ TIT1
+ The 'Content group description' frame is used if the sound belongs to
+ a larger category of sounds/music. For example, classical music is
+ often sorted in different musical sections (e.g. "Piano Concerto",
+ "Weather - Hurricane").
+
+ TIT2
+ The 'Title/Songname/Content description' frame is the actual name of
+ the piece (e.g. "Adagio", "Hurricane Donna").
+
+ TIT3
+ The 'Subtitle/Description refinement' frame is used for information
+ directly related to the contents title (e.g. "Op. 16" or "Performed
+ live at Wembley").
+
+ TKEY
+ The 'Initial key' frame contains the musical key in which the sound
+ starts. It is represented as a string with a maximum length of three
+ characters. The ground keys are represented with "A","B","C","D","E",
+ "F" and "G" and halfkeys represented with "b" and "#". Minor is
+ represented as "m". Example "Cbm". Off key is represented with an "o"
+ only.
+
+ TLAN
+ The 'Language(s)' frame should contain the languages of the text or
+ lyrics spoken or sung in the audio. The language is represented with
+ three characters according to ISO-639-2. If more than one language is
+ used in the text their language codes should follow according to
+ their usage.
+
+ TLEN
+ The 'Length' frame contains the length of the audiofile in
+ milliseconds, represented as a numeric string.
+
+ TMED
+ The 'Media type' frame describes from which media the sound
+ originated. This may be a text string or a reference to the
+ predefined media types found in the list below. References are made
+ within "(" and ")" and are optionally followed by a text refinement,
+ e.g. "(MC) with four channels". If a text refinement should begin
+ with a "(" character it should be replaced with "((" in the same way
+ as in the "TCO" frame. Predefined refinements is appended after the
+ media type, e.g. "(CD/A)" or "(VID/PAL/VHS)".
+
+ DIG Other digital media
+ /A Analog transfer from media
+
+ ANA Other analog media
+ /WAC Wax cylinder
+ /8CA 8-track tape cassette
+
+ CD CD
+ /A Analog transfer from media
+ /DD DDD
+ /AD ADD
+ /AA AAD
+
+ LD Laserdisc
+ /A Analog transfer from media
+
+ TT Turntable records
+ /33 33.33 rpm
+ /45 45 rpm
+ /71 71.29 rpm
+ /76 76.59 rpm
+ /78 78.26 rpm
+ /80 80 rpm
+
+ MD MiniDisc
+ /A Analog transfer from media
+
+ DAT DAT
+ /A Analog transfer from media
+ /1 standard, 48 kHz/16 bits, linear
+ /2 mode 2, 32 kHz/16 bits, linear
+ /3 mode 3, 32 kHz/12 bits, nonlinear, low speed
+ /4 mode 4, 32 kHz/12 bits, 4 channels
+ /5 mode 5, 44.1 kHz/16 bits, linear
+ /6 mode 6, 44.1 kHz/16 bits, 'wide track' play
+
+ DCC DCC
+ /A Analog transfer from media
+
+ DVD DVD
+ /A Analog transfer from media
+
+ TV Television
+ /PAL PAL
+ /NTSC NTSC
+ /SECAM SECAM
+
+ VID Video
+ /PAL PAL
+ /NTSC NTSC
+ /SECAM SECAM
+ /VHS VHS
+ /SVHS S-VHS
+ /BETA BETAMAX
+
+ RAD Radio
+ /FM FM
+ /AM AM
+ /LW LW
+ /MW MW
+
+ TEL Telephone
+ /I ISDN
+
+ MC MC (normal cassette)
+ /4 4.75 cm/s (normal speed for a two sided cassette)
+ /9 9.5 cm/s
+ /I Type I cassette (ferric/normal)
+ /II Type II cassette (chrome)
+ /III Type III cassette (ferric chrome)
+ /IV Type IV cassette (metal)
+
+ REE Reel
+ /9 9.5 cm/s
+ /19 19 cm/s
+ /38 38 cm/s
+ /76 76 cm/s
+ /I Type I cassette (ferric/normal)
+ /II Type II cassette (chrome)
+ /III Type III cassette (ferric chrome)
+ /IV Type IV cassette (metal)
+
+ TOAL
+ The 'Original album/movie/show title' frame is intended for the title
+ of the original recording (or source of sound), if for example the
+ music in the file should be a cover of a previously released song.
+
+ TOFN
+ The 'Original filename' frame contains the preferred filename for the
+ file, since some media doesn't allow the desired length of the
+ filename. The filename is case sensitive and includes its suffix.
+
+ TOLY
+ The 'Original lyricist(s)/text writer(s)' frame is intended for the
+ text writer(s) of the original recording, if for example the music in
+ the file should be a cover of a previously released song. The text
+ writers are seperated with the "/" character.
+
+ TOPE
+ The 'Original artist(s)/performer(s)' frame is intended for the
+ performer(s) of the original recording, if for example the music in
+ the file should be a cover of a previously released song. The
+ performers are seperated with the "/" character.
+
+ TORY
+ The 'Original release year' frame is intended for the year when the
+ original recording, if for example the music in the file should be a
+ cover of a previously released song, was released. The field is
+ formatted as in the "TYER" frame.
+
+ TOWN
+ The 'File owner/licensee' frame contains the name of the owner or
+ licensee of the file and it's contents.
+
+ TPE1
+ The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is
+ used for the main artist(s). They are seperated with the "/"
+ character.
+
+ TPE2
+ The 'Band/Orchestra/Accompaniment' frame is used for additional
+ information about the performers in the recording.
+
+ TPE3
+ The 'Conductor' frame is used for the name of the conductor.
+
+ TPE4
+ The 'Interpreted, remixed, or otherwise modified by' frame contains
+ more information about the people behind a remix and similar
+ interpretations of another existing piece.
+
+ TPOS
+ The 'Part of a set' frame is a numeric string that describes which
+ part of a set the audio came from. This frame is used if the source
+ described in the "TALB" frame is divided into several mediums, e.g. a
+ double CD. The value may be extended with a "/" character and a
+ numeric string containing the total number of parts in the set. E.g.
+ "1/2".
+
+ TPUB
+ The 'Publisher' frame simply contains the name of the label or
+ publisher.
+
+ TRCK
+ The 'Track number/Position in set' frame is a numeric string
+ containing the order number of the audio-file on its original
+ recording. This may be extended with a "/" character and a numeric
+ string containing the total numer of tracks/elements on the original
+ recording. E.g. "4/9".
+
+ TRDA
+ The 'Recording dates' frame is a intended to be used as complement to
+ the "TYER", "TDAT" and "TIME" frames. E.g. "4th-7th June, 12th June"
+ in combination with the "TYER" frame.
+
+ TRSN
+ The 'Internet radio station name' frame contains the name of the
+ internet radio station from which the audio is streamed.
+
+ TRSO
+ The 'Internet radio station owner' frame contains the name of the
+ owner of the internet radio station from which the audio is
+ streamed.
+
+ TSIZ
+ The 'Size' frame contains the size of the audiofile in bytes,
+ excluding the ID3v2 tag, represented as a numeric string.
+
+ TSRC
+ The 'ISRC' frame should contain the International Standard Recording
+ Code [ISRC] (12 characters).
+
+ TSSE
+ The 'Software/Hardware and settings used for encoding' frame
+ includes the used audio encoder and its settings when the file was
+ encoded. Hardware refers to hardware encoders, not the computer on
+ which a program was run.
+
+ TYER
+ The 'Year' frame is a numeric string with a year of the recording.
+ This frames is always four characters long (until the year 10000).
+
+
+4.2.2. User defined text information frame
+
+ This frame is intended for one-string text information concerning the
+ audiofile in a similar way to the other "T"-frames. The frame body
+ consists of a description of the string, represented as a terminated
+ string, followed by the actual string. There may be more than one
+ "TXXX" frame in each tag, but only one with the same description.
+
+ <Header for 'User defined text information frame', ID: "TXXX">
+ Text encoding $xx
+ Description <text string according to encoding> $00 (00)
+ Value <text string according to encoding>
+
+
+4.3. URL link frames
+
+ With these frames dynamic data such as webpages with touring
+ information, price information or plain ordinary news can be added to
+ the tag. There may only be one URL [URL] link frame of its kind in an
+ tag, except when stated otherwise in the frame description. If the
+ textstring is followed by a termination ($00 (00)) all the following
+ information should be ignored and not be displayed. All URL link
+ frame identifiers begins with "W". Only URL link frame identifiers
+ begins with "W". All URL link frames have the following format:
+
+ <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX"
+ described in 4.3.2.>
+ URL <text string>
+
+
+4.3.1. URL link frames - details
+
+ WCOM
+ The 'Commercial information' frame is a URL pointing at a webpage
+ with information such as where the album can be bought. There may be
+ more than one "WCOM" frame in a tag, but not with the same content.
+
+ WCOP
+ The 'Copyright/Legal information' frame is a URL pointing at a
+ webpage where the terms of use and ownership of the file is
+ described.
+
+ WOAF
+ The 'Official audio file webpage' frame is a URL pointing at a file
+ specific webpage.
+
+ WOAR
+ The 'Official artist/performer webpage' frame is a URL pointing at
+ the artists official webpage. There may be more than one "WOAR" frame
+ in a tag if the audio contains more than one performer, but not with
+ the same content.
+
+ WOAS
+ The 'Official audio source webpage' frame is a URL pointing at the
+ official webpage for the source of the audio file, e.g. a movie.
+
+ WORS
+ The 'Official internet radio station homepage' contains a URL
+ pointing at the homepage of the internet radio station.
+
+ WPAY
+ The 'Payment' frame is a URL pointing at a webpage that will handle
+ the process of paying for this file.
+
+ WPUB
+ The 'Publishers official webpage' frame is a URL pointing at the
+ official wepage for the publisher.
+
+
+4.3.2. User defined URL link frame
+
+ This frame is intended for URL [URL] links concerning the audiofile
+ in a similar way to the other "W"-frames. The frame body consists
+ of a description of the string, represented as a terminated string,
+ followed by the actual URL. The URL is always encoded with ISO-8859-1
+ [ISO-8859-1]. There may be more than one "WXXX" frame in each tag,
+ but only one with the same description.
+
+ <Header for 'User defined URL link frame', ID: "WXXX">
+ Text encoding $xx
+ Description <text string according to encoding> $00 (00)
+ URL <text string>
+
+
+4.4. Involved people list
+
+ Since there might be a lot of people contributing to an audio file in
+ various ways, such as musicians and technicians, the 'Text
+ information frames' are often insufficient to list everyone involved
+ in a project. The 'Involved people list' is a frame containing the
+ names of those involved, and how they were involved. The body simply
+ contains a terminated string with the involvement directly followed
+ by a terminated string with the involvee followed by a new
+ involvement and so on. There may only be one "IPLS" frame in each
+ tag.
+
+ <Header for 'Involved people list', ID: "IPLS">
+ Text encoding $xx
+ People list strings <text strings according to encoding>
+
+
+4.5. Music CD identifier
+
+ This frame is intended for music that comes from a CD, so that the CD
+ can be identified in databases such as the CDDB [CDDB]. The frame
+ consists of a binary dump of the Table Of Contents, TOC, from the CD,
+ which is a header of 4 bytes and then 8 bytes/track on the CD plus 8
+ bytes for the 'lead out' making a maximum of 804 bytes. The offset to
+ the beginning of every track on the CD should be described with a
+ four bytes absolute CD-frame address per track, and not with absolute
+ time. This frame requires a present and valid "TRCK" frame, even if
+ the CD's only got one track. There may only be one "MCDI" frame in
+ each tag.
+
+ <Header for 'Music CD identifier', ID: "MCDI">
+ CD TOC <binary data>
+
+
+4.6. Event timing codes
+
+ This frame allows synchronisation with key events in a song or sound.
+ The header is:
+
+ <Header for 'Event timing codes', ID: "ETCO">
+ Time stamp format $xx
+
+ Where time stamp format is:
+
+ $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+
+ Abolute time means that every stamp contains the time from the
+ beginning of the file.
+
+ Followed by a list of key events in the following format:
+
+ Type of event $xx
+ Time stamp $xx (xx ...)
+
+ The 'Time stamp' is set to zero if directly at the beginning of the
+ sound or after the previous event. All events should be sorted in
+ chronological order. The type of event is as follows:
+
+ $00 padding (has no meaning)
+ $01 end of initial silence
+ $02 intro start
+ $03 mainpart start
+ $04 outro start
+ $05 outro end
+ $06 verse start
+ $07 refrain start
+ $08 interlude start
+ $09 theme start
+ $0A variation start
+ $0B key change
+ $0C time change
+ $0D momentary unwanted noise (Snap, Crackle & Pop)
+ $0E sustained noise
+ $0F sustained noise end
+ $10 intro end
+ $11 mainpart end
+ $12 verse end
+ $13 refrain end
+ $14 theme end
+
+ $15-$DF reserved for future use
+
+ $E0-$EF not predefined sync 0-F
+
+ $F0-$FC reserved for future use
+
+ $FD audio end (start of silence)
+ $FE audio file ends
+ $FF one more byte of events follows (all the following bytes with
+ the value $FF have the same function)
+
+ Terminating the start events such as "intro start" is not required.
+ The 'Not predefined sync's ($E0-EF) are for user events. You might
+ want to synchronise your music to something, like setting of an
+ explosion on-stage, turning on your screensaver etc.
+
+ There may only be one "ETCO" frame in each tag.
+
+
+4.7. MPEG location lookup table
+
+ To increase performance and accuracy of jumps within a MPEG [MPEG]
+ audio file, frames with timecodes in different locations in the file
+ might be useful. The ID3v2 frame includes references that the
+ software can use to calculate positions in the file. After the frame
+ header is a descriptor of how much the 'frame counter' should
+ increase for every reference. If this value is two then the first
+ reference points out the second frame, the 2nd reference the 4th
+ frame, the 3rd reference the 6th frame etc. In a similar way the
+ 'bytes between reference' and 'milliseconds between reference' points
+ out bytes and milliseconds respectively.
+
+ Each reference consists of two parts; a certain number of bits, as
+ defined in 'bits for bytes deviation', that describes the difference
+ between what is said in 'bytes between reference' and the reality and
+ a certain number of bits, as defined in 'bits for milliseconds
+ deviation', that describes the difference between what is said in
+ 'milliseconds between reference' and the reality. The number of bits
+ in every reference, i.e. 'bits for bytes deviation'+'bits for
+ milliseconds deviation', must be a multiple of four. There may only
+ be one "MLLT" frame in each tag.
+
+ <Header for 'Location lookup table', ID: "MLLT">
+ MPEG frames between reference $xx xx
+ Bytes between reference $xx xx xx
+ Milliseconds between reference $xx xx xx
+ Bits for bytes deviation $xx
+ Bits for milliseconds dev. $xx
+
+ Then for every reference the following data is included;
+
+ Deviation in bytes %xxx....
+ Deviation in milliseconds %xxx....
+
+
+4.8. Synchronised tempo codes
+
+ For a more accurate description of the tempo of a musical piece this
+ frame might be used. After the header follows one byte describing
+ which time stamp format should be used. Then follows one or more
+ tempo codes. Each tempo code consists of one tempo part and one time
+ part. The tempo is in BPM described with one or two bytes. If the
+ first byte has the value $FF, one more byte follows, which is added
+ to the first giving a range from 2 - 510 BPM, since $00 and $01 is
+ reserved. $00 is used to describe a beat-free time period, which is
+ not the same as a music-free time period. $01 is used to indicate one
+ single beat-stroke followed by a beat-free period.
+
+ The tempo descriptor is followed by a time stamp. Every time the
+ tempo in the music changes, a tempo descriptor may indicate this for
+ the player. All tempo descriptors should be sorted in chronological
+ order. The first beat-stroke in a time-period is at the same time as
+ the beat description occurs. There may only be one "SYTC" frame in
+ each tag.
+
+ <Header for 'Synchronised tempo codes', ID: "SYTC">
+ Time stamp format $xx
+ Tempo data <binary data>
+
+ Where time stamp format is:
+
+ $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+
+ Abolute time means that every stamp contains the time from the
+ beginning of the file.
+
+
+4.9. Unsychronised lyrics/text transcription
+
+ This frame contains the lyrics of the song or a text transcription of
+ other vocal activities. The head includes an encoding descriptor and
+ a content descriptor. The body consists of the actual text. The
+ 'Content descriptor' is a terminated string. If no descriptor is
+ entered, 'Content descriptor' is $00 (00) only. Newline characters
+ are allowed in the text. There may be more than one 'Unsynchronised
+ lyrics/text transcription' frame in each tag, but only one with the
+ same language and content descriptor.
+
+ <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT">
+ Text encoding $xx
+ Language $xx xx xx
+ Content descriptor <text string according to encoding> $00 (00)
+ Lyrics/text <full text string according to encoding>
+
+
+4.10. Synchronised lyrics/text
+
+ This is another way of incorporating the words, said or sung lyrics,
+ in the audio file as text, this time, however, in sync with the
+ audio. It might also be used to describing events e.g. occurring on a
+ stage or on the screen in sync with the audio. The header includes a
+ content descriptor, represented with as terminated textstring. If no
+ descriptor is entered, 'Content descriptor' is $00 (00) only.
+
+ <Header for 'Synchronised lyrics/text', ID: "SYLT">
+ Text encoding $xx
+ Language $xx xx xx
+ Time stamp format $xx
+ Content type $xx
+ Content descriptor <text string according to encoding> $00 (00)
+
+
+ Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00
+ is sync identifier.
+ $01 Unicode [UNICODE] character set is used => $00 00 is
+ sync identifier.
+
+ Content type: $00 is other
+ $01 is lyrics
+ $02 is text transcription
+ $03 is movement/part name (e.g. "Adagio")
+ $04 is events (e.g. "Don Quijote enters the stage")
+ $05 is chord (e.g. "Bb F Fsus")
+ $06 is trivia/'pop up' information
+
+ Time stamp format is:
+
+ $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+
+ Abolute time means that every stamp contains the time from the
+ beginning of the file.
+
+ The text that follows the frame header differs from that of the
+ unsynchronised lyrics/text transcription in one major way. Each
+ syllable (or whatever size of text is considered to be convenient by
+ the encoder) is a null terminated string followed by a time stamp
+ denoting where in the sound file it belongs. Each sync thus has the
+ following structure:
+
+ Terminated text to be synced (typically a syllable)
+ Sync identifier (terminator to above string) $00 (00)
+ Time stamp $xx (xx ...)
+
+ The 'time stamp' is set to zero or the whole sync is omitted if
+ located directly at the beginning of the sound. All time stamps
+ should be sorted in chronological order. The sync can be considered
+ as a validator of the subsequent string.
+
+ Newline ($0A) characters are allowed in all "SYLT" frames and should
+ be used after every entry (name, event etc.) in a frame with the
+ content type $03 - $04.
+
+ A few considerations regarding whitespace characters: Whitespace
+ separating words should mark the beginning of a new word, thus
+ occurring in front of the first syllable of a new word. This is also
+ valid for new line characters. A syllable followed by a comma should
+ not be broken apart with a sync (both the syllable and the comma
+ should be before the sync).
+
+ An example: The "USLT" passage
+
+ "Strangers in the night" $0A "Exchanging glances"
+
+ would be "SYLT" encoded as:
+
+ "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx
+ " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx
+ xx "glan" $00 xx xx "ces" $00 xx xx
+
+ There may be more than one "SYLT" frame in each tag, but only one
+ with the same language and content descriptor.
+
+
+4.11. Comments
+
+ This frame is indended for any kind of full text information that
+ does not fit in any other frame. It consists of a frame header
+ followed by encoding, language and content descriptors and is ended
+ with the actual comment as a text string. Newline characters are
+ allowed in the comment text string. There may be more than one
+ comment frame in each tag, but only one with the same language and
+ content descriptor.
+
+ <Header for 'Comment', ID: "COMM">
+ Text encoding $xx
+ Language $xx xx xx
+ Short content descrip. <text string according to encoding> $00 (00)
+ The actual text <full text string according to encoding>
+
+
+4.12. Relative volume adjustment
+
+ This is a more subjective function than the previous ones. It allows
+ the user to say how much he wants to increase/decrease the volume on
+ each channel while the file is played. The purpose is to be able to
+ align all files to a reference volume, so that you don't have to
+ change the volume constantly. This frame may also be used to balance
+ adjust the audio. If the volume peak levels are known then this could
+ be described with the 'Peak volume right' and 'Peak volume left'
+ field. If Peakvolume is not known these fields could be left zeroed
+ or, if no other data follows, be completely omitted. There may only
+ be one "RVAD" frame in each tag.
+
+ <Header for 'Relative volume adjustment', ID: "RVAD">
+ Increment/decrement %00xxxxxx
+ Bits used for volume descr. $xx
+ Relative volume change, right $xx xx (xx ...)
+ Relative volume change, left $xx xx (xx ...)
+ Peak volume right $xx xx (xx ...)
+ Peak volume left $xx xx (xx ...)
+
+ In the increment/decrement field bit 0 is used to indicate the right
+ channel and bit 1 is used to indicate the left channel. 1 is
+ increment and 0 is decrement.
+
+ The 'bits used for volume description' field is normally $10 (16
+ bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value
+ may not be $00. The volume is always represented with whole bytes,
+ padded in the beginning (highest bits) when 'bits used for volume
+ description' is not a multiple of eight.
+
+ This datablock is then optionally followed by a volume definition for
+ the left and right back channels. If this information is appended to
+ the frame the first two channels will be treated as front channels.
+ In the increment/decrement field bit 2 is used to indicate the right
+ back channel and bit 3 for the left back channel.
+
+ Relative volume change, right back $xx xx (xx ...)
+ Relative volume change, left back $xx xx (xx ...)
+ Peak volume right back $xx xx (xx ...)
+ Peak volume left back $xx xx (xx ...)
+
+ If the center channel adjustment is present the following is appended
+ to the existing frame, after the left and right back channels. The
+ center channel is represented by bit 4 in the increase/decrease
+ field.
+
+ Relative volume change, center $xx xx (xx ...)
+ Peak volume center $xx xx (xx ...)
+
+ If the bass channel adjustment is present the following is appended
+ to the existing frame, after the center channel. The bass channel is
+ represented by bit 5 in the increase/decrease field.
+
+ Relative volume change, bass $xx xx (xx ...)
+ Peak volume bass $xx xx (xx ...)
+
+
+4.13. Equalisation
+
+ This is another subjective, alignment frame. It allows the user to
+ predefine an equalisation curve within the audio file. There may only
+ be one "EQUA" frame in each tag.
+
+ <Header of 'Equalisation', ID: "EQUA">
+ Adjustment bits $xx
+
+ The 'adjustment bits' field defines the number of bits used for
+ representation of the adjustment. This is normally $10 (16 bits) for
+ MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be
+ $00.
+
+ This is followed by 2 bytes + ('adjustment bits' rounded up to the
+ nearest byte) for every equalisation band in the following format,
+ giving a frequency range of 0 - 32767Hz:
+
+ Increment/decrement %x (MSB of the Frequency)
+ Frequency (lower 15 bits)
+ Adjustment $xx (xx ...)
+
+ The increment/decrement bit is 1 for increment and 0 for decrement.
+ The equalisation bands should be ordered increasingly with reference
+ to frequency. All frequencies don't have to be declared. The
+ equalisation curve in the reading software should be interpolated
+ between the values in this frame. Three equal adjustments for three
+ subsequent frequencies. A frequency should only be described once in
+ the frame.
+
+
+4.14. Reverb
+
+ Yet another subjective one. You may here adjust echoes of different
+ kinds. Reverb left/right is the delay between every bounce in ms.
+ Reverb bounces left/right is the number of bounces that should be
+ made. $FF equals an infinite number of bounces. Feedback is the
+ amount of volume that should be returned to the next echo bounce. $00
+ is 0%, $FF is 100%. If this value were $7F, there would be 50% volume
+ reduction on the first bounce, 50% of that on the second and so on.
+ Left to left means the sound from the left bounce to be played in the
+ left speaker, while left to right means sound from the left bounce to
+ be played in the right speaker.
+
+ 'Premix left to right' is the amount of left sound to be mixed in the
+ right before any reverb is applied, where $00 id 0% and $FF is 100%.
+ 'Premix right to left' does the same thing, but right to left.
+ Setting both premix to $FF would result in a mono output (if the
+ reverb is applied symmetric). There may only be one "RVRB" frame in
+ each tag.
+
+ <Header for 'Reverb', ID: "RVRB">
+ Reverb left (ms) $xx xx
+ Reverb right (ms) $xx xx
+ Reverb bounces, left $xx
+ Reverb bounces, right $xx
+ Reverb feedback, left to left $xx
+ Reverb feedback, left to right $xx
+ Reverb feedback, right to right $xx
+ Reverb feedback, right to left $xx
+ Premix left to right $xx
+ Premix right to left $xx
+
+
+4.15. Attached picture
+
+ This frame contains a picture directly related to the audio file.
+ Image format is the MIME type and subtype [MIME] for the image. In
+ the event that the MIME media type name is omitted, "image/" will be
+ implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format
+ should be used when interoperability is wanted. Description is a
+ short description of the picture, represented as a terminated
+ textstring. The description has a maximum length of 64 characters,
+ but may be empty. There may be several pictures attached to one file,
+ each in their individual "APIC" frame, but only one with the same
+ content descriptor. There may only be one picture with the picture
+ type declared as picture type $01 and $02 respectively. There is the
+ possibility to put only a link to the image file by using the 'MIME
+ type' "-->" and having a complete URL [URL] instead of picture data.
+ The use of linked files should however be used sparingly since there
+ is the risk of separation of files.
+
+ <Header for 'Attached picture', ID: "APIC">
+ Text encoding $xx
+ MIME type <text string> $00
+ Picture type $xx
+ Description <text string according to encoding> $00 (00)
+ Picture data <binary data>
+
+
+ Picture type: $00 Other
+ $01 32x32 pixels 'file icon' (PNG only)
+ $02 Other file icon
+ $03 Cover (front)
+ $04 Cover (back)
+ $05 Leaflet page
+ $06 Media (e.g. lable side of CD)
+ $07 Lead artist/lead performer/soloist
+ $08 Artist/performer
+ $09 Conductor
+ $0A Band/Orchestra
+ $0B Composer
+ $0C Lyricist/text writer
+ $0D Recording Location
+ $0E During recording
+ $0F During performance
+ $10 Movie/video screen capture
+ $11 A bright coloured fish
+ $12 Illustration
+ $13 Band/artist logotype
+ $14 Publisher/Studio logotype
+
+
+4.16. General encapsulated object
+
+ In this frame any type of file can be encapsulated. After the header,
+ 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as
+ as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The
+ filename is case sensitive and is encoded as 'Encoding'. Then follows
+ a content description as terminated string, encoded as 'Encoding'.
+ The last thing in the frame is the actual object. The first two
+ strings may be omitted, leaving only their terminations. MIME type is
+ always an ISO-8859-1 text string. There may be more than one "GEOB"
+ frame in each tag, but only one with the same content descriptor.
+
+ <Header for 'General encapsulated object', ID: "GEOB">
+ Text encoding $xx
+ MIME type <text string> $00
+ Filename <text string according to encoding> $00 (00)
+ Content description <text string according to encóding> $00 (00)
+ Encapsulated object <binary data>
+
+
+4.17. Play counter
+
+ This is simply a counter of the number of times a file has been
+ played. The value is increased by one every time the file begins to
+ play. There may only be one "PCNT" frame in each tag. When the
+ counter reaches all one's, one byte is inserted in front of the
+ counter thus making the counter eight bits bigger. The counter must
+ be at least 32-bits long to begin with.
+
+ <Header for 'Play counter', ID: "PCNT">
+ Counter $xx xx xx xx (xx ...)
+
+
+4.18. Popularimeter
+
+ The purpose of this frame is to specify how good an audio file is.
+ Many interesting applications could be found to this frame such as a
+ playlist that features better audiofiles more often than others or it
+ could be used to profile a person's taste and find other 'good' files
+ by comparing people's profiles. The frame is very simple. It contains
+ the email address to the user, one rating byte and a four byte play
+ counter, intended to be increased with one for every time the file is
+ played. The email is a terminated string. The rating is 1-255 where
+ 1 is worst and 255 is best. 0 is unknown. If no personal counter is
+ wanted it may be omitted. When the counter reaches all one's, one
+ byte is inserted in front of the counter thus making the counter
+ eight bits bigger in the same away as the play counter ("PCNT").
+ There may be more than one "POPM" frame in each tag, but only one
+ with the same email address.
+
+ <Header for 'Popularimeter', ID: "POPM">
+ Email to user <text string> $00
+ Rating $xx
+ Counter $xx xx xx xx (xx ...)
+
+
+4.19. Recommended buffer size
+
+ Sometimes the server from which a audio file is streamed is aware of
+ transmission or coding problems resulting in interruptions in the
+ audio stream. In these cases, the size of the buffer can be
+ recommended by the server using this frame. If the 'embedded info
+ flag' is true (1) then this indicates that an ID3 tag with the
+ maximum size described in 'Buffer size' may occur in the audiostream.
+ In such case the tag should reside between two MPEG [MPEG] frames, if
+ the audio is MPEG encoded. If the position of the next tag is known,
+ 'offset to next tag' may be used. The offset is calculated from the
+ end of tag in which this frame resides to the first byte of the
+ header in the next. This field may be omitted. Embedded tags are
+ generally not recommended since this could render unpredictable
+ behaviour from present software/hardware.
+
+ For applications like streaming audio it might be an idea to embed
+ tags into the audio stream though. If the clients connects to
+ individual connections like HTTP and there is a possibility to begin
+ every transmission with a tag, then this tag should include a
+ 'recommended buffer size' frame. If the client is connected to a
+ arbitrary point in the stream, such as radio or multicast, then the
+ 'recommended buffer size' frame should be included in every tag.
+ Every tag that is picked up after the initial/first tag is to be
+ considered as an update of the previous one. E.g. if there is a
+ "TIT2" frame in the first received tag and one in the second tag,
+ then the first should be 'replaced' with the second.
+
+ The 'Buffer size' should be kept to a minimum. There may only be one
+ "RBUF" frame in each tag.
+
+ <Header for 'Recommended buffer size', ID: "RBUF">
+ Buffer size $xx xx xx
+ Embedded info flag %0000000x
+ Offset to next tag $xx xx xx xx
+
+
+4.20. Audio encryption
+
+ This frame indicates if the actual audio stream is encrypted, and by
+ whom. Since standardisation of such encrypion scheme is beyond this
+ document, all "AENC" frames begin with a terminated string with a
+ URL containing an email address, or a link to a location where an
+ email address can be found, that belongs to the organisation
+ responsible for this specific encrypted audio file. Questions
+ regarding the encrypted audio should be sent to the email address
+ specified. If a $00 is found directly after the 'Frame size' and the
+ audiofile indeed is encrypted, the whole file may be considered
+ useless.
+
+ After the 'Owner identifier', a pointer to an unencrypted part of the
+ audio can be specified. The 'Preview start' and 'Preview length' is
+ described in frames. If no part is unencrypted, these fields should
+ be left zeroed. After the 'preview length' field follows optionally a
+ datablock required for decryption of the audio. There may be more
+ than one "AENC" frames in a tag, but only one with the same 'Owner
+ identifier'.
+
+ <Header for 'Audio encryption', ID: "AENC">
+ Owner identifier <text string> $00
+ Preview start $xx xx
+ Preview length $xx xx
+ Encryption info <binary data>
+
+
+4.21. Linked information
+
+ To keep space waste as low as possible this frame may be used to link
+ information from another ID3v2 tag that might reside in another audio
+ file or alone in a binary file. It is recommended that this method is
+ only used when the files are stored on a CD-ROM or other
+ circumstances when the risk of file seperation is low. The frame
+ contains a frame identifier, which is the frame that should be linked
+ into this tag, a URL [URL] field, where a reference to the file where
+ the frame is given, and additional ID data, if needed. Data should be
+ retrieved from the first tag found in the file to which this link
+ points. There may be more than one "LINK" frame in a tag, but only
+ one with the same contents. A linked frame is to be considered as
+ part of the tag and has the same restrictions as if it was a physical
+ part of the tag (i.e. only one "RVRB" frame allowed, whether it's
+ linked or not).
+
+ <Header for 'Linked information', ID: "LINK">
+ Frame identifier $xx xx xx
+ URL <text string> $00
+ ID and additional data <text string(s)>
+
+ Frames that may be linked and need no additional data are "IPLS",
+ "MCID", "ETCO", "MLLT", "SYTC", "RVAD", "EQUA", "RVRB", "RBUF", the
+ text information frames and the URL link frames.
+
+ The "TXXX", "APIC", "GEOB" and "AENC" frames may be linked with
+ the content descriptor as additional ID data.
+
+ The "COMM", "SYLT" and "USLT" frames may be linked with three bytes
+ of language descriptor directly followed by a content descriptor as
+ additional ID data.
+
+
+4.22. Position synchronisation frame
+
+ This frame delivers information to the listener of how far into the
+ audio stream he picked up; in effect, it states the time offset of
+ the first frame in the stream. The frame layout is:
+
+ <Head for 'Position synchronisation', ID: "POSS">
+ Time stamp format $xx
+ Position $xx (xx ...)
+
+ Where time stamp format is:
+
+ $01 Absolute time, 32 bit sized, using MPEG frames as unit
+ $02 Absolute time, 32 bit sized, using milliseconds as unit
+
+ and position is where in the audio the listener starts to receive,
+ i.e. the beginning of the next frame. If this frame is used in the
+ beginning of a file the value is always 0. There may only be one
+ "POSS" frame in each tag.
+
+
+4.23. Terms of use frame
+
+ This frame contains a brief description of the terms of use and
+ ownership of the file. More detailed information concerning the legal
+ terms might be available through the "WCOP" frame. Newlines are
+ allowed in the text. There may only be one "USER" frame in a tag.
+
+ <Header for 'Terms of use frame', ID: "USER">
+ Text encoding $xx
+ Language $xx xx xx
+ The actual text <text string according to encoding>
+
+
+4.24. Ownership frame
+
+ The ownership frame might be used as a reminder of a made transaction
+ or, if signed, as proof. Note that the "USER" and "TOWN" frames are
+ good to use in conjunction with this one. The frame begins, after the
+ frame ID, size and encoding fields, with a 'price payed' field. The
+ first three characters of this field contains the currency used for
+ the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic
+ currency code. Concatenated to this is the actual price payed, as a
+ numerical string using "." as the decimal separator. Next is an 8
+ character date string (YYYYMMDD) followed by a string with the name
+ of the seller as the last field in the frame. There may only be one
+ "OWNE" frame in a tag.
+
+ <Header for 'Ownership frame', ID: "OWNE">
+ Text encoding $xx
+ Price payed <text string> $00
+ Date of purch. <text string>
+ Seller <text string according to encoding>
+
+
+4.25. Commercial frame
+
+ This frame enables several competing offers in the same tag by
+ bundling all needed information. That makes this frame rather complex
+ but it's an easier solution than if one tries to achieve the same
+ result with several frames. The frame begins, after the frame ID,
+ size and encoding fields, with a price string field. A price is
+ constructed by one three character currency code, encoded according
+ to ISO 4217 [ISO-4217] alphabetic currency code, followed by a
+ numerical value where "." is used as decimal seperator. In the price
+ string several prices may be concatenated, seperated by a "/"
+ character, but there may only be one currency of each type.
+
+ The price string is followed by an 8 character date string in the
+ format YYYYMMDD, describing for how long the price is valid. After
+ that is a contact URL, with which the user can contact the seller,
+ followed by a one byte 'received as' field. It describes how the
+ audio is delivered when bought according to the following list:
+
+ $00 Other
+ $01 Standard CD album with other songs
+ $02 Compressed audio on CD
+ $03 File over the Internet
+ $04 Stream over the Internet
+ $05 As note sheets
+ $06 As note sheets in a book with other sheets
+ $07 Music on other media
+ $08 Non-musical merchandise
+
+ Next follows a terminated string with the name of the seller followed
+ by a terminated string with a short description of the product. The
+ last thing is the ability to include a company logotype. The first of
+ them is the 'Picture MIME type' field containing information about
+ which picture format is used. In the event that the MIME media type
+ name is omitted, "image/" will be implied. Currently only "image/png"
+ and "image/jpeg" are allowed. This format string is followed by the
+ binary picture data. This two last fields may be omitted if no
+ picture is to attach.
+
+ <Header for 'Commercial frame', ID: "COMR">
+ Text encoding $xx
+ Price string <text string> $00
+ Valid until <text string>
+ Contact URL <text string> $00
+ Received as $xx
+ Name of seller <text string according to encoding> $00 (00)
+ Description <text string according to encoding> $00 (00)
+ Picture MIME type <string> $00
+ Seller logo <binary data>
+
+
+4.26. Encryption method registration
+
+ To identify with which method a frame has been encrypted the
+ encryption method must be registered in the tag with this frame. The
+ 'Owner identifier' is a null-terminated string with a URL [URL]
+ containing an email address, or a link to a location where an email
+ address can be found, that belongs to the organisation responsible
+ for this specific encryption method. Questions regarding the
+ encryption method should be sent to the indicated email address. The
+ 'Method symbol' contains a value that is associated with this method
+ throughout the whole tag. Values below $80 are reserved. The 'Method
+ symbol' may optionally be followed by encryption specific data. There
+ may be several "ENCR" frames in a tag but only one containing the
+ same symbol and only one containing the same owner identifier. The
+ method must be used somewhere in the tag. See section 3.3.1, flag j
+ for more information.
+
+ <Header for 'Encryption method registration', ID: "ENCR">
+ Owner identifier <text string> $00
+ Method symbol $xx
+ Encryption data <binary data>
+
+
+4.27. Group identification registration
+
+ This frame enables grouping of otherwise unrelated frames. This can
+ be used when some frames are to be signed. To identify which frames
+ belongs to a set of frames a group identifier must be registered in
+ the tag with this frame. The 'Owner identifier' is a null-terminated
+ string with a URL [URL] containing an email address, or a link to a
+ location where an email address can be found, that belongs to the
+ organisation responsible for this grouping. Questions regarding the
+ grouping should be sent to the indicated email address. The 'Group
+ symbol' contains a value that associates the frame with this group
+ throughout the whole tag. Values below $80 are reserved. The 'Group
+ symbol' may optionally be followed by some group specific data, e.g.
+ a digital signature. There may be several "GRID" frames in a tag but
+ only one containing the same symbol and only one containing the same
+ owner identifier. The group symbol must be used somewhere in the tag.
+ See section 3.3.1, flag j for more information.
+
+ <Header for 'Group ID registration', ID: "GRID">
+ Owner identifier <text string> $00
+ Group symbol $xx
+ Group dependent data <binary data>
+
+
+4.28. Private frame
+
+ This frame is used to contain information from a software producer
+ that its program uses and does not fit into the other frames. The
+ frame consists of an 'Owner identifier' string and the binary data.
+ The 'Owner identifier' is a null-terminated string with a URL [URL]
+ containing an email address, or a link to a location where an email
+ address can be found, that belongs to the organisation responsible
+ for the frame. Questions regarding the frame should be sent to the
+ indicated email address. The tag may contain more than one "PRIV"
+ frame but only with different contents. It is recommended to keep the
+ number of "PRIV" frames as low as possible.
+
+ <Header for 'Private frame', ID: "PRIV">
+ Owner identifier <text string> $00
+ The private data <binary data>
+
+
+5. The 'unsynchronisation scheme'
+
+ The only purpose of the 'unsynchronisation scheme' is to make the
+ ID3v2 tag as compatible as possible with existing software. There is
+ no use in 'unsynchronising' tags if the file is only to be processed
+ by new software. Unsynchronisation may only be made with MPEG 2 layer
+ I, II and III and MPEG 2.5 files.
+
+ Whenever a false synchronisation is found within the tag, one zeroed
+ byte is inserted after the first false synchronisation byte. The
+ format of a correct sync that should be altered by ID3 encoders is as
+ follows:
+
+ %11111111 111xxxxx
+
+ And should be replaced with:
+
+ %11111111 00000000 111xxxxx
+
+ This has the side effect that all $FF 00 combinations have to be
+ altered, so they won't be affected by the decoding process. Therefore
+ all the $FF 00 combinations have to be replaced with the $FF 00 00
+ combination during the unsynchronisation.
+
+ To indicate usage of the unsynchronisation, the first bit in 'ID3
+ flags' should be set. This bit should only be set if the tag
+ contains a, now corrected, false synchronisation. The bit should
+ only be clear if the tag does not contain any false synchronisations.
+
+ Do bear in mind, that if a compression scheme is used by the encoder,
+ the unsynchronisation scheme should be applied *afterwards*. When
+ decoding a compressed, 'unsynchronised' file, the 'unsynchronisation
+ scheme' should be parsed first, decompression afterwards.
+
+ If the last byte in the tag is $FF, and there is a need to eliminate
+ false synchronisations in the tag, at least one byte of padding
+ should be added.
+
+
+6. Copyright
+
+ Copyright (C) Martin Nilsson 1998. All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that a reference to this document is included on all
+ such copies and derivative works. However, this document itself may
+ not be modified in any way and reissued as the original document.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+7. References
+
+ [CDDB] Compact Disc Data Base
+
+ <url:http://www.cddb.com>
+
+ [ID3v2] Martin Nilsson, "ID3v2 informal standard".
+
+ <url:http://www.id3.org/id3v2-00.txt>
+
+ [ISO-639-2] ISO/FDIS 639-2.
+ Codes for the representation of names of languages, Part 2: Alpha-3
+ code. Technical committee / subcommittee: TC 37 / SC 2
+
+ [ISO-4217] ISO 4217:1995.
+ Codes for the representation of currencies and funds.
+ Technical committee / subcommittee: TC 68
+
+ [ISO-8859-1] ISO/IEC DIS 8859-1.
+ 8-bit single-byte coded graphic character sets, Part 1: Latin
+ alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2
+
+ [ISRC] ISO 3901:1986
+ International Standard Recording Code (ISRC).
+ Technical committee / subcommittee: TC 46 / SC 9
+
+ [JFIF] JPEG File Interchange Format, version 1.02
+
+ <url:http://www.w3.org/Graphics/JPEG/jfif.txt>
+
+ [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt>
+
+ [MPEG] ISO/IEC 11172-3:1993.
+ Coding of moving pictures and associated audio for digital storage
+ media at up to about 1,5 Mbit/s, Part 3: Audio.
+ Technical committee / subcommittee: JTC 1 / SC 29
+ and
+ ISO/IEC 13818-3:1995
+ Generic coding of moving pictures and associated audio information,
+ Part 3: Audio.
+ Technical committee / subcommittee: JTC 1 / SC 29
+ and
+ ISO/IEC DIS 13818-3
+ Generic coding of moving pictures and associated audio information,
+ Part 3: Audio (Revision of ISO/IEC 13818-3:1995)
+
+
+ [PNG] Portable Network Graphics, version 1.0
+
+ <url:http://www.w3.org/TR/REC-png-multi.html>
+
+ [UNICODE] ISO/IEC 10646-1:1993.
+ Universal Multiple-Octet Coded Character Set (UCS), Part 1:
+ Architecture and Basic Multilingual Plane.
+ Technical committee / subcommittee: JTC 1 / SC 2
+
+ <url:http://www.unicode.org>
+
+ [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource
+ Locators (URL).", RFC 1738, December 1994.
+
+ <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt>
+
+ [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB
+ Compressed
+ Data Format Specification version 3.3", RFC 1950, May 1996.
+
+ <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt>
+
+
+8. Appendix
+
+
+A. Appendix A - Genre List from ID3v1
+
+ The following genres is defined in ID3v1
+
+ 0.Blues
+ 1.Classic Rock
+ 2.Country
+ 3.Dance
+ 4.Disco
+ 5.Funk
+ 6.Grunge
+ 7.Hip-Hop
+ 8.Jazz
+ 9.Metal
+ 10.New Age
+ 11.Oldies
+ 12.Other
+ 13.Pop
+ 14.R&B
+ 15.Rap
+ 16.Reggae
+ 17.Rock
+ 18.Techno
+ 19.Industrial
+ 20.Alternative
+ 21.Ska
+ 22.Death Metal
+ 23.Pranks
+ 24.Soundtrack
+ 25.Euro-Techno
+ 26.Ambient
+ 27.Trip-Hop
+ 28.Vocal
+ 29.Jazz+Funk
+ 30.Fusion
+ 31.Trance
+ 32.Classical
+ 33.Instrumental
+ 34.Acid
+ 35.House
+ 36.Game
+ 37.Sound Clip
+ 38.Gospel
+ 39.Noise
+ 40.AlternRock
+ 41.Bass
+ 42.Soul
+ 43.Punk
+ 44.Space
+ 45.Meditative
+ 46.Instrumental Pop
+ 47.Instrumental Rock
+ 48.Ethnic
+ 49.Gothic
+ 50.Darkwave
+ 51.Techno-Industrial
+ 52.Electronic
+ 53.Pop-Folk
+ 54.Eurodance
+ 55.Dream
+ 56.Southern Rock
+ 57.Comedy
+ 58.Cult
+ 59.Gangsta
+ 60.Top 40
+ 61.Christian Rap
+ 62.Pop/Funk
+ 63.Jungle
+ 64.Native American
+ 65.Cabaret
+ 66.New Wave
+ 67.Psychadelic
+ 68.Rave
+ 69.Showtunes
+ 70.Trailer
+ 71.Lo-Fi
+ 72.Tribal
+ 73.Acid Punk
+ 74.Acid Jazz
+ 75.Polka
+ 76.Retro
+ 77.Musical
+ 78.Rock & Roll
+ 79.Hard Rock
+
+ The following genres are Winamp extensions
+
+ 80.Folk
+ 81.Folk-Rock
+ 82.National Folk
+ 83.Swing
+ 84.Fast Fusion
+ 85.Bebob
+ 86.Latin
+ 87.Revival
+ 88.Celtic
+ 89.Bluegrass
+ 90.Avantgarde
+ 91.Gothic Rock
+ 92.Progressive Rock
+ 93.Psychedelic Rock
+ 94.Symphonic Rock
+ 95.Slow Rock
+ 96.Big Band
+ 97.Chorus
+ 98.Easy Listening
+ 99.Acoustic
+ 100.Humour
+ 101.Speech
+ 102.Chanson
+ 103.Opera
+ 104.Chamber Music
+ 105.Sonata
+ 106.Symphony
+ 107.Booty Bass
+ 108.Primus
+ 109.Porn Groove
+ 110.Satire
+ 111.Slow Jam
+ 112.Club
+ 113.Tango
+ 114.Samba
+ 115.Folklore
+ 116.Ballad
+ 117.Power Ballad
+ 118.Rhythmic Soul
+ 119.Freestyle
+ 120.Duet
+ 121.Punk Rock
+ 122.Drum Solo
+ 123.Acapella
+ 124.Euro-House
+ 125.Dance Hall
+
+
+9. Author's Address
+
+ Written by
+
+ Martin Nilsson
+ Rydsvägen 246 C. 30
+ S-584 34 Linköping
+ Sweden
+
+ Email: nilsson@id3.org
+
+
+ Edited by
+
+ Dirk Mahoney
+ 57 Pechey Street
+ Chermside Q
+ Australia 4032
+
+ Email: dirk@id3.org
+
+
+ Johan Sundström
+ Alsättersgatan 5 A. 34
+ S-584 35 Linköping
+ Sweden
+
+ Email: johan@id3.org
+
+
diff --git a/doc/id3v2.gif b/doc/id3v2.gif
new file mode 100644
index 0000000..a9bd030
--- /dev/null
+++ b/doc/id3v2.gif
Binary files differ
diff --git a/doc/id3v2.ico b/doc/id3v2.ico
new file mode 100644
index 0000000..ed1421e
--- /dev/null
+++ b/doc/id3v2.ico
Binary files differ
diff --git a/doc/id3v2.png b/doc/id3v2.png
new file mode 100644
index 0000000..76dab63
--- /dev/null
+++ b/doc/id3v2.png
Binary files differ
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..188acaf
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,450 @@
+<!-- $Id: index.html.in,v 1.10 2000/10/15 16:37:54 eldamitri Exp $ -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>id3lib - The ID3v1/ID3v2 Tagging Library</title>
+
+ <style type="text/css">
+ <!--
+ body {text-align: center}
+ td.h1 {font: 43px Arial, Helvetica}
+ td.h2 {font: 27px Arial, Helvetica}
+ td.h3 {font: 17px Arial, Helvetica}
+ div.h5 {font: 14px Arial, Helvetica}
+ td {font: 14px Arial, Helvetica}
+ a {color: #DD6600; text-decoration: none}
+ b {font-weight: bold}
+ -->
+ </style>
+
+ <meta name="description" content="id3lib - The ID3v1/ID3v2 Tagging Library">
+
+ </head>
+
+ <body vlink="#551a8b" alink="#ff0000" link="#0000ee" text="#000000" bgcolor="#ffffff">
+ <br>
+
+ <table border=0 width="90%">
+ <tr align="center">
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/news/?group_id=979">News</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">Download</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">Mailing list</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/bugs/?group_id=979">Bugs</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/patch/?group_id=979">Patches</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/cvs/?group_id=979">CVS</a>
+ </td>
+ </tr>
+ <tr>
+ <td bgcolor="#FF7700" colspan=6><img src="fillpx.gif" width=1 height=1 alt="----------------------------------------------------------------------"></td>
+ </tr>
+ </table>
+
+ <br>
+
+ <img src="id3v2.gif" alt="[ID3v2 logo]">
+ <table border=0>
+ <tr align="center"><td class=h1>&nbsp;<a href="http://sourceforge.net/project/?group_id=979">id3lib</a>&nbsp;</td></tr>
+ <tr align="center">
+ <td bgcolor="#FF7700"><img src="fillpx.gif" width=1 height=1 alt="------"></td>
+ </tr>
+
+ </table>
+ <table border=0>
+ <tr align="center">
+ <td class=h3>Latest Release:
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">3.8.3</a>
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr align="left"><td class=h2>Overview</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ id3lib is an <a href="http://www.opensource.org">open-source</a>,
+ cross-platform software development library for reading, writing,
+ and manipulating <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ and <a href="http://www.id3.org">ID3v2</a> tags. It
+ is an on-going project whose primary goals are full compliance with
+ the <a href="http://www.id3.org">ID3v2</a> standard, portability
+ across several platforms, and providing a powerful and feature-rich
+ API with a highly stable and efficient implementation.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Features</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr><td>
+
+ <dl>
+ <dt><b>Powerful</b></dt>
+ <dd>
+
+ id3lib automatically handles most of the low-level details
+ involved with manipulating <a
+ href="http://www.id3.org/id3v1.html">ID3v1</a> and <a
+ href="http://www.id3.org">ID3v2</a> tags in digital audio
+ files. It provides support for several tasks associated with
+ manipulating such tags, such as conversion between tagging
+ formats, identifying valid tags, converting
+ sizes, synchronisation, compression, and padding.
+
+ </dd>
+
+ <dt><b>Standards-compliant</b></dt>
+ <dd>
+
+ While many digital audio libraries and applications provide
+ minimal support
+ for basic <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ tagging, few provide the same level of support for the up-and-coming
+ <a href="http://www.id3.org">ID3v2</a> standard like id3lib.
+ The developers of id3lib work closely with the <a
+ href="http://www.id3.org">ID3v2</a> specification and go to
+ great effort to ensure the library correctly handles all its
+ nuances. By using id3lib for both your <a
+ href="http://www.id3.org/id3v1.html">ID3v1</a> and <a
+ href="http://www.id3.org">ID3v2</a> tagging needs, you can be
+ assured that your application produces tags that comply with
+ the standard now and in the future.
+
+ </dd>
+
+ <dt><b>Cross-platform</b></dt>
+ <dd>
+
+ A primary goal for id3lib is cross-platform compatibility. The
+ library is developed primarily on the <a
+ href="http://www.gnu.org">GNU</a>/<a
+ href="http://www.linux.org">Linux</a> operating system but has
+ been compiled and tested on other Unix-like OS's as well as
+ Windows NT.
+ </dd>
+
+ <dt><b>Multi-language</b></dt>
+ <dd>
+
+ id3lib aspires to provide interfaces for multiple programming
+ languages, and currently fully supports both C and C++. A COM
+ wrapper (id3com) is also supplied allowing VB, VBA, VBScript and
+ other COM-enabled languages to use the library.
+
+ </dd>
+ </dl>
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <a name="news"></a>
+ <table border=0 width="90%"><tr><td class=h2>Development</td></tr></table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ All development is centered around the the <a
+ href="http://sourceforge.net/project/?group_id=979">id3lib project
+ page</a> hosted by <a
+ href="http://www.sourceforge.net">SourceForge</a>. Please go there
+ to <a href="http://sourceforge.net/news/?group_id=979">find out the
+ latest news</a>, <a
+ href="http://sourceforge.net/project/filelist.php?group_id=979">download
+ the current release</a>, <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">join
+ the mailing list</a>, <a
+ href="http://sourceforge.net/bugs/?group_id=979">file a bug
+ report</a>, <a
+ href="http://sourceforge.net/patch/?group_id=979">submit a patch</a>,
+ <a href="http://sourceforge.net/cvs/?group_id=979">browse the CVS
+ repository</a>, or just <a
+ href="http://sourceforge.net/project/?group_id=979">look around</a>.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Licensing</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr><td>
+
+ The id3lib library is <a
+ href="http://www.opensource.org">open-source</a> software, licensed
+ under the <a href="http://www.gnu.org/copyleft/lesser.html">GNU
+ Library General Public License (LGPL)</a>. In short, this allows
+ any application to link to and use the library without affecting
+ their license, while guaranteeing that the id3lib library itself
+ (and any modifications to it) will remain freely available in
+ source code form. The project developers therefore greatly
+ encourage input from everyone, be it with feature suggestions, code
+ patches, bug reports, or anything. The best way to contribute to
+ this effort is to <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">subscribe
+ to the mailing list</a> and join in on the discussions!
+
+ <br><br>
+
+ Versions of ID3Lib prior to and including version 3.05a were
+ released to the public domain. The last such release is still <a
+ href="http://download.sourceforge.net/id3lib/id3lib305.zip">available
+ for download</a>. These versions are therefore completely free of
+ any licence restrictions, but are no longer maintained.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Documentation</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+ The following documentation is available for those who wish to
+ develop software with id3lib:
+ <ul>
+
+ <li>
+
+ <a href="api/index.html">Documentation for the id3lib API</a>
+ is available thanks to the <a
+ href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>
+ documentation system.
+
+ <br><br>
+
+ <li>
+
+ There is a <a href="id3lib-manual.php">web-readable
+ translation</a> of the <a
+ href="http://download.sourceforge.net/id3lib/id3lib305.doc">original
+ ID3Lib manual</a>, written by Dirk Mahoney, the original author
+ of ID3Lib. The API for the current library has changed
+ somewhat, but this documentation is still mostly valid. Many
+ thanks to <a href="mailto:smoser@brickies.net">Scott Moser</a>
+ for the web-friendly translation.
+
+ <br><br>
+
+ <li>
+
+ <a href="mailto:merlin@starr.econ.nyu.edu">James Lin</a> wrote
+ some <a href="id3guide.html">guidelines</a> for those
+ programming with <a href="http://www.id3.org">ID3v2</a> tags.
+ It, too, is outdated, and some of the links are broken. But
+ most of the information is still pertinent and quite valuable.
+
+ </ul>
+ </td>
+ </tr>
+
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Projects</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ The following software projects have used, do use, or will use
+ id3lib for their <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ and <a href="http://www.id3.org">ID3v2</a> tag
+ processing:
+
+ <ul>
+ <li>
+
+ <a href="http://www.musicmatch.com">MusicMatch</a>, creators of
+ the MusicMatch Jukebox for Windows and a previous project
+ coordinator for ID3Lib
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.freeamp.org">FreeAmp</a> is a
+ cross-platform mp3 player and, as of version 2.1, is using
+ id3lib for their <a href="http://www.id3.org">ID3v1/v2</a>
+ support.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.empeg.com">empeg</a>, creators of the
+ world-renowned in-car MP3 player, uses id3lib for reading and
+ writing <a href="http://www.id3.org">ID3v1/v2</a> tags in their
+ various tools and utilities.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://id3v2.sourceforge.net">The id3v2 tagger</a> is
+ a <a href="http://www.gnu.org">GNU</a>/<a
+ href="http://www.linux.org">Linux</a> command-line editor for
+ <a href="http://www.id3.org">ID3v1/v2</a> tags
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.zlurp.com">Zlurp!</a> is an all-in-one CD
+ audio tool for Windows that rips, encodes and tags CDs.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.adcock8.freeserve.co.uk/">The javpc
+ project</a>'s goal is to turn a PC into an audio/visual unit
+ sutibale for plugging into a Hi-Fi and TV.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://coconutbeach.hypermart.net/sonize">Sonize</a> is
+ a collection of small but powerful tools integrated in one
+ application that organizes and prepares your mp3 files for
+ publishing on CDROM
+
+ <br><br>
+
+ <li>
+
+ <a href="http://ampbar.tripod.com">AmpBar</a> uses a modified
+ version of the 3.05a library in their MP3 player and ID3v2 tag
+ editor.
+
+ </ul>
+
+ The following software projects used the original version of
+ ID3Lib. Whether or not they still do is currently unknown.
+
+ <ul>
+ <li>
+
+ <a href="http://www.poikosoft.com/cdda/">Easy CD-DA
+ Extractor</a>, a Windows CD-Ripper/Tagger/CDDB
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.macamp.net">MacAmp</a>, a Macintosh MP3
+ Player
+
+ <br><br>
+
+ </ul>
+
+ If I have listed any of the above in error or if I have
+ neglected any other projects that use id3lib, please <a
+ href="mailto:scott@id3.org">let me
+ know</a> so that I might update the list accordingly.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <a name="contact"></a>
+ <table border=0 width="90%">
+ <tr><td class=h2>Contacting the Author</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ The id3lib project is currently coordinated by <a
+ href="mailto:scott@id3.org">Scott Thomas Haug</a>. The original
+ ID3Lib library was written by <a href="mailto:dirk@id3.org">Dirk
+ Mahoney</a>.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table align="center" border=0 width="90%">
+ <tr>
+ <td bgcolor="#FF7700" colspan=6><img src="fillpx.gif" width=1 height=1 alt="----------------------------------------------------------------------"></td>
+ </tr>
+ <tr>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/news/?group_id=979">News</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">Download</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">Mailing list</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/bugs/?group_id=979">Bugs</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/patch/?group_id=979">Patches</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/cvs/?group_id=979">CVS</a>
+ </td>
+ </tr>
+ </table>
+
+ <br><br>
+
+ <table align="center" width="80%" border="0">
+ <tr>
+ <td align="left">
+ <a href="http://sourceforge.net">
+ <IMG src="http://sourceforge.net/sflogo.php?group_id=979&amp;type=1" width="88" height="31" border="0" alt="SourceForge.net"></A>
+ </td>
+ <td align="right">
+
+ <a href="http://validator.w3.org/check/referer">
+ <img border=0
+ src="http://validator.w3.org/images/vh401"
+ alt="Valid HTML 4.01!" height=31 width=88></a>
+ </td>
+ </tr>
+ </table>
+ <br>
+ </body>
+</html>
diff --git a/doc/index.html.in b/doc/index.html.in
new file mode 100644
index 0000000..a727f0f
--- /dev/null
+++ b/doc/index.html.in
@@ -0,0 +1,450 @@
+<!-- $Id: index.html.in,v 1.10 2000/10/15 16:37:54 eldamitri Exp $ -->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>id3lib - The ID3v1/ID3v2 Tagging Library</title>
+
+ <style type="text/css">
+ <!--
+ body {text-align: center}
+ td.h1 {font: 43px Arial, Helvetica}
+ td.h2 {font: 27px Arial, Helvetica}
+ td.h3 {font: 17px Arial, Helvetica}
+ div.h5 {font: 14px Arial, Helvetica}
+ td {font: 14px Arial, Helvetica}
+ a {color: #DD6600; text-decoration: none}
+ b {font-weight: bold}
+ -->
+ </style>
+
+ <meta name="description" content="id3lib - The ID3v1/ID3v2 Tagging Library">
+
+ </head>
+
+ <body vlink="#551a8b" alink="#ff0000" link="#0000ee" text="#000000" bgcolor="#ffffff">
+ <br>
+
+ <table border=0 width="90%">
+ <tr align="center">
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/news/?group_id=979">News</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">Download</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">Mailing list</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/bugs/?group_id=979">Bugs</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/patch/?group_id=979">Patches</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/cvs/?group_id=979">CVS</a>
+ </td>
+ </tr>
+ <tr>
+ <td bgcolor="#FF7700" colspan=6><img src="fillpx.gif" width=1 height=1 alt="----------------------------------------------------------------------"></td>
+ </tr>
+ </table>
+
+ <br>
+
+ <img src="id3v2.gif" alt="[ID3v2 logo]">
+ <table border=0>
+ <tr align="center"><td class=h1>&nbsp;<a href="http://sourceforge.net/project/?group_id=979">@PACKAGE@</a>&nbsp;</td></tr>
+ <tr align="center">
+ <td bgcolor="#FF7700"><img src="fillpx.gif" width=1 height=1 alt="------"></td>
+ </tr>
+
+ </table>
+ <table border=0>
+ <tr align="center">
+ <td class=h3>Latest Release:
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">@VERSION@</a>
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr align="left"><td class=h2>Overview</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ id3lib is an <a href="http://www.opensource.org">open-source</a>,
+ cross-platform software development library for reading, writing,
+ and manipulating <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ and <a href="http://www.id3.org">ID3v2</a> tags. It
+ is an on-going project whose primary goals are full compliance with
+ the <a href="http://www.id3.org">ID3v2</a> standard, portability
+ across several platforms, and providing a powerful and feature-rich
+ API with a highly stable and efficient implementation.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Features</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr><td>
+
+ <dl>
+ <dt><b>Powerful</b></dt>
+ <dd>
+
+ id3lib automatically handles most of the low-level details
+ involved with manipulating <a
+ href="http://www.id3.org/id3v1.html">ID3v1</a> and <a
+ href="http://www.id3.org">ID3v2</a> tags in digital audio
+ files. It provides support for several tasks associated with
+ manipulating such tags, such as conversion between tagging
+ formats, identifying valid tags, converting
+ sizes, synchronisation, compression, and padding.
+
+ </dd>
+
+ <dt><b>Standards-compliant</b></dt>
+ <dd>
+
+ While many digital audio libraries and applications provide
+ minimal support
+ for basic <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ tagging, few provide the same level of support for the up-and-coming
+ <a href="http://www.id3.org">ID3v2</a> standard like id3lib.
+ The developers of id3lib work closely with the <a
+ href="http://www.id3.org">ID3v2</a> specification and go to
+ great effort to ensure the library correctly handles all its
+ nuances. By using id3lib for both your <a
+ href="http://www.id3.org/id3v1.html">ID3v1</a> and <a
+ href="http://www.id3.org">ID3v2</a> tagging needs, you can be
+ assured that your application produces tags that comply with
+ the standard now and in the future.
+
+ </dd>
+
+ <dt><b>Cross-platform</b></dt>
+ <dd>
+
+ A primary goal for id3lib is cross-platform compatibility. The
+ library is developed primarily on the <a
+ href="http://www.gnu.org">GNU</a>/<a
+ href="http://www.linux.org">Linux</a> operating system but has
+ been compiled and tested on other Unix-like OS's as well as
+ Windows NT.
+ </dd>
+
+ <dt><b>Multi-language</b></dt>
+ <dd>
+
+ id3lib aspires to provide interfaces for multiple programming
+ languages, and currently fully supports both C and C++. A COM
+ wrapper (id3com) is also supplied allowing VB, VBA, VBScript and
+ other COM-enabled languages to use the library.
+
+ </dd>
+ </dl>
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <a name="news"></a>
+ <table border=0 width="90%"><tr><td class=h2>Development</td></tr></table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ All development is centered around the the <a
+ href="http://sourceforge.net/project/?group_id=979">id3lib project
+ page</a> hosted by <a
+ href="http://www.sourceforge.net">SourceForge</a>. Please go there
+ to <a href="http://sourceforge.net/news/?group_id=979">find out the
+ latest news</a>, <a
+ href="http://sourceforge.net/project/filelist.php?group_id=979">download
+ the current release</a>, <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">join
+ the mailing list</a>, <a
+ href="http://sourceforge.net/bugs/?group_id=979">file a bug
+ report</a>, <a
+ href="http://sourceforge.net/patch/?group_id=979">submit a patch</a>,
+ <a href="http://sourceforge.net/cvs/?group_id=979">browse the CVS
+ repository</a>, or just <a
+ href="http://sourceforge.net/project/?group_id=979">look around</a>.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Licensing</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr><td>
+
+ The id3lib library is <a
+ href="http://www.opensource.org">open-source</a> software, licensed
+ under the <a href="http://www.gnu.org/copyleft/lesser.html">GNU
+ Library General Public License (LGPL)</a>. In short, this allows
+ any application to link to and use the library without affecting
+ their license, while guaranteeing that the id3lib library itself
+ (and any modifications to it) will remain freely available in
+ source code form. The project developers therefore greatly
+ encourage input from everyone, be it with feature suggestions, code
+ patches, bug reports, or anything. The best way to contribute to
+ this effort is to <a
+ href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">subscribe
+ to the mailing list</a> and join in on the discussions!
+
+ <br><br>
+
+ Versions of ID3Lib prior to and including version 3.05a were
+ released to the public domain. The last such release is still <a
+ href="http://download.sourceforge.net/id3lib/id3lib305.zip">available
+ for download</a>. These versions are therefore completely free of
+ any licence restrictions, but are no longer maintained.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Documentation</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+ The following documentation is available for those who wish to
+ develop software with id3lib:
+ <ul>
+
+ <li>
+
+ <a href="@DOX_DIR_HTML@/index.html">Documentation for the id3lib API</a>
+ is available thanks to the <a
+ href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>
+ documentation system.
+
+ <br><br>
+
+ <li>
+
+ There is a <a href="id3lib-manual.php">web-readable
+ translation</a> of the <a
+ href="http://download.sourceforge.net/id3lib/id3lib305.doc">original
+ ID3Lib manual</a>, written by Dirk Mahoney, the original author
+ of ID3Lib. The API for the current library has changed
+ somewhat, but this documentation is still mostly valid. Many
+ thanks to <a href="mailto:smoser@brickies.net">Scott Moser</a>
+ for the web-friendly translation.
+
+ <br><br>
+
+ <li>
+
+ <a href="mailto:merlin@starr.econ.nyu.edu">James Lin</a> wrote
+ some <a href="id3guide.html">guidelines</a> for those
+ programming with <a href="http://www.id3.org">ID3v2</a> tags.
+ It, too, is outdated, and some of the links are broken. But
+ most of the information is still pertinent and quite valuable.
+
+ </ul>
+ </td>
+ </tr>
+
+ </table>
+
+ <br>
+
+ <table border=0 width="90%">
+ <tr><td class=h2>Projects</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ The following software projects have used, do use, or will use
+ id3lib for their <a href="http://www.id3.org/id3v1.html">ID3v1</a>
+ and <a href="http://www.id3.org">ID3v2</a> tag
+ processing:
+
+ <ul>
+ <li>
+
+ <a href="http://www.musicmatch.com">MusicMatch</a>, creators of
+ the MusicMatch Jukebox for Windows and a previous project
+ coordinator for ID3Lib
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.freeamp.org">FreeAmp</a> is a
+ cross-platform mp3 player and, as of version 2.1, is using
+ id3lib for their <a href="http://www.id3.org">ID3v1/v2</a>
+ support.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.empeg.com">empeg</a>, creators of the
+ world-renowned in-car MP3 player, uses id3lib for reading and
+ writing <a href="http://www.id3.org">ID3v1/v2</a> tags in their
+ various tools and utilities.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://id3v2.sourceforge.net">The id3v2 tagger</a> is
+ a <a href="http://www.gnu.org">GNU</a>/<a
+ href="http://www.linux.org">Linux</a> command-line editor for
+ <a href="http://www.id3.org">ID3v1/v2</a> tags
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.zlurp.com">Zlurp!</a> is an all-in-one CD
+ audio tool for Windows that rips, encodes and tags CDs.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.adcock8.freeserve.co.uk/">The javpc
+ project</a>'s goal is to turn a PC into an audio/visual unit
+ sutibale for plugging into a Hi-Fi and TV.
+
+ <br><br>
+
+ <li>
+
+ <a href="http://coconutbeach.hypermart.net/sonize">Sonize</a> is
+ a collection of small but powerful tools integrated in one
+ application that organizes and prepares your mp3 files for
+ publishing on CDROM
+
+ <br><br>
+
+ <li>
+
+ <a href="http://ampbar.tripod.com">AmpBar</a> uses a modified
+ version of the 3.05a library in their MP3 player and ID3v2 tag
+ editor.
+
+ </ul>
+
+ The following software projects used the original version of
+ ID3Lib. Whether or not they still do is currently unknown.
+
+ <ul>
+ <li>
+
+ <a href="http://www.poikosoft.com/cdda/">Easy CD-DA
+ Extractor</a>, a Windows CD-Ripper/Tagger/CDDB
+
+ <br><br>
+
+ <li>
+
+ <a href="http://www.macamp.net">MacAmp</a>, a Macintosh MP3
+ Player
+
+ <br><br>
+
+ </ul>
+
+ If I have listed any of the above in error or if I have
+ neglected any other projects that use id3lib, please <a
+ href="mailto:scott@id3.org">let me
+ know</a> so that I might update the list accordingly.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <a name="contact"></a>
+ <table border=0 width="90%">
+ <tr><td class=h2>Contacting the Author</td></tr>
+ </table>
+ <table border=0 width="80%">
+ <tr>
+ <td>
+
+ The id3lib project is currently coordinated by <a
+ href="mailto:scott@id3.org">Scott Thomas Haug</a>. The original
+ ID3Lib library was written by <a href="mailto:dirk@id3.org">Dirk
+ Mahoney</a>.
+
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
+ <table align="center" border=0 width="90%">
+ <tr>
+ <td bgcolor="#FF7700" colspan=6><img src="fillpx.gif" width=1 height=1 alt="----------------------------------------------------------------------"></td>
+ </tr>
+ <tr>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/news/?group_id=979">News</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/project/filelist.php?group_id=979">Download</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://lists.sourceforge.net/mailman/listinfo/id3lib-devel">Mailing list</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/bugs/?group_id=979">Bugs</a>
+ </td>
+ <td class=h5 align="center" width="17%">
+ <a href="http://sourceforge.net/patch/?group_id=979">Patches</a>
+ </td>
+ <td class=h5 align="center" width="16%">
+ <a href="http://sourceforge.net/cvs/?group_id=979">CVS</a>
+ </td>
+ </tr>
+ </table>
+
+ <br><br>
+
+ <table align="center" width="80%" border="0">
+ <tr>
+ <td align="left">
+ <a href="http://sourceforge.net">
+ <IMG src="http://sourceforge.net/sflogo.php?group_id=979&amp;type=1" width="88" height="31" border="0" alt="SourceForge.net"></A>
+ </td>
+ <td align="right">
+
+ <a href="http://validator.w3.org/check/referer">
+ <img border=0
+ src="http://validator.w3.org/images/vh401"
+ alt="Valid HTML 4.01!" height=31 width=88></a>
+ </td>
+ </tr>
+ </table>
+ <br>
+ </body>
+</html>
diff --git a/doc/musicmatch.txt b/doc/musicmatch.txt
new file mode 100644
index 0000000..ae83179
--- /dev/null
+++ b/doc/musicmatch.txt
@@ -0,0 +1,529 @@
+$Id: musicmatch.txt,v 1.4 2000/09/09 23:02:37 eldamitri Exp $
+
+
+ MusicMatch (TM) tag format description
+
+Status of this document
+
+ This document is a description of a deprecated tagging format. The
+ information contained herein is not a specification; its intent is to
+ interpret the format based on hundreds of examples. It also relies heavily
+ on information obtained by others who have done similar investigations. It
+ is not based on any official documentation of the format, as such
+ documentation is not publicly available. Therefore the contents of this
+ document may change to adjust for newly-discovered information, but the
+ format itself is unlikely to change due to its deprecation.
+
+ Distribution of this document is unlimited.
+
+
+Abstract
+
+ This document describes the MusicMatch tagging format present in some
+ digital audio files. This format, like other tagging specifications,
+ provides a method for storing information about an audio file within itself
+ to document its contents. This format was developed by MusicMatch and
+ used exclusively by older versions of Jukebox, their popular, "all-in-one"
+ MP3 application.
+
+1. Table of contents
+
+ Status of this document
+ Abstract
+ 1. Table of contents
+ 2. Introduction
+ 3. Conventions in this document
+ 4. Tagging format
+ 4.1. Header
+ 4.2. Image extension
+ 4.3. Image binary
+ 4.4. Unused
+ 4.5. Version information
+ 4.6. Audio meta-data
+ 4.6.1. Single-line text fields
+ 4.6.2. Non-text fields
+ 4.6.3. Multi-line text fields
+ 4.6.4. Internet addresses
+ 4.6.5. Padding
+ 4.7. Data offsets
+ 4.8. Footer
+ 5. Identifying and parsing a MusicMatch tag
+ 6. Converting to ID3v2
+ 7. Copyright
+ 8. References
+ 9. Author's Address
+
+
+2. Introduction
+
+ The following document describes the structure of the tagging format used
+ by MusicMatch (TM) Jukebox, prior to version 4.0 of that application. This
+ program is a so-called "All-In-One" MP3 program and provides a CD-Ripper,
+ WAV-to-MP3 converter, database, and MP3 player.
+
+ The MusicMatch tagging format has gone through several incremental
+ iterations in its format, although the basic structure has remained fairly
+ constant throughout its history. The various formats of the MusicMatch tag
+ have been tightly coupled with the version of Jukebox that created it. As
+ such, this document will refer to the Jukebox version and tagging format
+ version interchangeably.
+
+ As of version 4.0, MusicMatch has deprecated the use of this format in
+ their own Jukebox application, transitioning instead to ID3v2, an open
+ standard for tagging digital audio. Unfortunately, despite repeated
+ requests, MusicMatch has not provided to the public any documents
+ describing this format, and the MusicMatch Jukebox is the only
+ widely-distributed software application that can read and write these tags.
+
+ As such, this text may not be completely accurate and is surely incomplete,
+ but it covers enough to the format to enable one to write robust software
+ to find and parse tags in this format. For example, the id3lib tagging
+ library's MusicMatch parsing routines were written solely based on the
+ information found in this document. However, the authors cannot be held
+ responsible for any inaccuracies or any harm caused by using this
+ information. One can assume that the specifition is unlikely to change,
+ given MusicMatch's own abandonment of the format. It should also be noted
+ that incoporating functionality into applications to write tags in this
+ format is discouraged, as the format has been officially deprecated by
+ MusicMatch themselves.
+
+3. Conventions in this document
+
+ This document borrows heavily from specifications written by Martin
+ Nillson, author of the ID3v2 tagging standard. Much of the structure,
+ formatting, and other such conventions used in the ID3v2 specifications are
+ carried over into this document.
+
+ Text within "" is a text string exactly as it appears in a tag. Numbers
+ preceded with $ are hexadecimal and numbers preceded with % are binary. $xx
+ is used to indicate a byte with unknown content.
+
+4. Tag overview
+
+ The MusicMatch Tagging Format was designed to store specific types of audio
+ meta-data inside the audio file itself. As the format was used exclusively
+ by the MusicMatch Jukebox application, it is used only with MPEG-1/2 layer
+ III files encoded with that program. However, its tagging format is not
+ inherently exclusive of other audio formats, and could conceivably be
+ used with other types of encodings.
+
+ MusicMatch tags were originally designed to come at the very end of MP3
+ files, after all of the MP3 audio frames. Starting with Jukebox version
+ 3.1, the application became more ID3-friendly and started placing ID3v1
+ tags after the MusicMatch tag as well. In practice, since very few
+ applications outside of the MusicMatch Jukebox are capable of reading and
+ understanding this format, it is not unusual to find MusicMatch tags
+ "buried" within mp3 files, coming before other types of tagging formats in
+ a file, such as Lyrics3 or ID3v2.4.0. Such "relocations" are not uncommon,
+ and therefore any software application that intends to find, read, and
+ parse MusicMatch tags should be flexible in this endeavor, despite the
+ apparent intentions of the original specification.
+
+ Although various sections of a MusicMatch tag are fixed in length, other
+ sections are not, and so tag lengths can vary from one file to another. A
+ valid MusicMatch tag will be at least 8 kilobytes (8192 bytes) in length.
+ Those tags with image data will often be much larger.
+
+ The byte-order in 4-byte pointers and multibyte numbers for MusicMatch tags
+ is least-significant byte (LSB) first, also known as "little endian". For
+ example, $12345678 is encoded as $78 56 34 12.
+
+ Overall tag structure:
+
+ +-----------------------------+
+ | Header |
+ | (256 bytes, OPTIONAL) |
+ +-----------------------------+
+ | Image extension (4 bytes) |
+ +-----------------------------+
+ | Image binary |
+ | (var. length >= 4 bytes) |
+ +-----------------------------+
+ | Unused (4 bytes) |
+ +-----------------------------+
+ | Version info (256 bytes) |
+ +-----------------------------+
+ | Audio meta-data |
+ | (var. length >= 7868 bytes) |
+ +-----------------------------+
+ | Data offsets (20 bytes) |
+ +-----------------------------+
+ | Footer (48 bytes) |
+ +-----------------------------+
+
+ This document will describe the various sections of the tag in the order
+ listed above (that is, in the sequential order that they appear when
+ reading the tag from beginning to end). However, due to the nature of the
+ tag's format, in practice the tag's sections will often be parsed in the
+ reverse order. A robust parsing algorithm will be suggested and described
+ later in the document.
+
+4.1. Header
+
+ An optional tag header often precedes the tag data in a MusicMatch tag.
+ Although the rules that determine this header's required presence are
+ unknown, the header is usually found in tag versions up to and including
+ 2.50, and is usually lacking otherwise. Luckily, its format is rigid and
+ therefore its presence is easy to determine. The data in the header are
+ not vital to the correct parsing of the rest of the tag and can thus be
+ discarded. The header is the only optional section in a MusicMatch tag.
+ All other sections are required to consider the tag valid.
+
+ The header section is always 256 bytes in length. It begins with three
+ 10-byte subsections, and ends with 226 bytes of space ($20) padding. Each
+ of the first three subsections contains an 8-byte ASCII text string
+ followed by two bytes of null ($00) padding.
+
+ The first subsection serves as a sync string: its 8-byte string is always
+ "18273645".
+
+ The second subsection's 8-byte string is the version of the Xing encoder
+ used to encode the mp3 file. The last four bytes of this string are
+ usually '0' ($30). An example of this string is "1.010000".
+
+ The third and final 10-byte subsection is the version of the MusicMatch
+ Jukebox used to encode the mp3 file. The last four bytes of this string
+ are usually '0' ($30). An example of this string is "2.120000".
+
+ Sync string "18273645"
+ Null padding $00 00
+ Xing encoder version <8-byte numerical ASCII string>
+ Null padding $00 00
+ MusicMatch version <8-byte numerical ASCII string>
+ Null padding $00 00
+ Space padding 226 * $20
+
+4.2. Image extension
+
+ MusicMatch tags can contain at most one image. This first required section
+ is the extension of the image when saved as a file (for example, "jpg" or
+ "bmp"). This section is 4 bytes in length, and the data is padded with
+ spaces ($20) if the extension doesn't use all 4 bytes (in practice, 3-byte
+ extensions are the most prevalent). Likewise, tags without images have all
+ spaces for this section (4 * $20).
+
+ Picture extension $xx xx xx xx
+
+4.3. Image binary
+
+ When an image is present in the tag, the image binary section consists of
+ two fields. The first field is the size of the image data, in bytes. The
+ second is the actual image data.
+
+ Image size $xx xx xx xx
+ Image data <binary data>
+
+ If no image is present, the image binary section consists of exactly four
+ null bytes ($00 00 00 00).
+
+4.4. Unused
+
+ This section is never used, to the best of the author's knowledge. It is
+ always 4 null ($00) bytes.
+
+ Null padding $00 00 00 00
+
+4.5. Version information
+
+ This section of the tag has the exact same format as the header. Unlike
+ the header, this section is required for the tag to be considered valid.
+
+ Sync string "18273645"
+ Null padding $00 00
+ Xing encoder version <8-byte numerical ASCII string>
+ Null padding $00 00
+ MusicMatch version <8-byte numerical ASCII string>
+ Null padding $00 00
+ Space padding 226 * $20
+
+4.6. Audio meta-data
+
+ The audio meta-data is the heart of the MusicMatch tag. It contains most
+ of the pertinent information found in other tagging formats (song title,
+ album title, artist, etc.) and some that are unique to this format (mood,
+ prefernce, situation).
+
+ In all versions of the MusicMatch format up to and including 3.00, this
+ section is always 7868 bytes in length. All subsequent versions allowed
+ three possible lengths for this section: 7936, 8004, and 8132 bytes. The
+ conditions under which a particular length from these three possibilities
+ was used is unknown. In all cases, this section is padded with dashes
+ ($2D) to achieve this constant size.
+
+ Due to the great number of fields in this portion of the tag, they are
+ divided amongst the next four sections of the document: single-line text
+ fields, non-text fields, multi-line text fields, and internet addresses.
+ This clarification is somewhat arbitrary and somewhat inaccurate (some of
+ the fields described as "non-text" are indeed ASCII strings). However, the
+ clarification does allow for easier description of the meta-data as a
+ whole. At any rate, the actual fields in this section of the tag appear
+ sequentially in the order presented.
+
+
+4.6.1. Single-line text fields
+
+ The first group entries in this section of the tag are variable-length
+ ASCII text strings. Each of these strings are preceded by a two-byte field
+ describing the size of the following string (again, in LSB order).
+ Multiple entries in a text field are separated by a semicolon ($3B). An
+ empty (and non-existant) text field is indicated by a size field of 0 ($00
+ 00).
+
+ The first three of these entries are fairly-self explanatory: song title,
+ album title, and artist name.
+
+ The final five entries are a little less common: Genre, Tempo, Mood,
+ Situation, and Preference. These fields can contain any information, but
+ do to the interface and default set-up for the Jukebox application, they
+ typically are limited to a subset of possibilities.
+
+ The Genre entry differs from the ID3v1 tagging format in that it allows
+ a full-text genre description, whereas ID3v1 maps a number to a list of
+ genres. Again, the genre description could be anything, but the interface
+ in Jukebox typically limited most users to the standard ID3v1 genres.
+
+ The Tempo entry is intended to describe the general tempo of the song. The
+ Jukebox application provided the following defaults: None, Fast, Pretty
+ fast, Moderate, Pretty slow, and Slow.
+
+ The Mood entry describes what type of mood the audio establishes: Typical
+ values include the following: None, Wild, Upbeat, Morose, Mellow, Tranquil,
+ and Comatose.
+
+ The Situation entry describes in which situation this music is best played.
+ Expect the following: None, Dance, Party, Romantic, Dinner, Background,
+ Seasonal, Rave, and Drunken Brawl.
+
+ The Preference entry allows the user to rate the song. Possible values
+ include the following: None, Excellent, Very Good, Good, Fair, Poor, and
+ Bad Taste.
+
+ Song title length $xx xx
+ Song title <ASCII string>
+ Album title length $xx xx
+ Album title <ASCII string>
+ Artist name length $xx xx
+ Artist name <ASCII string>
+ Genre length $xx xx
+ Genre <ASCII string>
+ Tempo length $xx xx
+ Tempo <ASCII string>
+ Mood length $xx xx
+ Mood <ASCII string>
+ Situation length $xx xx
+ Situation <ASCII string>
+ Preference length $xx xx
+ Preference <ASCII string>
+
+4.6.2. Non-text fields
+
+ The next group of fields is described here as "non-text". They are
+ probably better described as entries that are auto-created (i.e., not
+ entered in by a user), although this isn't entirely accurate, either, as
+ the track number field is determined by user input. At any rate, they've
+ been separated to clarify the presentation of the material.
+
+ The "Song duration" entry consists of two fields: a size and text. The
+ text is formatted as "minutes:seconds", and thus the size field is
+ typically 4 ($04 00).
+
+ The only field that is neither a string nor a LSB numerical value is the
+ creation date. It is 8-byte floating-point value. It can be interpreted
+ as a TDateTime in the Delphi programming language, where the integral
+ portion is the number of elapsed days since 1899-12-30, and the mantissa
+ portion represents the fractional portion of that day, where .0 would be
+ midnight, .5 would be noon, and .99999... would be just before midnight
+ of the next day. In practice, this field is typically unused and will be
+ filled with 8 null ($00) bytes.
+
+ The next field is the play counter, presumably maintained by the Jukebox
+ application. Most of the time this field is unused, and is typically 0
+ ($00 00 00 00).
+
+ The next entry is a size/text combo and represents the original filename
+ and path. As these tags were created almost universally on Windows
+ machines, the entries are typically in the form of "C:\path\to\file.mp3".
+
+ The next size/text entry is the album serial number fetched from the online
+ CDDB when a track is ripped with MusicMatch.
+
+ The final field is the track number, usually entered automatically when
+ ripping, encoding, and tagging the audio off from a CD using CDDB.
+
+ Song duration length $xx xx
+ Song duration <ASCII string>
+ Creation date <8-byte IEEE-64 float>
+ Play counter $xx xx xx xx
+ Original filename length $xx xx
+ Original filename <ASCII string>
+ Serial number length $xx xx
+ Serial number <ASCII string>
+ Track number $xx xx
+
+4.6.3. Multi-line text fields
+
+ The next three entries are typically multi-line entries. All line
+ separators use the Windows-standard carriage return ($0D 0A). As with the
+ single-line text entries, the text fields are preceded by LSB size fields
+ which indicate their length.
+
+ Notes length $xx xx
+ Notes <ASCII string>
+ Artist bio length $xx xx
+ Artist bio <ASCII string>
+ Lyrics length $xx xx
+ Lyrics <ASCII string>
+
+4.6.4. Internet addresses
+
+ The final group of meta-data are internet addresses. As with other text
+ entries, the text fields are preceded by LSB size fields.
+
+ Artist URL length $xx xx
+ Artist URL <ASCII string>
+ "Buy CD" URL length $xx xx
+ "Buy CD" URL <ASCII string>
+ Artist email length $xx xx
+ Artist email <ASCII string>
+
+4.6.5. Padding
+
+ The data fields are then followed by 16 null ($00) bytes. Presumably these
+ were intended for (up to 8) future text fields.
+
+ The remainder of this section is padded with '-' ($2D) characters.
+
+4.7. Data offsets
+
+ This section of the tag was intended to give offsets into the file for each
+ of the five major required sections of the tag. The offsets, however, are
+ off by 1; for searching a file where the first position is offset 0, the
+ offset given here must be reduced by 1. In practice, however, these
+ offsets can often be invalid, since the data that comes before may be
+ increased or reduces (such as when an ID3v2 tag is appended to the file).
+ Therefore these offsets are best used to calculate the size of the sections
+ by finding the difference of two consecutive offsets. Obviously, the size
+ of the audio meta-data section must be calculated in a different manner.
+
+ Image extension offset $xx xx xx xx
+ Image binary offset $xx xx xx xx
+ Unused offset $xx xx xx xx
+ Version info offset $xx xx xx xx
+ Audio meta-data offset $xx xx xx xx
+
+4.8. Footer
+
+ Unlike the header, the footer is a required section of any MusicMatch tag,
+ and checking for its existance is an easy way to determine if a file has a
+ MusicMatch tag. It is always 48 bytes in length. The first 19 bytes is
+ the company name "Brava Software Inc." (Note: it seems that the company
+ name has officially changed to MusicMatch, as "Brava Software" is not
+ mentioned anywhere on their website), followed by 13 bytes of space ($20)
+ padding. The next 4 bytes is the tag version as a numerical ASCII string
+ (e.g., "3.05"), and should match the version string found in the Version
+ section and the (optional) header. This is followed by 12 bytes of space
+ ($20) padding.
+
+ Signature "Brava Software Inc."
+ Space padding 13 * $20
+ Tag version <4-byte numerical ASCII string>
+ Space padding 12 * $20
+
+5. Identifying and parsing a MusicMatch tag
+
+ Finding and parsing a MusicMatch tag is not difficult to do, but due to
+ lack of foresight and questionable design decisions by MusicMatch, care
+ must be taken to ensure it is done correctly.
+
+ <unfinished />
+
+6. Converting to ID3v2
+
+ As of Jukebox 4.0, MusicMatch has abandoned the MusicMatch tagging format
+ in favor of the open standard ID3v2. The Jukebox application will convert
+ old tags to ID3v2 upon request, but as this is a closed application that
+ serves a limited number of platforms (currently on Windows and Macintosh),
+ having a public specification for performing this mapping is necessary. As
+ ID3v2 can encapsulate all of the information found in the original
+ MusicMatch format while being infinitely more flexible, the decision to
+ convert shouldn't be a difficult one.
+
+ <unfinished />
+
+7. Copyright
+
+ Copyright (C) Scott Thomas Haug 2000. All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to others,
+ and derivative works that comment on or otherwise explain it or assist in
+ its implementation may be prepared, copied, published and distributed, in
+ whole or in part, without restriction of any kind, provided that a
+ reference to this document is included on all such copies and derivative
+ works. However, this document itself may not be modified in any way and
+ reissued as the original document.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked.
+
+ This document and the information contained herein is provided on an 'AS
+ IS' basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
+ INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+8. References
+
+ [MMTrailer] Peter "The Videoripper" Luijer,
+ 'Description of the MusicMatch trailer in MP3 files'
+
+ <url:http://members.xoom.com/videoripper/warez/mmtrailer.txt>
+
+ [ID3v2] Martin Nilsson, 'ID3v2 informal standard'.
+
+ <url:http://www.id3.org/id3v2.3.0.txt>
+
+ [id3lib] Scott Thomas Haug, 'The ID3v1/ID3v2 Tagging Library'
+
+ <url:http://www.id3lib.org>
+
+ [ISO-8859-1] ISO/IEC DIS 8859-1.
+ '8-bit single-byte coded graphic character sets, Part 1: Latin
+ alphabet No. 1.' Technical committee / subcommittee: JTC 1 / SC 2
+
+ [JFIF] 'JPEG File Interchange Format, version 1.02'
+
+ <url:http://www.w3.org/Graphics/JPEG/jfif.txt>
+
+ [MPEG] ISO/IEC 11172-3:1993.
+ 'Coding of moving pictures and associated audio for digital storage
+ media at up to about 1,5 Mbit/s, Part 3: Audio.'
+ Technical committee / subcommittee: JTC 1 / SC 29
+ and
+ ISO/IEC 13818-3:1995
+ 'Generic coding of moving pictures and associated audio information,
+ Part 3: Audio.'
+ Technical committee / subcommittee: JTC 1 / SC 29
+ and
+ ISO/IEC DIS 13818-3
+ 'Generic coding of moving pictures and associated audio information,
+ Part 3: Audio (Revision of ISO/IEC 13818-3:1995)'
+
+ [URL] T. Berners-Lee, L. Masinter & M. McCahill, 'Uniform Resource
+ Locators (URL)', RFC 1738, December 1994.
+
+ <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt>
+
+ [UTF-8] F. Yergeau, 'UTF-8, a transformation format of ISO 10646',
+ RFC 2279, January 1998.
+
+ <url:ftp://ftp.isi.edu/in-notes/rfc2279.txt>
+
+
+9. Author's Address
+
+ Written by
+
+ Scott Thomas Haug
+ Seattle, WA
+ USA \ No newline at end of file
diff --git a/examples/221-compressed.tag b/examples/221-compressed.tag
new file mode 100644
index 0000000..121a240
--- /dev/null
+++ b/examples/221-compressed.tag
Binary files differ
diff --git a/examples/230-compressed.tag b/examples/230-compressed.tag
new file mode 100644
index 0000000..238dc85
--- /dev/null
+++ b/examples/230-compressed.tag
Binary files differ
diff --git a/examples/230-picture.tag b/examples/230-picture.tag
new file mode 100644
index 0000000..7c29582
--- /dev/null
+++ b/examples/230-picture.tag
Binary files differ
diff --git a/examples/230-syncedlyrics.tag b/examples/230-syncedlyrics.tag
new file mode 100644
index 0000000..3f152bb
--- /dev/null
+++ b/examples/230-syncedlyrics.tag
Binary files differ
diff --git a/examples/230-unicode.tag b/examples/230-unicode.tag
new file mode 100644
index 0000000..1908713
--- /dev/null
+++ b/examples/230-unicode.tag
Binary files differ
diff --git a/examples/Makefile.am b/examples/Makefile.am
new file mode 100644
index 0000000..8b087fb
--- /dev/null
+++ b/examples/Makefile.am
@@ -0,0 +1,98 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if ID3_NEEDDEBUG
+ID3_DEBUG_LIBS = -lcwd -lbfd -liberty
+else
+ID3_DEBUG_LIBS =
+endif
+
+if ID3_NEEDZLIB
+zlib_lib = $(top_builddir)/zlib/src/libz.la
+zlib_include = -I$(top_srcdir)/zlib/include
+else
+zlib_lib = -lz
+zlib_include =
+endif
+
+if ID3_NEEDGETOPT_LONG
+getopt_lib = getopt.o getopt1.o
+else
+getopt_lib =
+endif
+
+LDADD = $(top_builddir)/src/libid3.la $(zlib_lib) $(ID3_DEBUG_LIBS) $(getopt_lib)
+
+INCLUDES = @ID3LIB_DEBUG_FLAGS@ -I$(top_srcdir)/include
+
+bin_PROGRAMS = id3info id3convert id3tag id3cp
+check_PROGRAMS = \
+ id3simple \
+ testpic \
+ testunicode \
+ testcompression \
+ testremove \
+ testio \
+ get_pic \
+ findstr \
+ findeng
+
+id3cp_SOURCES = demo_copy_options.c demo_copy.cpp
+
+id3info_SOURCES = demo_info_options.c demo_info.cpp
+
+id3convert_SOURCES = demo_convert_options.c demo_convert.cpp
+
+id3tag_SOURCES = demo_tag_options.c demo_tag.cpp
+
+id3simple_SOURCES = demo_simple.cpp
+testpic_SOURCES = test_pic.cpp
+testunicode_SOURCES = test_unicode.cpp
+testcompression_SOURCES = test_compression.cpp
+testremove_SOURCES = test_remove.cpp
+testio_SOURCES = test_io.cpp
+get_pic_SOURCES = get_pic.cpp
+findeng_SOURCES = findeng.cpp
+findstr_SOURCES = findstr.cpp
+
+tag_files = \
+ composer.jpg \
+ demo_main.cpp \
+ 221-compressed.tag \
+ 230-compressed.tag \
+ 230-picture.tag \
+ 230-unicode.tag \
+ 230-syncedlyrics.tag \
+ thatspot.tag \
+ ozzy.tag \
+ crc53865.mp3
+
+getopt_files = \
+ getopt.c \
+ getopt.h \
+ getopt1.c
+
+header_files = \
+ demo_tag_options.h \
+ demo_copy_options.h \
+ demo_info_options.h \
+ demo_convert_options.h
+
+EXTRA_DIST = \
+ $(tag_files) \
+ $(getopt_files) \
+ $(header_files)
+
+PROGNAME = gengetopt
+
+%.c: $(srcdir)/%.ggo
+ $(PROGNAME) --file-name=$* --unamed-opts --input=$<
+
+demo_%.cpp: demo_%_options.c
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..d6d9da3
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,986 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+@ID3_NEEDDEBUG_TRUE@ID3_DEBUG_LIBS = -lcwd -lbfd -liberty
+@ID3_NEEDDEBUG_FALSE@ID3_DEBUG_LIBS =
+
+@ID3_NEEDZLIB_TRUE@zlib_lib = $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDZLIB_FALSE@zlib_lib = -lz
+@ID3_NEEDZLIB_TRUE@zlib_include = -I$(top_srcdir)/zlib/include
+@ID3_NEEDZLIB_FALSE@zlib_include =
+
+@ID3_NEEDGETOPT_LONG_TRUE@getopt_lib = getopt.o getopt1.o
+@ID3_NEEDGETOPT_LONG_FALSE@getopt_lib =
+
+LDADD = $(top_builddir)/src/libid3.la $(zlib_lib) $(ID3_DEBUG_LIBS) $(getopt_lib)
+
+INCLUDES = @ID3LIB_DEBUG_FLAGS@ -I$(top_srcdir)/include
+
+bin_PROGRAMS = id3info id3convert id3tag id3cp
+check_PROGRAMS = \
+ id3simple \
+ testpic \
+ testunicode \
+ testcompression \
+ testremove \
+ testio \
+ get_pic \
+ findstr \
+ findeng
+
+
+id3cp_SOURCES = demo_copy_options.c demo_copy.cpp
+
+id3info_SOURCES = demo_info_options.c demo_info.cpp
+
+id3convert_SOURCES = demo_convert_options.c demo_convert.cpp
+
+id3tag_SOURCES = demo_tag_options.c demo_tag.cpp
+
+id3simple_SOURCES = demo_simple.cpp
+testpic_SOURCES = test_pic.cpp
+testunicode_SOURCES = test_unicode.cpp
+testcompression_SOURCES = test_compression.cpp
+testremove_SOURCES = test_remove.cpp
+testio_SOURCES = test_io.cpp
+get_pic_SOURCES = get_pic.cpp
+findeng_SOURCES = findeng.cpp
+findstr_SOURCES = findstr.cpp
+
+tag_files = \
+ composer.jpg \
+ demo_main.cpp \
+ 221-compressed.tag \
+ 230-compressed.tag \
+ 230-picture.tag \
+ 230-unicode.tag \
+ 230-syncedlyrics.tag \
+ thatspot.tag \
+ ozzy.tag \
+ crc53865.mp3
+
+
+getopt_files = \
+ getopt.c \
+ getopt.h \
+ getopt1.c
+
+
+header_files = \
+ demo_tag_options.h \
+ demo_copy_options.h \
+ demo_info_options.h \
+ demo_convert_options.h
+
+
+EXTRA_DIST = \
+ $(tag_files) \
+ $(getopt_files) \
+ $(header_files)
+
+
+PROGNAME = gengetopt
+subdir = examples
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = id3info$(EXEEXT) id3convert$(EXEEXT) id3tag$(EXEEXT) \
+ id3cp$(EXEEXT)
+check_PROGRAMS = id3simple$(EXEEXT) testpic$(EXEEXT) \
+ testunicode$(EXEEXT) testcompression$(EXEEXT) \
+ testremove$(EXEEXT) testio$(EXEEXT) get_pic$(EXEEXT) \
+ findstr$(EXEEXT) findeng$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+am_findeng_OBJECTS = findeng.$(OBJEXT)
+findeng_OBJECTS = $(am_findeng_OBJECTS)
+findeng_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@findeng_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+findeng_LDFLAGS =
+am_findstr_OBJECTS = findstr.$(OBJEXT)
+findstr_OBJECTS = $(am_findstr_OBJECTS)
+findstr_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@findstr_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+findstr_LDFLAGS =
+am_get_pic_OBJECTS = get_pic.$(OBJEXT)
+get_pic_OBJECTS = $(am_get_pic_OBJECTS)
+get_pic_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@get_pic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+get_pic_LDFLAGS =
+am_id3convert_OBJECTS = demo_convert_options.$(OBJEXT) \
+ demo_convert.$(OBJEXT)
+id3convert_OBJECTS = $(am_id3convert_OBJECTS)
+id3convert_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3convert_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+id3convert_LDFLAGS =
+am_id3cp_OBJECTS = demo_copy_options.$(OBJEXT) demo_copy.$(OBJEXT)
+id3cp_OBJECTS = $(am_id3cp_OBJECTS)
+id3cp_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3cp_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+id3cp_LDFLAGS =
+am_id3info_OBJECTS = demo_info_options.$(OBJEXT) demo_info.$(OBJEXT)
+id3info_OBJECTS = $(am_id3info_OBJECTS)
+id3info_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3info_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+id3info_LDFLAGS =
+am_id3simple_OBJECTS = demo_simple.$(OBJEXT)
+id3simple_OBJECTS = $(am_id3simple_OBJECTS)
+id3simple_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3simple_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+id3simple_LDFLAGS =
+am_id3tag_OBJECTS = demo_tag_options.$(OBJEXT) demo_tag.$(OBJEXT)
+id3tag_OBJECTS = $(am_id3tag_OBJECTS)
+id3tag_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@id3tag_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+id3tag_LDFLAGS =
+am_testcompression_OBJECTS = test_compression.$(OBJEXT)
+testcompression_OBJECTS = $(am_testcompression_OBJECTS)
+testcompression_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testcompression_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+testcompression_LDFLAGS =
+am_testio_OBJECTS = test_io.$(OBJEXT)
+testio_OBJECTS = $(am_testio_OBJECTS)
+testio_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testio_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+testio_LDFLAGS =
+am_testpic_OBJECTS = test_pic.$(OBJEXT)
+testpic_OBJECTS = $(am_testpic_OBJECTS)
+testpic_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testpic_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+testpic_LDFLAGS =
+am_testremove_OBJECTS = test_remove.$(OBJEXT)
+testremove_OBJECTS = $(am_testremove_OBJECTS)
+testremove_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testremove_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+testremove_LDFLAGS =
+am_testunicode_OBJECTS = test_unicode.$(OBJEXT)
+testunicode_OBJECTS = $(am_testunicode_OBJECTS)
+testunicode_LDADD = $(LDADD)
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_FALSE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_FALSE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ $(top_builddir)/zlib/src/libz.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_TRUE@ getopt1.o
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@testunicode_DEPENDENCIES = \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ $(top_builddir)/src/libid3.la \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt.o \
+@ID3_NEEDDEBUG_TRUE@@ID3_NEEDGETOPT_LONG_TRUE@@ID3_NEEDZLIB_FALSE@ getopt1.o
+testunicode_LDFLAGS =
+
+DEFS = @DEFS@
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/demo_convert.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_convert_options.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_copy.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_copy_options.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_info.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_info_options.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_simple.Po ./$(DEPDIR)/demo_tag.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/demo_tag_options.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/findeng.Po ./$(DEPDIR)/findstr.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/get_pic.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/test_compression.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/test_io.Po ./$(DEPDIR)/test_pic.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/test_remove.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/test_unicode.Po
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
+ $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CFLAGS = @CFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXFLAGS = @CXXFLAGS@
+DIST_SOURCES = $(findeng_SOURCES) $(findstr_SOURCES) $(get_pic_SOURCES) \
+ $(id3convert_SOURCES) $(id3cp_SOURCES) $(id3info_SOURCES) \
+ $(id3simple_SOURCES) $(id3tag_SOURCES) \
+ $(testcompression_SOURCES) $(testio_SOURCES) $(testpic_SOURCES) \
+ $(testremove_SOURCES) $(testunicode_SOURCES)
+DIST_COMMON = Makefile.am Makefile.in
+SOURCES = $(findeng_SOURCES) $(findstr_SOURCES) $(get_pic_SOURCES) $(id3convert_SOURCES) $(id3cp_SOURCES) $(id3info_SOURCES) $(id3simple_SOURCES) $(id3tag_SOURCES) $(testcompression_SOURCES) $(testio_SOURCES) $(testpic_SOURCES) $(testremove_SOURCES) $(testunicode_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cpp .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu examples/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ p1=`echo "$$p1" | sed -e 's,^.*/,,'`; \
+ f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ f=`echo "$$f" | sed -e 's,^.*/,,'`; \
+ echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
+ rm -f $(DESTDIR)$(bindir)/$$f; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+findeng$(EXEEXT): $(findeng_OBJECTS) $(findeng_DEPENDENCIES)
+ @rm -f findeng$(EXEEXT)
+ $(CXXLINK) $(findeng_LDFLAGS) $(findeng_OBJECTS) $(findeng_LDADD) $(LIBS)
+findstr$(EXEEXT): $(findstr_OBJECTS) $(findstr_DEPENDENCIES)
+ @rm -f findstr$(EXEEXT)
+ $(CXXLINK) $(findstr_LDFLAGS) $(findstr_OBJECTS) $(findstr_LDADD) $(LIBS)
+get_pic$(EXEEXT): $(get_pic_OBJECTS) $(get_pic_DEPENDENCIES)
+ @rm -f get_pic$(EXEEXT)
+ $(CXXLINK) $(get_pic_LDFLAGS) $(get_pic_OBJECTS) $(get_pic_LDADD) $(LIBS)
+id3convert$(EXEEXT): $(id3convert_OBJECTS) $(id3convert_DEPENDENCIES)
+ @rm -f id3convert$(EXEEXT)
+ $(CXXLINK) $(id3convert_LDFLAGS) $(id3convert_OBJECTS) $(id3convert_LDADD) $(LIBS)
+id3cp$(EXEEXT): $(id3cp_OBJECTS) $(id3cp_DEPENDENCIES)
+ @rm -f id3cp$(EXEEXT)
+ $(CXXLINK) $(id3cp_LDFLAGS) $(id3cp_OBJECTS) $(id3cp_LDADD) $(LIBS)
+id3info$(EXEEXT): $(id3info_OBJECTS) $(id3info_DEPENDENCIES)
+ @rm -f id3info$(EXEEXT)
+ $(CXXLINK) $(id3info_LDFLAGS) $(id3info_OBJECTS) $(id3info_LDADD) $(LIBS)
+id3simple$(EXEEXT): $(id3simple_OBJECTS) $(id3simple_DEPENDENCIES)
+ @rm -f id3simple$(EXEEXT)
+ $(CXXLINK) $(id3simple_LDFLAGS) $(id3simple_OBJECTS) $(id3simple_LDADD) $(LIBS)
+id3tag$(EXEEXT): $(id3tag_OBJECTS) $(id3tag_DEPENDENCIES)
+ @rm -f id3tag$(EXEEXT)
+ $(CXXLINK) $(id3tag_LDFLAGS) $(id3tag_OBJECTS) $(id3tag_LDADD) $(LIBS)
+testcompression$(EXEEXT): $(testcompression_OBJECTS) $(testcompression_DEPENDENCIES)
+ @rm -f testcompression$(EXEEXT)
+ $(CXXLINK) $(testcompression_LDFLAGS) $(testcompression_OBJECTS) $(testcompression_LDADD) $(LIBS)
+testio$(EXEEXT): $(testio_OBJECTS) $(testio_DEPENDENCIES)
+ @rm -f testio$(EXEEXT)
+ $(CXXLINK) $(testio_LDFLAGS) $(testio_OBJECTS) $(testio_LDADD) $(LIBS)
+testpic$(EXEEXT): $(testpic_OBJECTS) $(testpic_DEPENDENCIES)
+ @rm -f testpic$(EXEEXT)
+ $(CXXLINK) $(testpic_LDFLAGS) $(testpic_OBJECTS) $(testpic_LDADD) $(LIBS)
+testremove$(EXEEXT): $(testremove_OBJECTS) $(testremove_DEPENDENCIES)
+ @rm -f testremove$(EXEEXT)
+ $(CXXLINK) $(testremove_LDFLAGS) $(testremove_OBJECTS) $(testremove_LDADD) $(LIBS)
+testunicode$(EXEEXT): $(testunicode_OBJECTS) $(testunicode_DEPENDENCIES)
+ @rm -f testunicode$(EXEEXT)
+ $(CXXLINK) $(testunicode_LDFLAGS) $(testunicode_OBJECTS) $(testunicode_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_convert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_convert_options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_copy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_copy_options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_info_options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_simple.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_tag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo_tag_options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findeng.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findstr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_pic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_compression.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_remove.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_unicode.Po@am__quote@
+
+distclean-depend:
+ -rm -rf ./$(DEPDIR)
+
+.c.o:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
+
+.c.obj:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(COMPILE) -c `cygpath -w $<`
+
+.c.lo:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+CCDEPMODE = @CCDEPMODE@
+
+.cpp.o:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.cpp.obj:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
+
+.cpp.lo:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+CXXDEPMODE = @CXXDEPMODE@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: check-am
+all-am: Makefile $(PROGRAMS)
+
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+ distclean-generic distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-checkPROGRAMS clean-generic clean-libtool distclean \
+ distclean-compile distclean-depend distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am info \
+ info-am install install-am install-binPROGRAMS install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool tags uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+%.c: $(srcdir)/%.ggo
+ $(PROGNAME) --file-name=$* --unamed-opts --input=$<
+
+demo_%.cpp: demo_%_options.c
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/Mp3test.sln b/examples/Mp3test.sln
new file mode 100644
index 0000000..790fd4d
--- /dev/null
+++ b/examples/Mp3test.sln
@@ -0,0 +1,49 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mp3test", "Mp3test.vcproj", "{D343BF64-9B60-4203-8F63-10766889FFAD}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD} = {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "id3lib", "..\libprj\id3lib.vcproj", "{B1B5C626-7AFB-42F6-B3FE-32825D9152AD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimplifyPeer Utilities static lib", "..\..\..\source\Peer\PeerUtils\PeerUtils.vcproj", "{0396466A-2BCE-4768-BB14-DBD86454E0D8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ NASM Debug|Win32 = NASM Debug|Win32
+ NASM Release|Win32 = NASM Release|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.Debug|Win32.Build.0 = Debug|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.NASM Debug|Win32.ActiveCfg = Debug|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.NASM Debug|Win32.Build.0 = Debug|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.NASM Release|Win32.ActiveCfg = Release|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.NASM Release|Win32.Build.0 = Release|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.Release|Win32.ActiveCfg = Release|Win32
+ {D343BF64-9B60-4203-8F63-10766889FFAD}.Release|Win32.Build.0 = Release|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Debug|Win32.Build.0 = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.NASM Debug|Win32.ActiveCfg = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.NASM Debug|Win32.Build.0 = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.NASM Release|Win32.ActiveCfg = Release|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.NASM Release|Win32.Build.0 = Release|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Release|Win32.ActiveCfg = Release|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Release|Win32.Build.0 = Release|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.Debug|Win32.Build.0 = Debug|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.NASM Debug|Win32.ActiveCfg = Debug|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.NASM Debug|Win32.Build.0 = Debug|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.NASM Release|Win32.ActiveCfg = Release|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.NASM Release|Win32.Build.0 = Release|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.Release|Win32.ActiveCfg = Release|Win32
+ {0396466A-2BCE-4768-BB14-DBD86454E0D8}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/Mp3test.vcproj b/examples/Mp3test.vcproj
new file mode 100644
index 0000000..bc1a3ed
--- /dev/null
+++ b/examples/Mp3test.vcproj
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="Mp3test"
+ ProjectGUID="{D343BF64-9B60-4203-8F63-10766889FFAD}"
+ RootNamespace="Mp3test"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+
+ AdditionalIncludeDirectories="&quot;$(SolutionDir)..\include&quot;"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;ID3LIB_LINKOPTION=1"
+
+
+
+
+
+ Detect64BitPortabilityProblems="false"
+
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+
+
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="&quot;$(SolutionDir)..\include&quot;"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;ID3LIB_LINKOPTION=1"
+
+
+
+ Detect64BitPortabilityProblems="false"
+
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+
+
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\demo_info.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\demo_info_options.c"
+ >
+ </File>
+ <File
+ RelativePath=".\getopt.c"
+ >
+ </File>
+ <File
+ RelativePath=".\getopt1.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/examples/composer.jpg b/examples/composer.jpg
new file mode 100644
index 0000000..4e55bef
--- /dev/null
+++ b/examples/composer.jpg
Binary files differ
diff --git a/examples/crc53865.mp3 b/examples/crc53865.mp3
new file mode 100644
index 0000000..78fa397
--- /dev/null
+++ b/examples/crc53865.mp3
Binary files differ
diff --git a/examples/demo_convert.cpp b/examples/demo_convert.cpp
new file mode 100644
index 0000000..a0d1cee
--- /dev/null
+++ b/examples/demo_convert.cpp
@@ -0,0 +1,163 @@
+// $Id: demo_convert.cpp,v 1.15 2002/06/27 12:46:55 t1mpy Exp $
+//
+// The authors have released ID3Lib as Public Domain (PD) and claim no
+// copyright, patent or other intellectual property protection in this work.
+// This means that it may be modified, redistributed and used in commercial
+// and non-commercial software and hardware without restrictions. ID3Lib is
+// distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+// express or implied.
+//
+// The ID3Lib authors encourage improvements and optimisations to be sent to
+// the ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org). Approved
+// submissions may be altered, and will be included and released under these
+// terms.
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+#include "demo_convert_options.h"
+
+using std::cout;
+using std::endl;
+
+static const char* VERSION_NUMBER = "$Revision: 1.15 $";
+
+void PrintUsage(const char *sName)
+{
+ cout << "Converts between id3v1 and id3v2 tags of an mp3 file." << endl;
+ cout << endl;
+ cout << "Will render both types of tag by default. Only the last" << endl
+ << "tag type indicated in the option list will be used. Non-" << endl
+ << "rendered will remain unchanged in the original file. Will" << endl
+ << "also parse and convert Lyrics3 v2.0 frames, but will not" << endl
+ << "render them." << endl;
+}
+
+void PrintVersion(const char *sName)
+{
+ size_t nIndex;
+ cout << sName << " ";
+ for (nIndex = 0; nIndex < strlen(VERSION_NUMBER); nIndex++)
+ {
+ if (VERSION_NUMBER[nIndex] == ' ')
+ {
+ break;
+ }
+ }
+ nIndex++;
+ for (; nIndex < strlen (VERSION_NUMBER); nIndex++)
+ {
+ if (VERSION_NUMBER[nIndex] == ' ')
+ {
+ break;
+ }
+ cout << VERSION_NUMBER[nIndex];
+ }
+ cout << endl;
+ cout << "Uses " << ID3LIB_FULL_NAME << endl << endl;
+
+ cout << "This program converts and strips ID3v1/1.1 and Lyrics3 v2.0" << endl;
+ cout << "tags to ID3v2 tags." << endl << endl;
+}
+
+void DisplayTags(ostream &os, luint nTags)
+{
+ if (!((nTags & ID3TT_ID3V1) || (nTags & ID3TT_ID3V2)))
+ {
+ os << "no tag";
+ }
+ if (nTags & ID3TT_ID3V1)
+ {
+ os << "v1";
+ }
+ if ((nTags & ID3TT_ID3V1) && (nTags & ID3TT_ID3V2))
+ {
+ os << " and ";
+ }
+ if (nTags & ID3TT_ID3V2)
+ {
+ os << "v2";
+ }
+}
+
+int main( unsigned int argc, char * const argv[])
+{
+ flags_t ulFlag = ID3TT_ALL;
+ gengetopt_args_info args;
+
+ if (cmdline_parser(argc, argv, &args) != 0)
+ {
+ exit(1);
+ }
+
+#if defined ID3_ENABLE_DEBUG
+ if (args.warning_flag)
+ {
+ ID3D_INIT_WARNING();
+ ID3D_WARNING ( "warnings turned on" );
+ }
+ if (args.notice_flag)
+ {
+ ID3D_INIT_NOTICE();
+ ID3D_NOTICE ( "notices turned on" );
+ }
+#endif
+
+ if (args.v1tag_flag)
+ {
+ ulFlag = ID3TT_ID3V1;
+ }
+
+ if (args.v2tag_flag)
+ {
+ ulFlag = ID3TT_ID3V2;
+ }
+
+
+ const char* filename = NULL;
+ for (size_t i = 0; i < args.inputs_num; ++i)
+ {
+ filename = args.inputs[i];
+ ID3_Tag myTag;
+
+ if (args.strip_given)
+ {
+ cout << "Stripping ";
+ }
+ else
+ {
+ cout << "Converting ";
+ }
+ cout << filename << ": ";
+
+ myTag.Clear();
+ myTag.Link(filename, ID3TT_ALL);
+ myTag.SetPadding(args.padding_flag);
+
+ cout << "attempting ";
+ DisplayTags(cout, ulFlag);
+ luint nTags;
+
+ if (args.strip_flag)
+ {
+ nTags = myTag.Strip(ulFlag);
+ cout << ", stripped ";
+ }
+ else
+ {
+ nTags = myTag.Update(ulFlag);
+ cout << ", converted ";
+ }
+
+ DisplayTags(cout, nTags);
+ cout << endl;
+ }
+
+ return 0;
+}
+
+
diff --git a/examples/demo_convert_options.c b/examples/demo_convert_options.c
new file mode 100644
index 0000000..571c742
--- /dev/null
+++ b/examples/demo_convert_options.c
@@ -0,0 +1,174 @@
+/*
+ File autogenerated by gengetopt version 2.1
+ generated with the following command:
+ gengetopt --file-name=demo_convert_options --unamed-opts --input=demo_convert_options.ggo
+
+ The developers of gengetopt consider the fixed text that goes in all
+ gengetopt output files to be in the public domain:
+ we make no copyright claims on it.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* If we use autoconf. */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Check for configure's getopt check result. */
+#ifndef HAVE_GETOPT_LONG
+#include "getopt.h"
+#else
+#include <getopt.h>
+#endif
+
+#include "demo_convert_options.h"
+
+/* Don't define PACKAGE and VERSION if we use automake. */
+#define GGO_PACKAGE "id3convert"
+#ifndef VERSION
+# define GGO_VERSION VERSION
+#else
+/* ******* WRITE THE VERSION OF YOUR PROGRAM HERE ******* */
+# define GGO_VERSION ""
+#endif
+
+
+void
+print_version (void)
+{
+ printf ("%s %s\n", GGO_PACKAGE, GGO_VERSION);
+}
+
+void
+print_help (void)
+{
+ print_version ();
+ printf ("Usage: %s [OPTIONS]... [FILES]...\n\
+ -h --help Print help and exit\n\
+ -V --version Print version and exit\n\
+ -1 --v1tag Render only the id3v1 tag (default=off)\n\
+ -2 --v2tag Render only the id3v2 tag (default=off)\n\
+ -s --strip Strip the tags instead of rendering (default=off)\n\
+ -p --padding Use padding in the tag (default=off)\n\
+ -w --warning Turn on warnings (for debugging) (default=off)\n\
+ -n --notice Turn on notices (for debugging) (default=off)\n\
+", GGO_PACKAGE);
+}
+
+
+int
+cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
+{
+ int c; /* Character of the parsed option. */
+ int missing_required_options = 0;
+
+ args_info->help_given = 0 ;
+ args_info->version_given = 0 ;
+ args_info->v1tag_given = 0 ;
+ args_info->v2tag_given = 0 ;
+ args_info->strip_given = 0 ;
+ args_info->padding_given = 0 ;
+ args_info->warning_given = 0 ;
+ args_info->notice_given = 0 ;
+
+#define clear_args()
+{ \
+ args_info->v1tag_flag = 0;\
+ args_info->v2tag_flag = 0;\
+ args_info->strip_flag = 0;\
+ args_info->padding_flag = 0;\
+ args_info->warning_flag = 0;\
+ args_info->notice_flag = 0;\
+}
+
+ clear_args();
+
+ args_info->inputs = NULL;
+ args_info->inputs_num = 0;
+
+ while (1)
+ {
+ int option_index = 0;
+ static struct option long_options[] = {
+ { "help", 0, NULL, 'h' },
+ { "version", 0, NULL, 'V' },
+ { "v1tag", 0, NULL, '1' },
+ { "v2tag", 0, NULL, '2' },
+ { "strip", 0, NULL, 's' },
+ { "padding", 0, NULL, 'p' },
+ { "warning", 0, NULL, 'w' },
+ { "notice", 0, NULL, 'n' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ c = getopt_long (argc, argv, "hV12spwn", long_options, &option_index);
+
+ if (c == -1) break; /* Exit from `while (1)' loop. */
+
+ switch (c)
+ {
+ case 'h': /* Print help and exit. */
+ clear_args ();
+ print_help ();
+ exit (0);
+
+ case 'V': /* Print version and exit. */
+ clear_args ();
+ print_version ();
+ exit (0);
+
+ case '1': /* Render only the id3v1 tag. */
+ args_info->v1tag_flag = !(args_info->v1tag_flag);
+ break;
+
+ case '2': /* Render only the id3v2 tag. */
+ args_info->v2tag_flag = !(args_info->v2tag_flag);
+ break;
+
+ case 's': /* Strip the tags instead of rendering. */
+ args_info->strip_flag = !(args_info->strip_flag);
+ break;
+
+ case 'p': /* Use padding in the tag. */
+ args_info->padding_flag = !(args_info->padding_flag);
+ break;
+
+ case 'w': /* Turn on warnings (for debugging). */
+ args_info->warning_flag = !(args_info->warning_flag);
+ break;
+
+ case 'n': /* Turn on notices (for debugging). */
+ args_info->notice_flag = !(args_info->notice_flag);
+ break;
+
+ case '?': /* Invalid option. */
+ /* `getopt_long' already printed an error message. */
+ exit (1);
+
+ default: /* bug: option not considered. */
+ fprintf (stderr, "%s: option unknown: %c\n", GGO_PACKAGE, c);
+ abort ();
+ } /* switch */
+ } /* while */
+
+ if ( missing_required_options )
+ exit (1);
+
+ if (optind < argc)
+ {
+ int i = 0 ;
+
+ args_info->inputs_num = argc - optind ;
+ args_info->inputs =
+ (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
+ while (optind < argc)
+ args_info->inputs[ i++ ] = strdup (argv[optind++]) ;
+ }
+
+ return 0;
+}
+
diff --git a/examples/demo_convert_options.h b/examples/demo_convert_options.h
new file mode 100644
index 0000000..e6f62e6
--- /dev/null
+++ b/examples/demo_convert_options.h
@@ -0,0 +1,38 @@
+/* demo_convert_options.h */
+
+/* File autogenerated by gengetopt version 2.1 */
+
+#ifndef _demo_convert_options_h
+#define _demo_convert_options_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct gengetopt_args_info {
+ int v1tag_flag; /* Render only the id3v1 tag (default=off). */
+ int v2tag_flag; /* Render only the id3v2 tag (default=off). */
+ int strip_flag; /* Strip the tags instead of rendering (default=off). */
+ int padding_flag; /* Use padding in the tag (default=off). */
+ int warning_flag; /* Turn on warnings (for debugging) (default=off). */
+ int notice_flag; /* Turn on notices (for debugging) (default=off). */
+
+ int help_given ; /* Wheter help was given. */
+ int version_given ; /* Wheter version was given. */
+ int v1tag_given ; /* Whether v1tag was given. */
+ int v2tag_given ; /* Whether v2tag was given. */
+ int strip_given ; /* Whether strip was given. */
+ int padding_given ; /* Whether padding was given. */
+ int warning_given ; /* Whether warning was given. */
+ int notice_given ; /* Whether notice was given. */
+
+ char **inputs ; /* unamed options */
+ unsigned inputs_num ; /* unamed options number */
+} ;
+
+int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _demo_convert_options_h */
diff --git a/examples/demo_copy.cpp b/examples/demo_copy.cpp
new file mode 100644
index 0000000..1d12944
--- /dev/null
+++ b/examples/demo_copy.cpp
@@ -0,0 +1,143 @@
+// $Id: demo_copy.cpp,v 1.11 2002/06/29 17:20:26 t1mpy Exp $
+//
+// The authors have released ID3Lib as Public Domain (PD) and claim no
+// copyright, patent or other intellectual property protection in this work.
+// This means that it may be modified, redistributed and used in commercial
+// and non-commercial software and hardware without restrictions. ID3Lib is
+// distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+// express or implied.
+//
+// The ID3Lib authors encourage improvements and optimisations to be sent to
+// the ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org). Approved
+// submissions may be altered, and will be included and released under these
+// terms.
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+
+#include "demo_copy_options.h"
+
+using std::cout;
+using std::endl;
+using std::cerr;
+
+static const char* VERSION_NUMBER = "$Revision: 1.11 $";
+
+void PrintUsage(const char *sName)
+{
+ cout << "Usage: " << sName << " [OPTION]... SOURCE DEST" << endl;
+ cout << "Copy the tag(s) from SOURCE to DEST." << endl;
+ cout << endl;
+}
+
+void PrintVersion(const char *sName)
+{
+ size_t nIndex;
+ cout << sName << " ";
+ for (nIndex = 0; nIndex < strlen(VERSION_NUMBER); nIndex++)
+ {
+ if (VERSION_NUMBER[nIndex] == ' ')
+ {
+ break;
+ }
+ }
+ nIndex++;
+ for (; nIndex < strlen (VERSION_NUMBER); nIndex++)
+ {
+ if (VERSION_NUMBER[nIndex] == ' ')
+ {
+ break;
+ }
+ cout << VERSION_NUMBER[nIndex];
+ }
+ cout << endl;
+ cout << "Uses " << ID3LIB_FULL_NAME << endl << endl;
+
+ cout << "This program copies tags from one file to another" << endl;
+}
+
+void DisplayTags(ostream &os, luint nTags)
+{
+ if (!((nTags & ID3TT_ID3V1) || (nTags & ID3TT_ID3V2)))
+ {
+ os << "no tag";
+ }
+ if (nTags & ID3TT_ID3V1)
+ {
+ os << "v1";
+ }
+ if ((nTags & ID3TT_ID3V1) && (nTags & ID3TT_ID3V2))
+ {
+ os << " and ";
+ }
+ if (nTags & ID3TT_ID3V2)
+ {
+ os << "v2";
+ }
+}
+
+int main( unsigned int argc, char * const argv[])
+{
+ int ulFlag = ID3TT_ID3;
+ ID3D_INIT_DOUT();
+ gengetopt_args_info args;
+
+ if (cmdline_parser(argc, argv, &args) != 0)
+ {
+ exit(1);
+ }
+
+#if defined ID3_ENABLE_DEBUG
+ if (args.warning_flag)
+ {
+ ID3D_INIT_WARNING();
+ ID3D_WARNING ( "warnings turned on" );
+ }
+ if (args.notice_flag)
+ {
+ ID3D_INIT_NOTICE();
+ ID3D_NOTICE ( "notices turned on" );
+ }
+#endif
+
+ if (args.v1tag_flag)
+ {
+ ulFlag = ID3TT_ID3V1;
+ }
+
+ if (args.v2tag_flag)
+ {
+ ulFlag = ID3TT_ID3V2;
+ }
+
+
+ if (args.inputs_num != 2)
+ {
+ cerr << "Usage: id3cp [OPTIONS] SOURCE DEST" << endl;
+ exit(1);
+ }
+
+ const char *source = args.inputs[0], *dest = args.inputs[1];
+
+ ID3_Tag myTag;
+
+ cout << "Parsing " << source << ": ";
+
+ myTag.Clear();
+ myTag.Link(source, ID3TT_ALL);
+
+ cout << "done. Copying to " << dest << ": ";
+
+ myTag.Link(dest, ID3TT_NONE);
+ myTag.Update(ulFlag);
+
+ cout << "done" << endl;
+
+ return 0;
+}
+
diff --git a/examples/demo_copy_options.c b/examples/demo_copy_options.c
new file mode 100644
index 0000000..7a51075
--- /dev/null
+++ b/examples/demo_copy_options.c
@@ -0,0 +1,164 @@
+/*
+ File autogenerated by gengetopt version 2.3
+ generated with the following command:
+ gengetopt --file-name=demo_copy_options --unamed-opts --input=demo_copy_options.ggo
+
+ The developers of gengetopt consider the fixed text that goes in all
+ gengetopt output files to be in the public domain:
+ we make no copyright claims on it.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/* If we use autoconf. */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+/* Check for configure's getopt check result. */
+#ifndef HAVE_GETOPT_LONG
+#include "getopt.h"
+#else
+#include <getopt.h>
+#endif
+
+#include "demo_copy_options.h"
+
+
+void
+cmdline_parser_print_version (void)
+{
+ printf ("%s %s\n", PACKAGE, VERSION);
+}
+
+void
+cmdline_parser_print_help (void)
+{
+ cmdline_parser_print_version ();
+ printf("\n"
+"Usage: %s [OPTIONS]... [FILES]...\n\
+ -h --help Print help and exit\n\
+ -V --version Print version and exit\n\
+ -1 --v1tag Render only the id3v1 tag (default=off)\n\
+ -2 --v2tag Render only the id3v2 tag (default=off)\n\
+ -w --warning Turn on warnings (for debugging) (default=off)\n\
+ -n --notice Turn on notices (for debugging) (default=off)\n\
+", PACKAGE);
+}
+
+
+static char *
+gengetopt_strdup (char * s)
+{
+ char * n, * pn, * ps = s;
+ while (*ps) ps++;
+ n = (char *) malloc (1 + ps - s);
+ if (n != NULL)
+ {
+ for (ps=s,pn=n; *ps; ps++,pn++)
+ *pn = *ps;
+ *pn = 0;
+ }
+ return n;
+}
+
+
+int
+cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
+{
+ int c; /* Character of the parsed option. */
+ int missing_required_options = 0;
+
+ args_info->help_given = 0 ;
+ args_info->version_given = 0 ;
+ args_info->v1tag_given = 0 ;
+ args_info->v2tag_given = 0 ;
+ args_info->warning_given = 0 ;
+ args_info->notice_given = 0 ;
+#define clear_args() { \
+ args_info->v1tag_flag = 0;\
+ args_info->v2tag_flag = 0;\
+ args_info->warning_flag = 0;\
+ args_info->notice_flag = 0;\
+}
+
+ clear_args();
+
+ args_info->inputs = NULL;
+ args_info->inputs_num = 0;
+
+ while (1)
+ {
+ int option_index = 0;
+ static struct option long_options[] = {
+ { "help", 0, NULL, 'h' },
+ { "version", 0, NULL, 'V' },
+ { "v1tag", 0, NULL, '1' },
+ { "v2tag", 0, NULL, '2' },
+ { "warning", 0, NULL, 'w' },
+ { "notice", 0, NULL, 'n' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ c = getopt_long (argc, argv, "hV12wn", long_options, &option_index);
+
+ if (c == -1) break; /* Exit from `while (1)' loop. */
+
+ switch (c)
+ {
+ case 'h': /* Print help and exit. */
+ clear_args ();
+ cmdline_parser_print_help ();
+ exit (0);
+
+ case 'V': /* Print version and exit. */
+ clear_args ();
+ cmdline_parser_print_version ();
+ exit (0);
+
+ case '1': /* Render only the id3v1 tag. */
+ args_info->v1tag_flag = !(args_info->v1tag_flag);
+ break;
+
+ case '2': /* Render only the id3v2 tag. */
+ args_info->v2tag_flag = !(args_info->v2tag_flag);
+ break;
+
+ case 'w': /* Turn on warnings (for debugging). */
+ args_info->warning_flag = !(args_info->warning_flag);
+ break;
+
+ case 'n': /* Turn on notices (for debugging). */
+ args_info->notice_flag = !(args_info->notice_flag);
+ break;
+
+ case 0: /* Long option with no short option */
+
+ case '?': /* Invalid option. */
+ /* `getopt_long' already printed an error message. */
+ exit (1);
+
+ default: /* bug: option not considered. */
+ fprintf (stderr, "%s: option unknown: %c\n", PACKAGE, c);
+ abort ();
+ } /* switch */
+ } /* while */
+
+ if ( missing_required_options )
+ exit (1);
+
+ if (optind < argc)
+ {
+ int i = 0 ;
+
+ args_info->inputs_num = argc - optind ;
+ args_info->inputs =
+ (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
+ while (optind < argc)
+ args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ;
+ }
+
+ return 0;
+}
+
diff --git a/examples/demo_copy_options.h b/examples/demo_copy_options.h
new file mode 100644
index 0000000..d64d276
--- /dev/null
+++ b/examples/demo_copy_options.h
@@ -0,0 +1,47 @@
+/* demo_copy_options.h */
+
+/* File autogenerated by gengetopt version 2.3 */
+
+#ifndef _demo_copy_options_h
+#define _demo_copy_options_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Don't define PACKAGE and VERSION if we use automake. */
+#if defined PACKAGE
+# undef PACKAGE
+#endif
+#define PACKAGE "id3cp"
+#ifndef VERSION
+/* ******* WRITE THE VERSION OF YOUR PROGRAM HERE ******* */
+#define VERSION ""
+#endif
+
+struct gengetopt_args_info {
+ int v1tag_flag; /* Render only the id3v1 tag (default=off). */
+ int v2tag_flag; /* Render only the id3v2 tag (default=off). */
+ int warning_flag; /* Turn on warnings (for debugging) (default=off). */
+ int notice_flag; /* Turn on notices (for debugging) (default=off). */
+
+ int help_given ; /* Whether help was given. */
+ int version_given ; /* Whether version was given. */
+ int v1tag_given ; /* Whether v1tag was given. */
+ int v2tag_given ; /* Whether v2tag was given. */
+ int warning_given ; /* Whether warning was given. */
+ int notice_given ; /* Whether notice was given. */
+
+ char **inputs ; /* unamed options */
+ unsigned inputs_num ; /* unamed options number */
+} ;
+
+int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info);
+
+void cmdline_parser_print_help(void);
+void cmdline_parser_print_version(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _demo_copy_options_h */
diff --git a/examples/demo_info.cpp b/examples/demo_info.cpp
new file mode 100644
index 0000000..e94e79f
--- /dev/null
+++ b/examples/demo_info.cpp
@@ -0,0 +1,401 @@
+// Copyright 1999 Scott Thomas Haug <scott@id3.org>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// $Id: demo_info.cpp,v 1.32 2002/07/28 21:53:56 t1mpy Exp $
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <id3/tag.h>
+#include <id3/utils.h>
+#include <id3/misc_support.h>
+#include <id3/readers.h>
+#include <id3/io_helpers.h>
+
+#include "demo_info_options.h"
+
+using namespace dami;
+using std::cout;
+using std::endl;
+
+static String VERSION_NUMBER = "$Revision: 1.32 $";
+
+void PrintUsage(const char *sName)
+{
+ cout << "Usage: " << sName << " [OPTION]... [FILE]..." << endl;
+ cout << "Display the id3 (both v1 and v2) tag information for a file." << endl;
+ cout << endl;
+ cout << " -h, --help Display this help and exit" << endl;
+ cout << " -v, --version Display version information and exit" << endl;
+ cout << endl;
+ cout << "Will not differentiate between the two types of tags" << endl;
+}
+
+void PrintVersion(const char *sName)
+{
+ cout << sName << " " << VERSION_NUMBER.c_str() << endl;
+ cout << "Displays ID3 Tag Information - Written by Scott Thomas Haug" << endl;
+ cout << "Uses " << ID3LIB_FULL_NAME << endl << endl;
+}
+
+void PrintInformation(const ID3_Tag &myTag)
+{
+ ID3_Tag::ConstIterator* iter = myTag.CreateIterator();
+ const ID3_Frame* frame = NULL;
+ while (NULL != (frame = iter->GetNext()))
+ {
+ const char* desc = frame->GetDescription();
+ if (!desc) desc = "";
+ cout << "=== " << frame->GetTextID() << " (" << desc << "): ";
+ ID3_FrameID eFrameID = frame->GetID();
+ switch (eFrameID)
+ {
+ case ID3FID_ALBUM:
+ case ID3FID_BPM:
+ case ID3FID_COMPOSER:
+ case ID3FID_CONTENTTYPE:
+ case ID3FID_COPYRIGHT:
+ case ID3FID_DATE:
+ case ID3FID_PLAYLISTDELAY:
+ case ID3FID_ENCODEDBY:
+ case ID3FID_LYRICIST:
+ case ID3FID_FILETYPE:
+ case ID3FID_TIME:
+ case ID3FID_CONTENTGROUP:
+ case ID3FID_TITLE:
+ case ID3FID_SUBTITLE:
+ case ID3FID_INITIALKEY:
+ case ID3FID_LANGUAGE:
+ case ID3FID_SONGLEN:
+ case ID3FID_MEDIATYPE:
+ case ID3FID_ORIGALBUM:
+ case ID3FID_ORIGFILENAME:
+ case ID3FID_ORIGLYRICIST:
+ case ID3FID_ORIGARTIST:
+ case ID3FID_ORIGYEAR:
+ case ID3FID_FILEOWNER:
+ case ID3FID_LEADARTIST:
+ case ID3FID_BAND:
+ case ID3FID_CONDUCTOR:
+ case ID3FID_MIXARTIST:
+ case ID3FID_PARTINSET:
+ case ID3FID_PUBLISHER:
+ case ID3FID_TRACKNUM:
+ case ID3FID_RECORDINGDATES:
+ case ID3FID_NETRADIOSTATION:
+ case ID3FID_NETRADIOOWNER:
+ case ID3FID_SIZE:
+ case ID3FID_ISRC:
+ case ID3FID_ENCODERSETTINGS:
+ case ID3FID_YEAR:
+ {
+ char *sText = ID3_GetString(frame, ID3FN_TEXT);
+ cout << sText << endl;
+ delete [] sText;
+ break;
+ }
+ case ID3FID_USERTEXT:
+ {
+ char
+ *sText = ID3_GetString(frame, ID3FN_TEXT),
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION);
+ cout << "(" << sDesc << "): " << sText << endl;
+ delete [] sText;
+ delete [] sDesc;
+ break;
+ }
+ case ID3FID_COMMENT:
+ case ID3FID_UNSYNCEDLYRICS:
+ {
+ char
+ *sText = ID3_GetString(frame, ID3FN_TEXT),
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION),
+ *sLang = ID3_GetString(frame, ID3FN_LANGUAGE);
+ cout << "(" << sDesc << ")[" << sLang << "]: "
+ << sText << endl;
+ delete [] sText;
+ delete [] sDesc;
+ delete [] sLang;
+ break;
+ }
+ case ID3FID_WWWAUDIOFILE:
+ case ID3FID_WWWARTIST:
+ case ID3FID_WWWAUDIOSOURCE:
+ case ID3FID_WWWCOMMERCIALINFO:
+ case ID3FID_WWWCOPYRIGHT:
+ case ID3FID_WWWPUBLISHER:
+ case ID3FID_WWWPAYMENT:
+ case ID3FID_WWWRADIOPAGE:
+ {
+ char *sURL = ID3_GetString(frame, ID3FN_URL);
+ cout << sURL << endl;
+ delete [] sURL;
+ break;
+ }
+ case ID3FID_WWWUSER:
+ {
+ char
+ *sURL = ID3_GetString(frame, ID3FN_URL),
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION);
+ cout << "(" << sDesc << "): " << sURL << endl;
+ delete [] sURL;
+ delete [] sDesc;
+ break;
+ }
+ case ID3FID_INVOLVEDPEOPLE:
+ {
+ size_t nItems = frame->GetField(ID3FN_TEXT)->GetNumTextItems();
+ for (size_t nIndex = 0; nIndex < nItems; nIndex++)
+ {
+ char *sPeople = ID3_GetString(frame, ID3FN_TEXT, nIndex);
+ cout << sPeople;
+ delete [] sPeople;
+ if (nIndex + 1 < nItems)
+ {
+ cout << ", ";
+ }
+ }
+ cout << endl;
+ break;
+ }
+ case ID3FID_PICTURE:
+ {
+ char
+ *sMimeType = ID3_GetString(frame, ID3FN_MIMETYPE),
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION),
+ *sFormat = ID3_GetString(frame, ID3FN_IMAGEFORMAT);
+ size_t
+ nPicType = frame->GetField(ID3FN_PICTURETYPE)->Get(),
+ nDataSize = frame->GetField(ID3FN_DATA)->Size();
+ cout << "(" << sDesc << ")[" << sFormat << ", "
+ << nPicType << "]: " << sMimeType << ", " << nDataSize
+ << " bytes" << endl;
+ delete [] sMimeType;
+ delete [] sDesc;
+ delete [] sFormat;
+ break;
+ }
+ case ID3FID_GENERALOBJECT:
+ {
+ char
+ *sMimeType = ID3_GetString(frame, ID3FN_MIMETYPE),
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION),
+ *sFileName = ID3_GetString(frame, ID3FN_FILENAME);
+ size_t
+ nDataSize = frame->GetField(ID3FN_DATA)->Size();
+ cout << "(" << sDesc << ")["
+ << sFileName << "]: " << sMimeType << ", " << nDataSize
+ << " bytes" << endl;
+ delete [] sMimeType;
+ delete [] sDesc;
+ delete [] sFileName;
+ break;
+ }
+ case ID3FID_UNIQUEFILEID:
+ {
+ char *sOwner = ID3_GetString(frame, ID3FN_OWNER);
+ size_t nDataSize = frame->GetField(ID3FN_DATA)->Size();
+ cout << sOwner << ", " << nDataSize
+ << " bytes" << endl;
+ delete [] sOwner;
+ break;
+ }
+ case ID3FID_PLAYCOUNTER:
+ {
+ size_t nCounter = frame->GetField(ID3FN_COUNTER)->Get();
+ cout << nCounter << endl;
+ break;
+ }
+ case ID3FID_POPULARIMETER:
+ {
+ char *sEmail = ID3_GetString(frame, ID3FN_EMAIL);
+ size_t
+ nCounter = frame->GetField(ID3FN_COUNTER)->Get(),
+ nRating = frame->GetField(ID3FN_RATING)->Get();
+ cout << sEmail << ", counter="
+ << nCounter << " rating=" << nRating << endl;
+ delete [] sEmail;
+ break;
+ }
+ case ID3FID_CRYPTOREG:
+ case ID3FID_GROUPINGREG:
+ {
+ char *sOwner = ID3_GetString(frame, ID3FN_OWNER);
+ size_t
+ nSymbol = frame->GetField(ID3FN_ID)->Get(),
+ nDataSize = frame->GetField(ID3FN_DATA)->Size();
+ cout << "(" << nSymbol << "): " << sOwner
+ << ", " << nDataSize << " bytes" << endl;
+ break;
+ }
+ case ID3FID_SYNCEDLYRICS:
+ {
+ char
+ *sDesc = ID3_GetString(frame, ID3FN_DESCRIPTION),
+ *sLang = ID3_GetString(frame, ID3FN_LANGUAGE);
+ size_t
+ nTimestamp = frame->GetField(ID3FN_TIMESTAMPFORMAT)->Get(),
+ nRating = frame->GetField(ID3FN_CONTENTTYPE)->Get();
+ const char* format = (2 == nTimestamp) ? "ms" : "frames";
+ cout << "(" << sDesc << ")[" << sLang << "]: ";
+ switch (nRating)
+ {
+ case ID3CT_OTHER: cout << "Other"; break;
+ case ID3CT_LYRICS: cout << "Lyrics"; break;
+ case ID3CT_TEXTTRANSCRIPTION: cout << "Text transcription"; break;
+ case ID3CT_MOVEMENT: cout << "Movement/part name"; break;
+ case ID3CT_EVENTS: cout << "Events"; break;
+ case ID3CT_CHORD: cout << "Chord"; break;
+ case ID3CT_TRIVIA: cout << "Trivia/'pop up' information"; break;
+ }
+ cout << endl;
+ ID3_Field* fld = frame->GetField(ID3FN_DATA);
+ if (fld)
+ {
+ ID3_MemoryReader mr(fld->GetRawBinary(), fld->BinSize());
+ while (!mr.atEnd())
+ {
+ cout << io::readString(mr).c_str();
+ cout << " [" << io::readBENumber(mr, sizeof(uint32)) << " "
+ << format << "] ";
+ }
+ }
+ cout << endl;
+ delete [] sDesc;
+ delete [] sLang;
+ break;
+ }
+ case ID3FID_AUDIOCRYPTO:
+ case ID3FID_EQUALIZATION:
+ case ID3FID_EVENTTIMING:
+ case ID3FID_CDID:
+ case ID3FID_MPEGLOOKUP:
+ case ID3FID_OWNERSHIP:
+ case ID3FID_PRIVATE:
+ case ID3FID_POSITIONSYNC:
+ case ID3FID_BUFFERSIZE:
+ case ID3FID_VOLUMEADJ:
+ case ID3FID_REVERB:
+ case ID3FID_SYNCEDTEMPO:
+ case ID3FID_METACRYPTO:
+ {
+ cout << " (unimplemented)" << endl;
+ break;
+ }
+ default:
+ {
+ cout << " frame" << endl;
+ break;
+ }
+ }
+ }
+ delete iter;
+}
+
+#define DEBUG
+
+int main( unsigned int argc, char * const argv[])
+{
+// ID3D_INIT_DOUT();
+
+ gengetopt_args_info args;
+
+ if (cmdline_parser(argc, argv, &args) != 0)
+ {
+ exit(1);
+ }
+
+#if defined ID3_ENABLE_DEBUG
+ if (args.warning_flag)
+ {
+ ID3D_INIT_WARNING();
+ ID3D_WARNING ( "warnings turned on" );
+ }
+ if (args.notice_flag)
+ {
+ ID3D_INIT_NOTICE();
+ ID3D_NOTICE ( "notices turned on" );
+ }
+#endif
+
+
+ const char* filename = NULL;
+ for (size_t i = 0; i < args.inputs_num; ++i)
+ {
+ filename = args.inputs[i];
+ ID3_Tag myTag;
+
+ myTag.Link(filename, ID3TT_ALL);
+ const Mp3_Headerinfo* mp3info;
+ mp3info = myTag.GetMp3HeaderInfo();
+
+ cout << endl << "*** Tag information for " << filename << endl;
+ if (!args.assign_given)
+ {
+ PrintInformation(myTag);
+ }
+ else
+ {
+ cout << "*** Testing assignment operator" << endl;
+ ID3_Tag tmpTag(myTag);
+ PrintInformation(tmpTag);
+ }
+ if (mp3info)
+ {
+ cout << "*** mp3 info\n";
+
+ switch (mp3info->version)
+ {
+ case MPEGVERSION_2_5:
+ cout << "MPEG2.5/";
+ break;
+ case MPEGVERSION_2:
+ cout << "MPEG2/";
+ break;
+ case MPEGVERSION_1:
+ cout << "MPEG1/";
+ break;
+ default:
+ break;
+ }
+
+ switch (mp3info->layer)
+ {
+ case MPEGLAYER_III:
+ cout << "layer III\n";
+ break;
+ case MPEGLAYER_II:
+ cout << "layer II\n";
+ break;
+ case MPEGLAYER_I:
+ cout << "layer I\n";
+ break;
+ default:
+ break;
+ }
+
+ cout << "Bitrate: " << mp3info->bitrate/1000 << "KBps\n";
+ cout << "Frequency: " << mp3info->frequency/1000 << "KHz\n";
+ }
+
+
+ }
+
+ return 0;
+}
+
diff --git a/examples/demo_info_options.c b/examples/demo_info_options.c
new file mode 100644
index 0000000..b7424eb
--- /dev/null
+++ b/examples/demo_info_options.c
@@ -0,0 +1,155 @@
+/*
+ File autogenerated by gengetopt version 2.3
+ generated with the following command:
+ gengetopt --file-name=demo_info_options --unamed-opts --input=demo_info_options.ggo
+
+ The developers of gengetopt consider the fixed text that goes in all
+ gengetopt output files to be in the public domain:
+ we make no copyright claims on it.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/* If we use autoconf. */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+/* Check for configure's getopt check result. */
+#ifndef HAVE_GETOPT_LONG
+#include "getopt.h"
+#else
+#include <getopt.h>
+#endif
+
+#include "demo_info_options.h"
+
+
+void
+cmdline_parser_print_version (void)
+{
+ printf ("%s %s\n", PACKAGE, VERSION);
+}
+
+void
+cmdline_parser_print_help (void)
+{
+ cmdline_parser_print_version ();
+ printf("\n"
+"Usage: %s [OPTIONS]... [FILES]...\n\
+ -h --help Print help and exit\n\
+ -V --version Print version and exit\n\
+ -a --assign Test the assignment operator (default=off)\n\
+ -w --warning Turn on warnings (for debugging) (default=off)\n\
+ -n --notice Turn on notices (for debugging) (default=off)\n\
+", PACKAGE);
+}
+
+
+static char *
+gengetopt_strdup (char * s)
+{
+ char * n, * pn, * ps = s;
+ while (*ps) ps++;
+ n = (char *) malloc (1 + ps - s);
+ if (n != NULL)
+ {
+ for (ps=s,pn=n; *ps; ps++,pn++)
+ *pn = *ps;
+ *pn = 0;
+ }
+ return n;
+}
+
+
+int
+cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
+{
+ int c; /* Character of the parsed option. */
+ int missing_required_options = 0;
+
+ args_info->help_given = 0 ;
+ args_info->version_given = 0 ;
+ args_info->assign_given = 0 ;
+ args_info->warning_given = 0 ;
+ args_info->notice_given = 0 ;
+#define clear_args() { \
+ args_info->assign_flag = 0;\
+ args_info->warning_flag = 0;\
+ args_info->notice_flag = 0;\
+}
+
+ clear_args();
+
+ args_info->inputs = NULL;
+ args_info->inputs_num = 0;
+
+ while (1)
+ {
+ int option_index = 0;
+ static struct option long_options[] = {
+ { "help", 0, NULL, 'h' },
+ { "version", 0, NULL, 'V' },
+ { "assign", 0, NULL, 'a' },
+ { "warning", 0, NULL, 'w' },
+ { "notice", 0, NULL, 'n' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ c = getopt_long (argc, argv, "hVawn", long_options, &option_index);
+
+ if (c == -1) break; /* Exit from `while (1)' loop. */
+
+ switch (c)
+ {
+ case 'h': /* Print help and exit. */
+ clear_args ();
+ cmdline_parser_print_help ();
+ exit (0);
+
+ case 'V': /* Print version and exit. */
+ clear_args ();
+ cmdline_parser_print_version ();
+ exit (0);
+
+ case 'a': /* Test the assignment operator. */
+ args_info->assign_flag = !(args_info->assign_flag);
+ break;
+
+ case 'w': /* Turn on warnings (for debugging). */
+ args_info->warning_flag = !(args_info->warning_flag);
+ break;
+
+ case 'n': /* Turn on notices (for debugging). */
+ args_info->notice_flag = !(args_info->notice_flag);
+ break;
+
+ case 0: /* Long option with no short option */
+
+ case '?': /* Invalid option. */
+ /* `getopt_long' already printed an error message. */
+ exit (1);
+
+ default: /* bug: option not considered. */
+ fprintf (stderr, "%s: option unknown: %c\n", PACKAGE, c);
+ abort ();
+ } /* switch */
+ } /* while */
+
+ if ( missing_required_options )
+ exit (1);
+
+ if (optind < argc)
+ {
+ int i = 0 ;
+
+ args_info->inputs_num = argc - optind ;
+ args_info->inputs =
+ (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
+ while (optind < argc)
+ args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ;
+ }
+
+ return 0;
+}
diff --git a/examples/demo_info_options.h b/examples/demo_info_options.h
new file mode 100644
index 0000000..c6c4b82
--- /dev/null
+++ b/examples/demo_info_options.h
@@ -0,0 +1,45 @@
+/* demo_info_options.h */
+
+/* File autogenerated by gengetopt version 2.3 */
+
+#ifndef _demo_info_options_h
+#define _demo_info_options_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Don't define PACKAGE and VERSION if we use automake. */
+#if defined PACKAGE
+# undef PACKAGE
+#endif
+#define PACKAGE "id3info"
+#ifndef VERSION
+/* ******* WRITE THE VERSION OF YOUR PROGRAM HERE ******* */
+#define VERSION ""
+#endif
+
+struct gengetopt_args_info {
+ int assign_flag; /* Test the assignment operator (default=off). */
+ int warning_flag; /* Turn on warnings (for debugging) (default=off). */
+ int notice_flag; /* Turn on notices (for debugging) (default=off). */
+
+ int help_given ; /* Whether help was given. */
+ int version_given ; /* Whether version was given. */
+ int assign_given ; /* Whether assign was given. */
+ int warning_given ; /* Whether warning was given. */
+ int notice_given ; /* Whether notice was given. */
+
+ char **inputs ; /* unamed options */
+ unsigned inputs_num ; /* unamed options number */
+} ;
+
+int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info);
+
+void cmdline_parser_print_help(void);
+void cmdline_parser_print_version(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _demo_info_options_h */
diff --git a/examples/demo_main.cpp b/examples/demo_main.cpp
new file mode 100644
index 0000000..c9d205e
--- /dev/null
+++ b/examples/demo_main.cpp
@@ -0,0 +1,135 @@
+// The authors have released ID3Lib as Public Domain (PD) and claim no
+// copyright, patent or other intellectual property protection in this work.
+// This means that it may be modified, redistributed and used in commercial
+// and non-commercial software and hardware without restrictions. ID3Lib is
+// distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+// express or implied.
+//
+// The ID3Lib authors encourage improvements and optimisations to be sent to
+// the ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org). Approved
+// submissions may be altered, and will be included and released under these
+// terms.
+//
+// Mon Nov 23 18:34:01 1998
+
+
+#ifndef __DLL
+
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+
+using std::cout;
+using std::endl;
+using std::cerr;
+
+
+void MakeDummyTag(void)
+{
+ ID3_Tag myTag("dummy.tag");
+ ID3_Frame myFrame[3];
+
+ myFrame[0].SetID(ID3FID_USERTEXT);
+ myFrame[0].Field(ID3FN_TEXTENC) = ID3TE_UNICODE;
+ myFrame[0].Field(ID3FN_DESCRIPTION) = "example #1";
+ myFrame[0].Field(ID3FN_TEXT) = "This is the text for example #1";
+
+ myFrame[1].SetID(ID3FID_USERTEXT);
+ myFrame[1].Field(ID3FN_TEXTENC) = ID3TE_ASCII;
+ myFrame[1].Field(ID3FN_DESCRIPTION) = "example #2";
+ myFrame[1].Field(ID3FN_TEXT) = "This is the text for example #2";
+
+ myFrame[2].SetID(ID3FID_INVOLVEDPEOPLE);
+ myFrame[2].Field(ID3FN_TEXTENC) = ID3TE_ASCII;
+ myFrame[2].Field(ID3FN_TEXT).Add("String 1");
+ myFrame[2].Field(ID3FN_TEXT).Add("String 2");
+ myFrame[2].Field(ID3FN_TEXT).Add("String 3");
+ myFrame[2].Field(ID3FN_TEXT).Add("String 4");
+
+ myTag.AddFrames(myFrame, 3);
+
+ //myTag.SetVersion(3, 0);
+ myTag.SetUnsync(false);
+ myTag.SetExtendedHeader(false);
+ myTag.SetCompression(false);
+ myTag.SetPadding(false);
+
+ myTag.Strip();
+ myTag.Update();
+
+ return;
+}
+
+
+void StripTags(char *file)
+{
+ ID3_Tag myTag;
+
+ myTag.Link(file);
+ myTag.Strip();
+
+ return;
+}
+
+
+void GetTestTag(void)
+{
+ ID3_Tag myTag("dummy.tag");
+ ID3_Frame *myFrame;
+
+ if (myFrame = myTag.Find(ID3FID_PICTURE))
+ {
+ cout << "Found a picture frame!\r\n" << endl;
+
+ char *dada = "output.jpg";
+
+ myFrame->Field(ID3FN_DATA).ToFile(dada);
+ }
+
+ if (myFrame = myTag.Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "example #1"))
+ {
+ cout << "Found a user text frame!\r\n" << endl;
+
+ char textBuff[1024];
+
+ myFrame->Field(ID3FN_DESCRIPTION).Get(textBuff, 1024);
+ cout << "Desc: " << textBuff << endl;
+
+ myFrame->Field(ID3FN_TEXT).Get(textBuff, 1024);
+ cout << "Text: " << textBuff << endl;
+ }
+
+ for (luint i = 0; i < myTag.NumFrames(); i++)
+ if (myFrame = myTag[i])
+ cout << "Frame " << i << " has ID " << (luint) myFrame->GetID() << endl;
+
+ return;
+}
+
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ // CreateDemoTag1();
+ // MakeDummyTag();
+ // GetTestTag();
+ StripTags("c:\\temp.mp3");
+ }
+
+
+ catch(ID3_Error err)
+ {
+ cout << "Error in ID3Lib!" << endl;
+ cout << "Error: '" << err.GetErrorDesc() << "'" << endl;
+ cout << " File: '" << err.GetErrorFile() << "'" << endl;
+ cout << " Line: " << err.GetErrorLine() << endl;
+ }
+
+ return 0;
+}
+
+
+#endif
+
+
diff --git a/examples/demo_simple.cpp b/examples/demo_simple.cpp
new file mode 100644
index 0000000..10fc1fa
--- /dev/null
+++ b/examples/demo_simple.cpp
@@ -0,0 +1,104 @@
+/* $Id: demo_simple.cpp,v 1.1 2002/07/23 13:47:58 t1mpy Exp $
+
+ * Copyright 2000 Scott Thomas Haug <scott@id3.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <id3.h>
+#include <stdio.h>
+
+int
+main( int argc, char *argv[] )
+{
+ char *filename = NULL;
+ ID3Tag *tag;
+
+ if (argc != 2)
+ {
+ printf("*** Usage: %s file\n", argv[0]);
+ exit (1);
+ }
+ filename = argv[1];
+ printf("*** Reading %s\n", filename);
+
+ if ((tag = ID3Tag_New()) != NULL)
+ {
+ ID3Frame *frame;
+
+ (void) ID3Tag_Link(tag, filename);
+ if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL)
+ {
+ ID3Field *field;
+ if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL)
+ {
+ char title[1024];
+ (void) ID3Field_GetASCII(field, title, 1024);
+ printf("Title: %s\n", title);
+ }
+ else
+ {
+ printf("Didn't get the field\n");
+ }
+ }
+ else
+ {
+ printf("Didn't get the frame\n");
+ }
+
+ if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL)
+ {
+ ID3Field *field;
+ if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL)
+ {
+ char artist[1024];
+ (void) ID3Field_GetASCII(field, artist, 1024);
+ printf("Artist: %s\n", artist);
+ }
+ else
+ {
+ printf("Didn't get the field\n");
+ }
+ }
+ else
+ {
+ printf("Didn't get the frame\n");
+ }
+
+ if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL)
+ {
+ ID3Field *field;
+ if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL)
+ {
+ char album[1024];
+ (void) ID3Field_GetASCII(field, album, 1024);
+ printf("Album: %s\n", album);
+ }
+ else
+ {
+ printf("Didn't get the field\n");
+ }
+ }
+ else
+ {
+ printf("Didn't get the frame\n");
+ }
+ }
+ else
+ {
+ printf("Didn't get the tag\n");
+ }
+ exit (0);
+}
diff --git a/examples/demo_tag.cpp b/examples/demo_tag.cpp
new file mode 100644
index 0000000..3c31307
--- /dev/null
+++ b/examples/demo_tag.cpp
@@ -0,0 +1,199 @@
+// $Id: demo_tag.cpp,v 1.15 2002/06/29 17:18:35 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include <stdlib.h>
+#include <string.h>
+
+#include <id3/tag.h>
+#include <id3/misc_support.h>
+
+#include "demo_tag_options.h"
+
+using std::cout;
+using std::endl;
+
+static const char* VERSION_NUMBER = "$Revision: 1.15 $";
+
+void PrintUsage(const char *sName)
+{
+ cout << "Will render both types of tag by default. Only the last" << endl
+ << "tag type indicated in the option list will be used. Non-" << endl
+ << "rendered will remain unchanged in the original file. Will" << endl
+ << "also parse and convert Lyrics3 v2.0 frames, but will not" << endl
+ << "render them." << endl;
+}
+
+void PrintVersion(const char *sName)
+{
+ cout << "Uses " << ID3LIB_FULL_NAME << endl << endl;
+
+ cout << "This program tags mp3 files with ID3v1/1.1 and/or id3v2 tags" << endl;
+}
+
+void DisplayTags(ostream &os, luint nTags)
+{
+ if (!((nTags & ID3TT_ID3V1) || (nTags & ID3TT_ID3V2)))
+ os << "no tag";
+ if (nTags & ID3TT_ID3V1)
+ os << "v1";
+ if ((nTags & ID3TT_ID3V1) && (nTags & ID3TT_ID3V2))
+ os << " and ";
+ if (nTags & ID3TT_ID3V2)
+ os << "v2";
+}
+
+int main( unsigned int argc, char * const argv[])
+{
+ int ulFlag = ID3TT_ID3;
+ ID3D_INIT_DOUT();
+ gengetopt_args_info args;
+
+ if (cmdline_parser(argc, argv, &args) != 0)
+ {
+ exit(1);
+ }
+
+#if defined ID3_ENABLE_DEBUG
+ if (args.warning_flag)
+ {
+ ID3D_INIT_WARNING();
+ ID3D_WARNING ( "warnings turned on" );
+ }
+ if (args.notice_flag)
+ {
+ ID3D_INIT_NOTICE();
+ ID3D_NOTICE ( "notices turned on" );
+ }
+#endif
+
+ if (args.v1tag_flag)
+ {
+ ulFlag = ID3TT_ID3V1;
+ }
+
+ if (args.v2tag_flag)
+ {
+ ulFlag = ID3TT_ID3V2;
+ }
+
+ const char
+ *sArtist = "",
+ *sAlbum = "",
+ *sTitle = "",
+ *sComment = "",
+ *sYear = "",
+ *sDesc = "";
+ unsigned short
+ nYear = 0,
+ nTrack = 0,
+ nTotal = 0,
+ nGenre = 0;
+
+
+ if (args.artist_given)
+ {
+ sArtist = args.artist_arg;
+ cout << "+++ Artist = " << sArtist << endl;
+ }
+ if (args.album_given)
+ {
+ sAlbum = args.album_arg;
+ cout << "+++ Album = " << sAlbum << endl;
+ }
+ if (args.song_given)
+ {
+ sTitle = args.song_arg;
+ cout << "+++ Song = " << sTitle << endl;
+ }
+ if (args.year_given)
+ {
+ sYear = args.year_arg;
+ nYear = ::strtol(sYear, NULL, 10);
+ cout << "+++ Year = " << nYear << endl;
+ }
+ if (args.comment_given)
+ {
+ sComment = args.comment_arg;
+ cout << "+++ Comment = " << sComment << endl;
+ if (args.desc_given)
+ {
+ sDesc = args.desc_arg;
+ cout << "+++ Comment Description" << endl;
+ cout << " = " << sDesc << endl;
+ }
+ else
+ {
+ sDesc = "";
+ }
+ }
+ if (args.genre_given && args.genre_arg > 0 && args.genre_arg < 0xFF)
+ {
+ nGenre = args.genre_arg;
+ cout << "+++ Genre = " << args.genre_arg << endl;
+ }
+ if (args.track_given)
+ {
+ nTrack = ::strtol(args.track_arg, NULL, 10);
+ cout << "+++ Track = " << nTrack << endl;
+ }
+ if (args.total_given)
+ {
+ nTotal = ::strtol(args.total_arg, NULL, 10);
+ cout << "+++ Total = " << nTotal << endl;
+ }
+ const char* filename = NULL;
+ for (size_t i = 0; i < args.inputs_num; ++i)
+ {
+ filename = args.inputs[i];
+ ID3_Tag myTag;
+
+ cout << "Tagging " << filename << ": ";
+
+ myTag.Link(filename);
+
+ cout << "attempting ";
+ DisplayTags(cout, ulFlag);
+
+ if (args.artist_given)
+ {
+ ID3_AddArtist(&myTag, sArtist, true);
+ }
+ if (args.album_given)
+ {
+ ID3_AddAlbum(&myTag, sAlbum, true);
+ }
+ if (args.song_given)
+ {
+ ID3_AddTitle(&myTag, sTitle, true);
+ }
+ if (args.year_given)
+ {
+ ID3_AddYear(&myTag, sYear, true);
+ }
+ if (args.comment_given)
+ {
+ ID3_AddComment(&myTag, sComment, sDesc, true);
+ }
+ if (args.genre_given)
+ {
+ ID3_AddGenre(&myTag, nGenre, true);
+ }
+ if (args.track_given)
+ {
+ ID3_AddTrack(&myTag, nTrack, nTotal, true);
+ }
+ luint nTags = myTag.Update(ulFlag);
+ cout << ", tagged ";
+
+ DisplayTags(cout, nTags);
+
+ cout << endl;
+ }
+
+ return 0;
+}
+
diff --git a/examples/demo_tag_options.c b/examples/demo_tag_options.c
new file mode 100644
index 0000000..bc5608d
--- /dev/null
+++ b/examples/demo_tag_options.c
@@ -0,0 +1,316 @@
+/*
+ File autogenerated by gengetopt version 2.1
+ generated with the following command:
+ gengetopt --file-name=demo_tag_options --unamed-opts --input=demo_tag_options.ggo
+
+ The developers of gengetopt consider the fixed text that goes in all
+ gengetopt output files to be in the public domain:
+ we make no copyright claims on it.
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* If we use autoconf. */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Check for configure's getopt check result. */
+#ifndef HAVE_GETOPT_LONG
+#include "getopt.h"
+#else
+#include <getopt.h>
+#endif
+
+#include "demo_tag_options.h"
+
+/* Don't define PACKAGE and VERSION if we use automake. */
+#define GGO_PACKAGE "id3tag"
+#ifndef VERSION
+# define GGO_VERSION VERSION
+#else
+/* ******* WRITE THE VERSION OF YOUR PROGRAM HERE ******* */
+# define GGO_VERSION ""
+#endif
+
+
+void
+print_version (void)
+{
+ printf ("%s %s\n", GGO_PACKAGE, GGO_VERSION);
+}
+
+void
+print_help (void)
+{
+ print_version ();
+ printf ("Usage: %s [OPTIONS]... [FILES]...\n\
+ -h --help Print help and exit\n\
+ -V --version Print version and exit\n\
+ -1 --v1tag Render only the id3v1 tag (default=off)\n\
+ -2 --v2tag Render only the id3v2 tag (default=off)\n\
+ -aSTRING --artist=STRING Set the artist information\n\
+ -ASTRING --album=STRING Set the album title information\n\
+ -sSTRING --song=STRING Set the title information\n\
+ -cSTRING --comment=STRING Set the comment information\n\
+ -CSTRING --desc=STRING Set the comment description\n\
+ -ySTRING --year=STRING Set the year\n\
+ -tSTRING --track=STRING Set the track number\n\
+ -TSTRING --total=STRING Set the total number of tracks\n\
+ -gSHORT --genre=SHORT Set the genre\n\
+ -w --warning Turn on warnings (for debugging) (default=off)\n\
+ -n --notice Turn on notices (for debugging) (default=off)\n\
+", GGO_PACKAGE);
+}
+
+
+char *
+gengetopt_strdup (char * s)
+{
+ char * n, * pn, * ps = s;
+ while (*ps) ps++;
+ n = (char *) malloc (1 + ps - s);
+ if (n != NULL)
+ {
+ for (ps=s,pn=n; *ps; ps++,pn++)
+ *pn = *ps;
+ *pn = 0;
+ }
+ return n;
+}
+
+
+int
+cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info)
+{
+ int c; /* Character of the parsed option. */
+ int missing_required_options = 0;
+
+ args_info->help_given = 0 ;
+ args_info->version_given = 0 ;
+ args_info->v1tag_given = 0 ;
+ args_info->v2tag_given = 0 ;
+ args_info->artist_given = 0 ;
+ args_info->album_given = 0 ;
+ args_info->song_given = 0 ;
+ args_info->comment_given = 0 ;
+ args_info->desc_given = 0 ;
+ args_info->year_given = 0 ;
+ args_info->track_given = 0 ;
+ args_info->total_given = 0 ;
+ args_info->genre_given = 0 ;
+ args_info->warning_given = 0 ;
+ args_info->notice_given = 0 ;
+
+#define clear_args()
+{ \
+ args_info->v1tag_flag = 0;\
+ args_info->v2tag_flag = 0;\
+ args_info->artist_arg = NULL; \
+ args_info->album_arg = NULL; \
+ args_info->song_arg = NULL; \
+ args_info->comment_arg = NULL; \
+ args_info->desc_arg = NULL; \
+ args_info->year_arg = NULL; \
+ args_info->track_arg = NULL; \
+ args_info->total_arg = NULL; \
+ args_info->warning_flag = 0;\
+ args_info->notice_flag = 0;\
+}
+
+ clear_args();
+
+ args_info->inputs = NULL;
+ args_info->inputs_num = 0;
+
+ while (1)
+ {
+ int option_index = 0;
+ static struct option long_options[] = {
+ { "help", 0, NULL, 'h' },
+ { "version", 0, NULL, 'V' },
+ { "v1tag", 0, NULL, '1' },
+ { "v2tag", 0, NULL, '2' },
+ { "artist", 1, NULL, 'a' },
+ { "album", 1, NULL, 'A' },
+ { "song", 1, NULL, 's' },
+ { "comment", 1, NULL, 'c' },
+ { "desc", 1, NULL, 'C' },
+ { "year", 1, NULL, 'y' },
+ { "track", 1, NULL, 't' },
+ { "total", 1, NULL, 'T' },
+ { "genre", 1, NULL, 'g' },
+ { "warning", 0, NULL, 'w' },
+ { "notice", 0, NULL, 'n' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ c = getopt_long (argc, argv, "hV12a:A:s:c:C:y:t:T:g:wn", long_options, &option_index);
+
+ if (c == -1) break; /* Exit from `while (1)' loop. */
+
+ switch (c)
+ {
+ case 'h': /* Print help and exit. */
+ clear_args ();
+ print_help ();
+ exit (0);
+
+ case 'V': /* Print version and exit. */
+ clear_args ();
+ print_version ();
+ exit (0);
+
+ case '1': /* Render only the id3v1 tag. */
+ args_info->v1tag_flag = !(args_info->v1tag_flag);
+ break;
+
+ case '2': /* Render only the id3v2 tag. */
+ args_info->v2tag_flag = !(args_info->v2tag_flag);
+ break;
+
+ case 'a': /* Set the artist information. */
+ if (args_info->artist_given)
+ {
+ fprintf (stderr, "%s: `--artist' (`-a') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->artist_given = 1;
+ args_info->artist_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'A': /* Set the album title information. */
+ if (args_info->album_given)
+ {
+ fprintf (stderr, "%s: `--album' (`-A') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->album_given = 1;
+ args_info->album_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 's': /* Set the title information. */
+ if (args_info->song_given)
+ {
+ fprintf (stderr, "%s: `--song' (`-s') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->song_given = 1;
+ args_info->song_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'c': /* Set the comment information. */
+ if (args_info->comment_given)
+ {
+ fprintf (stderr, "%s: `--comment' (`-c') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->comment_given = 1;
+ args_info->comment_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'C': /* Set the comment description. */
+ if (args_info->desc_given)
+ {
+ fprintf (stderr, "%s: `--desc' (`-C') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->desc_given = 1;
+ args_info->desc_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'y': /* Set the year. */
+ if (args_info->year_given)
+ {
+ fprintf (stderr, "%s: `--year' (`-y') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->year_given = 1;
+ args_info->year_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 't': /* Set the track number. */
+ if (args_info->track_given)
+ {
+ fprintf (stderr, "%s: `--track' (`-t') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->track_given = 1;
+ args_info->track_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'T': /* Set the total number of tracks. */
+ if (args_info->total_given)
+ {
+ fprintf (stderr, "%s: `--total' (`-T') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->total_given = 1;
+ args_info->total_arg = gengetopt_strdup (optarg);
+ break;
+
+ case 'g': /* Set the genre. */
+ if (args_info->genre_given)
+ {
+ fprintf (stderr, "%s: `--genre' (`-g') option given more than once\n", GGO_PACKAGE);
+ clear_args ();
+ print_help ();
+ exit (1);
+ }
+ args_info->genre_given = 1;
+ args_info->genre_arg = (short)atoi (optarg);
+ break;
+
+ case 'w': /* Turn on warnings (for debugging). */
+ args_info->warning_flag = !(args_info->warning_flag);
+ break;
+
+ case 'n': /* Turn on notices (for debugging). */
+ args_info->notice_flag = !(args_info->notice_flag);
+ break;
+
+ case '?': /* Invalid option. */
+ /* `getopt_long' already printed an error message. */
+ exit (1);
+
+ default: /* bug: option not considered. */
+ fprintf (stderr, "%s: option unknown: %c\n", GGO_PACKAGE, c);
+ abort ();
+ } /* switch */
+ } /* while */
+
+ if ( missing_required_options )
+ exit (1);
+
+ if (optind < argc)
+ {
+ int i = 0 ;
+
+ args_info->inputs_num = argc - optind ;
+ args_info->inputs =
+ (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ;
+ while (optind < argc)
+ args_info->inputs[ i++ ] = strdup (argv[optind++]) ;
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/examples/demo_tag_options.h b/examples/demo_tag_options.h
new file mode 100644
index 0000000..36c9fb5
--- /dev/null
+++ b/examples/demo_tag_options.h
@@ -0,0 +1,52 @@
+/* demo_tag_options.h */
+
+/* File autogenerated by gengetopt version 2.1 */
+
+#ifndef _demo_tag_options_h
+#define _demo_tag_options_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+struct gengetopt_args_info {
+ int v1tag_flag; /* Render only the id3v1 tag (default=off). */
+ int v2tag_flag; /* Render only the id3v2 tag (default=off). */
+ char * artist_arg; /* Set the artist information. */
+ char * album_arg; /* Set the album title information. */
+ char * song_arg; /* Set the title information. */
+ char * comment_arg; /* Set the comment information. */
+ char * desc_arg; /* Set the comment description. */
+ char * year_arg; /* Set the year. */
+ char * track_arg; /* Set the track number. */
+ char * total_arg; /* Set the total number of tracks. */
+ short genre_arg; /* Set the genre. */
+ int warning_flag; /* Turn on warnings (for debugging) (default=off). */
+ int notice_flag; /* Turn on notices (for debugging) (default=off). */
+
+ int help_given ; /* Wheter help was given. */
+ int version_given ; /* Wheter version was given. */
+ int v1tag_given ; /* Whether v1tag was given. */
+ int v2tag_given ; /* Whether v2tag was given. */
+ int artist_given ; /* Whether artist was given. */
+ int album_given ; /* Whether album was given. */
+ int song_given ; /* Whether song was given. */
+ int comment_given ; /* Whether comment was given. */
+ int desc_given ; /* Whether desc was given. */
+ int year_given ; /* Whether year was given. */
+ int track_given ; /* Whether track was given. */
+ int total_given ; /* Whether total was given. */
+ int genre_given ; /* Whether genre was given. */
+ int warning_given ; /* Whether warning was given. */
+ int notice_given ; /* Whether notice was given. */
+
+ char **inputs ; /* unamed options */
+ unsigned inputs_num ; /* unamed options number */
+} ;
+
+int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _demo_tag_options_h */
diff --git a/examples/findeng.cpp b/examples/findeng.cpp
new file mode 100644
index 0000000..d5617e6
--- /dev/null
+++ b/examples/findeng.cpp
@@ -0,0 +1,37 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+#include "id3/misc_support.h"
+
+using std::cout;
+using std::endl;
+
+int main(unsigned argc, char* argv[])
+{
+ ID3D_INIT_DOUT();
+ ID3D_INIT_WARNING();
+ ID3D_INIT_NOTICE();
+
+ if (argc != 2)
+ {
+ cout << "Usage: findeng <tagfile>" << endl;
+ exit(1);
+ }
+ ID3_Tag tag(argv[1]);
+ const ID3_Frame* frame = tag.Find(ID3FID_COMMENT, ID3FN_LANGUAGE, "eng");
+ if (frame)
+ {
+ char* comment = ID3_GetString(frame, ID3FN_TEXT);
+ cout << "*** Found english comment: " << comment << endl;
+ delete [] comment;
+ }
+ else
+ {
+ cout << "*** No english comment to be found." << endl;
+ }
+ return 0;
+}
+
diff --git a/examples/findstr.cpp b/examples/findstr.cpp
new file mode 100644
index 0000000..6160981
--- /dev/null
+++ b/examples/findstr.cpp
@@ -0,0 +1,41 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+#include "id3/misc_support.h"
+
+using std::cout;
+using std::endl;
+
+int main(unsigned argc, char* argv[])
+{
+ ID3D_INIT_DOUT();
+ ID3D_INIT_WARNING();
+ ID3D_INIT_NOTICE();
+
+ if (argc != 2)
+ {
+ cout << "Usage: findstr <tagfile>" << endl;
+ exit(1);
+ }
+ ID3_Tag tag(argv[1]);
+ ID3_Frame* first = NULL, *frame = NULL;
+ while(NULL != (frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, "")))
+ {
+ if (frame == first)
+ {
+ break;
+ }
+ if (first == NULL)
+ {
+ first = frame;
+ }
+ char* comment = ID3_GetString(frame, ID3FN_TEXT);
+ cout << "*** Found comment w/o description: " << comment << endl;
+ delete [] comment;
+ }
+ return 0;
+}
+
diff --git a/examples/get_pic.cpp b/examples/get_pic.cpp
new file mode 100644
index 0000000..02151cc
--- /dev/null
+++ b/examples/get_pic.cpp
@@ -0,0 +1,40 @@
+// $Id: get_pic.cpp,v 1.8 2002/06/29 17:25:05 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include <stdlib.h>
+
+#include <id3/tag.h>
+#include <id3/misc_support.h>
+
+using std::cout;
+using std::endl;
+
+int main( int argc, char *argv[])
+{
+ if (argc != 3)
+ {
+ cout << "Usage: get_pic <tagfile> <picfilename>" << endl;
+ return 1;
+ }
+
+ ID3_Tag tag(argv[1]);
+ const ID3_Frame* frame = tag.Find(ID3FID_PICTURE);
+ if (frame && frame->Contains(ID3FN_DATA))
+ {
+ cout << "*** extracting picture to file \"" << argv[2] << "\"...";
+ frame->Field(ID3FN_DATA).ToFile(argv[2]);
+ cout << " done!" << endl;
+ }
+ else
+ {
+ cout << "*** no picture frame found in \"" << argv[1] << "\"" << endl;
+ return 1;
+ }
+
+ return 0;
+}
+
diff --git a/examples/getopt.c b/examples/getopt.c
new file mode 100644
index 0000000..566b8ef
--- /dev/null
+++ b/examples/getopt.c
@@ -0,0 +1,736 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+ before changing it!
+
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* NOTE!!! AIX requires this to be the first thing in the file.
+ Do not put ANYTHING before it! */
+#if !defined (__GNUC__) && defined (_AIX)
+ #pragma alloca
+#endif
+
+#include <string.h> //for strncmp
+#if defined (WIN32)
+#include <malloc.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__))))
+#include <alloca.h>
+#else
+#if !defined (_AIX) && !defined (WIN32)
+char *alloca ();
+#endif
+#endif /* alloca.h */
+#endif /* not __GNUC__ */
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#undef alloca
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+#include <stdlib.h>
+#else /* Not GNU C library. */
+#define __alloca alloca
+#endif /* GNU C library. */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+ long-named option. Because this is not POSIX.2 compliant, it is
+ being phased out. */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+ because there are many ways it can cause trouble.
+ On some systems, it contains special magic macros that don't work
+ in GCC. */
+#include <string.h>
+#define my_index strchr
+#define my_bcopy(src, dst, n) memcpy ((dst), (src), (n))
+#else
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+ const char *str;
+ int chr;
+{
+ while (*str)
+ {
+ if (*str == chr)
+ return (char *) str;
+ str++;
+ }
+ return 0;
+}
+
+static void
+my_bcopy (from, to, size)
+ const char *from;
+ char *to;
+ int size;
+{
+ int i;
+ for (i = 0; i < size; i++)
+ to[i] = from[i];
+}
+#endif /* GNU C library. */
+
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (argv)
+ char **argv;
+{
+ int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
+ char **temp = (char **) __alloca (nonopts_size);
+
+ /* Interchange the two blocks of data in ARGV. */
+
+ my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size);
+ my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt],
+ (optind - last_nonopt) * sizeof (char *));
+ my_bcopy ((char *) temp,
+ (char *) &argv[first_nonopt + optind - last_nonopt],
+ nonopts_size);
+
+ /* Update records for the slots the non-options now occupy. */
+
+ first_nonopt += (optind - last_nonopt);
+ last_nonopt = optind;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+ const struct option *longopts;
+ int *longind;
+ int long_only;
+{
+ int option_index;
+
+ optarg = 0;
+
+ /* Initialize the internal data when the first call is made.
+ Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ if (optind == 0)
+ {
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = NULL;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (getenv ("POSIXLY_CORRECT") != NULL)
+ ordering = REQUIRE_ORDER;
+ else
+ ordering = PERMUTE;
+ }
+
+ if (nextchar == NULL || *nextchar == '\0')
+ {
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Now skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* Special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Start decoding its characters. */
+
+ nextchar = (argv[optind] + 1
+ + (longopts != NULL && argv[optind][1] == '-'));
+ }
+
+ if (longopts != NULL
+ && ((argv[optind][0] == '-'
+ && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ ))
+ {
+ const struct option *p;
+ char *s = nextchar;
+ int exact = 0;
+ int ambig = 0;
+ const struct option *pfound = NULL;
+ int indfound = 0 ;
+
+ while (*s && *s != '=')
+ s++;
+
+ /* Test all options for either exact match or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name;
+ p++, option_index++)
+ if (!strncmp (p->name, nextchar, s - nextchar))
+ {
+ if ((size_t)(s - nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += strlen (nextchar);
+ optind++;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ optind++;
+ if (*s)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ optarg = s + 1;
+ else
+ {
+ if (opterr)
+ {
+ if (argv[optind - 1][1] == '-')
+ /* --option */
+ fprintf (stderr,
+ "%s: option `--%s' doesn't allow an argument\n",
+ argv[0], pfound->name);
+ else
+ /* +option or -option */
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ }
+ nextchar += strlen (nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += strlen (nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ nextchar += strlen (nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ || my_index (optstring, *nextchar) == NULL)
+ {
+ if (opterr)
+ {
+ if (argv[optind][1] == '-')
+ /* --option */
+ fprintf (stderr, "%s: unrecognized option `--%s'\n",
+ argv[0], nextchar);
+ else
+ /* +option or -option */
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ }
+ nextchar = (char *) "";
+ optind++;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = my_index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == '\0')
+ ++optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (opterr)
+ {
+#if 0
+ if (c < 040 || c >= 0177)
+ fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+ argv[0], c);
+ else
+ fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+ }
+ optopt = c;
+ return '?';
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = 0;
+ nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr)
+ {
+#if 0
+ fprintf (stderr, "%s: option `-%c' requires an argument\n",
+ argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: option requires an argument -- %c\n",
+ argv[0], c);
+#endif
+ }
+ optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/examples/getopt.h b/examples/getopt.h
new file mode 100644
index 0000000..45541f5
--- /dev/null
+++ b/examples/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/examples/getopt1.c b/examples/getopt1.c
new file mode 100644
index 0000000..ce99012
--- /dev/null
+++ b/examples/getopt1.c
@@ -0,0 +1,176 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "getopt.h"
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/examples/ozzy.tag b/examples/ozzy.tag
new file mode 100644
index 0000000..d88ab60
--- /dev/null
+++ b/examples/ozzy.tag
Binary files differ
diff --git a/examples/test_compression.cpp b/examples/test_compression.cpp
new file mode 100644
index 0000000..44a19e6
--- /dev/null
+++ b/examples/test_compression.cpp
@@ -0,0 +1,35 @@
+// $Id: test_compression.cpp,v 1.9 2002/06/29 17:25:23 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+
+int main( int argc, char *argv[])
+{
+ ID3D_INIT_DOUT();
+ ID3D_INIT_WARNING();
+ ID3D_INIT_NOTICE();
+
+ ID3_Tag tag;
+ ID3_Frame frame;
+
+ tag.Link("test-230-compressed.tag");
+ tag.Strip(ID3TT_ALL);
+ tag.Clear();
+
+ frame.SetID(ID3FID_USERTEXT);
+ frame.GetField(ID3FN_DESCRIPTION)->Set("compression example");
+ frame.GetField(ID3FN_TEXT)->Set("This sample user text frame came from an ID3v2-3.0 tag. The frame has the 'compression' bit set in it's frame header. This is the new method for compressing frames, which supercedes the 2.01 Compressed Data Metaframe.");
+ frame.SetCompression(true);
+ tag.AddFrame(frame);
+
+ tag.SetPadding(false);
+ tag.SetUnsync(false);
+ tag.Update(ID3TT_ID3V2);
+
+ return 0;
+}
+
diff --git a/examples/test_io.cpp b/examples/test_io.cpp
new file mode 100644
index 0000000..bee1a27
--- /dev/null
+++ b/examples/test_io.cpp
@@ -0,0 +1,207 @@
+// $Id: test_io.cpp,v 1.6 2003/03/02 15:17:21 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <id3/readers.h>
+#include <id3/writers.h>
+#include <id3/io_decorators.h>
+#include <id3/io_helpers.h>
+#include <id3/io_strings.h>
+#include <id3/utils.h>
+
+using std::cout;
+using std::endl;
+using std::cerr;
+
+using namespace dami;
+
+int
+main(size_t argc, const char** argv)
+{
+ ID3D_INIT_DOUT();
+ ID3D_INIT_WARNING();
+ ID3D_INIT_NOTICE();
+
+ ID3_IStreamReader isr(cin);
+ BString orig = io::readAllBinary(isr);
+
+ cout << "input size: " << orig.size() << endl;
+
+ cout << endl;
+
+ cout << "=== Testing Synchronization ===" << endl;
+ BString synced;
+
+ {
+ io::BStringReader sr(orig);
+ io::UnsyncedReader ur(sr);
+
+ synced = io::readAllBinary(ur);
+ }
+
+ cout << "synced size: " << synced.size() << endl;
+
+ BString unsynced;
+
+ {
+ io::BStringWriter sw(unsynced);
+ io::UnsyncedWriter uw(sw);
+
+ uw.writeChars(synced.data(), synced.size());
+ }
+
+ cout << "unsynced size: " << unsynced.size() << endl;
+
+ BString resynced;
+
+ {
+ io::BStringReader sr(unsynced);
+ io::UnsyncedReader ur(sr);
+
+ resynced = io::readAllBinary(ur);
+ }
+
+ cout << "resynced size: " << resynced.size() << endl;
+
+ if (unsynced == orig)
+ {
+ cout << "orig == unsynced" << endl;
+ }
+ else
+ {
+ cout << "orig != unsynced" << endl;
+ }
+ if (synced == resynced)
+ {
+ cout << "synced == resynced" << endl;
+ }
+ else
+ {
+ cout << "synced != resynced" << endl;
+ }
+
+ cout << endl;
+ cout << "=== Testing Trailing Spaces ===" << endl;
+
+ String text;
+
+ {
+ io::StringWriter sw(text);
+ io::writeTrailingSpaces (sw, "hello, world", 50);
+ }
+
+ cout << "new text = \"" << text << "\"" << endl;
+
+ String origText;
+
+ {
+ io::StringReader sr(text);
+ origText = io::readTrailingSpaces(sr, 100);
+ }
+
+ cout << "orig text = \"" << origText << "\"" << endl;
+
+ cout << endl;
+ cout << "=== Testing Binary Numbers ===" << endl;
+
+ String number;
+
+ {
+ io::StringWriter sw(number);
+ io::writeBENumber(sw, 1234567890, 4);
+ }
+
+ cout << "binary number:";
+ for (size_t i = 0; i < number.size(); ++i)
+ {
+ cout << " 0x" << hex << (size_t) (0xFF & number[i]) << dec;
+ }
+ cout << endl;
+
+ size_t val;
+
+ {
+ io::StringReader sr(number);
+ val = io::readBENumber(sr, 4);
+ }
+
+ cout << "orig number: " << val << endl;
+
+ cout << endl;
+ cout << "=== Testing Compression ===" << endl;
+
+ String compressed;
+ size_t origSize = orig.size();
+ cout << "origSize = " << origSize << endl;
+
+
+ {
+ io::StringWriter sw(compressed);
+ io::CompressedWriter cw(sw);
+ cw.writeChars(orig.data(), orig.size());
+ cw.flush();
+ if (origSize != cw.getOrigSize())
+ {
+ origSize = cw.getOrigSize();
+ cout << "cw.getOrigSize() = " << origSize << endl;
+ }
+ }
+
+ cout << "compressed size = " << compressed.size() << endl;
+
+ BString uncompressed;
+
+ if (origSize == 0)
+ {
+ cout << "no compression" << endl;
+ }
+ else
+ {
+ io::StringReader sr(compressed);
+ io::CompressedReader cr(sr, origSize);
+
+ uncompressed = io::readAllBinary(cr);
+ cout << "uncompressed size = " << uncompressed.size() << endl;
+ }
+
+ if (uncompressed.size() == orig.size())
+ {
+ if (uncompressed == orig)
+ {
+ cout << "orig == uncompressed" << endl;
+ }
+ else
+ {
+ cout << "orig != uncompressed" << endl;
+ }
+ }
+
+ String ascii;
+ ascii.reserve(8192);
+
+ for (size_t i = 0; i < 8192; ++i)
+ {
+ ascii += 'a' + (i % 26);
+ }
+
+ cout << endl;
+ cout << "ascii.size() = " << ascii.size() << endl;
+ String unicode = dami::convert(ascii, ID3TE_ASCII, ID3TE_UTF16BE);
+ cout << "uncicode.size() = " << unicode.size() << endl;
+ String ascii_2 = dami::convert(unicode, ID3TE_UTF16BE, ID3TE_ASCII);
+ if (ascii != ascii_2)
+ {
+ cout << "ascii != ascii_2" << endl;
+ }
+ else
+ {
+ cout << "ascii == ascii_2" << endl;
+ }
+
+
+
+ return 0;
+}
+
diff --git a/examples/test_pic.cpp b/examples/test_pic.cpp
new file mode 100644
index 0000000..600836b
--- /dev/null
+++ b/examples/test_pic.cpp
@@ -0,0 +1,71 @@
+// $Id: test_pic.cpp,v 1.10 2002/06/29 17:25:53 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+
+int main( int argc, char *argv[])
+{
+ ID3D_INIT_DOUT();
+ ID3D_INIT_WARNING();
+ ID3D_INIT_NOTICE();
+
+ ID3_Tag tag;
+ ID3_Frame frame;
+
+ tag.Link("test-230-picture.tag");
+ tag.Strip(ID3TT_ALL);
+ tag.Clear();
+
+ frame.SetID(ID3FID_TITLE);
+ frame.GetField(ID3FN_TEXT)->Set("Aquarium");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_CONTENTGROUP);
+ frame.GetField(ID3FN_TEXT)->Set("Short fraction of 'Carnival of the Animals: A Grand Zoological Fantasy'");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COMPOSER);
+ frame.GetField(ID3FN_TEXT)->Set("Camille Saint-Saëns");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_BAND);
+ frame.GetField(ID3FN_TEXT)->Set("Slovakia Radio Symphony Orchestra");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_CONDUCTOR);
+ frame.GetField(ID3FN_TEXT)->Set("Ondrej Lenárd");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COPYRIGHT);
+ frame.GetField(ID3FN_TEXT)->Set("1996 HNH international Ltd.");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_CONTENTTYPE);
+ frame.GetField(ID3FN_TEXT)->Set("(32)");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_INVOLVEDPEOPLE);
+ frame.GetField(ID3FN_TEXT)->Add("Producer");
+ frame.GetField(ID3FN_TEXT)->Add("Martin Sauer");
+ frame.GetField(ID3FN_TEXT)->Add("Piano");
+ frame.GetField(ID3FN_TEXT)->Add("Peter Toperczer");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_PICTURE);
+ frame.GetField(ID3FN_MIMETYPE)->Set("image/jpeg");
+ frame.GetField(ID3FN_PICTURETYPE)->Set(11);
+ frame.GetField(ID3FN_DESCRIPTION)->Set("B/W picture of Saint-Saëns");
+ frame.GetField(ID3FN_DATA)->FromFile("composer.jpg");
+ tag.AddFrame(frame);
+
+ tag.SetPadding(false);
+ tag.SetUnsync(true);
+ tag.Update(ID3TT_ID3V2);
+
+ return 0;
+}
+
diff --git a/examples/test_remove.cpp b/examples/test_remove.cpp
new file mode 100644
index 0000000..6bdfc63
--- /dev/null
+++ b/examples/test_remove.cpp
@@ -0,0 +1,118 @@
+// $Id: test_remove.cpp,v 1.13 2003/03/02 15:17:21 t1mpy Exp $
+
+#if defined(HAVE_CONFIG_H)
+# include "config.h"
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/tag.h"
+#include "id3/misc_support.h"
+#include "id3/id3lib_strings.h"
+
+using std::cout;
+using std::endl;
+using std::cerr;
+
+using namespace dami;
+
+typedef const char* LPCTSTR;
+
+/* CSharedTag is a wrapper I made for some features I need */
+/* LPCTSTR means const char * */
+size_t RemoveFrame(ID3_Tag& pTag, ID3_FrameID fID, LPCTSTR sDescription)
+{
+ size_t nCount = 0;
+ const ID3_Frame * frame = NULL;
+
+ do {
+ if (!sDescription)
+ {
+ cerr << "*** description is null" << endl;
+ frame = pTag.Find(fID);
+ }
+ else
+ {
+ cerr << "*** description is \"" << sDescription << "\"" << endl;
+ frame = pTag.Find(fID, ID3FN_DESCRIPTION, sDescription);
+ }
+
+ if (frame)
+ {
+ ID3_Field* fld = frame->GetField(ID3FN_TEXT);
+ String text(fld->GetRawText(), fld->Size());
+ cerr << "*** delete frame with text \"" << text << "\"" << endl;
+ /* pTag is an ID3_Tag */
+ delete pTag.RemoveFrame(frame);
+ nCount++;
+ }
+ } while (frame != NULL);
+
+ return nCount;
+}
+
+int main( int argc, char *argv[])
+{
+ ID3_Tag tag;
+ ID3_Frame frame;
+
+ if (argc == 2)
+ {
+ tag.Link(argv[1]);
+ cerr << "removed " << RemoveFrame(tag, ID3FID_COMMENT, "") << " descriptionless comment frames" << endl;
+ tag.Update();
+
+ }
+ else
+ {
+ tag.Link("test-remove.tag");
+ tag.Strip(ID3TT_ALL);
+ tag.Clear();
+
+ frame.SetID(ID3FID_TITLE);
+ frame.GetField(ID3FN_TEXT)->Set("Test title");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COMPOSER);
+ frame.GetField(ID3FN_TEXT)->Set("Test composer");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_BAND);
+ frame.GetField(ID3FN_TEXT)->Set("Test band");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_CONDUCTOR);
+ frame.GetField(ID3FN_TEXT)->Set("Test conductor");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COMMENT);
+ frame.GetField(ID3FN_LANGUAGE)->Set("eng");
+ frame.GetField(ID3FN_TEXT)->Set("Test comment");
+ frame.GetField(ID3FN_DESCRIPTION)->Set("A Description");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COMMENT);
+ frame.GetField(ID3FN_LANGUAGE)->Set("eng");
+ frame.GetField(ID3FN_TEXT)->Set("Test comment 2");
+ frame.GetField(ID3FN_DESCRIPTION)->Set("");
+ tag.AddFrame(frame);
+
+ frame.SetID(ID3FID_COMMENT);
+ frame.GetField(ID3FN_LANGUAGE)->Set("eng");
+ frame.GetField(ID3FN_TEXT)->Set("ID3v1 comment text?");
+ frame.GetField(ID3FN_DESCRIPTION)->Set(STR_V1_COMMENT_DESC);
+ tag.AddFrame(frame);
+
+ tag.SetPadding(false);
+ tag.Update(ID3TT_ID3V2);
+
+ cerr << "removed " << ID3_RemoveArtists(&tag) << " artist frames" << endl;
+ tag.Update();
+ cerr << "removed " << ID3_RemoveTitles(&tag) << " title frames" << endl;
+ tag.Update();
+ cerr << "removed " << RemoveFrame(tag, ID3FID_COMMENT, "") << " descriptionless comment frames" << endl;
+ tag.Update();
+ }
+
+ return 0;
+}
+
diff --git a/examples/test_unicode.cpp b/examples/test_unicode.cpp
new file mode 100644
index 0000000..ea916b1
--- /dev/null
+++ b/examples/test_unicode.cpp
@@ -0,0 +1,31 @@
+// $Id: test_unicode.cpp,v 1.8 2002/06/29 17:26:18 t1mpy Exp $
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include <id3/tag.h>
+
+int main( int argc, char *argv[])
+{
+ ID3_Tag tag;
+ ID3_Frame frame;
+
+ tag.Link("test-230-unicode.tag");
+ tag.Strip(ID3TT_ALL);
+ tag.Clear();
+
+ frame.SetID(ID3FID_USERTEXT);
+ frame.GetField(ID3FN_DESCRIPTION)->Set("example text frame");
+ frame.GetField(ID3FN_TEXT)->Set("This text and the description should be in Unicode.");
+ frame.GetField(ID3FN_TEXTENC)->Set(ID3TE_UNICODE);
+ tag.AddFrame(frame);
+
+ tag.SetPadding(false);
+ tag.SetUnsync(false);
+ tag.Update(ID3TT_ID3V2);
+
+ return 0;
+}
+
diff --git a/examples/thatspot.tag b/examples/thatspot.tag
new file mode 100644
index 0000000..5e46d81
--- /dev/null
+++ b/examples/thatspot.tag
Binary files differ
diff --git a/id3com/EnumFields.cpp b/id3com/EnumFields.cpp
new file mode 100644
index 0000000..6fbfdce
--- /dev/null
+++ b/id3com/EnumFields.cpp
@@ -0,0 +1,111 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// EnumFields.cpp : Implementation of DLL Exports.
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ID3COM.h"
+#include "EnumFields.h"
+#include <comdef.h>
+
+/////////////////////////////////////////////////////////////////////////////
+// CEnumFields
+CEnumFields::CEnumFields()
+{
+ m_Tag = NULL;
+ m_CurrentNum = 0;
+}
+
+CEnumFields::~CEnumFields()
+{
+ if(m_Tag != NULL)
+ {
+ m_Tag->Release();
+ }
+}
+
+IEnumVARIANT* CEnumFields::CreateObject(IID3ComTag* Tag)
+{
+ CComObject<CEnumFields>* pRetVal = new CComObject<CEnumFields>;
+ pRetVal->m_Tag = Tag;
+ pRetVal->m_Tag->AddRef();
+ return pRetVal;
+}
+
+STDMETHODIMP CEnumFields::Next(ULONG celt, VARIANT* rgelt, ULONG * pceltFetched)
+{
+ long NumItems;
+ m_Tag->get_Count(&NumItems);
+ for(long i(0); i < (long)((pceltFetched==NULL)?1:(*pceltFetched)); i++)
+ {
+ if(m_CurrentNum + i >= NumItems)
+ {
+ return S_FALSE;
+ }
+ else
+ {
+ IID3ComFrame* Frame;
+ m_Tag->get_Item(m_CurrentNum + i, &Frame);
+ *(_variant_t*)rgelt = Frame;
+ Frame->Release();
+ rgelt++;
+ }
+ }
+ m_CurrentNum += ((pceltFetched==NULL)?1:(*pceltFetched));
+ return S_OK;
+}
+
+STDMETHODIMP CEnumFields::Skip(ULONG celt)
+{
+ m_CurrentNum += celt;
+ return S_OK;
+}
+
+STDMETHODIMP CEnumFields::Reset(void)
+{
+ m_CurrentNum = 0;
+ return S_OK;
+}
+
+STDMETHODIMP CEnumFields::Clone(IEnumVARIANT ** ppenum)
+{
+ CComObject<CEnumFields>* pRetVal = new CComObject<CEnumFields>;
+ pRetVal->m_Tag = m_Tag;
+ pRetVal->m_CurrentNum = m_CurrentNum;
+ pRetVal->m_Tag->AddRef();
+ *ppenum = pRetVal;
+ return S_OK;
+}
+
diff --git a/id3com/EnumFields.h b/id3com/EnumFields.h
new file mode 100644
index 0000000..2b90394
--- /dev/null
+++ b/id3com/EnumFields.h
@@ -0,0 +1,70 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// EnumFields,h
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __ENUMFIELDS_H_
+#define __ENUMFIELDS_H_
+
+#include "resource.h" // main symbols
+
+/////////////////////////////////////////////////////////////////////////////
+// CEnumFields
+class ATL_NO_VTABLE CEnumFields :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public IEnumVARIANT
+{
+public:
+ CEnumFields();
+ ~CEnumFields();
+
+ static IEnumVARIANT* CreateObject(IID3ComTag* Tag);
+
+DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+BEGIN_COM_MAP(CEnumFields)
+ COM_INTERFACE_ENTRY(IEnumVARIANT)
+END_COM_MAP()
+
+ STDMETHOD(Next)(ULONG celt, VARIANT* rgelt, ULONG * pceltFetched);
+ STDMETHOD(Skip)(ULONG celt);
+ STDMETHOD(Reset)(void);
+ STDMETHOD(Clone)(IEnumVARIANT ** ppenum);
+protected:
+ IID3ComTag* m_Tag;
+ long m_CurrentNum;
+};
+
+#endif //__ENUMVBWORKITEMS_H_
diff --git a/id3com/ID3COM.def b/id3com/ID3COM.def
new file mode 100644
index 0000000..5c89dda
--- /dev/null
+++ b/id3com/ID3COM.def
@@ -0,0 +1,9 @@
+; ID3COM.def : Declares the module parameters.
+
+LIBRARY "ID3COM.DLL"
+
+EXPORTS
+ DllCanUnloadNow @1 PRIVATE
+ DllGetClassObject @2 PRIVATE
+ DllRegisterServer @3 PRIVATE
+ DllUnregisterServer @4 PRIVATE
diff --git a/id3com/ID3COM.rc b/id3com/ID3COM.rc
new file mode 100644
index 0000000..076593d
--- /dev/null
+++ b/id3com/ID3COM.rc
@@ -0,0 +1,137 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "1 TYPELIB ""ID3COM.tlb""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 3,7,12,2
+ PRODUCTVERSION 3,7,12,2
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "\0"
+ VALUE "FileDescription", "ID3libCOM Module\0"
+ VALUE "FileVersion", "3, 7, 12, 2\0"
+ VALUE "InternalName", "ID3libCOM\0"
+ VALUE "LegalCopyright", "Copyright 2000\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OLESelfRegister", "\0"
+ VALUE "OriginalFilename", "ID3libCOM.DLL\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "ID3libCOM Module\0"
+ VALUE "ProductVersion", "3, 7, 12, 2\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// REGISTRY
+//
+
+IDR_ID3TAG REGISTRY DISCARDABLE "ID3Tag.rgs"
+IDR_ID3FRAME REGISTRY DISCARDABLE "ID3Frame.rgs"
+IDR_ID3FIELD REGISTRY DISCARDABLE "ID3Field.rgs"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_PROJNAME "ID3libCOM"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_UNEXPECTED_ERROR "An unexpected error has occurred"
+ IDS_ERROR_BAD_FILENAME "You must specify a file and not a directory"
+ IDS_ERROR_BAD_URL "The URL could not be resolved"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+1 TYPELIB "ID3COM.tlb"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/id3com/ID3COMps.def b/id3com/ID3COMps.def
new file mode 100644
index 0000000..8116a7e
--- /dev/null
+++ b/id3com/ID3COMps.def
@@ -0,0 +1,11 @@
+
+LIBRARY "ID3libCOMPS"
+
+DESCRIPTION 'Proxy/Stub DLL'
+
+EXPORTS
+ DllGetClassObject @1 PRIVATE
+ DllCanUnloadNow @2 PRIVATE
+ GetProxyDllInfo @3 PRIVATE
+ DllRegisterServer @4 PRIVATE
+ DllUnregisterServer @5 PRIVATE
diff --git a/id3com/ID3COMps.mk b/id3com/ID3COMps.mk
new file mode 100644
index 0000000..eab182c
--- /dev/null
+++ b/id3com/ID3COMps.mk
@@ -0,0 +1,16 @@
+
+ID3libCOMps.dll: dlldata.obj ID3libCOM_p.obj ID3libCOM_i.obj
+ link /dll /out:ID3libCOMps.dll /def:ID3libCOMps.def /entry:DllMain dlldata.obj ID3libCOM_p.obj ID3libCOM_i.obj \
+ kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib \
+
+.c.obj:
+ cl /c /Ox /DWIN32 /D_WIN32_WINNT=0x0400 /DREGISTER_PROXY_DLL \
+ $<
+
+clean:
+ @del ID3libCOMps.dll
+ @del ID3libCOMps.lib
+ @del ID3libCOMps.exp
+ @del dlldata.obj
+ @del ID3libCOM_p.obj
+ @del ID3libCOM_i.obj
diff --git a/id3com/ID3Field.cpp b/id3com/ID3Field.cpp
new file mode 100644
index 0000000..bd1fb14
--- /dev/null
+++ b/id3com/ID3Field.cpp
@@ -0,0 +1,270 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Field.cpp : Implementation of CID3Field
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ID3COM.h"
+#include "ID3Field.h"
+#include "ID3Frame.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Field
+
+CID3Field::CID3Field()
+{
+ m_Field = NULL;
+ m_FrameParent = NULL;
+}
+
+CID3Field::~CID3Field()
+{
+ if(m_FrameParent != NULL)
+ {
+ m_FrameParent->Release();
+ }
+ m_Field = NULL;
+}
+
+IID3ComField* CID3Field::CreateObject(IID3ComFrame* FrameParent, ID3_Field* Field)
+{
+ CComObject<CID3Field>* pRetVal = new CComObject<CID3Field>;
+ pRetVal->m_Field = Field;
+ pRetVal->m_FrameParent = FrameParent;
+ FrameParent->AddRef();
+ return (IID3ComField*)pRetVal;
+}
+
+STDMETHODIMP CID3Field::InterfaceSupportsErrorInfo(REFIID riid)
+{
+ static const IID* arr[] =
+ {
+ &IID_IID3ComField
+ };
+ for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
+ {
+ if (InlineIsEqualGUID(*arr[i],riid))
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
+STDMETHODIMP CID3Field::get_Text(long ItemNum, BSTR *pVal)
+{
+ USES_CONVERSION;
+ luint TryChars = 0;
+ luint GotChars = 0;
+ try
+ {
+ *pVal = NULL;
+ size_t nText = m_Field->Size();
+ if(m_Field->GetEncoding() == ID3TE_UNICODE)
+ {
+ unicode_t* sText = new unicode_t[nText + 1];
+ try
+ {
+ m_Field->Get(sText, nText, ItemNum - 1);
+ sText[nText] = '\0';
+ *pVal = SysAllocString(sText);
+ }
+ catch (...)
+ {
+ *pVal = NULL;
+ }
+ delete [] sText;
+ }
+ else
+ {
+ char* sText = new char[nText + 1];
+ try
+ {
+ m_Field->Get(sText, nText, ItemNum - 1);
+ sText[nText] = '\0';
+ *pVal = SysAllocString(A2W(sText));
+ }
+ catch (...)
+ {
+ *pVal = NULL;
+ }
+ delete [] sText;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::put_Text(long ItemNum, BSTR newVal)
+{
+ try
+ {
+ m_Field->Set(newVal);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::get_Long(long *pVal)
+{
+ try
+ {
+ *pVal = m_Field->Get();
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::put_Long(long newVal)
+{
+ try
+ {
+ m_Field->Set(newVal);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::Clear()
+{
+ try
+ {
+ m_Field->Clear();
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::CopyDataToFile(BSTR FileName)
+{
+ USES_CONVERSION;
+ try
+ {
+ m_Field->ToFile(OLE2A(FileName));
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::CopyDataFromFile(BSTR FileName)
+{
+ USES_CONVERSION;
+ try
+ {
+ m_Field->FromFile(OLE2A(FileName));
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::get_NumTextItems(long *pVal)
+{
+ try
+ {
+ *pVal = m_Field->GetNumTextItems();
+ return S_OK;
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Field::get_Binary(BSTR *pVal)
+{
+ // TODO: Add your implementation code here
+ if (pVal == NULL)
+ return E_POINTER;
+ try
+ {
+ *pVal = NULL;
+ const uchar *pData = m_Field->GetRawBinary();
+ if (pData == NULL)
+ return E_FAIL;
+ ID3_Frame *pFrame = ((CID3Frame*)m_FrameParent)->GetID3Frame();
+ if (pFrame->GetID() == ID3FID_PICTURE)
+ {
+ *pVal = _bstr_t((LPCTSTR)pData).copy();
+ }
+ else
+ {
+ *pVal = SysAllocStringByteLen((const char *)pData,m_Field->Size());
+ }
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+ return S_OK;
+}
+
+STDMETHODIMP CID3Field::put_Binary(BSTR newVal)
+{
+ // TODO: Add your implementation code here
+ try
+ {
+ size_t Size = SysStringByteLen(newVal);
+ m_Field->Set((const uchar *)newVal,Size);
+ }
+ catch (...)
+ {
+ return Error(IDS_UNEXPECTED_ERROR, IID_IID3ComField, E_UNEXPECTED);
+ }
+ return S_OK;
+}
+///////////////////////////////////////////////////////
+// End Added Philip Oldaker 12-Aug 2000
+///////////////////////////////////////////////////////
+
diff --git a/id3com/ID3Field.h b/id3com/ID3Field.h
new file mode 100644
index 0000000..7085dde
--- /dev/null
+++ b/id3com/ID3Field.h
@@ -0,0 +1,94 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Field.h : Declaration of the CID3Field
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __ID3FIELD_H_
+#define __ID3FIELD_H_
+
+#include "resource.h" // main symbols
+#include <id3/tag.h>
+#include <id3.h>
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Field
+class ATL_NO_VTABLE CID3Field :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public CComCoClass<CID3Field, &CLSID_ID3ComField>,
+ public ISupportErrorInfo,
+ public IDispatchImpl<IID3ComField, &IID_IID3ComField, &LIBID_ID3COM>
+{
+public:
+ CID3Field();
+ ~CID3Field();
+ ID3_Field *GetID3Field()
+ {
+ return m_Field;
+ }
+
+ static IID3ComField* CreateObject(IID3ComFrame* FrameParent, ID3_Field* Field);
+
+DECLARE_REGISTRY_RESOURCEID(IDR_ID3FIELD)
+
+DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+BEGIN_COM_MAP(CID3Field)
+ COM_INTERFACE_ENTRY(IID3ComField)
+ COM_INTERFACE_ENTRY(IDispatch)
+ COM_INTERFACE_ENTRY(ISupportErrorInfo)
+END_COM_MAP()
+
+// ISupportsErrorInfo
+ STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
+
+// IID3ComField
+public:
+ STDMETHOD(get_Binary)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Binary)(/*[in]*/ BSTR newVal);
+ STDMETHOD(get_NumTextItems)(/*[out, retval]*/ long *pVal);
+ STDMETHOD(CopyDataFromFile)(BSTR FileName);
+ STDMETHOD(CopyDataToFile)(BSTR FileName);
+ STDMETHOD(Clear)();
+ STDMETHOD(get_Long)(/*[out, retval]*/ long *pVal);
+ STDMETHOD(put_Long)(/*[in]*/ long newVal);
+ STDMETHOD(get_Text)(/*[in]*/ long ItemNum, /*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Text)(/*[in]*/ long ItemNum, /*[in]*/ BSTR newVal);
+protected:
+ ID3_Field* m_Field;
+ IID3ComFrame* m_FrameParent;
+};
+
+#endif //__ID3FIELD_H_
diff --git a/id3com/ID3Field.rgs b/id3com/ID3Field.rgs
new file mode 100644
index 0000000..863d754
--- /dev/null
+++ b/id3com/ID3Field.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+ ID3COM.ID3ComField.1 = s 'ID3ComField Class'
+ {
+ CLSID = s '{A513A24F-C749-11D3-841C-0008C782A257}'
+ }
+ ID3COM.ID3ComField = s 'ID3ComField Class'
+ {
+ CLSID = s '{A513A24F-C749-11D3-841C-0008C782A257}'
+ CurVer = s 'ID3COM.ID3ComField.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {A513A24F-C749-11D3-841C-0008C782A257} = s 'ID3ComField Class'
+ {
+ ProgID = s 'ID3COM.ID3ComField.1'
+ VersionIndependentProgID = s 'ID3COM.ID3ComField'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ 'TypeLib' = s '{AEBA98B0-C36C-11D3-841B-0008C782A257}'
+ }
+ }
+}
diff --git a/id3com/ID3Frame.cpp b/id3com/ID3Frame.cpp
new file mode 100644
index 0000000..67417aa
--- /dev/null
+++ b/id3com/ID3Frame.cpp
@@ -0,0 +1,202 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Frame.cpp : Implementation of CID3Frame
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ID3COM.h"
+#include "ID3Frame.h"
+#include "ID3Field.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Frame
+
+CID3Frame::CID3Frame()
+{
+ m_Frame = NULL;
+ m_TagParent = NULL;
+}
+
+CID3Frame::~CID3Frame()
+{
+ if(m_TagParent != NULL)
+ {
+ m_TagParent->Release();
+ }
+ m_Frame = NULL;
+}
+
+IID3ComFrame* CID3Frame::CreateObject(IID3ComTag* TagParent, ID3_Frame* Frame)
+{
+ CComObject<CID3Frame>* pRetVal = new CComObject<CID3Frame>;
+ pRetVal->m_Frame = Frame;
+ pRetVal->m_TagParent = TagParent;
+ TagParent->AddRef();
+ return (IID3ComFrame*)pRetVal;
+}
+
+STDMETHODIMP CID3Frame::InterfaceSupportsErrorInfo(REFIID riid)
+{
+ static const IID* arr[] =
+ {
+ &IID_IID3ComFrame
+ };
+ for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
+ {
+ if (InlineIsEqualGUID(*arr[i],riid))
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
+STDMETHODIMP CID3Frame::get_Field(eID3FieldTypes FieldType, IID3ComField** pVal)
+{
+ try
+ {
+ *pVal = NULL;
+ ID3_Field* Field = &(m_Frame->Field((enum ID3_FieldID)FieldType));
+ if(Field != NULL)
+ {
+ *pVal = CID3Field::CreateObject(this, Field);
+ (*pVal)->AddRef();
+ }
+ else
+ {
+ *pVal = NULL;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::Clear()
+{
+ try
+ {
+ m_Frame->Clear();
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::get_ID(eID3FrameTypes *pVal)
+{
+ try
+ {
+ *pVal = ID3_NOFRAME;
+ *pVal = (eID3FrameTypes)m_Frame->GetID();
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::put_ID(eID3FrameTypes newVal)
+{
+ try
+ {
+ m_Frame->SetID((ID3_FrameID)newVal);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::get_FrameName(BSTR *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ const char* sDesc = m_Frame->GetDescription();
+ if(sDesc != NULL)
+ {
+ *pVal = SysAllocString(A2W(sDesc));
+ }
+ else
+ {
+ *pVal = SysAllocString(L"Unknown Frame");
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::put_Compressed(VARIANT_BOOL newVal)
+{
+ try
+ {
+ m_Frame->SetCompression(newVal == VARIANT_TRUE);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Frame::get_Compressed(VARIANT_BOOL *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ if(m_Frame->GetCompression())
+ {
+ *pVal = VARIANT_TRUE;
+ }
+ else
+ {
+ *pVal = VARIANT_FALSE;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComFrame, "An unexpected error has occurred", IID_IID3ComFrame, E_UNEXPECTED);
+ }
+} \ No newline at end of file
diff --git a/id3com/ID3Frame.h b/id3com/ID3Frame.h
new file mode 100644
index 0000000..ce656e1
--- /dev/null
+++ b/id3com/ID3Frame.h
@@ -0,0 +1,90 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Frame.h : Declaration of the CID3Frame
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __ID3FRAME_H_
+#define __ID3FRAME_H_
+
+#include "resource.h" // main symbols
+#include <id3/tag.h>
+#include <id3.h>
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Frame
+class ATL_NO_VTABLE CID3Frame :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public CComCoClass<CID3Frame, &CLSID_ID3ComFrame>,
+ public ISupportErrorInfo,
+ public IDispatchImpl<IID3ComFrame, &IID_IID3ComFrame, &LIBID_ID3COM>
+{
+public:
+ CID3Frame();
+ ~CID3Frame();
+ ID3_Frame *GetID3Frame()
+ {
+ return m_Frame;
+ }
+ static IID3ComFrame* CreateObject(IID3ComTag* TagParent, ID3_Frame* Frame);
+
+DECLARE_REGISTRY_RESOURCEID(IDR_ID3FRAME)
+
+DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+BEGIN_COM_MAP(CID3Frame)
+ COM_INTERFACE_ENTRY(IID3ComFrame)
+ COM_INTERFACE_ENTRY(IDispatch)
+ COM_INTERFACE_ENTRY(ISupportErrorInfo)
+END_COM_MAP()
+
+// ISupportsErrorInfo
+ STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
+
+// IID3ComFrame
+public:
+ STDMETHOD(get_Compressed)(/*[out, retval]*/ VARIANT_BOOL *pVal);
+ STDMETHOD(put_Compressed)(/*[in]*/ VARIANT_BOOL newVal);
+ STDMETHOD(get_FrameName)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(get_ID)(/*[out, retval]*/ eID3FrameTypes *pVal);
+ STDMETHOD(put_ID)(/*[in]*/ eID3FrameTypes newVal);
+ STDMETHOD(Clear)();
+ STDMETHOD(get_Field)(/*[in]*/ eID3FieldTypes FieldType, /*[out, retval]*/ IID3ComField** pVal);
+
+protected:
+ ID3_Frame* m_Frame;
+ IID3ComTag* m_TagParent;
+};
+
+#endif //__ID3FRAME_H_
diff --git a/id3com/ID3Frame.rgs b/id3com/ID3Frame.rgs
new file mode 100644
index 0000000..062a2ff
--- /dev/null
+++ b/id3com/ID3Frame.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+ ID3COM.ID3ComFrame.1 = s 'ID3ComFrame Class'
+ {
+ CLSID = s '{AEBA98BF-C36C-11D3-841B-0008C782A257}'
+ }
+ ID3COM.ID3ComFrame = s 'ID3ComFrame Class'
+ {
+ CLSID = s '{AEBA98BF-C36C-11D3-841B-0008C782A257}'
+ CurVer = s 'ID3COM.ID3ComFrame.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {AEBA98BF-C36C-11D3-841B-0008C782A257} = s 'ID3ComFrame Class'
+ {
+ ProgID = s 'ID3COM.ID3ComFrame.1'
+ VersionIndependentProgID = s 'ID3COM.ID3ComFrame'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ 'TypeLib' = s '{AEBA98B0-C36C-11D3-841B-0008C782A257}'
+ }
+ }
+}
diff --git a/id3com/ID3Tag.cpp b/id3com/ID3Tag.cpp
new file mode 100644
index 0000000..e583409
--- /dev/null
+++ b/id3com/ID3Tag.cpp
@@ -0,0 +1,905 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Tag.cpp : Implementation of CID3Tag
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ID3COM.h"
+#include "ID3Tag.h"
+#include "config.h"
+#include "ID3Frame.h"
+#include "ID3Field.h"
+#include "EnumFields.h"
+#include "id3/misc_support.h"
+#include "math.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Tag
+
+CID3Tag::CID3Tag()
+{
+ m_ID3Tag = new ID3_Tag();
+}
+
+CID3Tag::~CID3Tag()
+{
+ if(m_ID3Tag != NULL)
+ {
+ delete m_ID3Tag;
+ }
+}
+
+STDMETHODIMP CID3Tag::InterfaceSupportsErrorInfo(REFIID riid)
+{
+ static const IID* arr[] =
+ {
+ &IID_IID3ComTag
+ };
+ for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
+ {
+ if (InlineIsEqualGUID(*arr[i],riid))
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
+
+STDMETHODIMP CID3Tag::Link(BSTR *FileName)
+{
+ USES_CONVERSION;
+
+ if(FileName == NULL)
+ {
+ return E_INVALIDARG;
+ }
+
+ try
+ {
+ m_ID3Tag->Link(OLE2A(*FileName));
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+ return S_OK;
+}
+
+STDMETHODIMP CID3Tag::Clear()
+{
+ try
+ {
+ m_ID3Tag->Clear();
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+ return S_OK;
+}
+
+STDMETHODIMP CID3Tag::get_HasChanged(VARIANT_BOOL *pVal)
+{
+ try
+ {
+ *pVal = VARIANT_FALSE;
+ if(m_ID3Tag->HasChanged())
+ {
+ *pVal = VARIANT_TRUE;
+ }
+ else
+ {
+ *pVal = VARIANT_FALSE;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::FindFrame(eID3FrameTypes FrameID, VARIANT_BOOL CreateNewIfNotFound, IID3ComFrame** pVal)
+{
+ try
+ {
+ *pVal = NULL;
+ ID3_Frame* pFrame = m_ID3Tag->Find((enum ID3_FrameID)FrameID);
+ if(CreateNewIfNotFound == VARIANT_TRUE && pFrame == NULL)
+ {
+ pFrame = new ID3_Frame((enum ID3_FrameID)FrameID);
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ if(pFrame != NULL)
+ {
+ *pVal = CID3Frame::CreateObject(this, pFrame);
+ (*pVal)->AddRef();
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get__NewEnum(IUnknown** pRetVal)
+{
+ *pRetVal = CEnumFields::CreateObject(this);
+ (*pRetVal)->AddRef();
+ return S_OK;
+}
+
+STDMETHODIMP CID3Tag::get_Count(long *pVal)
+{
+ try
+ {
+ *pVal = 0;
+ *pVal = m_ID3Tag->NumFrames();
+ return S_OK;
+ }
+ catch (...)
+ {
+ *pVal = 0;
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Item(long FrameNum, IID3ComFrame** pVal)
+{
+ try
+ {
+ *pVal = NULL;
+ ID3_Frame* pFrame = NULL;
+ ID3_Tag::Iterator* it = m_ID3Tag->CreateIterator();
+ pFrame = it->GetNext();
+ while(FrameNum)
+ {
+ pFrame = it->GetNext();
+ --FrameNum;
+ }
+ delete it;
+ if(pFrame != NULL)
+ {
+ *pVal = CID3Frame::CreateObject(this, pFrame);
+ (*pVal)->AddRef();
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::SaveV1Tag()
+{
+ try
+ {
+ m_ID3Tag->Update(ID3TT_ID3V1);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::StripV1Tag()
+{
+ try
+ {
+ m_ID3Tag->Strip(ID3TT_ID3V1);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::SaveV2Tag()
+{
+ try
+ {
+ m_ID3Tag->Update(ID3TT_ID3V2);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::StripV2Tag()
+{
+ try
+ {
+ m_ID3Tag->Strip(ID3TT_ID3V2);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Artist(BSTR *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ *pVal = NULL;
+ char* RetStr = NULL;
+ RetStr = ID3_GetArtist(m_ID3Tag);
+ *pVal = SysAllocString(A2W(RetStr));
+ if(RetStr != NULL)
+ {
+ delete [] RetStr;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Artist(BSTR newVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ ID3_Frame *pFrame;
+ if((pFrame = m_ID3Tag->Find(ID3FID_LEADARTIST)) == NULL &&
+ (pFrame = m_ID3Tag->Find(ID3FID_BAND)) == NULL &&
+ (pFrame = m_ID3Tag->Find(ID3FID_CONDUCTOR)) == NULL &&
+ (pFrame = m_ID3Tag->Find(ID3FID_COMPOSER)) == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_LEADARTIST);
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ pFrame->Field(ID3FN_TEXT) = OLE2A(newVal);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Album(BSTR *pVal)
+{
+ USES_CONVERSION;
+ char* RetStr = NULL;
+ try
+ {
+ *pVal = NULL;
+ RetStr = ID3_GetAlbum(m_ID3Tag);
+ *pVal = SysAllocString(A2W(RetStr));
+ if(RetStr != NULL)
+ {
+ delete [] RetStr;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Album(BSTR newVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ ID3_AddAlbum(m_ID3Tag, OLE2A(newVal), true);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Title(BSTR *pVal)
+{
+ USES_CONVERSION;
+ char* RetStr = NULL;
+ try
+ {
+ *pVal = NULL;
+ RetStr = ID3_GetTitle(m_ID3Tag);
+ *pVal = SysAllocString(A2W(RetStr));
+ if(RetStr != NULL)
+ {
+ delete [] RetStr;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Title(BSTR newVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ ID3_AddTitle(m_ID3Tag, OLE2A(newVal), true);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Comment(BSTR *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ *pVal = NULL;
+ char* RetStr = NULL;
+ RetStr = ID3_GetComment(m_ID3Tag);
+ *pVal = SysAllocString(A2W(RetStr));
+ if(RetStr != NULL)
+ {
+ delete [] RetStr;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Comment(BSTR newVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ ID3_AddComment(m_ID3Tag, OLE2A(newVal), STR_V1_COMMENT_DESC, true);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Genre(long *pVal)
+{
+ try
+ {
+ *pVal = 255;
+ *pVal = ID3_GetGenreNum(m_ID3Tag);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Genre(long newVal)
+{
+ try
+ {
+ ID3_AddGenre(m_ID3Tag, newVal, true);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Year(BSTR *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ *pVal = 0;
+ char* RetStr = NULL;
+ RetStr = ID3_GetYear(m_ID3Tag);
+ *pVal = SysAllocString(A2W(RetStr));
+ if(RetStr != NULL)
+ {
+ delete [] RetStr;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Year(BSTR newVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ ID3_AddYear(m_ID3Tag, OLE2A(newVal), true);
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+ return S_OK;
+}
+
+STDMETHODIMP CID3Tag::get_Track(long *pVal)
+{
+ try
+ {
+ *pVal = -1;
+ *pVal = ID3_GetTrackNum(m_ID3Tag);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Track(long newVal)
+{
+ try
+ {
+ ID3_AddTrack(m_ID3Tag, (uchar)newVal, 0, true);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_LastPlayed(DATE *pVal)
+{
+ try
+ {
+ *pVal = 0;
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "LastPlayed");
+ if (pFrame != NULL)
+ {
+ char* szLastPlayed = ID3_GetString(pFrame, ID3FN_TEXT);
+ if(szLastPlayed != NULL)
+ {
+ *pVal = atof(szLastPlayed);
+ delete [] szLastPlayed;
+ }
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_LastPlayed(DATE newVal)
+{
+ try
+ {
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "LastPlayed");
+ if(pFrame == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_USERTEXT);
+ pFrame->Field(ID3FN_DESCRIPTION) = "LastPlayed";
+ pFrame->Field(ID3FN_TEXTENC) = ID3TE_ASCII;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ char Buffer[40];
+ sprintf(Buffer, "%6.7f", newVal);
+ pFrame->Field(ID3FN_TEXT) = Buffer;
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_HasV1Tag(VARIANT_BOOL *pVal)
+{
+ try
+ {
+ *pVal = VARIANT_FALSE;
+ if (m_ID3Tag->HasTagType(ID3TT_ID3V1))
+ {
+ *pVal = VARIANT_TRUE;
+ }
+ else
+ {
+ *pVal = VARIANT_FALSE;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_HasV2Tag(VARIANT_BOOL *pVal)
+{
+ try
+ {
+ *pVal = VARIANT_FALSE;
+ if (m_ID3Tag->HasTagType(ID3TT_ID3V2))
+ {
+ *pVal = VARIANT_TRUE;
+ }
+ else
+ {
+ *pVal = VARIANT_FALSE;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_HasLyrics(VARIANT_BOOL *pVal)
+{
+ try
+ {
+ if (m_ID3Tag->HasTagType(ID3TT_LYRICS))
+ {
+ *pVal = VARIANT_TRUE;
+ }
+ else
+ {
+ *pVal = VARIANT_FALSE;
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::FindFrameString(eID3FrameTypes FrameID, eID3FieldTypes FieldType, BSTR FindString, VARIANT_BOOL CreateNewIfNotFound, IID3ComFrame** pVal)
+{
+ try
+ {
+ *pVal = NULL;
+ ID3_Frame* pFrame = m_ID3Tag->Find((enum ID3_FrameID)FrameID, (enum ID3_FieldID)FieldType, FindString);
+ if(CreateNewIfNotFound == VARIANT_TRUE && pFrame == NULL)
+ {
+ pFrame = new ID3_Frame((enum ID3_FrameID)FrameID);
+ pFrame->Field((enum ID3_FieldID)FieldType) = FindString;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ if(pFrame != NULL)
+ {
+ *pVal = CID3Frame::CreateObject(this, pFrame);
+ (*pVal)->AddRef();
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+
+STDMETHODIMP CID3Tag::get_PlayCount(BSTR EMailAddress, long *pVal)
+{
+ try
+ {
+ *pVal = 0;
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_POPULARIMETER, ID3FN_EMAIL, EMailAddress);
+ if (pFrame != NULL)
+ {
+ *pVal = pFrame->Field(ID3FN_COUNTER).Get();
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_PlayCount(BSTR EMailAddress, long newVal)
+{
+ try
+ {
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_POPULARIMETER, ID3FN_EMAIL, EMailAddress);
+ if(pFrame == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_POPULARIMETER);
+ pFrame->Field(ID3FN_EMAIL) = EMailAddress;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ pFrame->Field(ID3FN_COUNTER) = newVal;
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_Popularity(BSTR EMailAddress, short *pVal)
+{
+ try
+ {
+ *pVal = 0;
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_POPULARIMETER, ID3FN_EMAIL, EMailAddress);
+ if (pFrame != NULL)
+ {
+ *pVal = (short)pFrame->Field(ID3FN_RATING).Get();
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Popularity(BSTR EMailAddress, short newVal)
+{
+ try
+ {
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_POPULARIMETER, ID3FN_EMAIL, EMailAddress);
+ if(pFrame == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_POPULARIMETER);
+ pFrame->Field(ID3FN_EMAIL) = EMailAddress;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ pFrame->Field(ID3FN_RATING) = newVal;
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_TagCreated(DATE *pVal)
+{
+ try
+ {
+ *pVal = 0;
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "TagCreated");
+ if (pFrame != NULL)
+ {
+ char* szTagCreated = ID3_GetString(pFrame, ID3FN_TEXT);
+ if(szTagCreated != NULL)
+ {
+ *pVal = atof(szTagCreated);
+ delete [] szTagCreated;
+ }
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_TagCreated(DATE newVal)
+{
+ try
+ {
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "TagCreated");
+ if(pFrame == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_USERTEXT);
+ pFrame->Field(ID3FN_DESCRIPTION) = "TagCreated";
+ pFrame->Field(ID3FN_TEXTENC) = ID3TE_ASCII;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ char Buffer[40];
+ sprintf(Buffer, "%6.7f", newVal);
+ pFrame->Field(ID3FN_TEXT) = Buffer;
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_PercentVolumeAdjust(double *pVal)
+{
+ try
+ {
+ *pVal = 100;
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "PercentVolAdj");
+ if (pFrame != NULL)
+ {
+ char* szVolAdjust = ID3_GetString(pFrame, ID3FN_TEXT);
+ if(szVolAdjust != NULL)
+ {
+ *pVal = atof(szVolAdjust);
+ delete [] szVolAdjust;
+ }
+ }
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_PercentVolumeAdjust(double newVal)
+{
+ try
+ {
+ ID3_Frame *pFrame = m_ID3Tag->Find(ID3FID_USERTEXT, ID3FN_DESCRIPTION, "PercentVolAdj");
+ if(pFrame == NULL)
+ {
+ pFrame = new ID3_Frame(ID3FID_USERTEXT);
+ pFrame->Field(ID3FN_DESCRIPTION) = "PercentVolAdj";
+ pFrame->Field(ID3FN_TEXTENC) = ID3TE_ASCII;
+ m_ID3Tag->AttachFrame(pFrame);
+ }
+ char Buffer[40];
+ sprintf(Buffer, "%6.7f", newVal);
+ pFrame->Field(ID3FN_TEXT) = Buffer;
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_Padding(VARIANT_BOOL newVal)
+{
+ try
+ {
+ m_ID3Tag->SetPadding(newVal == VARIANT_TRUE);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::put_UnSync(VARIANT_BOOL newVal)
+{
+ try
+ {
+ m_ID3Tag->SetUnsync(newVal == VARIANT_TRUE);
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::get_VersionString(BSTR *pVal)
+{
+ USES_CONVERSION;
+ try
+ {
+ // this buffer needs to be overly large
+ // for some unexplained reason
+ // if the size is small you get what?
+ char Buffer[1024];
+ sprintf(Buffer, "id3com %d.%d.%d Compiled %s %s", _ID3LIB_MAJOR_VERSION,
+ _ID3LIB_MINOR_VERSION,
+ _ID3LIB_PATCH_VERSION,
+ __DATE__,
+ __TIME__);
+ *pVal = SysAllocString(A2W(Buffer));
+ return S_OK;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+}
+
+STDMETHODIMP CID3Tag::RemoveFrame(eID3FrameTypes FrameID)
+{
+ // TODO: Add your implementation code here
+ HRESULT hr=S_OK;
+ try
+ {
+ ID3_Frame* pFrame = m_ID3Tag->Find((enum ID3_FrameID)FrameID);
+ if (pFrame)
+ {
+ /* pTag is an ID3_Tag */
+ delete m_ID3Tag->RemoveFrame(pFrame);
+ }
+ else
+ hr = E_POINTER;
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+ return hr;
+}
+
+STDMETHODIMP CID3Tag::RemoveFrameByNum(long FrameNum)
+{
+ HRESULT hr=S_OK;
+ try
+ {
+ ID3_Frame* pFrame = NULL;
+ ID3_Tag::Iterator* it = m_ID3Tag->CreateIterator();
+ pFrame = it->GetNext();
+ while(FrameNum)
+ {
+ pFrame = it->GetNext();
+ --FrameNum;
+ }
+ delete it;
+
+ if(pFrame)
+ {
+ /* pTag is an ID3_Tag */
+ delete m_ID3Tag->RemoveFrame(pFrame);
+ }
+ else
+ {
+ hr = E_POINTER;
+ }
+ }
+ catch (...)
+ {
+ return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
+ }
+
+ return hr;
+}
+///////////////////////////////////////////////////////
+// End Added Philip Oldaker 12-Aug 2000
+///////////////////////////////////////////////////////
+
diff --git a/id3com/ID3Tag.h b/id3com/ID3Tag.h
new file mode 100644
index 0000000..b9a954e
--- /dev/null
+++ b/id3com/ID3Tag.h
@@ -0,0 +1,121 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3Tag.h : Declaration of the CID3Tag
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __ID3TAG_H_
+#define __ID3TAG_H_
+
+#include "resource.h" // main symbols
+#include <id3/tag.h>
+#include "ID3COM.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// CID3Tag
+class ATL_NO_VTABLE CID3Tag :
+ public CComObjectRootEx<CComSingleThreadModel>,
+ public CComCoClass<CID3Tag, &CLSID_ID3ComTag>,
+ public ISupportErrorInfo,
+ public IDispatchImpl<IID3ComTag, &IID_IID3ComTag, &LIBID_ID3COM>
+{
+public:
+ CID3Tag();
+ ~CID3Tag();
+
+DECLARE_REGISTRY_RESOURCEID(IDR_ID3TAG)
+
+DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+BEGIN_COM_MAP(CID3Tag)
+ COM_INTERFACE_ENTRY(IID3ComTag)
+ COM_INTERFACE_ENTRY(IDispatch)
+ COM_INTERFACE_ENTRY(ISupportErrorInfo)
+END_COM_MAP()
+
+// ISupportsErrorInfo
+ STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
+
+// IID3ComTag
+public:
+ STDMETHOD(RemoveFrameByNum)(/*[in]*/ long FrameNum);
+ STDMETHOD(RemoveFrame)(/*[in]*/ eID3FrameTypes FrameID);
+ STDMETHOD(get_VersionString)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_UnSync)(/*[in]*/ VARIANT_BOOL newVal);
+ STDMETHOD(put_Padding)(/*[in]*/ VARIANT_BOOL newVal);
+ STDMETHOD(get_PercentVolumeAdjust)(/*[out, retval]*/ double *pVal);
+ STDMETHOD(put_PercentVolumeAdjust)(/*[in]*/ double newVal);
+ STDMETHOD(get_TagCreated)(/*[out, retval]*/ DATE *pVal);
+ STDMETHOD(put_TagCreated)(/*[in]*/ DATE newVal);
+ STDMETHOD(get_Popularity)(/*[in]*/ BSTR EMailAddress, /*[out, retval]*/ short *pVal);
+ STDMETHOD(put_Popularity)(/*[in]*/ BSTR EMailAddress, /*[in]*/ short newVal);
+ STDMETHOD(get_PlayCount)(/*[in]*/ BSTR EMailAddress, /*[out, retval]*/ long *pVal);
+ STDMETHOD(put_PlayCount)(/*[in]*/ BSTR EMailAddress, /*[in]*/ long newVal);
+ STDMETHOD(FindFrameString)(/*[in]*/ eID3FrameTypes FrameID, /*[in]*/ eID3FieldTypes FieldType, /*[in]*/ BSTR FindString, /*[in]*/ VARIANT_BOOL CreateNewIfNotFound, /*[out, retval]*/ IID3ComFrame** pVal);
+ STDMETHOD(get_HasLyrics)(/*[out, retval]*/ VARIANT_BOOL *pVal);
+ STDMETHOD(get_HasV2Tag)(/*[out, retval]*/ VARIANT_BOOL *pVal);
+ STDMETHOD(get_HasV1Tag)(/*[out, retval]*/ VARIANT_BOOL *pVal);
+ STDMETHOD(get_LastPlayed)(/*[out, retval]*/ DATE *pVal);
+ STDMETHOD(put_LastPlayed)(/*[in]*/ DATE newVal);
+ STDMETHOD(get_Track)(/*[out, retval]*/ long *pVal);
+ STDMETHOD(put_Track)(/*[in]*/ long newVal);
+ STDMETHOD(get_Year)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Year)(/*[in]*/ BSTR newVal);
+ STDMETHOD(get_Genre)(/*[out, retval]*/ long *pVal);
+ STDMETHOD(put_Genre)(/*[in]*/ long newVal);
+ STDMETHOD(get_Comment)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Comment)(/*[in]*/ BSTR newVal);
+ STDMETHOD(get_Title)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Title)(/*[in]*/ BSTR newVal);
+ STDMETHOD(get_Album)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Album)(/*[in]*/ BSTR newVal);
+ STDMETHOD(get_Artist)(/*[out, retval]*/ BSTR *pVal);
+ STDMETHOD(put_Artist)(/*[in]*/ BSTR newVal);
+ STDMETHOD(StripV2Tag)();
+ STDMETHOD(SaveV2Tag)();
+ STDMETHOD(StripV1Tag)();
+ STDMETHOD(SaveV1Tag)();
+ STDMETHOD(get_Item)(/*[in]*/ long FrameNum, /*[out, retval]*/ IID3ComFrame** pVal);
+ STDMETHOD(get_Count)(/*[out, retval]*/ long *pVal);
+ STDMETHOD(FindFrame)(/*[in]*/ eID3FrameTypes FrameID, /*[in]*/ VARIANT_BOOL CreateNewIfNotFound, /*[out, retval]*/ IID3ComFrame** pVal);
+ STDMETHOD(get_HasChanged)(/*[out, retval]*/ VARIANT_BOOL *pVal);
+ STDMETHOD(Clear)();
+ STDMETHOD(Link)(BSTR* FileName);
+ STDMETHOD(get__NewEnum)(/*[out, retval]*/ IUnknown** pRetVal);
+protected:
+ ID3_Tag* m_ID3Tag;
+};
+
+#endif //__ID3TAG_H_
diff --git a/id3com/ID3Tag.rgs b/id3com/ID3Tag.rgs
new file mode 100644
index 0000000..6b23610
--- /dev/null
+++ b/id3com/ID3Tag.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+ ID3COM.ID3ComTag.1 = s 'ID3ComTag Class'
+ {
+ CLSID = s '{AEBA98BD-C36C-11D3-841B-0008C782A257}'
+ }
+ ID3COM.ID3ComTag = s 'ID3ComTag Class'
+ {
+ CLSID = s '{AEBA98BD-C36C-11D3-841B-0008C782A257}'
+ CurVer = s 'ID3libCOM.ID3ComTag.1'
+ }
+ NoRemove CLSID
+ {
+ ForceRemove {AEBA98BD-C36C-11D3-841B-0008C782A257} = s 'ID3ComTag Class'
+ {
+ ProgID = s 'ID3COM.ID3ComTag.1'
+ VersionIndependentProgID = s 'ID3COM.ID3ComTag'
+ ForceRemove 'Programmable'
+ InprocServer32 = s '%MODULE%'
+ {
+ val ThreadingModel = s 'Apartment'
+ }
+ 'TypeLib' = s '{AEBA98B0-C36C-11D3-841B-0008C782A257}'
+ }
+ }
+}
diff --git a/id3com/Makefile.am b/id3com/Makefile.am
new file mode 100644
index 0000000..6fef3aa
--- /dev/null
+++ b/id3com/Makefile.am
@@ -0,0 +1,37 @@
+# Copyright 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SUBDIRS = Sample
+
+EXTRA_DIST = EnumFields.cpp \
+EnumFields.h \
+ID3COM.def \
+ID3COM.rc \
+ID3COMps.def \
+ID3COMps.mk \
+ID3Field.cpp \
+ID3Field.h \
+ID3Field.rgs \
+ID3Frame.cpp \
+ID3Frame.h \
+ID3Frame.rgs \
+ID3Tag.cpp \
+ID3Tag.h \
+ID3Tag.rgs \
+StdAfx.cpp \
+StdAfx.h \
+dlldata.c \
+id3com.cpp \
+id3com.dsp \
+id3com.dsw \
+id3com.idl \
+resource.h \
+win32.readme.first.txt
+
diff --git a/id3com/Makefile.in b/id3com/Makefile.in
new file mode 100644
index 0000000..45bc8d7
--- /dev/null
+++ b/id3com/Makefile.in
@@ -0,0 +1,396 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+SUBDIRS = Sample
+
+EXTRA_DIST = EnumFields.cpp \
+EnumFields.h \
+ID3COM.def \
+ID3COM.rc \
+ID3COMps.def \
+ID3COMps.mk \
+ID3Field.cpp \
+ID3Field.h \
+ID3Field.rgs \
+ID3Frame.cpp \
+ID3Frame.h \
+ID3Frame.rgs \
+ID3Tag.cpp \
+ID3Tag.h \
+ID3Tag.rgs \
+StdAfx.cpp \
+StdAfx.h \
+dlldata.c \
+id3com.cpp \
+id3com.dsp \
+id3com.dsw \
+id3com.idl \
+resource.h \
+win32.readme.first.txt
+
+subdir = id3com
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
+ uninstall-info-recursive all-recursive install-data-recursive \
+ install-exec-recursive installdirs-recursive install-recursive \
+ uninstall-recursive check-recursive installcheck-recursive
+DIST_COMMON = Makefile.am Makefile.in
+DIST_SUBDIRS = $(SUBDIRS)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu id3com/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+
+distclean-am: clean-am distclean-generic distclean-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
+ clean-generic clean-libtool clean-recursive distclean \
+ distclean-generic distclean-libtool distclean-recursive \
+ distclean-tags distdir dvi dvi-am dvi-recursive info info-am \
+ info-recursive install install-am install-data install-data-am \
+ install-data-recursive install-exec install-exec-am \
+ install-exec-recursive install-info install-info-am \
+ install-info-recursive install-man install-recursive \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am installdirs-recursive maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive mostlyclean \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+ tags tags-recursive uninstall uninstall-am uninstall-info-am \
+ uninstall-info-recursive uninstall-recursive
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/id3com/Sample/ID3Test.vbp b/id3com/Sample/ID3Test.vbp
new file mode 100644
index 0000000..4e187e4
--- /dev/null
+++ b/id3com/Sample/ID3Test.vbp
@@ -0,0 +1,32 @@
+Type=Exe
+Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\stdole2.tlb#OLE Automation
+Reference=*\G{AEBA98B0-C36C-11D3-841B-0008C782A257}#1.0#0#..\Debug\id3com.dll#ID3COM 1.0 Type Library
+Form=FRMID3~1.FRM
+IconForm="frmID3Test"
+Startup="frmID3Test"
+ExeName32="ID3Test.exe"
+Command32=""
+Name="ID3Test"
+HelpContextID="0"
+CompatibleMode="0"
+MajorVer=1
+MinorVer=0
+RevisionVer=0
+AutoIncrementVer=0
+ServerSupportFiles=0
+VersionCompanyName="Prebon Marshall Yemane"
+CompilationType=0
+OptimizationType=0
+FavorPentiumPro(tm)=0
+CodeViewDebugInfo=0
+NoAliasing=0
+BoundsCheck=0
+OverflowCheck=0
+FlPointCheck=0
+FDIVCheck=0
+UnroundedFP=0
+StartMode=0
+Unattended=0
+Retained=0
+ThreadPerObject=0
+MaxNumberOfThreads=1
diff --git a/id3com/Sample/ID3Test.vbw b/id3com/Sample/ID3Test.vbw
new file mode 100644
index 0000000..9c2e32e
--- /dev/null
+++ b/id3com/Sample/ID3Test.vbw
@@ -0,0 +1 @@
+frmID3Test = 114, -10, 648, 430, C, 22, 22, 566, 467, C
diff --git a/id3com/Sample/Makefile.am b/id3com/Sample/Makefile.am
new file mode 100644
index 0000000..acc7376
--- /dev/null
+++ b/id3com/Sample/Makefile.am
@@ -0,0 +1,15 @@
+# Copyright 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+EXTRA_DIST = ID3Test.vbp \
+ID3Test.vbw \
+frmID3Test.frm
+
diff --git a/id3com/Sample/Makefile.in b/id3com/Sample/Makefile.in
new file mode 100644
index 0000000..4becd8c
--- /dev/null
+++ b/id3com/Sample/Makefile.in
@@ -0,0 +1,252 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+EXTRA_DIST = ID3Test.vbp \
+ID3Test.vbw \
+frmID3Test.frm
+
+subdir = id3com/Sample
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu id3com/Sample/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/id3com/Sample/frmID3Test.frm b/id3com/Sample/frmID3Test.frm
new file mode 100644
index 0000000..71d0a68
--- /dev/null
+++ b/id3com/Sample/frmID3Test.frm
@@ -0,0 +1,179 @@
+VERSION 5.00
+Begin VB.Form frmID3Test
+ Caption = "ID3 Test"
+ ClientHeight = 5595
+ ClientLeft = 60
+ ClientTop = 345
+ ClientWidth = 7845
+ LinkTopic = "Form1"
+ ScaleHeight = 5595
+ ScaleWidth = 7845
+ StartUpPosition = 3 'Windows Default
+ Begin VB.CommandButton cmdVersion
+ Caption = "Show ID3COM Version"
+ Height = 375
+ Left = 5640
+ TabIndex = 8
+ Top = 2160
+ Width = 2175
+ End
+ Begin VB.CommandButton cmdRemoveV2
+ Caption = "Remove ID3v2"
+ Height = 375
+ Left = 5640
+ TabIndex = 7
+ Top = 1200
+ Width = 2175
+ End
+ Begin VB.CommandButton cmdAddTestTag
+ Caption = "Add Test Tag"
+ Height = 375
+ Left = 5640
+ TabIndex = 6
+ Top = 1680
+ Width = 2175
+ End
+ Begin VB.CommandButton cmdCopyV1toV2
+ Caption = "Copy ID3 v1 to v2"
+ Enabled = 0 'False
+ Height = 375
+ Left = 5640
+ TabIndex = 5
+ Top = 240
+ Width = 2175
+ End
+ Begin VB.CommandButton cmdRemoveV1
+ Caption = "Remove ID3v1"
+ Enabled = 0 'False
+ Height = 375
+ Left = 5640
+ TabIndex = 4
+ Top = 720
+ Width = 2175
+ End
+ Begin VB.ListBox List1
+ Height = 2595
+ Left = 120
+ TabIndex = 3
+ Top = 2880
+ Width = 5415
+ End
+ Begin VB.FileListBox File1
+ Height = 2625
+ Left = 2400
+ Pattern = "*.mp3;*.tag"
+ TabIndex = 2
+ Top = 120
+ Width = 3135
+ End
+ Begin VB.DirListBox Dir1
+ Height = 2115
+ Left = 120
+ TabIndex = 1
+ Top = 600
+ Width = 2055
+ End
+ Begin VB.DriveListBox Drive1
+ Height = 315
+ Left = 120
+ TabIndex = 0
+ Top = 120
+ Width = 2055
+ End
+End
+Attribute VB_Name = "frmID3Test"
+Attribute VB_GlobalNameSpace = False
+Attribute VB_Creatable = False
+Attribute VB_PredeclaredId = True
+Attribute VB_Exposed = False
+Option Explicit
+Private oTag As ID3ComTag
+
+Private Sub cmdAddTestTag_Click()
+ Dim oFrame As ID3ComFrame
+ If Not oTag Is Nothing Then
+ Set oFrame = oTag.FindFrameString(ID3_USERTEXT, ID3_FIELD_DESCRIPTION, "ID3ComTest")
+ oFrame.Field(ID3_FIELD_TEXT).Text(1) = "This is a test done at " & Time
+ oTag.SaveV2Tag
+ File1_Click
+ End If
+End Sub
+
+Private Sub cmdCopyV1toV2_Click()
+ If Not oTag Is Nothing Then
+ If Not oTag.HasV2Tag Then
+ oTag.SaveV2Tag
+ File1_Click
+ Else
+ MsgBox "File already Has V2 Tag"
+ End If
+ End If
+End Sub
+
+Private Sub cmdRemoveV1_Click()
+ If Not oTag Is Nothing Then
+ oTag.StripV1Tag
+ File1_Click
+ End If
+End Sub
+
+Private Sub cmdRemoveV2_Click()
+ If Not oTag Is Nothing Then
+ oTag.StripV2Tag
+ File1_Click
+ End If
+End Sub
+
+Private Sub cmdVersion_Click()
+ If Not oTag Is Nothing Then
+ MsgBox oTag.VersionString
+ End If
+End Sub
+
+Private Sub Dir1_Change()
+ On Error Resume Next
+ File1.Path = Dir1.Path
+End Sub
+
+Private Sub Drive1_Change()
+ On Error Resume Next
+ Dir1.Path = Drive1.Drive
+End Sub
+
+Private Sub File1_Click()
+ Dim oFrame As ID3ComFrame
+ Dim oField As ID3ComField
+ Dim FrameLine As String
+ Dim n As Long
+
+ List1.Clear
+
+ Set oTag = New ID3ComTag
+
+ oTag.Link File1.Path & "\" & File1.FileName
+
+ cmdCopyV1toV2.Enabled = oTag.HasV1Tag And Not oTag.HasV2Tag
+ cmdRemoveV1.Enabled = oTag.HasV1Tag
+ cmdRemoveV2.Enabled = oTag.HasV2Tag
+
+ For Each oFrame In oTag
+ FrameLine = oFrame.FrameName
+ Set oField = oFrame.Field(ID3_FIELD_DESCRIPTION)
+ If Not oField Is Nothing Then
+ FrameLine = FrameLine & " - " & oField.Text(1)
+ End If
+ Set oField = oFrame.Field(ID3_FIELD_EMAIL)
+ If Not oField Is Nothing Then
+ FrameLine = FrameLine & " - " & oField.Text(1)
+ End If
+ Set oField = oFrame.Field(ID3_FIELD_TEXT)
+ If Not oField Is Nothing Then
+ For n = 1 To oField.NumTextItems
+ FrameLine = FrameLine & " - " & oField.Text(n)
+ Next n
+ End If
+ ' could go on
+ List1.AddItem FrameLine
+ Next
+End Sub
+
diff --git a/id3com/StdAfx.cpp b/id3com/StdAfx.cpp
new file mode 100644
index 0000000..964f3cd
--- /dev/null
+++ b/id3com/StdAfx.cpp
@@ -0,0 +1,48 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// stdafx.cpp : source file that includes just the standard includes
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+// stdafx.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+#ifdef _ATL_STATIC_REGISTRY
+#include <statreg.h>
+#include <statreg.cpp>
+#endif
+
+#include <atlimpl.cpp>
diff --git a/id3com/StdAfx.h b/id3com/StdAfx.h
new file mode 100644
index 0000000..a707ba2
--- /dev/null
+++ b/id3com/StdAfx.h
@@ -0,0 +1,70 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This file is subject to the terms of the GNU General Public License as
+// published by the Free Software Foundation. A copy of this license is
+// included with this software distribution in the file COPYING. If you
+// do not have a copy, you may obtain a copy by writing to the Free
+// Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// This software is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details
+//
+/////////////////////////////////////////////////////////////////////////////
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently,
+// but are changed infrequently
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#if !defined(AFX_STDAFX_H__AEBA98B3_C36C_11D3_841B_0008C782A257__INCLUDED_)
+#define AFX_STDAFX_H__AEBA98B3_C36C_11D3_841B_0008C782A257__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define STRICT
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0400
+#endif
+
+#define _ATL_APARTMENT_THREADED
+
+#ifndef _ATL_STATIC_REGISTRY
+#define _ATL_STATIC_REGISTRY
+#endif
+
+#include <atlbase.h>
+//You may derive a class from CComModule and use it if you want to override
+//something, but do not change the name of _Module
+extern CComModule _Module;
+#include <atlcom.h>
+#include <atlctl.h>
+#include <comdef.h>
+
+#include <string>
+#include <vector>
+#include <list>
+#include <map>
+
+#ifdef UNICODE
+#define tstring std::wstring
+#else
+#define tstring std::string
+#endif
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__AEBA98B3_C36C_11D3_841B_0008C782A257__INCLUDED)
diff --git a/id3com/dlldata.c b/id3com/dlldata.c
new file mode 100644
index 0000000..1f6e65b
--- /dev/null
+++ b/id3com/dlldata.c
@@ -0,0 +1,42 @@
+/*********************************************************
+ DllData file -- generated by MIDL compiler
+
+ DO NOT ALTER THIS FILE
+
+ This file is regenerated by MIDL on every IDL file compile.
+
+ To completely reconstruct this file, delete it and rerun MIDL
+ on all the IDL files in this DLL, specifying this file for the
+ /dlldata command line option
+
+*********************************************************/
+
+#define PROXY_DELEGATION
+
+#include <rpcproxy.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXTERN_PROXY_FILE( ID3Com )
+EXTERN_PROXY_FILE( ID3libCOM )
+EXTERN_PROXY_FILE( id3com )
+
+
+PROXYFILE_LIST_START
+/* Start of list */
+ REFERENCE_PROXY_FILE( ID3Com ),
+ REFERENCE_PROXY_FILE( ID3libCOM ),
+ REFERENCE_PROXY_FILE( id3com ),
+/* End of list */
+PROXYFILE_LIST_END
+
+
+DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
+
+#ifdef __cplusplus
+} /*extern "C" */
+#endif
+
+/* end of generated dlldata file */
diff --git a/id3com/id3com.cpp b/id3com/id3com.cpp
new file mode 100644
index 0000000..068c450
--- /dev/null
+++ b/id3com/id3com.cpp
@@ -0,0 +1,109 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3COM.cpp : Implementation of DLL Exports.
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+//
+/////////////////////////////////////////////////////////////////////////////
+
+// Note: Proxy/Stub Information
+// To build a separate proxy/stub DLL,
+// run nmake -f ID3libCOMps.mk in the project directory.
+
+#include "stdafx.h"
+#include "resource.h"
+#include <initguid.h>
+#include "ID3COM.h"
+
+#include "ID3COM_i.c"
+#include "ID3Tag.h"
+#include "ID3Frame.h"
+#include "ID3Field.h"
+
+
+CComModule _Module;
+
+BEGIN_OBJECT_MAP(ObjectMap)
+OBJECT_ENTRY(CLSID_ID3ComTag, CID3Tag)
+END_OBJECT_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// DLL Entry Point
+
+extern "C"
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
+{
+ if (dwReason == DLL_PROCESS_ATTACH)
+ {
+ _Module.Init(ObjectMap, hInstance, &LIBID_ID3COM);
+ DisableThreadLibraryCalls(hInstance);
+ }
+ else if (dwReason == DLL_PROCESS_DETACH)
+ _Module.Term();
+ return TRUE; // ok
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Used to determine whether the DLL can be unloaded by OLE
+
+STDAPI DllCanUnloadNow(void)
+{
+ return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Returns a class factory to create an object of the requested type
+
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
+{
+ return _Module.GetClassObject(rclsid, riid, ppv);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// DllRegisterServer - Adds entries to the system registry
+
+STDAPI DllRegisterServer(void)
+{
+ // registers object, typelib and all interfaces in typelib
+ return _Module.RegisterServer(TRUE);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// DllUnregisterServer - Removes entries from the system registry
+
+STDAPI DllUnregisterServer(void)
+{
+ return _Module.UnregisterServer(TRUE);
+}
+
+
diff --git a/id3com/id3com.dsp b/id3com/id3com.dsp
new file mode 100644
index 0000000..0388922
--- /dev/null
+++ b/id3com/id3com.dsp
@@ -0,0 +1,226 @@
+# Microsoft Developer Studio Project File - Name="id3com" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=id3com - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "id3com.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "id3com.mak" CFG="id3com - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "id3com - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "id3com - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath "Desktop"
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "id3com - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D ID3LIB_LINKOPTION=1 /Yu"stdafx.h" /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\\" /I "..\include" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "HAVE_CONFIG_H" /D ID3LIB_LINKOPTION=1 /Yu"stdafx.h" /FD /GZ /c
+# SUBTRACT CPP /Fr
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ../libprj/id3libd.lib ../zlib/zlibd.lib /nologo /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libcmtd" /pdbtype:sept
+# ADD LINK32 ../libprj/id3libd.lib ../zlib/zlibd.lib /nologo /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libcmtd" /pdbtype:sept
+# Begin Custom Build - Performing registration
+OutDir=.\Debug
+TargetPath=.\Debug\id3com.dll
+InputPath=.\Debug\id3com.dll
+SOURCE="$(InputPath)"
+
+"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ regsvr32 /s /c "$(TargetPath)"
+ echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "id3com - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "id3com___Win32_Release"
+# PROP BASE Intermediate_Dir "id3com___Win32_Release"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O1 /I ".\\" /I "..\\" /I "..\include" /I "..\include\id3" /I "..\zlib\include" /D "NDEBUG" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "WIN32" /D "_WINDOWS" /D "HAVE_CONFIG_H" /D ID3LIB_LINKOPTION=1 /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /W3 /GX /O1 /I "..\\" /I "..\include" /D "NDEBUG" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "WIN32" /D "_WINDOWS" /D "HAVE_CONFIG_H" /D ID3LIB_LINKOPTION=1 /Yu"stdafx.h" /FD /c
+# SUBTRACT CPP /Fr
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ../libprj/id3lib.lib ../zlib/zlib.lib /nologo /subsystem:windows /dll /machine:I386 /nodefaultlib:"libcmt"
+# ADD LINK32 ../libprj/id3lib.lib ../zlib/zlib.lib /nologo /subsystem:windows /dll /machine:I386 /nodefaultlib:"libcmt"
+# Begin Custom Build - Performing registration
+OutDir=.\Release
+TargetPath=.\Release\id3com.dll
+InputPath=.\Release\id3com.dll
+SOURCE="$(InputPath)"
+
+"$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ regsvr32 /s /c "$(TargetPath)"
+ echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
+
+# End Custom Build
+
+!ENDIF
+
+# Begin Target
+
+# Name "id3com - Win32 Debug"
+# Name "id3com - Win32 Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\EnumFields.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\id3com.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\id3com.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\id3com.idl
+# ADD MTL /tlb ".\id3com.tlb" /h "id3com.h" /iid "id3com_i.c" /Oicf
+# End Source File
+# Begin Source File
+
+SOURCE=.\id3com.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Field.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Frame.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Tag.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+# ADD CPP /Yc"stdafx.h"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\EnumFields.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Field.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Frame.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Tag.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\ID3ComFieldLong.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3ComFieldPicture.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3ComFieldText.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Field.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Frame.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\ID3Tag.rgs
+# End Source File
+# Begin Source File
+
+SOURCE=.\TextCollection.rgs
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\ChangeLog
+# End Source File
+# Begin Source File
+
+SOURCE=..\News
+# End Source File
+# Begin Source File
+
+SOURCE=..\Todo
+# End Source File
+# End Target
+# End Project
diff --git a/id3com/id3com.dsw b/id3com/id3com.dsw
new file mode 100644
index 0000000..7c54de4
--- /dev/null
+++ b/id3com/id3com.dsw
@@ -0,0 +1,59 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "id3com"=.\id3com.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name id3lib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "id3lib"=..\libprj\id3lib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name zlib
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "zlib"=..\zlib\prj\zlib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/id3com/id3com.idl b/id3com/id3com.idl
new file mode 100644
index 0000000..52cbfac
--- /dev/null
+++ b/id3com/id3com.idl
@@ -0,0 +1,323 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2000 John Adcock. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+//
+// This file is subject to the terms of the GNU General Public License as
+// published by the Free Software Foundation. A copy of this license is
+// included with this software distribution in the file COPYING. If you
+// do not have a copy, you may obtain a copy by writing to the Free
+// Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// This software is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details
+//
+/////////////////////////////////////////////////////////////////////////////
+// ID3COM.idl : IDL source for ID3COM.dll
+/////////////////////////////////////////////////////////////////////////////
+// Change Log
+//
+// Date Developer Changes
+//
+// 05 Jan 2000 John Adcock Original Release
+// 18 Aug 2000 Philip Oldaker Added Picture Functionality
+// 01 Nov 2002 John Adcock Changed fields to reflect changes to id3lib
+//
+/////////////////////////////////////////////////////////////////////////////
+
+// This file will be processed by the MIDL tool to
+// produce the type library (ID3COM.tlb) and marshalling code.
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+ typedef
+ [
+ uuid(181CFC77-C770-11d3-841C-0008C782A257),
+ helpstring("ID3 Field Types")
+ ]
+ enum
+ {
+ ID3_FIELD_NOFIELD = 0, /**< No field */
+ ID3_FIELD_TEXTENC, /**< Text encoding (unicode or ASCII) */
+ ID3_FIELD_TEXT, /**< Text field */
+ ID3_FIELD_URL, /**< A URL */
+ ID3_FIELD_DATA, /**< Data field */
+ ID3_FIELD_DESCRIPTION, /**< Description field */
+ ID3_FIELD_OWNER, /**< Owner field */
+ ID3_FIELD_EMAIL, /**< Email field */
+ ID3_FIELD_RATING, /**< Rating field */
+ ID3_FIELD_FILENAME, /**< Filename field */
+ ID3_FIELD_LANGUAGE, /**< Language field */
+ ID3_FIELD_PICTURETYPE, /**< Picture type field */
+ ID3_FIELD_IMAGEFORMAT, /**< Image format field */
+ ID3_FIELD_MIMETYPE, /**< Mimetype field */
+ ID3_FIELD_COUNTER, /**< Counter field */
+ ID3_FIELD_ID, /**< Identifier/Symbol field */
+ ID3_FIELD_VOLUMEADJ, /**< Volume adjustment field */
+ ID3_FIELD_NUMBITS, /**< Number of bits field */
+ ID3_FIELD_NUMBER, /**< General Number, can be anything, as long it's an integer <= 32 bits */
+ ID3_FIELD_VOLCHGRIGHT, /**< Volume chage on the right channel */
+ ID3_FIELD_VOLCHGLEFT, /**< Volume chage on the left channel */
+ ID3_FIELD_PEAKVOLRIGHT, /**< Peak volume on the right channel */
+ ID3_FIELD_PEAKVOLLEFT, /**< Peak volume on the left channel */
+ ID3_FIELD_TIMESTAMPFORMAT, /**< SYLT Timestamp Format */
+ ID3_FIELD_CONTENTTYPE, /**< SYLT content type */
+ ID3_FIELD_REVERBL, /**< Reverb Left */
+ ID3_FIELD_REVERBR, /**< Reverb Right */
+ ID3_FIELD_REVERBBOUNCESL, /**< Reverb Bounces Left */
+ ID3_FIELD_REVERBBOUNCESR, /**< Reverb Bounces Right */
+ ID3_FIELD_REVERBFEEDBACKL2L, /**< Reverb Feedback Left to Left */
+ ID3_FIELD_REVERBFEEDBACKL2R, /**< Reverb Feedback Left to Right */
+ ID3_FIELD_REVERBFEEDBACKR2R, /**< Reverb Feedback Right to Right */
+ ID3_FIELD_REVERBFEEDBACKR2L, /**< Reverb Feedback Right to Left */
+ ID3_FIELD_PREMIXL2R, /**< Premix Left to Right */
+ ID3_FIELD_PREMIXR2L, /**< Premix Right to Left */
+ ID3_FIELD_LENGTH, /**< Size field, can be bits, bytes, time etc */
+ ID3_FIELD_FLAGS, /**< Flags field */
+ ID3_FIELD_OFFSET, /**< Offset, can be bits, bytes, time etc */
+ ID3_FIELD_PRICE, /**< Price Field, containing currency+amount */
+ ID3_FIELD_8DATE, /**< Date Field, containing date as YYYYMMDD */
+ ID3_FIELD_SELLER, /**< Seller */
+ ID3_FIELD_DELIVERY, /**< Way of delivery field */
+ ID3_FIELD_BITSSIZE, /**< contains the number of bits for other fields' fixed size */
+ ID3_FIELD_BYTESSIZE, /**< contains the number of bytes for other fields' fixed size */
+ ID3_FIELD_LASTFIELDID /**< Last field placeholder */
+ } eID3FieldTypes;
+
+
+ typedef
+ [
+ uuid(385B5F8C-1F3C-11d3-83C6-0008C782A257),
+ helpstring("ID3 Frame Types")
+ ]
+ enum
+ {
+ /* ???? */ ID3_NOFRAME = 0, /**< No known frame */
+ /* AENC */ ID3_AUDIOCRYPTO, /**< Audio encryption */
+ /* APIC */ ID3_PICTURE, /**< Attached picture */
+ /* ASPI */ ID3_AUDIOSEEKPOINT, /**< Audio seek point index */
+ /* COMM */ ID3_COMMENT, /**< Comments */
+ /* COMR */ ID3_COMMERCIAL, /**< Commercial frame */
+ /* ENCR */ ID3_CRYPTOREG, /**< Encryption method registration */
+ /* EQU2 */ ID3_EQUALIZATION2, /**< Equalisation (2) */
+ /* EQUA */ ID3_EQUALIZATION, /**< Equalization */
+ /* ETCO */ ID3_EVENTTIMING, /**< Event timing codes */
+ /* GEOB */ ID3_GENERALOBJECT, /**< General encapsulated object */
+ /* GRID */ ID3_GROUPINGREG, /**< Group identification registration */
+ /* IPLS */ ID3_INVOLVEDPEOPLE, /**< Involved people list */
+ /* LINK */ ID3_LINKEDINFO, /**< Linked information */
+ /* MCDI */ ID3_CDID, /**< Music CD identifier */
+ /* MLLT */ ID3_MPEGLOOKUP, /**< MPEG location lookup table */
+ /* OWNE */ ID3_OWNERSHIP, /**< Ownership frame */
+ /* PRIV */ ID3_PRIVATE, /**< Private frame */
+ /* PCNT */ ID3_PLAYCOUNTER, /**< Play counter */
+ /* POPM */ ID3_POPULARIMETER, /**< Popularimeter */
+ /* POSS */ ID3_POSITIONSYNC, /**< Position synchronisation frame */
+ /* RBUF */ ID3_BUFFERSIZE, /**< Recommended buffer size */
+ /* RVA2 */ ID3_VOLUMEADJ2, /**< Relative volume adjustment (2) */
+ /* RVAD */ ID3_VOLUMEADJ, /**< Relative volume adjustment */
+ /* RVRB */ ID3_REVERB, /**< Reverb */
+ /* SEEK */ ID3_SEEKFRAME, /**< Seek frame */
+ /* SIGN */ ID3_SIGNATURE, /**< Signature frame */
+ /* SYLT */ ID3_SYNCEDLYRICS, /**< Synchronized lyric/text */
+ /* SYTC */ ID3_SYNCEDTEMPO, /**< Synchronized tempo codes */
+ /* TALB */ ID3_ALBUM, /**< Album/Movie/Show title */
+ /* TBPM */ ID3_BPM, /**< BPM (beats per minute) */
+ /* TCOM */ ID3_COMPOSER, /**< Composer */
+ /* TCON */ ID3_CONTENTTYPE, /**< Content type */
+ /* TCOP */ ID3_COPYRIGHT, /**< Copyright message */
+ /* TDAT */ ID3_DATE, /**< Date */
+ /* TDEN */ ID3_ENCODINGTIME, /**< Encoding time */
+ /* TDLY */ ID3_PLAYLISTDELAY, /**< Playlist delay */
+ /* TDOR */ ID3_ORIGRELEASETIME, /**< Original release time */
+ /* TDRC */ ID3_RECORDINGTIME, /**< Recording time */
+ /* TDRL */ ID3_RELEASETIME, /**< Release time */
+ /* TDTG */ ID3_TAGGINGTIME, /**< Tagging time */
+ /* TIPL */ ID3_INVOLVEDPEOPLE2, /**< Involved people list */
+ /* TENC */ ID3_ENCODEDBY, /**< Encoded by */
+ /* TEXT */ ID3_LYRICIST, /**< Lyricist/Text writer */
+ /* TFLT */ ID3_FILETYPE, /**< File type */
+ /* TIME */ ID3_TIME, /**< Time */
+ /* TIT1 */ ID3_CONTENTGROUP, /**< Content group description */
+ /* TIT2 */ ID3_TITLE, /**< Title/songname/content description */
+ /* TIT3 */ ID3_SUBTITLE, /**< Subtitle/Description refinement */
+ /* TKEY */ ID3_INITIALKEY, /**< Initial key */
+ /* TLAN */ ID3_LANGUAGE, /**< Language(s) */
+ /* TLEN */ ID3_SONGLEN, /**< Length */
+ /* TMCL */ ID3_MUSICIANCREDITLIST,/**< Musician credits list */
+ /* TMED */ ID3_MEDIATYPE, /**< Media type */
+ /* TMOO */ ID3_MOOD, /**< Mood */
+ /* TOAL */ ID3_ORIGALBUM, /**< Original album/movie/show title */
+ /* TOFN */ ID3_ORIGFILENAME, /**< Original filename */
+ /* TOLY */ ID3_ORIGLYRICIST, /**< Original lyricist(s)/text writer(s) */
+ /* TOPE */ ID3_ORIGARTIST, /**< Original artist(s)/performer(s) */
+ /* TORY */ ID3_ORIGYEAR, /**< Original release year */
+ /* TOWN */ ID3_FILEOWNER, /**< File owner/licensee */
+ /* TPE1 */ ID3_LEADARTIST, /**< Lead performer(s)/Soloist(s) */
+ /* TPE2 */ ID3_BAND, /**< Band/orchestra/accompaniment */
+ /* TPE3 */ ID3_CONDUCTOR, /**< Conductor/performer refinement */
+ /* TPE4 */ ID3_MIXARTIST, /**< Interpreted, remixed, or otherwise modified by */
+ /* TPOS */ ID3_PARTINSET, /**< Part of a set */
+ /* TPRO */ ID3_PRODUCEDNOTICE, /**< Produced notice */
+ /* TPUB */ ID3_PUBLISHER, /**< Publisher */
+ /* TRCK */ ID3_TRACKNUM, /**< Track number/Position in set */
+ /* TRDA */ ID3_RECORDINGDATES, /**< Recording dates */
+ /* TRSN */ ID3_NETRADIOSTATION, /**< Internet radio station name */
+ /* TRSO */ ID3_NETRADIOOWNER, /**< Internet radio station owner */
+ /* TSIZ */ ID3_SIZE, /**< Size */
+ /* TSOA */ ID3_ALBUMSORTORDER, /**< Album sort order */
+ /* TSOP */ ID3_PERFORMERSORTORDER,/**< Performer sort order */
+ /* TSOT */ ID3_TITLESORTORDER, /**< Title sort order */
+ /* TSRC */ ID3_ISRC, /**< ISRC (international standard recording code) */
+ /* TSSE */ ID3_ENCODERSETTINGS, /**< Software/Hardware and settings used for encoding */
+ /* TSST */ ID3_SETSUBTITLE, /**< Set subtitle */
+ /* TXXX */ ID3_USERTEXT, /**< User defined text information */
+ /* TYER */ ID3_YEAR, /**< Year */
+ /* UFID */ ID3_UNIQUEFILEID, /**< Unique file identifier */
+ /* USER */ ID3_TERMSOFUSE, /**< Terms of use */
+ /* USLT */ ID3_UNSYNCEDLYRICS, /**< Unsynchronized lyric/text transcription */
+ /* WCOM */ ID3_WWWCOMMERCIALINFO, /**< Commercial information */
+ /* WCOP */ ID3_WWWCOPYRIGHT, /**< Copyright/Legal infromation */
+ /* WOAF */ ID3_WWWAUDIOFILE, /**< Official audio file webpage */
+ /* WOAR */ ID3_WWWARTIST, /**< Official artist/performer webpage */
+ /* WOAS */ ID3_WWWAUDIOSOURCE, /**< Official audio source webpage */
+ /* WORS */ ID3_WWWRADIOPAGE, /**< Official internet radio station homepage */
+ /* WPAY */ ID3_WWWPAYMENT, /**< Payment */
+ /* WPUB */ ID3_WWWPUBLISHER, /**< Official publisher webpage */
+ /* WXXX */ ID3_WWWUSER, /**< User defined URL link */
+ /* */ ID3_METACRYPTO, /**< Encrypted meta frame (id3v2.2.x) */
+ /* */ ID3_METACOMPRESSION, /**< Compressed meta frame (id3v2.2.1) */
+ /* >>>> */ ID3_LASTFRAMEID /**< Last field placeholder */
+ } eID3FrameTypes;
+
+ [
+ object,
+ uuid(A513A24E-C749-11D3-841C-0008C782A257),
+ dual,
+ helpstring("IID3ComField Interface"),
+ pointer_default(unique)
+ ]
+ interface IID3ComField : IDispatch
+ {
+ [propget, id(0), helpstring("property Text")] HRESULT Text([in] long ItemNum, [out, retval] BSTR *pVal);
+ [propput, id(0), helpstring("property Text")] HRESULT Text([in] long ItemNum, [in] BSTR newVal);
+ [propget, id(1), helpstring("property Long")] HRESULT Long([out, retval] long *pVal);
+ [propput, id(1), helpstring("property Long")] HRESULT Long([in] long newVal);
+ [id(4), helpstring("method Clear")] HRESULT Clear();
+ [id(5), helpstring("method CopyDataToFile")] HRESULT CopyDataToFile(BSTR FileName);
+ [id(6), helpstring("method CopyDataFromFile")] HRESULT CopyDataFromFile(BSTR FileName);
+ [propget, id(7), helpstring("property NumTextItems")] HRESULT NumTextItems([out, retval] long *pVal);
+ [propget, id(8), helpstring("property Binary")] HRESULT Binary([out, retval] BSTR *pVal);
+ [propput, id(8), helpstring("property Binary")] HRESULT Binary([in] BSTR newVal);
+ };
+
+ [
+ object,
+ uuid(AEBA98BE-C36C-11D3-841B-0008C782A257),
+ dual,
+ helpstring("IID3ComFrame Interface"),
+ pointer_default(unique)
+ ]
+ interface IID3ComFrame : IDispatch
+ {
+ [propget, id(1), helpstring("property Field")] HRESULT Field([in] eID3FieldTypes FieldType, [out, retval] IID3ComField** pVal);
+ [id(2), helpstring("method Clear")] HRESULT Clear();
+ [propget, id(3), helpstring("property ID")] HRESULT ID([out, retval] eID3FrameTypes *pVal);
+ [propput, id(3), helpstring("property ID")] HRESULT ID([in] eID3FrameTypes newVal);
+ [propget, id(4), helpstring("property FrameName")] HRESULT FrameName([out, retval] BSTR *pVal);
+ [propget, id(5), helpstring("property Compressed")] HRESULT Compressed([out, retval] VARIANT_BOOL *pVal);
+ [propput, id(5), helpstring("property Compressed")] HRESULT Compressed([in] VARIANT_BOOL newVal);
+ };
+ [
+ object,
+ uuid(AEBA98BC-C36C-11D3-841B-0008C782A257),
+ dual,
+ helpstring("IID3ComTag Interface"),
+ pointer_default(unique)
+ ]
+ interface IID3ComTag : IDispatch
+ {
+ [id(1), helpstring("method Link")] HRESULT Link(BSTR* FileName);
+ [id(2), helpstring("method Clear")] HRESULT Clear();
+ [propget, id(3), helpstring("property HasChanged")] HRESULT HasChanged([out, retval] VARIANT_BOOL *pVal);
+ [id(4), helpstring("method FindFrame")] HRESULT FindFrame([in] eID3FrameTypes FrameID, [in, defaultvalue(TRUE)] VARIANT_BOOL CreateNewIfNotFound, [out, retval] IID3ComFrame** pVal);
+ [propget, id(5), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
+ [propget, id(DISPID_VALUE), helpstring("property Item")] HRESULT Item([in] long FrameNum, [out, retval] IID3ComFrame** pVal);
+ [id(7), helpstring("method SaveV1Tag")] HRESULT SaveV1Tag();
+ [id(8), helpstring("method StripV1Tag")] HRESULT StripV1Tag();
+ [id(9), helpstring("method SaveV2Tag")] HRESULT SaveV2Tag();
+ [id(10), helpstring("method StripV2Tag")] HRESULT StripV2Tag();
+ [propget, id(11), helpstring("property Artist")] HRESULT Artist([out, retval] BSTR *pVal);
+ [propput, id(11), helpstring("property Artist")] HRESULT Artist([in] BSTR newVal);
+ [propget, id(12), helpstring("property Album")] HRESULT Album([out, retval] BSTR *pVal);
+ [propput, id(12), helpstring("property Album")] HRESULT Album([in] BSTR newVal);
+ [propget, id(13), helpstring("property Title")] HRESULT Title([out, retval] BSTR *pVal);
+ [propput, id(13), helpstring("property Title")] HRESULT Title([in] BSTR newVal);
+ [propget, id(14), helpstring("property Comment")] HRESULT Comment([out, retval] BSTR *pVal);
+ [propput, id(14), helpstring("property Comment")] HRESULT Comment([in] BSTR newVal);
+ [propget, id(15), helpstring("property Genre")] HRESULT Genre([out, retval] long *pVal);
+ [propput, id(15), helpstring("property Genre")] HRESULT Genre([in] long newVal);
+ [propget, id(16), helpstring("property Year")] HRESULT Year([out, retval] BSTR *pVal);
+ [propput, id(16), helpstring("property Year")] HRESULT Year([in] BSTR newVal);
+ [propget, id(17), helpstring("property Track")] HRESULT Track([out, retval] long *pVal);
+ [propput, id(17), helpstring("property Track")] HRESULT Track([in] long newVal);
+ [propget, id(18), helpstring("property LastPlayed")] HRESULT LastPlayed([out, retval] DATE *pVal);
+ [propput, id(18), helpstring("property LastPlayed")] HRESULT LastPlayed([in] DATE newVal);
+ [propget, id(19), helpstring("property HasV1Tag")] HRESULT HasV1Tag([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(20), helpstring("property HasV2Tag")] HRESULT HasV2Tag([out, retval] VARIANT_BOOL *pVal);
+ [propget, id(21), helpstring("property HasLyrics")] HRESULT HasLyrics([out, retval] VARIANT_BOOL *pVal);
+ [id(22), helpstring("method FindFrameString")] HRESULT FindFrameString([in] eID3FrameTypes FrameID, [in] eID3FieldTypes FieldType, [in] BSTR FindString, [in, defaultvalue(TRUE)] VARIANT_BOOL CreateNewIfNotFound, [out, retval] IID3ComFrame** pVal);
+ [propget, id(23), helpstring("property PlayCount")] HRESULT PlayCount([in] BSTR EMailAddress, [out, retval] long *pVal);
+ [propput, id(23), helpstring("property PlayCount")] HRESULT PlayCount([in] BSTR EMailAddress, [in] long newVal);
+ [propget, id(24), helpstring("property Popularity")] HRESULT Popularity([in] BSTR EMailAddress, [out, retval] short *pVal);
+ [propput, id(24), helpstring("property Popularity")] HRESULT Popularity([in] BSTR EMailAddress, [in] short newVal);
+ [propget, id(25), helpstring("property TagCreated")] HRESULT TagCreated([out, retval] DATE *pVal);
+ [propput, id(25), helpstring("property TagCreated")] HRESULT TagCreated([in] DATE newVal);
+ [propget, id(26), helpstring("property PercentVolumeAdjust")] HRESULT PercentVolumeAdjust([out, retval] double *pVal);
+ [propput, id(26), helpstring("property PercentVolumeAdjust")] HRESULT PercentVolumeAdjust([in] double newVal);
+ [propput, id(27), helpstring("property Padding")] HRESULT Padding([in] VARIANT_BOOL newVal);
+ [propput, id(28), helpstring("property UnSync")] HRESULT UnSync([in] VARIANT_BOOL newVal);
+ [propget, id(29), helpstring("property VersionString")] HRESULT VersionString([out, retval] BSTR *pVal);
+ [id(35), helpstring("method RemoveFrame")] HRESULT RemoveFrame([in] eID3FrameTypes FrameID);
+ [id(37), helpstring("method RemoveFrameByNum")] HRESULT RemoveFrameByNum([in] long FrameNum);
+ [propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval] IUnknown** pRetVal);
+ };
+[
+ uuid(AEBA98B0-C36C-11D3-841B-0008C782A257),
+ version(1.0),
+ helpstring("ID3COM 1.0 Type Library")
+]
+library ID3COM
+{
+ importlib("stdole32.tlb");
+ importlib("stdole2.tlb");
+
+ [
+ uuid(AEBA98BD-C36C-11D3-841B-0008C782A257),
+ helpstring("ID3ComTag Class")
+ ]
+ coclass ID3ComTag
+ {
+ [default] interface IID3ComTag;
+ };
+ [
+ uuid(AEBA98BF-C36C-11D3-841B-0008C782A257),
+ helpstring("ID3ComFrame Class"),
+ noncreatable
+ ]
+ coclass ID3ComFrame
+ {
+ [default] interface IID3ComFrame;
+ };
+ [
+ uuid(A513A24F-C749-11D3-841C-0008C782A257),
+ helpstring("ID3ComField Class"),
+ noncreatable
+ ]
+ coclass ID3ComField
+ {
+ [default] interface IID3ComField;
+ };
+};
diff --git a/id3com/resource.h b/id3com/resource.h
new file mode 100644
index 0000000..3555184
--- /dev/null
+++ b/id3com/resource.h
@@ -0,0 +1,26 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by id3com.rc
+//
+#define IDS_PROJNAME 100
+#define IDR_ID3TAG 101
+#define IDR_ID3FRAME 102
+#define IDR_ID3FIELD 104
+#define IDR_ID3COMFIELDTEXT 105
+#define IDR_ID3COMFIELDLONG 106
+#define IDR_ID3COMFIELDPICTURE 107
+#define IDR_TEXTCOLLECTION 108
+#define IDS_UNEXPECTED_ERROR 0x0200
+#define IDS_ERROR_BAD_FILENAME 513
+#define IDS_ERROR_BAD_URL 514
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 201
+#define _APS_NEXT_COMMAND_VALUE 32768
+#define _APS_NEXT_CONTROL_VALUE 201
+#define _APS_NEXT_SYMED_VALUE 109
+#endif
+#endif
diff --git a/id3com/win32.readme.first.txt b/id3com/win32.readme.first.txt
new file mode 100644
index 0000000..584c0b0
--- /dev/null
+++ b/id3com/win32.readme.first.txt
@@ -0,0 +1,75 @@
+Compiling on win32:
+
+So far, it has only been confirmed it compiles on visual C 6.0 (service pack 5),
+but if you got it working on Borland or other compilers, drop me a mail, or better, add a patch
+here: http://sourceforge.net/tracker/?group_id=979&atid=300979 with the (e.g.) borland project files.
+
+These are the directories you'll be needing:
+id3lib/prj
+id3lib/libprj
+id3lib/id3com
+
+The first one (id3lib/prj) creates the standard dll (no COM interface)
+The Second one (id3lib/libprj) creates the .lib file for static linking.
+And the third one (id3lib/id3com) creates a dll with com interface. A Visual basic demo using it is included.
+
+Before you compile, you'll need to rename id3lib/config.h.win32 to id3lib/config.h
+
+The third one is not too much tested, it was created outside this project but
+it doesn't seem to be maintained anymore. I've included it as a service.
+The original location is http://sourceforge.net/projects/id3com
+
+And, last but not least, there is a delphi project in cvs
+(http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/id3lib/id3lib-stable/delphi/)
+which uses the allready compiled dll.
+Also in there is a file called Id3lib.pas which has the interface to the dll
+defined.
+
+How to start:
+
+A) ***Your project wants to link id3lib static, and has mfc linked static:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcd" or(release) /nodefaultlib:"libc"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+B)***Your project wants to link id3lib static, and has mfc linked dynamic or has no MFC:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcmtd" or(release) /nodefaultlib:"libcmt"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+C)***Your project wants to link id3lib dynamic: (instructions below for vc)
+1) Rename config.h.win32 to config.h
+2) include prj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace (*note this is a different id3lib than above)
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=3 to your project options (settings, C/C++ tab) (*note this is a different option than above)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Compile.
+8) dump id3lib.dll in your programs project dir.
+9) distribute your program including id3lib.dll
+(MS recommend you distribute it in your programs dir and not in system(32) to avoid version conficts)
+
+Thijmen
+thijmen@id3lib.org
+
diff --git a/id3lib.spec b/id3lib.spec
new file mode 100644
index 0000000..554d28f
--- /dev/null
+++ b/id3lib.spec
@@ -0,0 +1,192 @@
+# $Id: id3lib.spec.in,v 1.27 2002/11/02 18:03:27 t1mpy Exp $
+
+%define name id3lib
+%define version 3.8.3
+%define release 1
+%define prefix /usr
+
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Summary: A software library for manipulating ID3v1 and ID3v2 tags.
+Source: http://download.sourceforge.net/id3lib/%{name}-%{version}.tar.gz
+URL: http://id3lib.sourceforge.net
+Group: System Environment/Libraries
+BuildRoot: %{_tmppath}/%{name}-buildroot
+Copyright: LGPL
+Prefix: %{_prefix}
+Docdir: %{prefix}/doc
+Requires: zlib
+
+%description
+This package provides a software library for manipulating ID3v1 and ID3v2 tags.
+It provides a convenient interface for software developers to include
+standards-compliant ID3v1/2 tagging capabilities in their applications.
+Features include identification of valid tags, automatic size conversions,
+(re)synchronisation of tag frames, seamless tag (de)compression, and optional
+padding facilities. Additionally, it can tell mp3 header info, like bitrate etc.
+
+%package devel
+Summary: Headers for developing programs that will use id3lib
+Group: Development/Libraries
+Requires: %{name}
+
+%description devel
+This package contains the headers that programmers will need to develop
+applications which will use id3lib, the software library for ID3v1 and ID3v2
+tag manipulation.
+
+%package doc
+Summary: Documentation for developing programs that will use id3lib
+Group: Documentation
+
+%description doc
+This package contains the documentation of the id3lib API that programmers will
+need to develop applications which will use id3lib, the software library for ID3v1
+and ID3v2 tag manipulation.
+
+%package examples
+Summary: Example applications that make use of the id3lib library
+Group: Applications/File
+Requires: %{name}
+
+%description examples
+This package contains simple example applications that make use of id3lib, a
+software library for ID3v1 and ID3v2 tag manipulation.
+
+%prep
+%setup -q
+
+%build
+
+CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix --enable-debug=no
+
+%ifnarch noarch
+
+uname -a|grep SMP && make -j 2 || make
+
+%endif
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%ifnarch noarch
+
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+
+%else
+
+make docs
+
+# strip down the doc and examples directories so we can copy w/impunity
+for i in doc/ examples/; do \
+ find $i \
+ \( -name 'Makefile*' -or \
+ -name '*.ps.gz' -or \
+ -name '*.pdf' \
+ \) -exec rm {} \; ; done
+
+%endif
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%ifnarch noarch
+
+%files
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/lib/*.so.*
+
+%files devel
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/include/id3*.h
+%{prefix}/include/id3
+%{prefix}/lib/*.la
+%{prefix}/lib/*.a
+%{prefix}/lib/*.so
+
+%files examples
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/bin/id3*
+
+%else
+
+%files doc
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%doc doc/*.* doc/api examples
+
+%endif
+
+%changelog
+* Sat Sep 08 2001 Cedric Tefft <cedric@earthling.net> 3.8.0pre2
+- Version 3.8.0pre2
+
+* Mon Nov 20 2000 Scott Thomas Haug <scott@id3.org> 3.8.0pre1-1
+- Version 3.8.0pre1
+
+* Thu Sep 14 2000 Scott Thomas Haug <scott@id3.org> 3.7.13-1
+- Version 3.7.13
+
+* Sat Aug 26 2000 Scott Thomas Haug <scott@id3.org> 3.7.12-2
+- Removed -mpreferred-stack-boundary option from RPM_OPT_FLAGS for RedHat 6.2
+
+* Fri Jul 07 2000 Scott Thomas Haug <scott@id3.org> 3.7.12-1
+- Version 3.7.12
+
+* Fri Jul 05 2000 Scott Thomas Haug <scott@id3.org> 3.7.11-1
+- Version 3.7.11
+
+* Fri Jun 23 2000 Scott Thomas Haug <scott@id3.org> 3.7.10-1
+- Version 3.7.10
+
+* Wed May 24 2000 Scott Thomas Haug <scott@id3.org> 3.7.9-1
+- Version 3.7.9
+
+* Wed May 10 2000 Scott Thomas Haug <scott@id3.org> 3.7.8-1
+- Version 3.7.8
+
+* Wed May 10 2000 Scott Thomas Haug <scott@id3.org> 3.7.7-1
+- Version 3.7.7
+
+* Wed May 03 2000 Scott Thomas Haug <scott@id3.org> 3.7.6-1
+- Version 3.7.6
+
+* Fri Apr 28 2000 Scott Thomas Haug <scott@id3.org> 3.7.5-1
+- Version 3.7.5
+
+* Wed Apr 26 2000 Scott Thomas Haug <scott@id3.org> 3.7.4-1
+- Version 3.7.4
+
+* Mon Apr 24 2000 Scott Thomas Haug <scott@id3.org> 3.7.3-1
+- Version 3.7.3
+- Added explicit RPM_OPT_FLAGS def based on arch, since -fno-exceptions and
+ -fno-rtti are part of the default flags in rpmrc and we need both exceptions
+ and rtti (exceptions uses rtti)
+
+* Fri Apr 21 2000 Scott Thomas Haug <scott@id3.org> 3.7.2-1
+- Version 3.7.2
+- More conditional blocks for noarch
+- More thorough cleaning of files for documentation
+- Updated html directory
+
+* Thu Apr 20 2000 Scott Thomas Haug <scott@id3.org> 3.7.1-2
+- Fixed date of changelog entry for 3.7.1-1
+- Added conditional blocks so docs only get built for noarch target
+
+* Wed Apr 19 2000 Scott Thomas Haug <scott@id3.org> 3.7.1-1
+- Version 3.7.1
+- Removed zlib-devel requirement from devel
+- Added doc package to distribute documentation
+- Added examples package to distribute binary examples (id3tag, id3info, ...)
+- Moved doc/ and examples/ source files from devel to doc package
+
+* Mon Apr 17 2000 Scott Thomas Haug <scott@id3.org> 3.7.0-1
+- First (s)rpm build
diff --git a/id3lib.spec.in b/id3lib.spec.in
new file mode 100644
index 0000000..8a77aa0
--- /dev/null
+++ b/id3lib.spec.in
@@ -0,0 +1,192 @@
+# $Id: id3lib.spec.in,v 1.27 2002/11/02 18:03:27 t1mpy Exp $
+
+%define name @PACKAGE@
+%define version @VERSION@
+%define release 1
+%define prefix /usr
+
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Summary: A software library for manipulating ID3v1 and ID3v2 tags.
+Source: http://download.sourceforge.net/id3lib/%{name}-%{version}.tar.gz
+URL: http://id3lib.sourceforge.net
+Group: System Environment/Libraries
+BuildRoot: %{_tmppath}/%{name}-buildroot
+Copyright: LGPL
+Prefix: %{_prefix}
+Docdir: %{prefix}/doc
+Requires: zlib
+
+%description
+This package provides a software library for manipulating ID3v1 and ID3v2 tags.
+It provides a convenient interface for software developers to include
+standards-compliant ID3v1/2 tagging capabilities in their applications.
+Features include identification of valid tags, automatic size conversions,
+(re)synchronisation of tag frames, seamless tag (de)compression, and optional
+padding facilities. Additionally, it can tell mp3 header info, like bitrate etc.
+
+%package devel
+Summary: Headers for developing programs that will use id3lib
+Group: Development/Libraries
+Requires: %{name}
+
+%description devel
+This package contains the headers that programmers will need to develop
+applications which will use id3lib, the software library for ID3v1 and ID3v2
+tag manipulation.
+
+%package doc
+Summary: Documentation for developing programs that will use id3lib
+Group: Documentation
+
+%description doc
+This package contains the documentation of the id3lib API that programmers will
+need to develop applications which will use id3lib, the software library for ID3v1
+and ID3v2 tag manipulation.
+
+%package examples
+Summary: Example applications that make use of the id3lib library
+Group: Applications/File
+Requires: %{name}
+
+%description examples
+This package contains simple example applications that make use of id3lib, a
+software library for ID3v1 and ID3v2 tag manipulation.
+
+%prep
+%setup -q
+
+%build
+
+CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix --enable-debug=no
+
+%ifnarch noarch
+
+uname -a|grep SMP && make -j 2 || make
+
+%endif
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%ifnarch noarch
+
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+
+%else
+
+make docs
+
+# strip down the doc and examples directories so we can copy w/impunity
+for i in doc/ examples/; do \
+ find $i \
+ \( -name 'Makefile*' -or \
+ -name '*.ps.gz' -or \
+ -name '*.pdf' \
+ \) -exec rm {} \; ; done
+
+%endif
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%ifnarch noarch
+
+%files
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/lib/*.so.*
+
+%files devel
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/include/id3*.h
+%{prefix}/include/id3
+%{prefix}/lib/*.la
+%{prefix}/lib/*.a
+%{prefix}/lib/*.so
+
+%files examples
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%{prefix}/bin/id3*
+
+%else
+
+%files doc
+%defattr(-, root, root)
+%doc AUTHORS COPYING ChangeLog HISTORY NEWS README THANKS TODO
+%doc doc/*.* doc/@DOX_DIR_HTML@ examples
+
+%endif
+
+%changelog
+* Sat Sep 08 2001 Cedric Tefft <cedric@earthling.net> 3.8.0pre2
+- Version 3.8.0pre2
+
+* Mon Nov 20 2000 Scott Thomas Haug <scott@id3.org> 3.8.0pre1-1
+- Version 3.8.0pre1
+
+* Thu Sep 14 2000 Scott Thomas Haug <scott@id3.org> 3.7.13-1
+- Version 3.7.13
+
+* Sat Aug 26 2000 Scott Thomas Haug <scott@id3.org> 3.7.12-2
+- Removed -mpreferred-stack-boundary option from RPM_OPT_FLAGS for RedHat 6.2
+
+* Fri Jul 07 2000 Scott Thomas Haug <scott@id3.org> 3.7.12-1
+- Version 3.7.12
+
+* Fri Jul 05 2000 Scott Thomas Haug <scott@id3.org> 3.7.11-1
+- Version 3.7.11
+
+* Fri Jun 23 2000 Scott Thomas Haug <scott@id3.org> 3.7.10-1
+- Version 3.7.10
+
+* Wed May 24 2000 Scott Thomas Haug <scott@id3.org> 3.7.9-1
+- Version 3.7.9
+
+* Wed May 10 2000 Scott Thomas Haug <scott@id3.org> 3.7.8-1
+- Version 3.7.8
+
+* Wed May 10 2000 Scott Thomas Haug <scott@id3.org> 3.7.7-1
+- Version 3.7.7
+
+* Wed May 03 2000 Scott Thomas Haug <scott@id3.org> 3.7.6-1
+- Version 3.7.6
+
+* Fri Apr 28 2000 Scott Thomas Haug <scott@id3.org> 3.7.5-1
+- Version 3.7.5
+
+* Wed Apr 26 2000 Scott Thomas Haug <scott@id3.org> 3.7.4-1
+- Version 3.7.4
+
+* Mon Apr 24 2000 Scott Thomas Haug <scott@id3.org> 3.7.3-1
+- Version 3.7.3
+- Added explicit RPM_OPT_FLAGS def based on arch, since -fno-exceptions and
+ -fno-rtti are part of the default flags in rpmrc and we need both exceptions
+ and rtti (exceptions uses rtti)
+
+* Fri Apr 21 2000 Scott Thomas Haug <scott@id3.org> 3.7.2-1
+- Version 3.7.2
+- More conditional blocks for noarch
+- More thorough cleaning of files for documentation
+- Updated html directory
+
+* Thu Apr 20 2000 Scott Thomas Haug <scott@id3.org> 3.7.1-2
+- Fixed date of changelog entry for 3.7.1-1
+- Added conditional blocks so docs only get built for noarch target
+
+* Wed Apr 19 2000 Scott Thomas Haug <scott@id3.org> 3.7.1-1
+- Version 3.7.1
+- Removed zlib-devel requirement from devel
+- Added doc package to distribute documentation
+- Added examples package to distribute binary examples (id3tag, id3info, ...)
+- Moved doc/ and examples/ source files from devel to doc package
+
+* Mon Apr 17 2000 Scott Thomas Haug <scott@id3.org> 3.7.0-1
+- First (s)rpm build
diff --git a/include/Makefile.am b/include/Makefile.am
new file mode 100644
index 0000000..25f19ec
--- /dev/null
+++ b/include/Makefile.am
@@ -0,0 +1,16 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SUBDIRS = id3
+
+id3includedir = $(includedir)
+id3include_HEADERS = id3.h
+
diff --git a/include/Makefile.in b/include/Makefile.in
new file mode 100644
index 0000000..2f320a0
--- /dev/null
+++ b/include/Makefile.in
@@ -0,0 +1,396 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+SUBDIRS = id3
+
+id3includedir = $(includedir)
+id3include_HEADERS = id3.h
+subdir = include
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+HEADERS = $(id3include_HEADERS)
+
+
+RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
+ uninstall-info-recursive all-recursive install-data-recursive \
+ install-exec-recursive installdirs-recursive install-recursive \
+ uninstall-recursive check-recursive installcheck-recursive
+DIST_COMMON = $(id3include_HEADERS) Makefile.am Makefile.in
+DIST_SUBDIRS = $(SUBDIRS)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu include/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+id3includeHEADERS_INSTALL = $(INSTALL_HEADER)
+install-id3includeHEADERS: $(id3include_HEADERS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(id3includedir)
+ @list='$(id3include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(id3includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(id3includedir)/$$f"; \
+ $(id3includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(id3includedir)/$$f; \
+ done
+
+uninstall-id3includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(id3include_HEADERS)'; for p in $$list; do \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " rm -f $(DESTDIR)$(id3includedir)/$$f"; \
+ rm -f $(DESTDIR)$(id3includedir)/$$f; \
+ done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" \
+ distdir=../$(distdir)/$$subdir \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+ $(mkinstalldirs) $(DESTDIR)$(id3includedir)
+
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+
+distclean-am: clean-am distclean-generic distclean-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-id3includeHEADERS
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-id3includeHEADERS uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
+ clean-generic clean-libtool clean-recursive distclean \
+ distclean-generic distclean-libtool distclean-recursive \
+ distclean-tags distdir dvi dvi-am dvi-recursive info info-am \
+ info-recursive install install-am install-data install-data-am \
+ install-data-recursive install-exec install-exec-am \
+ install-exec-recursive install-id3includeHEADERS install-info \
+ install-info-am install-info-recursive install-man \
+ install-recursive install-strip installcheck installcheck-am \
+ installdirs installdirs-am installdirs-recursive \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive tags tags-recursive \
+ uninstall uninstall-am uninstall-id3includeHEADERS \
+ uninstall-info-am uninstall-info-recursive uninstall-recursive
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/include/id3.h b/include/id3.h
new file mode 100644
index 0000000..22e745b
--- /dev/null
+++ b/include/id3.h
@@ -0,0 +1,133 @@
+/* $Id: id3.h,v 1.21 2002/09/21 17:23:32 t1mpy Exp $
+ *
+ * id3lib: a software library for creating and manipulating id3v1/v2 tags
+ * Copyright 1999, 2000 Scott Thomas Haug
+ * Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+ * License for more details.
+
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ * The id3lib authors encourage improvements and optimisations to be sent to
+ * the id3lib coordinator. Please see the README file for details on where to
+ * send such submissions. See the AUTHORS file for a list of people who have
+ * contributed to id3lib. See the ChangeLog file for a list of changes to
+ * id3lib. These files are distributed with id3lib at
+ * http://download.sourceforge.net/id3lib/
+ */
+
+#ifndef _ID3LIB_ID3_H_
+#define _ID3LIB_ID3_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ typedef struct { char _dummy; } ID3Tag;
+ typedef struct { char _dummy; } ID3TagIterator;
+ typedef struct { char _dummy; } ID3TagConstIterator;
+ typedef struct { char _dummy; } ID3Frame;
+ typedef struct { char _dummy; } ID3Field;
+ typedef struct { char _dummy; } ID3FrameInfo;
+
+ /* tag wrappers */
+ ID3_C_EXPORT ID3Tag* CCONV ID3Tag_New (void);
+ ID3_C_EXPORT void CCONV ID3Tag_Delete (ID3Tag *tag);
+ ID3_C_EXPORT void CCONV ID3Tag_Clear (ID3Tag *tag);
+ ID3_C_EXPORT bool CCONV ID3Tag_HasChanged (const ID3Tag *tag);
+ ID3_C_EXPORT void CCONV ID3Tag_SetUnsync (ID3Tag *tag, bool unsync);
+ ID3_C_EXPORT void CCONV ID3Tag_SetExtendedHeader (ID3Tag *tag, bool ext);
+ ID3_C_EXPORT void CCONV ID3Tag_SetPadding (ID3Tag *tag, bool pad);
+ ID3_C_EXPORT void CCONV ID3Tag_AddFrame (ID3Tag *tag, const ID3Frame *frame);
+ ID3_C_EXPORT bool CCONV ID3Tag_AttachFrame (ID3Tag *tag, ID3Frame *frame);
+ ID3_C_EXPORT void CCONV ID3Tag_AddFrames (ID3Tag *tag, const ID3Frame *frames, size_t num);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Tag_RemoveFrame (ID3Tag *tag, const ID3Frame *frame);
+ ID3_C_EXPORT ID3_Err CCONV ID3Tag_Parse (ID3Tag *tag, const uchar header[ID3_TAGHEADERSIZE], const uchar *buffer);
+#ifdef WIN32
+ ID3_C_EXPORT size_t CCONV ID3Tag_Link (ID3Tag *tag, const wchar_t *fileName);
+ ID3_C_EXPORT size_t CCONV ID3Tag_LinkWithFlags (ID3Tag *tag, const wchar_t *fileName, flags_t flags);
+#else
+ ID3_C_EXPORT size_t CCONV ID3Tag_Link (ID3Tag *tag, const char *fileName);
+ ID3_C_EXPORT size_t CCONV ID3Tag_LinkWithFlags (ID3Tag *tag, const char *fileName, flags_t flags);
+#endif
+ ID3_C_EXPORT ID3_Err CCONV ID3Tag_Update (ID3Tag *tag);
+ ID3_C_EXPORT ID3_Err CCONV ID3Tag_UpdateByTagType (ID3Tag *tag, flags_t type);
+ ID3_C_EXPORT ID3_Err CCONV ID3Tag_Strip (ID3Tag *tag, flags_t ulTagFlags);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Tag_FindFrameWithID (const ID3Tag *tag, ID3_FrameID id);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Tag_FindFrameWithINT (const ID3Tag *tag, ID3_FrameID id, ID3_FieldID fld, uint32 data);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Tag_FindFrameWithASCII (const ID3Tag *tag, ID3_FrameID id, ID3_FieldID fld, const char *data);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Tag_FindFrameWithUNICODE (const ID3Tag *tag, ID3_FrameID id, ID3_FieldID fld, const unicode_t *data);
+ ID3_C_EXPORT size_t CCONV ID3Tag_NumFrames (const ID3Tag *tag);
+ ID3_C_EXPORT bool CCONV ID3Tag_HasTagType (const ID3Tag *tag, ID3_TagType);
+ ID3_C_EXPORT ID3TagIterator* CCONV ID3Tag_CreateIterator (ID3Tag *tag);
+ ID3_C_EXPORT ID3TagConstIterator* CCONV ID3Tag_CreateConstIterator (const ID3Tag *tag);
+
+ ID3_C_EXPORT void CCONV ID3TagIterator_Delete (ID3TagIterator*);
+ ID3_C_EXPORT ID3Frame* CCONV ID3TagIterator_GetNext (ID3TagIterator*);
+ ID3_C_EXPORT void CCONV ID3TagConstIterator_Delete (ID3TagConstIterator*);
+ ID3_C_EXPORT const ID3Frame* CCONV ID3TagConstIterator_GetNext(ID3TagConstIterator*);
+
+ /* frame wrappers */
+ ID3_C_EXPORT ID3Frame* CCONV ID3Frame_New (void);
+ ID3_C_EXPORT ID3Frame* CCONV ID3Frame_NewID (ID3_FrameID id);
+ ID3_C_EXPORT void CCONV ID3Frame_Delete (ID3Frame *frame);
+ ID3_C_EXPORT void CCONV ID3Frame_Clear (ID3Frame *frame);
+ ID3_C_EXPORT void CCONV ID3Frame_SetID (ID3Frame *frame, ID3_FrameID id);
+ ID3_C_EXPORT ID3_FrameID CCONV ID3Frame_GetID (const ID3Frame *frame);
+ ID3_C_EXPORT ID3Field* CCONV ID3Frame_GetField (const ID3Frame *frame, ID3_FieldID name);
+ ID3_C_EXPORT void CCONV ID3Frame_SetCompression (ID3Frame *frame, bool comp);
+ ID3_C_EXPORT bool CCONV ID3Frame_GetCompression (const ID3Frame *frame);
+
+ /* field wrappers */
+ ID3_C_EXPORT void CCONV ID3Field_Clear (ID3Field *field);
+ ID3_C_EXPORT size_t CCONV ID3Field_Size (const ID3Field *field);
+ ID3_C_EXPORT size_t CCONV ID3Field_GetNumTextItems (const ID3Field *field);
+ ID3_C_EXPORT void CCONV ID3Field_SetINT (ID3Field *field, uint32 data);
+ ID3_C_EXPORT uint32 CCONV ID3Field_GetINT (const ID3Field *field);
+ ID3_C_EXPORT void CCONV ID3Field_SetUNICODE (ID3Field *field, const unicode_t *string);
+ ID3_C_EXPORT size_t CCONV ID3Field_GetUNICODE (const ID3Field *field, unicode_t *buffer, size_t maxChars);
+ ID3_C_EXPORT size_t CCONV ID3Field_GetUNICODEItem (const ID3Field *field, unicode_t *buffer, size_t maxChars, size_t itemNum);
+ ID3_C_EXPORT void CCONV ID3Field_AddUNICODE (ID3Field *field, const unicode_t *string);
+ ID3_C_EXPORT void CCONV ID3Field_SetASCII (ID3Field *field, const char *string);
+ ID3_C_EXPORT size_t CCONV ID3Field_GetASCII (const ID3Field *field, char *buffer, size_t maxChars);
+ ID3_C_EXPORT size_t CCONV ID3Field_GetASCIIItem (const ID3Field *field, char *buffer, size_t maxChars, size_t itemNum);
+ ID3_C_EXPORT void CCONV ID3Field_AddASCII (ID3Field *field, const char *string);
+ ID3_C_EXPORT void CCONV ID3Field_SetBINARY (ID3Field *field, const uchar *data, size_t size);
+ ID3_C_EXPORT void CCONV ID3Field_GetBINARY (const ID3Field *field, uchar *buffer, size_t buffLength);
+ ID3_C_EXPORT void CCONV ID3Field_FromFile (ID3Field *field, const char *fileName);
+ ID3_C_EXPORT void CCONV ID3Field_ToFile (const ID3Field *field, const char *fileName);
+
+ /* field-info wrappers */
+ ID3_C_EXPORT char* CCONV ID3FrameInfo_ShortName (ID3_FrameID frameid);
+ ID3_C_EXPORT char* CCONV ID3FrameInfo_LongName (ID3_FrameID frameid);
+ ID3_C_EXPORT const char* CCONV ID3FrameInfo_Description (ID3_FrameID frameid);
+ ID3_C_EXPORT int CCONV ID3FrameInfo_MaxFrameID (void);
+ ID3_C_EXPORT int CCONV ID3FrameInfo_NumFields (ID3_FrameID frameid);
+ ID3_C_EXPORT ID3_FieldType CCONV ID3FrameInfo_FieldType (ID3_FrameID frameid, int fieldnum);
+ ID3_C_EXPORT size_t CCONV ID3FrameInfo_FieldSize (ID3_FrameID frameid, int fieldnum);
+ ID3_C_EXPORT flags_t CCONV ID3FrameInfo_FieldFlags (ID3_FrameID frameid, int fieldnum);
+
+ ID3_C_EXPORT const Mp3_Headerinfo* CCONV ID3Tag_GetMp3HeaderInfo ( ID3Tag *tag ) ;
+
+ /* Deprecated */
+ ID3_C_EXPORT void CCONV ID3Tag_SetCompression (ID3Tag *tag, bool comp);
+
+
+#ifdef __cplusplus
+}
+#endif /*__cplusplus*/
+
+#endif /* _ID3LIB_ID3_H_ */
diff --git a/include/id3/Makefile.am b/include/id3/Makefile.am
new file mode 100644
index 0000000..2ac7515
--- /dev/null
+++ b/include/id3/Makefile.am
@@ -0,0 +1,36 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+the_headers = \
+ field.h \
+ id3lib_frame.h \
+ globals.h \
+ misc_support.h \
+ reader.h \
+ readers.h \
+ sized_types.h \
+ tag.h \
+ writer.h \
+ writers.h \
+ utils.h \
+ id3lib_streams.h \
+ id3lib_strings.h
+
+
+id3includedir = $(includedir)/id3
+id3include_HEADERS = $(the_headers)
+
+noinst_HEADERS = \
+ helpers.h \
+ io_decorators.h \
+ io_helpers.h \
+ io_strings.h \
+ id3lib_bitset
diff --git a/include/id3/Makefile.in b/include/id3/Makefile.in
new file mode 100644
index 0000000..886efcd
--- /dev/null
+++ b/include/id3/Makefile.in
@@ -0,0 +1,333 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+the_headers = \
+ field.h \
+ id3lib_frame.h \
+ globals.h \
+ misc_support.h \
+ reader.h \
+ readers.h \
+ sized_types.h \
+ tag.h \
+ writer.h \
+ writers.h \
+ utils.h \
+ id3lib_streams.h \
+ id3lib_strings.h
+
+
+id3includedir = $(includedir)/id3
+id3include_HEADERS = $(the_headers)
+
+noinst_HEADERS = \
+ helpers.h \
+ io_decorators.h \
+ io_helpers.h \
+ io_strings.h \
+ id3lib_bitset
+
+subdir = include/id3
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+HEADERS = $(id3include_HEADERS) $(noinst_HEADERS)
+
+DIST_COMMON = $(id3include_HEADERS) $(noinst_HEADERS) Makefile.am \
+ Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu include/id3/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+id3includeHEADERS_INSTALL = $(INSTALL_HEADER)
+install-id3includeHEADERS: $(id3include_HEADERS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(id3includedir)
+ @list='$(id3include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(id3includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(id3includedir)/$$f"; \
+ $(id3includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(id3includedir)/$$f; \
+ done
+
+uninstall-id3includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(id3include_HEADERS)'; for p in $$list; do \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " rm -f $(DESTDIR)$(id3includedir)/$$f"; \
+ rm -f $(DESTDIR)$(id3includedir)/$$f; \
+ done
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(id3includedir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-id3includeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-id3includeHEADERS uninstall-info-am
+
+.PHONY: GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-id3includeHEADERS install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool tags uninstall uninstall-am \
+ uninstall-id3includeHEADERS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/include/id3/field.h b/include/id3/field.h
new file mode 100644
index 0000000..6e1039f
--- /dev/null
+++ b/include/id3/field.h
@@ -0,0 +1,119 @@
+// -*- C++ -*-
+// $Id: field.h,v 1.47 2002/07/02 22:10:26 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FIELD_H_
+#define _ID3LIB_FIELD_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+#include "id3/id3lib_strings.h"
+
+class ID3_Reader;
+class ID3_Writer;
+
+class ID3_CPP_EXPORT ID3_Field
+{
+public:
+ virtual void Clear() = 0;
+
+ virtual size_t Size() const = 0;
+ virtual size_t BinSize() const = 0;
+ virtual size_t GetNumTextItems() const = 0;
+
+ // integer field functions
+ virtual ID3_Field& operator= (uint32 val) = 0;
+ virtual void Set(uint32) = 0;
+ virtual uint32 Get() const = 0;
+
+ // general string field functions
+ virtual dami::String GetText( size_t index = 0, ID3_TextEnc enc = ID3TE_ISO8859_1 ) const = 0;
+ virtual size_t SetText( dami::String data, size_t index = 0, ID3_TextEnc enc = ID3TE_ISO8859_1 ) = 0;
+
+ // ASCII string field functions
+ virtual ID3_Field& operator= (const char* s) = 0;
+ virtual size_t Set(const char*) = 0; // deprecated
+ virtual size_t Get(char*, size_t) const = 0; // deprecated
+ virtual size_t Get(char*, size_t, size_t) const = 0; // deprecated
+ virtual const char* GetRawText() const = 0; // deprecated
+ virtual const char* GetRawTextItem(size_t) const = 0; // deprecated
+ virtual size_t Add(const char*) = 0;
+
+ // Unicode string field functions
+ virtual ID3_Field& operator= (const unicode_t* s) = 0;
+ virtual size_t Set(const unicode_t*) = 0;
+ virtual size_t Get(unicode_t *buffer, size_t) const = 0;
+ virtual size_t Get(unicode_t *buffer, size_t, size_t) const = 0;
+ virtual const unicode_t* GetRawUnicodeText() const = 0;
+ virtual const unicode_t* GetRawUnicodeTextItem(size_t) const = 0;
+ virtual size_t Add(const unicode_t*) = 0;
+
+ // binary field functions
+ virtual size_t Set(const uchar*, size_t) = 0;
+ virtual size_t Get(uchar*, size_t) const = 0;
+ virtual const uchar* GetRawBinary() const = 0;
+ virtual void FromFile(const char*) = 0;
+ virtual void ToFile(const char *sInfo) const = 0;
+ virtual size_t GetBinaryStartPosition() = 0;
+
+ // miscelaneous functions
+ virtual ID3_Field& operator=( const ID3_Field & ) = 0;
+ virtual bool InScope(ID3_V2Spec spec) const = 0;
+
+ virtual ID3_FieldID GetID() const = 0;
+ virtual ID3_FieldType GetType() const = 0;
+ virtual bool SetEncoding(ID3_TextEnc enc) = 0;
+ virtual ID3_TextEnc GetEncoding() const = 0;
+ virtual bool IsEncodable() const = 0;
+
+ virtual void Render(ID3_Writer&) const = 0;
+ virtual bool Parse(ID3_Reader&) = 0;
+ virtual bool HasChanged() const = 0;
+
+protected:
+ virtual ~ID3_Field() { };
+
+ // To prevent public instantiation, the constructor is made protected
+ ID3_Field() { };
+};
+
+class ID3_CPP_EXPORT ID3_FrameInfo
+{
+
+public:
+ ID3_FrameInfo() {};
+ ~ID3_FrameInfo() {};
+ char *ShortName(ID3_FrameID frameid);
+ char *LongName(ID3_FrameID frameid);
+ const char *Description(ID3_FrameID frameid);
+ int MaxFrameID();
+ int NumFields(ID3_FrameID frameid);
+ ID3_FieldType FieldType(ID3_FrameID frameid, int fieldnum);
+ size_t FieldSize(ID3_FrameID frameid, int fieldnum);
+ flags_t FieldFlags(ID3_FrameID frameid, int fieldnum);
+};
+
+#endif /* _ID3LIB_FIELD_H_ */
+
diff --git a/include/id3/globals.h b/include/id3/globals.h
new file mode 100644
index 0000000..1184bd0
--- /dev/null
+++ b/include/id3/globals.h
@@ -0,0 +1,748 @@
+// -*- C++ -*-
+/* $Id: globals.h,v 1.54 2003/02/21 03:47:41 slackorama Exp $
+
+ * id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+ * Copyright 1999, 2000 Scott Thomas Haug
+ * Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ * The id3lib authors encourage improvements and optimisations to be sent to
+ * the id3lib coordinator. Please see the README file for details on where to
+ * send such submissions. See the AUTHORS file for a list of people who have
+ * contributed to id3lib. See the ChangeLog file for a list of changes to
+ * id3lib. These files are distributed with id3lib at
+ * http://download.sourceforge.net/id3lib/
+ */
+
+/** This file defines common macros, types, constants, and enums used
+ ** throughout id3lib.
+ **/
+
+#ifndef _ID3LIB_GLOBALS_H_
+#define _ID3LIB_GLOBALS_H_
+
+#include <stdlib.h>
+#include "id3/sized_types.h"
+
+/* id3lib version.
+ * we prefix variable declarations so they can
+ * properly get exported in windows dlls.
+ */
+#ifdef WIN32
+# define LINKOPTION_STATIC 1 //both for use and creation of static lib
+# define LINKOPTION_CREATE_DYNAMIC 2 //should only be used by prj/id3lib.dsp
+# define LINKOPTION_USE_DYNAMIC 3 //if your project links id3lib dynamic
+# ifndef ID3LIB_LINKOPTION
+# pragma message("*** NOTICE *** (not a real error)")
+# pragma message("* You should include a define in your project which reflect how you link the library")
+# pragma message("* If you use id3lib.lib or libprj/id3lib.dsp (you link static) you should add")
+# pragma message("* ID3LIB_LINKOPTION=1 to your preprocessor definitions of your project.")
+# pragma message("* If you use id3lib.dll (you link dynamic) you should add ID3LIB_LINKOPTION=3")
+# pragma message("* to your preprocessor definitions of your project.")
+# pragma message("***")
+# error read message above or win32.readme.first.txt
+# else
+# if (ID3LIB_LINKOPTION == LINKOPTION_CREATE_DYNAMIC)
+ //used for creating a dynamic dll
+# define ID3_C_EXPORT extern _declspec(dllexport)
+# define ID3_CPP_EXPORT __declspec(dllexport)
+# define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
+# endif
+# if (ID3LIB_LINKOPTION == LINKOPTION_STATIC)
+ //used for creating a static lib and using a static lib
+# define ID3_C_EXPORT
+# define ID3_CPP_EXPORT
+# define CCONV
+# endif
+# if (ID3LIB_LINKOPTION == LINKOPTION_USE_DYNAMIC)
+ //used for those that do not link static and are using the dynamic dll by including a id3lib header
+# define ID3_C_EXPORT extern _declspec(dllimport)
+# define ID3_CPP_EXPORT __declspec(dllimport) //functions like these shouldn't be used by vb and delphi,
+# define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
+# endif
+# endif
+#else /* !WIN32 */
+# define ID3_C_EXPORT
+# define ID3_CPP_EXPORT
+# define CCONV
+#endif /* !WIN32 */
+
+#define ID3_C_VAR extern
+
+#ifndef __cplusplus
+
+typedef int bool;
+# define false (0)
+# define true (!false)
+
+#endif /* __cplusplus */
+
+ID3_C_VAR const char * const ID3LIB_NAME;
+ID3_C_VAR const char * const ID3LIB_RELEASE;
+ID3_C_VAR const char * const ID3LIB_FULL_NAME;
+ID3_C_VAR const int ID3LIB_MAJOR_VERSION;
+ID3_C_VAR const int ID3LIB_MINOR_VERSION;
+ID3_C_VAR const int ID3LIB_PATCH_VERSION;
+ID3_C_VAR const int ID3LIB_INTERFACE_AGE;
+ID3_C_VAR const int ID3LIB_BINARY_AGE;
+
+#define ID3_TAGID "ID3"
+#define ID3_TAGIDSIZE (3)
+#define ID3_TAGHEADERSIZE (10)
+
+/** String used for the description field of a comment tag converted from an
+ ** id3v1 tag to an id3v2 tag
+ **
+ ** \sa #ID3V1_Tag
+ **/
+#define STR_V1_COMMENT_DESC "ID3v1 Comment"
+
+
+typedef unsigned char uchar;
+typedef long unsigned int luint;
+
+typedef uint16 unicode_t;
+typedef uint16 flags_t;
+
+#define NULL_UNICODE ((unicode_t) '\0')
+
+/* These macros are used to make the C and C++ declarations for enums and
+ * structs have the same syntax. Basically, it allows C users to refer to an
+ * enum or a struct without prepending enum/struct.
+ */
+#ifdef __cplusplus
+# define ID3_ENUM(E) enum E
+# define ID3_STRUCT(S) struct S
+#else
+# define ID3_ENUM(E) typedef enum _ ## E E; enum _ ## E
+# define ID3_STRUCT(S) typedef struct _ ## S S; struct _ ## S
+#endif
+
+/** \enum ID3_TextEnc
+ ** Enumeration of the types of text encodings: ascii or unicode
+ **/
+ID3_ENUM(ID3_TextEnc)
+{
+ ID3TE_NONE = -1,
+ ID3TE_ISO8859_1,
+ ID3TE_UTF16, // this is utf16 little endian
+ ID3TE_UTF16BE, //(ESL: Might not be used or implemented, keep in this list to preserver enum values)
+ ID3TE_UTF8,
+ ID3TE_NUMENCODINGS,
+ ID3TE_ASCII = ID3TE_ISO8859_1, // do not use this -> use ID3TE_IS_SINGLE_BYTE_ENC(enc) instead
+ ID3TE_UNICODE = ID3TE_UTF16 // do not use this -> use ID3TE_IS_DOUBLE_BYTE_ENC(enc) instead
+};
+
+#define ID3TE_IS_SINGLE_BYTE_ENC(enc) ((enc) == ID3TE_ISO8859_1 || (enc) == ID3TE_UTF8)
+#define ID3TE_IS_DOUBLE_BYTE_ENC(enc) ((enc) == ID3TE_UTF16 /*|| (enc) == ID3TE_UTF16BE */) // Removed unused BE
+
+/** Enumeration of the various id3 specifications
+ **/
+ID3_ENUM(ID3_V1Spec)
+{
+ ID3V1_0 = 0,
+ ID3V1_1,
+ ID3V1_NUMSPECS
+};
+
+ID3_ENUM(ID3_V2Spec)
+{
+ ID3V2_UNKNOWN = -1,
+ ID3V2_2_0 = 0,
+ ID3V2_2_1,
+ ID3V2_3_0,
+ ID3V2_4_0,
+ ID3V2_EARLIEST = ID3V2_2_0,
+ ID3V2_LATEST = ID3V2_4_0
+};
+
+/** The various types of tags that id3lib can handle
+ **/
+ID3_ENUM(ID3_TagType)
+{
+ ID3TT_NONE = 0, /**< Represents an empty or non-existant tag */
+ ID3TT_ID3V1 = 1 << 0, /**< Represents an id3v1 or id3v1.1 tag */
+ ID3TT_ID3V2 = 1 << 1, /**< Represents an id3v2 tag */
+ ID3TT_LYRICS3 = 1 << 2, /**< Represents a Lyrics3 tag */
+ ID3TT_LYRICS3V2 = 1 << 3, /**< Represents a Lyrics3 v2.00 tag */
+ ID3TT_MUSICMATCH = 1 << 4, /**< Represents a MusicMatch tag */
+ /**< Represents a Lyrics3 tag (for backwards compatibility) */
+ ID3TT_LYRICS = ID3TT_LYRICS3,
+ /** Represents both id3 tags: id3v1 and id3v2 */
+ ID3TT_ID3 = ID3TT_ID3V1 | ID3TT_ID3V2,
+ /** Represents all possible types of tags */
+ ID3TT_ALL = ~ID3TT_NONE,
+ /** Represents all tag types that can be prepended to a file */
+ ID3TT_PREPENDED = ID3TT_ID3V2,
+ /** Represents all tag types that can be appended to a file */
+ ID3TT_APPENDED = ID3TT_ALL & ~ID3TT_ID3V2
+};
+
+/**
+ ** Enumeration of the different types of fields in a frame.
+ **/
+ID3_ENUM(ID3_FieldID)
+{
+ ID3FN_NOFIELD = 0, /**< No field */
+ ID3FN_TEXTENC, /**< Text encoding (unicode or ASCII) */
+ ID3FN_TEXT, /**< Text field */
+ ID3FN_URL, /**< A URL */
+ ID3FN_DATA, /**< Data field */
+ ID3FN_DESCRIPTION, /**< Description field */
+ ID3FN_OWNER, /**< Owner field */
+ ID3FN_EMAIL, /**< Email field */
+ ID3FN_RATING, /**< Rating field */
+ ID3FN_FILENAME, /**< Filename field */
+ ID3FN_LANGUAGE, /**< Language field */
+ ID3FN_PICTURETYPE, /**< Picture type field */
+ ID3FN_IMAGEFORMAT, /**< Image format field */
+ ID3FN_MIMETYPE, /**< Mimetype field */
+ ID3FN_COUNTER, /**< Counter field */
+ ID3FN_ID, /**< Identifier/Symbol field */
+ ID3FN_VOLUMEADJ, /**< Volume adjustment field */
+ ID3FN_NUMBITS, /**< Number of bits field */
+ ID3FN_VOLCHGRIGHT, /**< Volume chage on the right channel */
+ ID3FN_VOLCHGLEFT, /**< Volume chage on the left channel */
+ ID3FN_PEAKVOLRIGHT, /**< Peak volume on the right channel */
+ ID3FN_PEAKVOLLEFT, /**< Peak volume on the left channel */
+ ID3FN_TIMESTAMPFORMAT,/**< SYLT Timestamp Format */
+ ID3FN_CONTENTTYPE, /**< SYLT content type */
+ ID3FN_LASTFIELDID /**< Last field placeholder */
+};
+
+/**
+ ** Enumeration of the different types of frames recognized by id3lib
+ **/
+ID3_ENUM(ID3_FrameID)
+{
+ /* ???? */ ID3FID_NOFRAME = 0, /**< No known frame */
+ /* AENC */ ID3FID_AUDIOCRYPTO, /**< Audio encryption */
+ /* APIC */ ID3FID_PICTURE, /**< Attached picture */
+ /* ASPI */ ID3FID_AUDIOSEEKPOINT, /**< Audio seek point index */
+ /* COMM */ ID3FID_COMMENT, /**< Comments */
+ /* COMR */ ID3FID_COMMERCIAL, /**< Commercial frame */
+ /* ENCR */ ID3FID_CRYPTOREG, /**< Encryption method registration */
+ /* EQU2 */ ID3FID_EQUALIZATION2, /**< Equalisation (2) */
+ /* EQUA */ ID3FID_EQUALIZATION, /**< Equalization */
+ /* ETCO */ ID3FID_EVENTTIMING, /**< Event timing codes */
+ /* GEOB */ ID3FID_GENERALOBJECT, /**< General encapsulated object */
+ /* GRID */ ID3FID_GROUPINGREG, /**< Group identification registration */
+ /* IPLS */ ID3FID_INVOLVEDPEOPLE, /**< Involved people list */
+ /* LINK */ ID3FID_LINKEDINFO, /**< Linked information */
+ /* MCDI */ ID3FID_CDID, /**< Music CD identifier */
+ /* MLLT */ ID3FID_MPEGLOOKUP, /**< MPEG location lookup table */
+ /* OWNE */ ID3FID_OWNERSHIP, /**< Ownership frame */
+ /* PRIV */ ID3FID_PRIVATE, /**< Private frame */
+ /* PCNT */ ID3FID_PLAYCOUNTER, /**< Play counter */
+ /* POPM */ ID3FID_POPULARIMETER, /**< Popularimeter */
+ /* POSS */ ID3FID_POSITIONSYNC, /**< Position synchronisation frame */
+ /* RBUF */ ID3FID_BUFFERSIZE, /**< Recommended buffer size */
+ /* RVA2 */ ID3FID_VOLUMEADJ2, /**< Relative volume adjustment (2) */
+ /* RVAD */ ID3FID_VOLUMEADJ, /**< Relative volume adjustment */
+ /* RVRB */ ID3FID_REVERB, /**< Reverb */
+ /* SEEK */ ID3FID_SEEKFRAME, /**< Seek frame */
+ /* SIGN */ ID3FID_SIGNATURE, /**< Signature frame */
+ /* SYLT */ ID3FID_SYNCEDLYRICS, /**< Synchronized lyric/text */
+ /* SYTC */ ID3FID_SYNCEDTEMPO, /**< Synchronized tempo codes */
+ /* TALB */ ID3FID_ALBUM, /**< Album/Movie/Show title */
+ /* TBPM */ ID3FID_BPM, /**< BPM (beats per minute) */
+ /* TCOM */ ID3FID_COMPOSER, /**< Composer */
+ /* TCON */ ID3FID_CONTENTTYPE, /**< Content type */
+ /* TCOP */ ID3FID_COPYRIGHT, /**< Copyright message */
+ /* TDAT */ ID3FID_DATE, /**< Date */
+ /* TDEN */ ID3FID_ENCODINGTIME, /**< Encoding time */
+ /* TDLY */ ID3FID_PLAYLISTDELAY, /**< Playlist delay */
+ /* TDOR */ ID3FID_ORIGRELEASETIME, /**< Original release time */
+ /* TDRC */ ID3FID_RECORDINGTIME, /**< Recording time */
+ /* TDRL */ ID3FID_RELEASETIME, /**< Release time */
+ /* TDTG */ ID3FID_TAGGINGTIME, /**< Tagging time */
+ /* TIPL */ ID3FID_INVOLVEDPEOPLE2, /**< Involved people list */
+ /* TENC */ ID3FID_ENCODEDBY, /**< Encoded by */
+ /* TEXT */ ID3FID_LYRICIST, /**< Lyricist/Text writer */
+ /* TFLT */ ID3FID_FILETYPE, /**< File type */
+ /* TIME */ ID3FID_TIME, /**< Time */
+ /* TIT1 */ ID3FID_CONTENTGROUP, /**< Content group description */
+ /* TIT2 */ ID3FID_TITLE, /**< Title/songname/content description */
+ /* TIT3 */ ID3FID_SUBTITLE, /**< Subtitle/Description refinement */
+ /* TKEY */ ID3FID_INITIALKEY, /**< Initial key */
+ /* TLAN */ ID3FID_LANGUAGE, /**< Language(s) */
+ /* TLEN */ ID3FID_SONGLEN, /**< Length */
+ /* TMCL */ ID3FID_MUSICIANCREDITLIST,/**< Musician credits list */
+ /* TMED */ ID3FID_MEDIATYPE, /**< Media type */
+ /* TMOO */ ID3FID_MOOD, /**< Mood */
+ /* TOAL */ ID3FID_ORIGALBUM, /**< Original album/movie/show title */
+ /* TOFN */ ID3FID_ORIGFILENAME, /**< Original filename */
+ /* TOLY */ ID3FID_ORIGLYRICIST, /**< Original lyricist(s)/text writer(s) */
+ /* TOPE */ ID3FID_ORIGARTIST, /**< Original artist(s)/performer(s) */
+ /* TORY */ ID3FID_ORIGYEAR, /**< Original release year */
+ /* TOWN */ ID3FID_FILEOWNER, /**< File owner/licensee */
+ /* TPE1 */ ID3FID_LEADARTIST, /**< Lead performer(s)/Soloist(s) */
+ /* TPE2 */ ID3FID_BAND, /**< Band/orchestra/accompaniment */
+ /* TPE3 */ ID3FID_CONDUCTOR, /**< Conductor/performer refinement */
+ /* TPE4 */ ID3FID_MIXARTIST, /**< Interpreted, remixed, or otherwise modified by */
+ /* TPOS */ ID3FID_PARTINSET, /**< Part of a set */
+ /* TPRO */ ID3FID_PRODUCEDNOTICE, /**< Produced notice */
+ /* TPUB */ ID3FID_PUBLISHER, /**< Publisher */
+ /* TRCK */ ID3FID_TRACKNUM, /**< Track number/Position in set */
+ /* TRDA */ ID3FID_RECORDINGDATES, /**< Recording dates */
+ /* TRSN */ ID3FID_NETRADIOSTATION, /**< Internet radio station name */
+ /* TRSO */ ID3FID_NETRADIOOWNER, /**< Internet radio station owner */
+ /* TSIZ */ ID3FID_SIZE, /**< Size */
+ /* TSOA */ ID3FID_ALBUMSORTORDER, /**< Album sort order */
+ /* TSOP */ ID3FID_PERFORMERSORTORDER,/**< Performer sort order */
+ /* TSOT */ ID3FID_TITLESORTORDER, /**< Title sort order */
+ /* TSRC */ ID3FID_ISRC, /**< ISRC (international standard recording code) */
+ /* TSSE */ ID3FID_ENCODERSETTINGS, /**< Software/Hardware and settings used for encoding */
+ /* TSST */ ID3FID_SETSUBTITLE, /**< Set subtitle */
+ /* TXXX */ ID3FID_USERTEXT, /**< User defined text information */
+ /* TYER */ ID3FID_YEAR, /**< Year */
+ /* UFID */ ID3FID_UNIQUEFILEID, /**< Unique file identifier */
+ /* USER */ ID3FID_TERMSOFUSE, /**< Terms of use */
+ /* USLT */ ID3FID_UNSYNCEDLYRICS, /**< Unsynchronized lyric/text transcription */
+ /* WCOM */ ID3FID_WWWCOMMERCIALINFO, /**< Commercial information */
+ /* WCOP */ ID3FID_WWWCOPYRIGHT, /**< Copyright/Legal infromation */
+ /* WOAF */ ID3FID_WWWAUDIOFILE, /**< Official audio file webpage */
+ /* WOAR */ ID3FID_WWWARTIST, /**< Official artist/performer webpage */
+ /* WOAS */ ID3FID_WWWAUDIOSOURCE, /**< Official audio source webpage */
+ /* WORS */ ID3FID_WWWRADIOPAGE, /**< Official internet radio station homepage */
+ /* WPAY */ ID3FID_WWWPAYMENT, /**< Payment */
+ /* WPUB */ ID3FID_WWWPUBLISHER, /**< Official publisher webpage */
+ /* WXXX */ ID3FID_WWWUSER, /**< User defined URL link */
+ /* */ ID3FID_METACRYPTO, /**< Encrypted meta frame (id3v2.2.x) */
+ /* */ ID3FID_METACOMPRESSION, /**< Compressed meta frame (id3v2.2.1) */
+ /* TCMP */ ID3FID_ITUNESCOMPILATION, /**< iTunes Compilation Flag (http://www.id3.org/iTunes_Compilation_Flag) */
+ /* >>>> */ ID3FID_LASTFRAMEID /**< Last field placeholder */
+};
+
+ID3_ENUM(ID3_V1Lengths)
+{
+ ID3_V1_LEN = 128,
+ ID3_V1_LEN_ID = 3,
+ ID3_V1_LEN_TITLE = 30,
+ ID3_V1_LEN_ARTIST = 30,
+ ID3_V1_LEN_ALBUM = 30,
+ ID3_V1_LEN_YEAR = 4,
+ ID3_V1_LEN_COMMENT = 30,
+ ID3_V1_LEN_GENRE = 1
+};
+
+ID3_ENUM(ID3_FieldFlags)
+{
+ ID3FF_NONE = 0,
+ ID3FF_CSTR = 1 << 0,
+ ID3FF_LIST = 1 << 1,
+ ID3FF_ENCODABLE = 1 << 2,
+ ID3FF_TEXTLIST = ID3FF_CSTR | ID3FF_LIST | ID3FF_ENCODABLE
+};
+
+/** Enumeration of the types of field types */
+ID3_ENUM(ID3_FieldType)
+{
+ ID3FTY_NONE = -1,
+ ID3FTY_INTEGER = 0,
+ ID3FTY_BINARY,
+ ID3FTY_TEXTSTRING,
+ ID3FTY_NUMTYPES
+};
+
+/**
+ ** Predefined id3lib error types.
+ **/
+ID3_ENUM(ID3_Err)
+{
+ ID3E_NoError = 0, /**< No error reported */
+ ID3E_NoMemory, /**< No available memory */
+ ID3E_NoData, /**< No data to parse */
+ ID3E_BadData, /**< Improperly formatted data */
+ ID3E_NoBuffer, /**< No buffer to write to */
+ ID3E_SmallBuffer, /**< Buffer is too small */
+ ID3E_InvalidFrameID, /**< Invalid frame id */
+ ID3E_FieldNotFound, /**< Requested field not found */
+ ID3E_UnknownFieldType, /**< Unknown field type */
+ ID3E_TagAlreadyAttached, /**< Tag is already attached to a file */
+ ID3E_InvalidTagVersion, /**< Invalid tag version */
+ ID3E_NoFile, /**< No file to parse */
+ ID3E_ReadOnly, /**< Attempting to write to a read-only file */
+ ID3E_zlibError /**< Error in compression/uncompression */
+};
+
+ID3_ENUM(ID3_ContentType)
+{
+ ID3CT_OTHER = 0,
+ ID3CT_LYRICS,
+ ID3CT_TEXTTRANSCRIPTION,
+ ID3CT_MOVEMENT,
+ ID3CT_EVENTS,
+ ID3CT_CHORD,
+ ID3CT_TRIVIA
+};
+
+ID3_ENUM(ID3_PictureType)
+{
+ ID3PT_OTHER = 0,
+ ID3PT_PNG32ICON = 1, // 32x32 pixels 'file icon' (PNG only)
+ ID3PT_OTHERICON = 2, // Other file icon
+ ID3PT_COVERFRONT = 3, // Cover (front)
+ ID3PT_COVERBACK = 4, // Cover (back)
+ ID3PT_LEAFLETPAGE = 5, // Leaflet page
+ ID3PT_MEDIA = 6, // Media (e.g. lable side of CD)
+ ID3PT_LEADARTIST = 7, // Lead artist/lead performer/soloist
+ ID3PT_ARTIST = 8, // Artist/performer
+ ID3PT_CONDUCTOR = 9, // Conductor
+ ID3PT_BAND = 10, // Band/Orchestra
+ ID3PT_COMPOSER = 11, // Composer
+ ID3PT_LYRICIST = 12, // Lyricist/text writer
+ ID3PT_REC_LOCATION = 13, // Recording Location
+ ID3PT_RECORDING = 14, // During recording
+ ID3PT_PERFORMANCE = 15, // During performance
+ ID3PT_VIDEO = 16, // Movie/video screen capture
+ ID3PT_FISH = 17, // A bright coloured fish
+ ID3PT_ILLUSTRATION = 18, // Illustration
+ ID3PT_ARTISTLOGO = 19, // Band/artist logotype
+ ID3PT_PUBLISHERLOGO = 20 // Publisher/Studio logotype
+};
+
+ID3_ENUM(ID3_TimeStampFormat)
+{
+ ID3TSF_FRAME = 1,
+ ID3TSF_MS
+};
+
+ID3_ENUM(MP3_BitRates)
+{
+ MP3BITRATE_FALSE = -1,
+ MP3BITRATE_NONE = 0,
+ MP3BITRATE_8K = 8000,
+ MP3BITRATE_16K = 16000,
+ MP3BITRATE_24K = 24000,
+ MP3BITRATE_32K = 32000,
+ MP3BITRATE_40K = 40000,
+ MP3BITRATE_48K = 48000,
+ MP3BITRATE_56K = 56000,
+ MP3BITRATE_64K = 64000,
+ MP3BITRATE_80K = 80000,
+ MP3BITRATE_96K = 96000,
+ MP3BITRATE_112K = 112000,
+ MP3BITRATE_128K = 128000,
+ MP3BITRATE_144K = 144000,
+ MP3BITRATE_160K = 160000,
+ MP3BITRATE_176K = 176000,
+ MP3BITRATE_192K = 192000,
+ MP3BITRATE_224K = 224000,
+ MP3BITRATE_256K = 256000,
+ MP3BITRATE_288K = 288000,
+ MP3BITRATE_320K = 320000,
+ MP3BITRATE_352K = 352000,
+ MP3BITRATE_384K = 384000,
+ MP3BITRATE_416K = 416000,
+ MP3BITRATE_448K = 448000
+};
+
+ID3_ENUM(Mpeg_Layers)
+{
+ MPEGLAYER_FALSE = -1,
+ MPEGLAYER_UNDEFINED,
+ MPEGLAYER_III,
+ MPEGLAYER_II,
+ MPEGLAYER_I
+};
+
+ID3_ENUM(Mpeg_Version)
+{
+ MPEGVERSION_FALSE = -1,
+ MPEGVERSION_2_5,
+ MPEGVERSION_Reserved,
+ MPEGVERSION_2,
+ MPEGVERSION_1
+};
+
+ID3_ENUM(Mp3_Frequencies)
+{
+ MP3FREQUENCIES_FALSE = -1,
+ MP3FREQUENCIES_Reserved = 0,
+ MP3FREQUENCIES_8000HZ = 8000,
+ MP3FREQUENCIES_11025HZ = 11025,
+ MP3FREQUENCIES_12000HZ = 12000,
+ MP3FREQUENCIES_16000HZ = 16000,
+ MP3FREQUENCIES_22050HZ = 22050,
+ MP3FREQUENCIES_24000HZ = 24000,
+ MP3FREQUENCIES_32000HZ = 32000,
+ MP3FREQUENCIES_48000HZ = 48000,
+ MP3FREQUENCIES_44100HZ = 44100,
+};
+
+ID3_ENUM(Mp3_ChannelMode)
+{
+ MP3CHANNELMODE_FALSE = -1,
+ MP3CHANNELMODE_STEREO,
+ MP3CHANNELMODE_JOINT_STEREO,
+ MP3CHANNELMODE_DUAL_CHANNEL,
+ MP3CHANNELMODE_SINGLE_CHANNEL
+};
+
+ID3_ENUM(Mp3_ModeExt)
+{
+ MP3MODEEXT_FALSE = -1,
+ MP3MODEEXT_0,
+ MP3MODEEXT_1,
+ MP3MODEEXT_2,
+ MP3MODEEXT_3
+};
+
+ID3_ENUM(Mp3_Emphasis)
+{
+ MP3EMPHASIS_FALSE = -1,
+ MP3EMPHASIS_NONE,
+ MP3EMPHASIS_50_15MS,
+ MP3EMPHASIS_Reserved,
+ MP3EMPHASIS_CCIT_J17
+};
+
+ID3_ENUM(Mp3_Crc)
+{
+ MP3CRC_ERROR_SIZE = -2,
+ MP3CRC_MISMATCH = -1,
+ MP3CRC_NONE = 0,
+ MP3CRC_OK = 1
+};
+
+ID3_STRUCT(Mp3_Headerinfo)
+{
+ Mpeg_Layers layer;
+ Mpeg_Version version;
+ MP3_BitRates bitrate;
+ Mp3_ChannelMode channelmode;
+ Mp3_ModeExt modeext;
+ Mp3_Emphasis emphasis;
+ Mp3_Crc crc;
+ uint32 vbr_bitrate; // avg bitrate from xing header
+ uint32 frequency; // samplerate
+ uint32 framesize;
+ uint32 frames; // nr of frames
+ uint32 time; // nr of seconds in song
+ bool privatebit;
+ bool copyrighted;
+ bool original;
+};
+
+#define ID3_NR_OF_V1_GENRES 148
+
+static const char *ID3_v1_genre_description[ID3_NR_OF_V1_GENRES] =
+{
+ "Blues", //0
+ "Classic Rock", //1
+ "Country", //2
+ "Dance", //3
+ "Disco", //4
+ "Funk", //5
+ "Grunge", //6
+ "Hip-Hop", //7
+ "Jazz", //8
+ "Metal", //9
+ "New Age", //10
+ "Oldies", //11
+ "Other", //12
+ "Pop", //13
+ "R&B", //14
+ "Rap", //15
+ "Reggae", //16
+ "Rock", //17
+ "Techno", //18
+ "Industrial", //19
+ "Alternative", //20
+ "Ska", //21
+ "Death Metal", //22
+ "Pranks", //23
+ "Soundtrack", //24
+ "Euro-Techno", //25
+ "Ambient", //26
+ "Trip-Hop", //27
+ "Vocal", //28
+ "Jazz+Funk", //29
+ "Fusion", //30
+ "Trance", //31
+ "Classical", //32
+ "Instrumental", //33
+ "Acid", //34
+ "House", //35
+ "Game", //36
+ "Sound Clip", //37
+ "Gospel", //38
+ "Noise", //39
+ "AlternRock", //40
+ "Bass", //41
+ "Soul", //42
+ "Punk", //43
+ "Space", //44
+ "Meditative", //45
+ "Instrumental Pop", //46
+ "Instrumental Rock", //47
+ "Ethnic", //48
+ "Gothic", //49
+ "Darkwave", //50
+ "Techno-Industrial", //51
+ "Electronic", //52
+ "Pop-Folk", //53
+ "Eurodance", //54
+ "Dream", //55
+ "Southern Rock", //56
+ "Comedy", //57
+ "Cult", //58
+ "Gangsta", //59
+ "Top 40", //60
+ "Christian Rap", //61
+ "Pop/Funk", //62
+ "Jungle", //63
+ "Native American", //64
+ "Cabaret", //65
+ "New Wave", //66
+ "Psychedelic", //67
+ "Rave", //68
+ "Showtunes", //69
+ "Trailer", //70
+ "Lo-Fi", //71
+ "Tribal", //72
+ "Acid Punk", //73
+ "Acid Jazz", //74
+ "Polka", //75
+ "Retro", //76
+ "Musical", //77
+ "Rock & Roll", //78
+ "Hard Rock", //79
+// following are winamp extentions
+ "Folk", //80
+ "Folk-Rock", //81
+ "National Folk", //82
+ "Swing", //83
+ "Fast Fusion", //84
+ "Bebob", //85
+ "Latin", //86
+ "Revival", //87
+ "Celtic", //88
+ "Bluegrass", //89
+ "Avantgarde", //90
+ "Gothic Rock", //91
+ "Progressive Rock", //92
+ "Psychedelic Rock", //93
+ "Symphonic Rock", //94
+ "Slow Rock", //95
+ "Big Band", //96
+ "Chorus", //97
+ "Easy Listening", //98
+ "Acoustic", //99
+ "Humour", //100
+ "Speech", //101
+ "Chanson", //102
+ "Opera", //103
+ "Chamber Music", //104
+ "Sonata", //105
+ "Symphony", //106
+ "Booty Bass", //107
+ "Primus", //108
+ "Porn Groove", //109
+ "Satire", //110
+ "Slow Jam", //111
+ "Club", //112
+ "Tango", //113
+ "Samba", //114
+ "Folklore", //115
+ "Ballad", //116
+ "Power Ballad", //117
+ "Rhythmic Soul", //118
+ "Freestyle", //119
+ "Duet", //120
+ "Punk Rock", //121
+ "Drum Solo", //122
+ "A capella", //123
+ "Euro-House", //124
+ "Dance Hall", //125
+ "Goa", //126
+ "Drum & Bass", //127
+ "Club-House", //128
+ "Hardcore", //129
+ "Terror", //130
+ "Indie", //131
+ "Britpop", //132
+ "Negerpunk", //133
+ "Polsk Punk", //134
+ "Beat", //135
+ "Christian Gangsta Rap", //136
+ "Heavy Metal", //137
+ "Black Metal", //138
+ "Crossover", //139
+ "Contemporary Christian",//140
+ "Christian Rock ", //141
+ "Merengue", //142
+ "Salsa", //143
+ "Trash Metal", //144
+ "Anime", //145
+ "JPop", //146
+ "Synthpop" //147
+};
+
+#define ID3_V1GENRE2DESCRIPTION(x) (x < ID3_NR_OF_V1_GENRES && x >= 0) ? ID3_v1_genre_description[x] : NULL
+
+#define MASK(bits) ((1 << (bits)) - 1)
+#define MASK1 MASK(1)
+#define MASK2 MASK(2)
+#define MASK3 MASK(3)
+#define MASK4 MASK(4)
+#define MASK5 MASK(5)
+#define MASK6 MASK(6)
+#define MASK7 MASK(7)
+#define MASK8 MASK(8)
+
+/*
+ * The following is borrowed from glib.h (http://www.gtk.org)
+ */
+#ifdef WIN32
+
+/* On native Win32, directory separator is the backslash, and search path
+ * separator is the semicolon.
+ */
+# define ID3_DIR_SEPARATOR '\\'
+# define ID3_DIR_SEPARATOR_S "\\"
+# define ID3_SEARCHPATH_SEPARATOR ';'
+# define ID3_SEARCHPATH_SEPARATOR_S ";"
+
+#else /* !WIN32 */
+
+# ifndef _EMX_
+/* Unix */
+
+# define ID3_DIR_SEPARATOR '/'
+# define ID3_DIR_SEPARATOR_S "/"
+# define ID3_SEARCHPATH_SEPARATOR ':'
+# define ID3_SEARCHPATH_SEPARATOR_S ":"
+
+# else
+/* EMX/OS2 */
+
+# define ID3_DIR_SEPARATOR '/'
+# define ID3_DIR_SEPARATOR_S "/"
+# define ID3_SEARCHPATH_SEPARATOR ';'
+# define ID3_SEARCHPATH_SEPARATOR_S ";"
+
+# endif
+
+#endif /* !WIN32 */
+
+#ifndef NULL
+# define NULL ((void*) 0)
+#endif
+
+#endif /* _ID3LIB_GLOBALS_H_ */
+
diff --git a/include/id3/helpers.h b/include/id3/helpers.h
new file mode 100644
index 0000000..95515eb
--- /dev/null
+++ b/include/id3/helpers.h
@@ -0,0 +1,109 @@
+// -*- C++ -*-
+// $Id: helpers.h,v 1.9 2002/07/02 22:10:45 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_HELPERS_H_
+#define _ID3LIB_HELPERS_H_
+
+#include "id3/id3lib_strings.h"
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+class ID3_TagImpl;
+class ID3_Frame;
+
+namespace dami
+{
+ namespace id3
+ {
+ namespace v2
+ {
+ ID3_C_EXPORT String getString(const ID3_Frame*, ID3_FieldID);
+ ID3_C_EXPORT String getStringAtIndex(const ID3_Frame*, ID3_FieldID, size_t);
+
+ ID3_C_EXPORT String getFrameText(const ID3_TagImpl&, ID3_FrameID);
+ ID3_C_EXPORT ID3_Frame* setFrameText(ID3_TagImpl&, ID3_FrameID, String);
+ ID3_C_EXPORT size_t removeFrames(ID3_TagImpl&, ID3_FrameID);
+
+ ID3_C_EXPORT ID3_Frame* hasArtist(const ID3_TagImpl&);
+ ID3_C_EXPORT String getArtist(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setArtist(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeArtists(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasAlbum(const ID3_TagImpl&);
+ ID3_C_EXPORT String getAlbum(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setAlbum(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeAlbums(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasTitle(const ID3_TagImpl&);
+ ID3_C_EXPORT String getTitle(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setTitle(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeTitles(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasYear(const ID3_TagImpl&);
+ ID3_C_EXPORT String getYear(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setYear(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeYears(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasV1Comment(const ID3_TagImpl&);
+ // ID3_C_EXPORT ID3_Frame* hasComment(const ID3_TagImpl&, String desc);
+ ID3_C_EXPORT ID3_Frame* hasComment(const ID3_TagImpl&);
+ ID3_C_EXPORT String getComment(const ID3_TagImpl&, String desc);
+ ID3_C_EXPORT String getV1Comment(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setComment(ID3_TagImpl&, String, String, String);
+ ID3_C_EXPORT size_t removeComments(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeAllComments(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasTrack(const ID3_TagImpl&);
+ ID3_C_EXPORT String getTrack(const ID3_TagImpl&);
+ ID3_C_EXPORT size_t getTrackNum(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setTrack(ID3_TagImpl&, uchar ucTrack, uchar ucTotal);
+ ID3_C_EXPORT size_t removeTracks(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasGenre(const ID3_TagImpl&);
+ ID3_C_EXPORT String getGenre(const ID3_TagImpl&);
+ ID3_C_EXPORT size_t getGenreNum(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setGenre(ID3_TagImpl&, size_t ucGenre);
+ ID3_C_EXPORT size_t removeGenres(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasLyrics(const ID3_TagImpl&);
+ ID3_C_EXPORT String getLyrics(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setLyrics(ID3_TagImpl&, String, String, String);
+ ID3_C_EXPORT size_t removeLyrics(ID3_TagImpl&);
+
+ ID3_C_EXPORT String getLyricist(const ID3_TagImpl&);
+ ID3_C_EXPORT ID3_Frame* setLyricist(ID3_TagImpl&, String);
+ ID3_C_EXPORT size_t removeLyricists(ID3_TagImpl&);
+
+ ID3_C_EXPORT ID3_Frame* hasSyncLyrics(const ID3_TagImpl&, String lang, String desc);
+ ID3_C_EXPORT ID3_Frame* setSyncLyrics(ID3_TagImpl&, BString, ID3_TimeStampFormat,
+ String, String, ID3_ContentType);
+ ID3_C_EXPORT BString getSyncLyrics(const ID3_TagImpl& tag, String lang, String desc);
+ };
+ };
+};
+
+#endif /* _ID3LIB_HELPERS_H_ */
+
diff --git a/include/id3/id3lib_bitset b/include/id3/id3lib_bitset
new file mode 100644
index 0000000..8b4f8b1
--- /dev/null
+++ b/include/id3/id3lib_bitset
@@ -0,0 +1,1066 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_BITSET
+#define __SGI_STL_BITSET
+
+// This implementation of bitset<> has a second template parameter,
+// _WordT, which defaults to unsigned long. *YOU SHOULD NOT USE
+// THIS FEATURE*. It is experimental, and it may be removed in
+// future releases.
+
+// A bitset of size N, using words of type _WordT, will have
+// N % (sizeof(_WordT) * CHAR_BIT) unused bits. (They are the high-
+// order bits in the highest word.) It is a class invariant
+// of class bitset<> that those unused bits are always zero.
+
+// Most of the actual code isn't contained in bitset<> itself, but in the
+// base class _Base_bitset. The base class works with whole words, not with
+// individual bits. This allows us to specialize _Base_bitset for the
+// important special case where the bitset is only a single word.
+
+// The C++ standard does not define the precise semantics of operator[].
+// In this implementation the const version of operator[] is equivalent
+// to test(), except that it does no range checking. The non-const version
+// returns a reference to a bit, again without doing any range checking.
+
+
+#include <stddef.h> // for size_t
+#include <limits.h> // for CHAR_BIT
+#include <string>
+#include <stdexcept> // for invalid_argument, out_of_range, overflow_error
+#include <iostream.h> // for istream, ostream
+
+#define __BITS_PER_WORDT(__wt) (CHAR_BIT*sizeof(__wt))
+#define __BITSET_WORDS(__n,__wt) \
+ ((__n) < 1 ? 1 : ((__n) + __BITS_PER_WORDT(__wt) - 1)/__BITS_PER_WORDT(__wt))
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1209
+#endif
+
+// structure to aid in counting bits
+template<bool __dummy>
+struct _Bit_count {
+ static unsigned char _S_bit_count[256];
+};
+
+// Mapping from 8 bit unsigned integers to the index of the first one
+// bit:
+template<bool __dummy>
+struct _First_one {
+ static unsigned char _S_first_one[256];
+};
+
+//
+// Base class: general case.
+//
+
+template<size_t _Nw, class _WordT>
+struct _Base_bitset {
+ _WordT _M_w[_Nw]; // 0 is the least significant word.
+
+ _Base_bitset( void ) { _M_do_reset(); }
+
+ _Base_bitset(unsigned long __val);
+
+ static size_t _S_whichword( size_t __pos ) {
+ return __pos / __BITS_PER_WORDT(_WordT);
+ }
+ static size_t _S_whichbyte( size_t __pos ) {
+ return (__pos % __BITS_PER_WORDT(_WordT)) / CHAR_BIT;
+ }
+ static size_t _S_whichbit( size_t __pos ) {
+ return __pos % __BITS_PER_WORDT(_WordT);
+ }
+ static _WordT _S_maskbit( size_t __pos ) {
+ return (static_cast<_WordT>(1)) << _S_whichbit(__pos);
+ }
+
+ _WordT& _M_getword(size_t __pos) { return _M_w[_S_whichword(__pos)]; }
+ _WordT _M_getword(size_t __pos) const { return _M_w[_S_whichword(__pos)]; }
+
+ _WordT& _M_hiword() { return _M_w[_Nw - 1]; }
+ _WordT _M_hiword() const { return _M_w[_Nw - 1]; }
+
+ void _M_do_and(const _Base_bitset<_Nw,_WordT>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] &= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_or(const _Base_bitset<_Nw,_WordT>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] |= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_xor(const _Base_bitset<_Nw,_WordT>& __x) {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] ^= __x._M_w[__i];
+ }
+ }
+
+ void _M_do_left_shift(size_t __shift);
+
+ void _M_do_right_shift(size_t __shift);
+
+ void _M_do_flip() {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] = ~_M_w[__i];
+ }
+ }
+
+ void _M_do_set() {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] = ~static_cast<_WordT>(0);
+ }
+ }
+
+ void _M_do_reset() {
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _M_w[__i] = 0;
+ }
+ }
+
+ bool _M_is_equal(const _Base_bitset<_Nw,_WordT>& __x) const {
+ for (size_t __i = 0; __i < _Nw; ++__i) {
+ if (_M_w[__i] != __x._M_w[__i])
+ return false;
+ }
+ return true;
+ }
+
+ bool _M_is_any() const {
+ for ( size_t __i = 0; __i < __BITSET_WORDS(_Nw,_WordT); __i++ ) {
+ if ( _M_w[__i] != static_cast<_WordT>(0) )
+ return true;
+ }
+ return false;
+ }
+
+ size_t _M_do_count() const {
+ size_t __result = 0;
+ const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
+ const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw);
+
+ while ( __byte_ptr < __end_ptr ) {
+ __result += _Bit_count<true>::_S_bit_count[*__byte_ptr];
+ __byte_ptr++;
+ }
+ return __result;
+ }
+
+ unsigned long _M_do_to_ulong() const;
+
+ // find first "on" bit
+ size_t _M_do_find_first(size_t __not_found) const;
+
+ // find the next "on" bit that follows "prev"
+ size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
+};
+
+//
+// Definitions of non-inline functions from _Base_bitset.
+//
+
+template<size_t _Nw, class _WordT>
+_Base_bitset<_Nw, _WordT>::_Base_bitset(unsigned long __val)
+{
+ _M_do_reset();
+ const size_t __n = min(sizeof(unsigned long)*CHAR_BIT,
+ __BITS_PER_WORDT(_WordT)*_Nw);
+ for(size_t __i = 0; __i < __n; ++__i, __val >>= 1)
+ if ( __val & 0x1 )
+ _M_getword(__i) |= _S_maskbit(__i);
+}
+
+template<size_t _Nw, class _WordT>
+void _Base_bitset<_Nw, _WordT>::_M_do_left_shift(size_t __shift)
+{
+ if (__shift != 0) {
+ const size_t __wshift = __shift / __BITS_PER_WORDT(_WordT);
+ const size_t __offset = __shift % __BITS_PER_WORDT(_WordT);
+ const size_t __sub_offset = __BITS_PER_WORDT(_WordT) - __offset;
+ size_t __n = _Nw - 1;
+ for ( ; __n > __wshift; --__n)
+ _M_w[__n] = (_M_w[__n - __wshift] << __offset) |
+ (_M_w[__n - __wshift - 1] >> __sub_offset);
+ if (__n == __wshift)
+ _M_w[__n] = _M_w[0] << __offset;
+ for (size_t __n1 = 0; __n1 < __n; ++__n1)
+ _M_w[__n1] = static_cast<_WordT>(0);
+ }
+}
+
+template<size_t _Nw, class _WordT>
+void _Base_bitset<_Nw, _WordT>::_M_do_right_shift(size_t __shift)
+{
+ if (__shift != 0) {
+ const size_t __wshift = __shift / __BITS_PER_WORDT(_WordT);
+ const size_t __offset = __shift % __BITS_PER_WORDT(_WordT);
+ const size_t __sub_offset = __BITS_PER_WORDT(_WordT) - __offset;
+ const size_t __limit = _Nw - __wshift - 1;
+ size_t __n = 0;
+ for ( ; __n < __limit; ++__n)
+ _M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
+ (_M_w[__n + __wshift + 1] << __sub_offset);
+ _M_w[__limit] = _M_w[_Nw-1] >> __offset;
+ for (size_t __n1 = __limit + 1; __n1 < _Nw; ++__n1)
+ _M_w[__n1] = static_cast<_WordT>(0);
+ }
+}
+
+template<size_t _Nw, class _WordT>
+unsigned long _Base_bitset<_Nw, _WordT>::_M_do_to_ulong() const
+{
+ const overflow_error __overflow("bitset");
+
+ if (sizeof(_WordT) >= sizeof(unsigned long)) {
+ for (size_t __i = 1; __i < _Nw; ++__i)
+ if (_M_w[__i])
+ __STL_THROW(__overflow);
+
+ const _WordT __mask = static_cast<_WordT>(static_cast<unsigned long>(-1));
+ if (_M_w[0] & ~__mask)
+ __STL_THROW(__overflow);
+
+ return static_cast<unsigned long>(_M_w[0] & __mask);
+ }
+ else { // sizeof(_WordT) < sizeof(unsigned long).
+ const size_t __nwords =
+ (sizeof(unsigned long) + sizeof(_WordT) - 1) / sizeof(_WordT);
+
+ size_t __min_nwords = __nwords;
+ if (_Nw > __nwords) {
+ for (size_t __i = __nwords; __i < _Nw; ++__i)
+ if (_M_w[__i])
+ __STL_THROW(__overflow);
+ }
+ else
+ __min_nwords = _Nw;
+
+ // If unsigned long is 8 bytes and _WordT is 6 bytes, then an unsigned
+ // long consists of all of one word plus 2 bytes from another word.
+ const size_t __part = sizeof(unsigned long) % sizeof(_WordT);
+
+ if (__part != 0 && __nwords <= _Nw &&
+ (_M_w[__min_nwords - 1] >> ((sizeof(_WordT) - __part) * CHAR_BIT)) != 0)
+ __STL_THROW(__overflow);
+
+ unsigned long __result = 0;
+ for (size_t __i = 0; __i < __min_nwords; ++__i) {
+ __result |= static_cast<unsigned long>(
+ _M_w[__i]) << (__i * sizeof(_WordT) * CHAR_BIT);
+ }
+ return __result;
+ }
+} // End _M_do_to_ulong
+
+template<size_t _Nw, class _WordT>
+size_t _Base_bitset<_Nw, _WordT>::_M_do_find_first(size_t __not_found) const
+{
+ for ( size_t __i = 0; __i < _Nw; __i++ ) {
+ _WordT __thisword = _M_w[__i];
+ if ( __thisword != static_cast<_WordT>(0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORDT(_WordT) + __j*CHAR_BIT +
+ _First_one<true>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ }
+ // not found, so return an indication of failure.
+ return __not_found;
+}
+
+template<size_t _Nw, class _WordT>
+size_t
+_Base_bitset<_Nw, _WordT>::_M_do_find_next(size_t __prev,
+ size_t __not_found) const
+{
+ // make bound inclusive
+ ++__prev;
+
+ // check out of bounds
+ if ( __prev >= _Nw * __BITS_PER_WORDT(_WordT) )
+ return __not_found;
+
+ // search first word
+ size_t __i = _S_whichword(__prev);
+ _WordT __thisword = _M_w[__i];
+
+ // mask off bits below bound
+ __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
+
+ if ( __thisword != static_cast<_WordT>(0) ) {
+ // find byte within word
+ // get first byte into place
+ __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+ for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORDT(_WordT) + __j*CHAR_BIT +
+ _First_one<true>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+
+ // check subsequent words
+ __i++;
+ for ( ; __i < _Nw; __i++ ) {
+ _WordT __thisword = _M_w[__i];
+ if ( __thisword != static_cast<_WordT>(0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
+ if ( __this_byte )
+ return __i*__BITS_PER_WORDT(_WordT) + __j*CHAR_BIT +
+ _First_one<true>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ }
+
+ // not found, so return an indication of failure.
+ return __not_found;
+} // end _M_do_find_next
+
+
+// ------------------------------------------------------------
+
+//
+// Base class: specialization for a single word.
+//
+
+template<class _WordT>
+struct _Base_bitset<1, _WordT> {
+ _WordT _M_w;
+
+ _Base_bitset( void ) { _M_do_reset(); }
+
+ _Base_bitset(unsigned long __val);
+
+ static size_t _S_whichword( size_t __pos ) {
+ return __pos / __BITS_PER_WORDT(_WordT);
+ }
+ static size_t _S_whichbyte( size_t __pos ) {
+ return (__pos % __BITS_PER_WORDT(_WordT)) / CHAR_BIT;
+ }
+ static size_t _S_whichbit( size_t __pos ) {
+ return __pos % __BITS_PER_WORDT(_WordT);
+ }
+ static _WordT _S_maskbit( size_t __pos ) {
+ return (static_cast<_WordT>(1)) << _S_whichbit(__pos);
+ }
+
+ _WordT& _M_getword(size_t) { return _M_w; }
+ _WordT _M_getword(size_t) const { return _M_w; }
+
+ _WordT& _M_hiword() { return _M_w; }
+ _WordT _M_hiword() const { return _M_w; }
+
+ void _M_do_and(const _Base_bitset<1,_WordT>& __x) { _M_w &= __x._M_w; }
+ void _M_do_or(const _Base_bitset<1,_WordT>& __x) { _M_w |= __x._M_w; }
+ void _M_do_xor(const _Base_bitset<1,_WordT>& __x) { _M_w ^= __x._M_w; }
+ void _M_do_left_shift(size_t __shift) { _M_w <<= __shift; }
+ void _M_do_right_shift(size_t __shift) { _M_w >>= __shift; }
+ void _M_do_flip() { _M_w = ~_M_w; }
+ void _M_do_set() { _M_w = ~static_cast<_WordT>(0); }
+ void _M_do_reset() { _M_w = 0; }
+
+ bool _M_is_equal(const _Base_bitset<1,_WordT>& __x) const {
+ return _M_w == __x._M_w;
+ }
+ bool _M_is_any() const {
+ return _M_w != 0;
+ }
+
+ size_t _M_do_count() const {
+ size_t __result = 0;
+ const unsigned char* __byte_ptr = (const unsigned char*)&_M_w;
+ const unsigned char* __end_ptr = ((const unsigned char*)&_M_w)+sizeof(_M_w);
+ while ( __byte_ptr < __end_ptr ) {
+ __result += _Bit_count<true>::_S_bit_count[*__byte_ptr];
+ __byte_ptr++;
+ }
+ return __result;
+ }
+
+ unsigned long _M_do_to_ulong() const {
+ if (sizeof(_WordT) <= sizeof(unsigned long))
+ return static_cast<unsigned long>(_M_w);
+ else {
+ const _WordT __mask = static_cast<_WordT>(static_cast<unsigned long>(-1));
+ if (_M_w & ~__mask)
+ __STL_THROW(overflow_error("bitset"));
+ return static_cast<unsigned long>(_M_w);
+ }
+ }
+
+ size_t _M_do_find_first(size_t __not_found) const;
+
+ // find the next "on" bit that follows "prev"
+ size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
+
+};
+
+//
+// Definitions of non-inline functions from the single-word version of
+// _Base_bitset.
+//
+
+template <class _WordT>
+_Base_bitset<1, _WordT>::_Base_bitset(unsigned long __val)
+{
+ _M_do_reset();
+ const size_t __n = min(sizeof(unsigned long)*CHAR_BIT,
+ __BITS_PER_WORDT(_WordT)*_Nw);
+ for(size_t __i = 0; __i < __n; ++__i, __val >>= 1)
+ if ( __val & 0x1 )
+ _M_w |= _S_maskbit(__i);
+}
+
+template <class _WordT>
+size_t _Base_bitset<1, _WordT>::_M_do_find_first(size_t __not_found) const
+{
+ _WordT __thisword = _M_w;
+
+ if ( __thisword != static_cast<_WordT>(0) ) {
+ // find byte within word
+ for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
+ if ( __this_byte )
+ return __j*CHAR_BIT + _First_one<true>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+ // not found, so return a value that indicates failure.
+ return __not_found;
+}
+
+template <class _WordT>
+size_t
+_Base_bitset<1, _WordT>::_M_do_find_next(size_t __prev,
+ size_t __not_found ) const
+{
+ // make bound inclusive
+ ++__prev;
+
+ // check out of bounds
+ if ( __prev >= __BITS_PER_WORDT(_WordT) )
+ return __not_found;
+
+ // search first (and only) word
+ _WordT __thisword = _M_w;
+
+ // mask off bits below bound
+ __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev);
+
+ if ( __thisword != static_cast<_WordT>(0) ) {
+ // find byte within word
+ // get first byte into place
+ __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+ for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+ unsigned char __this_byte
+ = static_cast<unsigned char>(__thisword & (~(unsigned char)0));
+ if ( __this_byte )
+ return __j*CHAR_BIT + _First_one<true>::_S_first_one[__this_byte];
+
+ __thisword >>= CHAR_BIT;
+ }
+ }
+
+ // not found, so return a value that indicates failure.
+ return __not_found;
+} // end _M_do_find_next
+
+//
+// One last specialization: _M_do_to_ulong() and the constructor from
+// unsigned long are very simple if the bitset consists of a single
+// word of type unsigned long.
+//
+
+template<>
+inline unsigned long
+_Base_bitset<1, unsigned long>::_M_do_to_ulong() const { return _M_w; }
+
+template<>
+inline _Base_bitset<1, unsigned long>::_Base_bitset(unsigned long __val) {
+ _M_w = __val;
+}
+
+
+// ------------------------------------------------------------
+// Helper class to zero out the unused high-order bits in the highest word.
+
+template <class _WordT, size_t _Extrabits> struct _Sanitize {
+ static void _M_do_sanitize(_WordT& __val)
+ { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); }
+};
+
+template <class _WordT> struct _Sanitize<_WordT, 0> {
+ static void _M_do_sanitize(_WordT) {}
+};
+
+// ------------------------------------------------------------
+// Class bitset.
+// _Nb may be any nonzero number of type size_t.
+// Type _WordT may be any unsigned integral type.
+
+template<size_t _Nb, class _WordT = unsigned long>
+class bitset : private _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT>
+{
+private:
+ typedef _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT> _Base;
+
+ // Import base's protected interface. Necessary because of new template
+ // name resolution rules.
+ using _Base::_S_whichword;
+ using _Base::_S_whichbyte;
+ using _Base::_S_whichbit;
+ using _Base::_S_maskbit;
+ using _Base::_M_getword;
+ using _Base::_M_hiword;
+ using _Base::_M_do_and;
+ using _Base::_M_do_or;
+ using _Base::_M_do_xor;
+ using _Base::_M_do_left_shift;
+ using _Base::_M_do_right_shift;
+ using _Base::_M_do_flip;
+ using _Base::_M_do_set;
+ using _Base::_M_do_reset;
+ using _Base::_M_is_equal;
+ using _Base::_M_is_any;
+ using _Base::_M_do_count;
+ using _Base::_M_do_to_ulong;
+ using _Base::_M_do_find_first;
+ using _Base::_M_do_find_next;
+
+private:
+ void _M_do_sanitize() {
+ _Sanitize<_WordT,_Nb%__BITS_PER_WORDT(_WordT) >
+ ::_M_do_sanitize(_M_hiword());
+ }
+
+public:
+
+ // bit reference:
+ class reference;
+ friend class reference;
+ class reference {
+ friend class bitset;
+
+ _WordT *_M_wp;
+ size_t _M_bpos;
+
+ // left undefined
+ reference();
+
+ reference( bitset& __b, size_t __pos ) {
+ _M_wp = &__b._M_getword(__pos);
+ _M_bpos = _S_whichbit(__pos);
+ }
+
+ public:
+ ~reference() {}
+
+ // for b[i] = __x;
+ reference& operator=(bool __x) {
+ if ( __x )
+ *_M_wp |= _S_maskbit(_M_bpos);
+ else
+ *_M_wp &= ~_S_maskbit(_M_bpos);
+
+ return *this;
+ }
+
+ // for b[i] = b[__j];
+ reference& operator=(const reference& __j) {
+ if ( (*(__j._M_wp) & _S_maskbit(__j._M_bpos)) )
+ *_M_wp |= _S_maskbit(_M_bpos);
+ else
+ *_M_wp &= ~_S_maskbit(_M_bpos);
+
+ return *this;
+ }
+
+ // flips the bit
+ bool operator~() const { return (*(_M_wp) & _S_maskbit(_M_bpos)) == 0; }
+
+ // for __x = b[i];
+ operator bool() const { return (*(_M_wp) & _S_maskbit(_M_bpos)) != 0; }
+
+ // for b[i].flip();
+ reference& flip() {
+ *_M_wp ^= _S_maskbit(_M_bpos);
+ return *this;
+ }
+ };
+
+ // 23.3.5.1 constructors:
+ bitset() {}
+ bitset(unsigned long __val) :
+ _Base_bitset<__BITSET_WORDS(_Nb,_WordT), _WordT>(__val) {}
+
+ template<class _CharT, class _Traits, class _Alloc>
+ explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ size_t __pos = 0,
+ size_t __n = size_t(basic_string<_CharT,_Traits,_Alloc>::npos))
+ : _Base()
+ {
+ if (__pos > __s.size())
+ __STL_THROW(out_of_range("bitset"));
+ _M_copy_from_string(__s, __pos, __n);
+ }
+
+ // 23.3.5.2 bitset operations:
+ bitset<_Nb,_WordT>& operator&=(const bitset<_Nb,_WordT>& __rhs) {
+ _M_do_and(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& operator|=(const bitset<_Nb,_WordT>& __rhs) {
+ _M_do_or(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& operator^=(const bitset<_Nb,_WordT>& __rhs) {
+ _M_do_xor(__rhs);
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& operator<<=(size_t __pos) {
+ _M_do_left_shift(__pos);
+ _M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& operator>>=(size_t __pos) {
+ _M_do_right_shift(__pos);
+ _M_do_sanitize();
+ return *this;
+ }
+
+ //
+ // Extension:
+ // Versions of single-bit set, reset, flip, test with no range checking.
+ //
+
+ bitset<_Nb,_WordT>& _Unchecked_set(size_t __pos) {
+ _M_getword(__pos) |= _S_maskbit(__pos);
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& _Unchecked_set(size_t __pos, int __val) {
+ if (__val)
+ _M_getword(__pos) |= _S_maskbit(__pos);
+ else
+ _M_getword(__pos) &= ~_S_maskbit(__pos);
+
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& _Unchecked_reset(size_t __pos) {
+ _M_getword(__pos) &= ~_S_maskbit(__pos);
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& _Unchecked_flip(size_t __pos) {
+ _M_getword(__pos) ^= _S_maskbit(__pos);
+ return *this;
+ }
+
+ bool _Unchecked_test(size_t __pos) const {
+ return (_M_getword(__pos) & _S_maskbit(__pos)) != static_cast<_WordT>(0);
+ }
+
+ // Set, reset, and flip.
+
+ bitset<_Nb,_WordT>& set() {
+ _M_do_set();
+ _M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& set(size_t __pos) {
+ if (__pos >= _Nb)
+ __STL_THROW(out_of_range("bitset"));
+
+ return _Unchecked_set(__pos);
+ }
+
+ bitset<_Nb,_WordT>& set(size_t __pos, int __val) {
+ if (__pos >= _Nb)
+ __STL_THROW(out_of_range("bitset"));
+
+ return _Unchecked_set(__pos, __val);
+ }
+
+ bitset<_Nb,_WordT>& reset() {
+ _M_do_reset();
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& reset(size_t __pos) {
+ if (__pos >= _Nb)
+ __STL_THROW(out_of_range("bitset"));
+
+ return _Unchecked_reset(__pos);
+ }
+
+ bitset<_Nb,_WordT>& flip() {
+ _M_do_flip();
+ _M_do_sanitize();
+ return *this;
+ }
+
+ bitset<_Nb,_WordT>& flip(size_t __pos) {
+ if (__pos >= _Nb)
+ __STL_THROW(out_of_range("bitset"));
+
+ return _Unchecked_flip(__pos);
+ }
+
+ bitset<_Nb,_WordT> operator~() const {
+ return bitset<_Nb,_WordT>(*this).flip();
+ }
+
+ // element access:
+ //for b[i];
+ reference operator[](size_t __pos) { return reference(*this,__pos); }
+ bool operator[](size_t __pos) const { return _Unchecked_test(__pos); }
+
+ unsigned long to_ulong() const { return _M_do_to_ulong(); }
+
+#ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
+ template <class _CharT, class _Traits, class _Alloc>
+ basic_string<_CharT, _Traits, _Alloc> to_string() const {
+ basic_string<_CharT, _Traits, _Alloc> __result;
+ _M_copy_to_string(__result);
+ return __result;
+ }
+#endif /* __STL_EXPLICIT_FUNCTION_TMPL_ARGS */
+
+ // Helper functions for string operations.
+ template<class _CharT, class _Traits, class _Alloc>
+ void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ size_t,
+ size_t);
+
+ // Helper functions for string operations.
+ template<class _CharT, class _Traits, class _Alloc>
+ void _M_copy_to_string(basic_string<_CharT,_Traits,_Alloc>&) const;
+
+ size_t count() const { return _M_do_count(); }
+
+ size_t size() const { return _Nb; }
+
+ bool operator==(const bitset<_Nb,_WordT>& __rhs) const {
+ return _M_is_equal(__rhs);
+ }
+ bool operator!=(const bitset<_Nb,_WordT>& __rhs) const {
+ return !_M_is_equal(__rhs);
+ }
+
+ bool test(size_t __pos) const {
+ if (__pos > _Nb)
+ __STL_THROW(out_of_range("bitset"));
+
+ return _Unchecked_test(__pos);
+ }
+
+ bool any() const { return _M_is_any(); }
+ bool none() const { return !_M_is_any(); }
+
+ bitset<_Nb,_WordT> operator<<(size_t __pos) const
+ { return bitset<_Nb,_WordT>(*this) <<= __pos; }
+ bitset<_Nb,_WordT> operator>>(size_t __pos) const
+ { return bitset<_Nb,_WordT>(*this) >>= __pos; }
+
+ //
+ // EXTENSIONS: bit-find operations. These operations are
+ // experimental, and are subject to change or removal in future
+ // versions.
+ //
+
+ // find the index of the first "on" bit
+ size_t _Find_first() const
+ { return _M_do_find_first(_Nb); }
+
+ // find the index of the next "on" bit after prev
+ size_t _Find_next( size_t __prev ) const
+ { return _M_do_find_next(__prev, _Nb); }
+
+};
+
+//
+// Definitions of non-inline member functions.
+//
+
+template <size_t _Nb, class _WordT>
+template<class _CharT, class _Traits, class _Alloc>
+void bitset<_Nb, _WordT>
+ ::_M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
+ size_t __pos,
+ size_t __n)
+{
+ reset();
+ const size_t __nbits = min(_Nb, min(__n, __s.size() - __pos));
+ for (size_t __i = 0; __i < __nbits; ++__i) {
+ switch(__s[__pos + __nbits - __i - 1]) {
+ case '0':
+ break;
+ case '1':
+ set(__i);
+ break;
+ default:
+ __STL_THROW(invalid_argument("bitset"));
+ }
+ }
+}
+
+template <size_t _Nb, class _WordT>
+template <class _CharT, class _Traits, class _Alloc>
+void bitset<_Nb, _WordT>
+ ::_M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
+{
+ __s.assign(_Nb, '0');
+
+ for (size_t __i = 0; __i < _Nb; ++__i)
+ if (_Unchecked_test(__i))
+ __s[_Nb - 1 - __i] = '1';
+}
+
+// ------------------------------------------------------------
+
+//
+// 23.3.5.3 bitset operations:
+//
+
+template <size_t _Nb, class _WordT>
+inline bitset<_Nb,_WordT> operator&(const bitset<_Nb,_WordT>& __x,
+ const bitset<_Nb,_WordT>& __y) {
+ bitset<_Nb,_WordT> __result(__x);
+ __result &= __y;
+ return __result;
+}
+
+
+template <size_t _Nb, class _WordT>
+inline bitset<_Nb,_WordT> operator|(const bitset<_Nb,_WordT>& __x,
+ const bitset<_Nb,_WordT>& __y) {
+ bitset<_Nb,_WordT> __result(__x);
+ __result |= __y;
+ return __result;
+}
+
+template <size_t _Nb, class _WordT>
+inline bitset<_Nb,_WordT> operator^(const bitset<_Nb,_WordT>& __x,
+ const bitset<_Nb,_WordT>& __y) {
+ bitset<_Nb,_WordT> __result(__x);
+ __result ^= __y;
+ return __result;
+}
+
+// NOTE: these must be rewritten once we have templatized iostreams.
+
+template <size_t _Nb, class _WordT>
+istream&
+operator>>(istream& __is, bitset<_Nb,_WordT>& __x) {
+ string __tmp;
+ __tmp.reserve(_Nb);
+
+ // In new templatized iostreams, use istream::sentry
+ if (__is.flags() & ios::skipws) {
+ char __c;
+ do
+ __is.get(__c);
+ while (__is && isspace(__c));
+ if (__is)
+ __is.putback(__c);
+ }
+
+ for (size_t __i = 0; __i < _Nb; ++__i) {
+ char __c;
+ __is.get(__c);
+
+ if (!__is)
+ break;
+ else if (__c != '0' && __c != '1') {
+ __is.putback(__c);
+ break;
+ }
+ else
+ __tmp.push_back(__c);
+ }
+
+ if (__tmp.empty())
+ __is.clear(__is.rdstate() | ios::failbit);
+ else
+ __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb);
+
+ return __is;
+}
+
+template <size_t _Nb, class _WordT>
+ostream& operator<<(ostream& __os, const bitset<_Nb,_WordT>& __x) {
+ string __tmp;
+ __x._M_copy_to_string(__tmp);
+ return __os << __tmp;
+}
+
+// ------------------------------------------------------------
+// Lookup tables for find and count operations.
+
+template<bool __dummy>
+unsigned char _Bit_count<__dummy>::_S_bit_count[] = {
+ 0, /* 0 */ 1, /* 1 */ 1, /* 2 */ 2, /* 3 */ 1, /* 4 */
+ 2, /* 5 */ 2, /* 6 */ 3, /* 7 */ 1, /* 8 */ 2, /* 9 */
+ 2, /* 10 */ 3, /* 11 */ 2, /* 12 */ 3, /* 13 */ 3, /* 14 */
+ 4, /* 15 */ 1, /* 16 */ 2, /* 17 */ 2, /* 18 */ 3, /* 19 */
+ 2, /* 20 */ 3, /* 21 */ 3, /* 22 */ 4, /* 23 */ 2, /* 24 */
+ 3, /* 25 */ 3, /* 26 */ 4, /* 27 */ 3, /* 28 */ 4, /* 29 */
+ 4, /* 30 */ 5, /* 31 */ 1, /* 32 */ 2, /* 33 */ 2, /* 34 */
+ 3, /* 35 */ 2, /* 36 */ 3, /* 37 */ 3, /* 38 */ 4, /* 39 */
+ 2, /* 40 */ 3, /* 41 */ 3, /* 42 */ 4, /* 43 */ 3, /* 44 */
+ 4, /* 45 */ 4, /* 46 */ 5, /* 47 */ 2, /* 48 */ 3, /* 49 */
+ 3, /* 50 */ 4, /* 51 */ 3, /* 52 */ 4, /* 53 */ 4, /* 54 */
+ 5, /* 55 */ 3, /* 56 */ 4, /* 57 */ 4, /* 58 */ 5, /* 59 */
+ 4, /* 60 */ 5, /* 61 */ 5, /* 62 */ 6, /* 63 */ 1, /* 64 */
+ 2, /* 65 */ 2, /* 66 */ 3, /* 67 */ 2, /* 68 */ 3, /* 69 */
+ 3, /* 70 */ 4, /* 71 */ 2, /* 72 */ 3, /* 73 */ 3, /* 74 */
+ 4, /* 75 */ 3, /* 76 */ 4, /* 77 */ 4, /* 78 */ 5, /* 79 */
+ 2, /* 80 */ 3, /* 81 */ 3, /* 82 */ 4, /* 83 */ 3, /* 84 */
+ 4, /* 85 */ 4, /* 86 */ 5, /* 87 */ 3, /* 88 */ 4, /* 89 */
+ 4, /* 90 */ 5, /* 91 */ 4, /* 92 */ 5, /* 93 */ 5, /* 94 */
+ 6, /* 95 */ 2, /* 96 */ 3, /* 97 */ 3, /* 98 */ 4, /* 99 */
+ 3, /* 100 */ 4, /* 101 */ 4, /* 102 */ 5, /* 103 */ 3, /* 104 */
+ 4, /* 105 */ 4, /* 106 */ 5, /* 107 */ 4, /* 108 */ 5, /* 109 */
+ 5, /* 110 */ 6, /* 111 */ 3, /* 112 */ 4, /* 113 */ 4, /* 114 */
+ 5, /* 115 */ 4, /* 116 */ 5, /* 117 */ 5, /* 118 */ 6, /* 119 */
+ 4, /* 120 */ 5, /* 121 */ 5, /* 122 */ 6, /* 123 */ 5, /* 124 */
+ 6, /* 125 */ 6, /* 126 */ 7, /* 127 */ 1, /* 128 */ 2, /* 129 */
+ 2, /* 130 */ 3, /* 131 */ 2, /* 132 */ 3, /* 133 */ 3, /* 134 */
+ 4, /* 135 */ 2, /* 136 */ 3, /* 137 */ 3, /* 138 */ 4, /* 139 */
+ 3, /* 140 */ 4, /* 141 */ 4, /* 142 */ 5, /* 143 */ 2, /* 144 */
+ 3, /* 145 */ 3, /* 146 */ 4, /* 147 */ 3, /* 148 */ 4, /* 149 */
+ 4, /* 150 */ 5, /* 151 */ 3, /* 152 */ 4, /* 153 */ 4, /* 154 */
+ 5, /* 155 */ 4, /* 156 */ 5, /* 157 */ 5, /* 158 */ 6, /* 159 */
+ 2, /* 160 */ 3, /* 161 */ 3, /* 162 */ 4, /* 163 */ 3, /* 164 */
+ 4, /* 165 */ 4, /* 166 */ 5, /* 167 */ 3, /* 168 */ 4, /* 169 */
+ 4, /* 170 */ 5, /* 171 */ 4, /* 172 */ 5, /* 173 */ 5, /* 174 */
+ 6, /* 175 */ 3, /* 176 */ 4, /* 177 */ 4, /* 178 */ 5, /* 179 */
+ 4, /* 180 */ 5, /* 181 */ 5, /* 182 */ 6, /* 183 */ 4, /* 184 */
+ 5, /* 185 */ 5, /* 186 */ 6, /* 187 */ 5, /* 188 */ 6, /* 189 */
+ 6, /* 190 */ 7, /* 191 */ 2, /* 192 */ 3, /* 193 */ 3, /* 194 */
+ 4, /* 195 */ 3, /* 196 */ 4, /* 197 */ 4, /* 198 */ 5, /* 199 */
+ 3, /* 200 */ 4, /* 201 */ 4, /* 202 */ 5, /* 203 */ 4, /* 204 */
+ 5, /* 205 */ 5, /* 206 */ 6, /* 207 */ 3, /* 208 */ 4, /* 209 */
+ 4, /* 210 */ 5, /* 211 */ 4, /* 212 */ 5, /* 213 */ 5, /* 214 */
+ 6, /* 215 */ 4, /* 216 */ 5, /* 217 */ 5, /* 218 */ 6, /* 219 */
+ 5, /* 220 */ 6, /* 221 */ 6, /* 222 */ 7, /* 223 */ 3, /* 224 */
+ 4, /* 225 */ 4, /* 226 */ 5, /* 227 */ 4, /* 228 */ 5, /* 229 */
+ 5, /* 230 */ 6, /* 231 */ 4, /* 232 */ 5, /* 233 */ 5, /* 234 */
+ 6, /* 235 */ 5, /* 236 */ 6, /* 237 */ 6, /* 238 */ 7, /* 239 */
+ 4, /* 240 */ 5, /* 241 */ 5, /* 242 */ 6, /* 243 */ 5, /* 244 */
+ 6, /* 245 */ 6, /* 246 */ 7, /* 247 */ 5, /* 248 */ 6, /* 249 */
+ 6, /* 250 */ 7, /* 251 */ 6, /* 252 */ 7, /* 253 */ 7, /* 254 */
+ 8 /* 255 */
+}; // end _Bit_count
+
+template<bool __dummy>
+unsigned char _First_one<__dummy>::_S_first_one[] = {
+ 0, /* 0 */ 0, /* 1 */ 1, /* 2 */ 0, /* 3 */ 2, /* 4 */
+ 0, /* 5 */ 1, /* 6 */ 0, /* 7 */ 3, /* 8 */ 0, /* 9 */
+ 1, /* 10 */ 0, /* 11 */ 2, /* 12 */ 0, /* 13 */ 1, /* 14 */
+ 0, /* 15 */ 4, /* 16 */ 0, /* 17 */ 1, /* 18 */ 0, /* 19 */
+ 2, /* 20 */ 0, /* 21 */ 1, /* 22 */ 0, /* 23 */ 3, /* 24 */
+ 0, /* 25 */ 1, /* 26 */ 0, /* 27 */ 2, /* 28 */ 0, /* 29 */
+ 1, /* 30 */ 0, /* 31 */ 5, /* 32 */ 0, /* 33 */ 1, /* 34 */
+ 0, /* 35 */ 2, /* 36 */ 0, /* 37 */ 1, /* 38 */ 0, /* 39 */
+ 3, /* 40 */ 0, /* 41 */ 1, /* 42 */ 0, /* 43 */ 2, /* 44 */
+ 0, /* 45 */ 1, /* 46 */ 0, /* 47 */ 4, /* 48 */ 0, /* 49 */
+ 1, /* 50 */ 0, /* 51 */ 2, /* 52 */ 0, /* 53 */ 1, /* 54 */
+ 0, /* 55 */ 3, /* 56 */ 0, /* 57 */ 1, /* 58 */ 0, /* 59 */
+ 2, /* 60 */ 0, /* 61 */ 1, /* 62 */ 0, /* 63 */ 6, /* 64 */
+ 0, /* 65 */ 1, /* 66 */ 0, /* 67 */ 2, /* 68 */ 0, /* 69 */
+ 1, /* 70 */ 0, /* 71 */ 3, /* 72 */ 0, /* 73 */ 1, /* 74 */
+ 0, /* 75 */ 2, /* 76 */ 0, /* 77 */ 1, /* 78 */ 0, /* 79 */
+ 4, /* 80 */ 0, /* 81 */ 1, /* 82 */ 0, /* 83 */ 2, /* 84 */
+ 0, /* 85 */ 1, /* 86 */ 0, /* 87 */ 3, /* 88 */ 0, /* 89 */
+ 1, /* 90 */ 0, /* 91 */ 2, /* 92 */ 0, /* 93 */ 1, /* 94 */
+ 0, /* 95 */ 5, /* 96 */ 0, /* 97 */ 1, /* 98 */ 0, /* 99 */
+ 2, /* 100 */ 0, /* 101 */ 1, /* 102 */ 0, /* 103 */ 3, /* 104 */
+ 0, /* 105 */ 1, /* 106 */ 0, /* 107 */ 2, /* 108 */ 0, /* 109 */
+ 1, /* 110 */ 0, /* 111 */ 4, /* 112 */ 0, /* 113 */ 1, /* 114 */
+ 0, /* 115 */ 2, /* 116 */ 0, /* 117 */ 1, /* 118 */ 0, /* 119 */
+ 3, /* 120 */ 0, /* 121 */ 1, /* 122 */ 0, /* 123 */ 2, /* 124 */
+ 0, /* 125 */ 1, /* 126 */ 0, /* 127 */ 7, /* 128 */ 0, /* 129 */
+ 1, /* 130 */ 0, /* 131 */ 2, /* 132 */ 0, /* 133 */ 1, /* 134 */
+ 0, /* 135 */ 3, /* 136 */ 0, /* 137 */ 1, /* 138 */ 0, /* 139 */
+ 2, /* 140 */ 0, /* 141 */ 1, /* 142 */ 0, /* 143 */ 4, /* 144 */
+ 0, /* 145 */ 1, /* 146 */ 0, /* 147 */ 2, /* 148 */ 0, /* 149 */
+ 1, /* 150 */ 0, /* 151 */ 3, /* 152 */ 0, /* 153 */ 1, /* 154 */
+ 0, /* 155 */ 2, /* 156 */ 0, /* 157 */ 1, /* 158 */ 0, /* 159 */
+ 5, /* 160 */ 0, /* 161 */ 1, /* 162 */ 0, /* 163 */ 2, /* 164 */
+ 0, /* 165 */ 1, /* 166 */ 0, /* 167 */ 3, /* 168 */ 0, /* 169 */
+ 1, /* 170 */ 0, /* 171 */ 2, /* 172 */ 0, /* 173 */ 1, /* 174 */
+ 0, /* 175 */ 4, /* 176 */ 0, /* 177 */ 1, /* 178 */ 0, /* 179 */
+ 2, /* 180 */ 0, /* 181 */ 1, /* 182 */ 0, /* 183 */ 3, /* 184 */
+ 0, /* 185 */ 1, /* 186 */ 0, /* 187 */ 2, /* 188 */ 0, /* 189 */
+ 1, /* 190 */ 0, /* 191 */ 6, /* 192 */ 0, /* 193 */ 1, /* 194 */
+ 0, /* 195 */ 2, /* 196 */ 0, /* 197 */ 1, /* 198 */ 0, /* 199 */
+ 3, /* 200 */ 0, /* 201 */ 1, /* 202 */ 0, /* 203 */ 2, /* 204 */
+ 0, /* 205 */ 1, /* 206 */ 0, /* 207 */ 4, /* 208 */ 0, /* 209 */
+ 1, /* 210 */ 0, /* 211 */ 2, /* 212 */ 0, /* 213 */ 1, /* 214 */
+ 0, /* 215 */ 3, /* 216 */ 0, /* 217 */ 1, /* 218 */ 0, /* 219 */
+ 2, /* 220 */ 0, /* 221 */ 1, /* 222 */ 0, /* 223 */ 5, /* 224 */
+ 0, /* 225 */ 1, /* 226 */ 0, /* 227 */ 2, /* 228 */ 0, /* 229 */
+ 1, /* 230 */ 0, /* 231 */ 3, /* 232 */ 0, /* 233 */ 1, /* 234 */
+ 0, /* 235 */ 2, /* 236 */ 0, /* 237 */ 1, /* 238 */ 0, /* 239 */
+ 4, /* 240 */ 0, /* 241 */ 1, /* 242 */ 0, /* 243 */ 2, /* 244 */
+ 0, /* 245 */ 1, /* 246 */ 0, /* 247 */ 3, /* 248 */ 0, /* 249 */
+ 1, /* 250 */ 0, /* 251 */ 2, /* 252 */ 0, /* 253 */ 1, /* 254 */
+ 0, /* 255 */
+}; // end _First_one
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1209
+#endif
+
+__STL_END_NAMESPACE
+
+
+#undef __BITS_PER_WORDT
+#undef __BITSET_WORDS
+
+#endif /* __SGI_STL_BITSET */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/include/id3/id3lib_frame.h b/include/id3/id3lib_frame.h
new file mode 100644
index 0000000..dca2f62
--- /dev/null
+++ b/include/id3/id3lib_frame.h
@@ -0,0 +1,105 @@
+// -*- C++ -*-
+// $Id: id3lib_frame.h,v 1.1 2002/08/10 10:55:47 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FRAME_H_
+#define _ID3LIB_FRAME_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+class ID3_Field;
+class ID3_FrameImpl;
+class ID3_Reader;
+class ID3_Writer;
+
+class ID3_CPP_EXPORT ID3_Frame
+{
+ ID3_FrameImpl* _impl;
+public:
+
+ class Iterator
+ {
+ public:
+ virtual ID3_Field* GetNext() = 0;
+ virtual ~Iterator() { } //Klenotic - Added by id3lib-3.8.3-VC8_AddFrame_Crash_Fix patch.
+ };
+
+ class ConstIterator
+ {
+ public:
+ virtual const ID3_Field* GetNext() = 0;
+ virtual ~ConstIterator() { } //Klenotic - Added by id3lib-3.8.3-VC8_AddFrame_Crash_Fix patch.
+ };
+
+public:
+ ID3_Frame(ID3_FrameID id = ID3FID_NOFRAME);
+ ID3_Frame(const ID3_Frame&);
+
+ virtual ~ID3_Frame();
+
+ void Clear();
+
+ bool SetID(ID3_FrameID id);
+ ID3_FrameID GetID() const;
+
+ ID3_Field* GetField(ID3_FieldID name) const;
+
+ size_t NumFields() const;
+
+ const char* GetDescription() const;
+ static const char* GetDescription(ID3_FrameID);
+
+ const char* GetTextID() const;
+
+ ID3_Frame& operator=(const ID3_Frame &);
+ bool HasChanged() const;
+ bool Parse(ID3_Reader&);
+ void Render(ID3_Writer&) const;
+ size_t Size();
+ bool Contains(ID3_FieldID fld) const;
+ bool SetSpec(ID3_V2Spec);
+ ID3_V2Spec GetSpec() const;
+
+ bool SetCompression(bool b);
+ bool GetCompression() const;
+ size_t GetDataSize() const;
+
+ bool SetEncryptionID(uchar id);
+ uchar GetEncryptionID() const;
+
+ bool SetGroupingID(uchar id);
+ uchar GetGroupingID() const;
+
+ Iterator* CreateIterator();
+ ConstIterator* CreateIterator() const;
+
+ // Deprecated
+ ID3_Field& Field(ID3_FieldID name) const;
+ //ID3_Field* GetFieldNum(size_t) const;
+};
+
+#endif /* _ID3LIB_FRAME_H_ */
+
diff --git a/include/id3/id3lib_streams.h b/include/id3/id3lib_streams.h
new file mode 100644
index 0000000..7ddd156
--- /dev/null
+++ b/include/id3/id3lib_streams.h
@@ -0,0 +1,43 @@
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 2002 Thijmen Klok
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef STREAMS_H_DEFINE
+#define STREAMS_H_DEFINE
+#include <fstream>
+#include <iostream>
+#include <iosfwd>
+
+using std::ifstream;
+using std::ofstream;
+using std::fstream;
+
+using std::iostream;
+using std::ostream;
+using std::istream;
+using std::ios;
+
+using std::streamoff;
+
+#endif // STREAMS_H_DEFINE
+
diff --git a/include/id3/id3lib_strings.h b/include/id3/id3lib_strings.h
new file mode 100644
index 0000000..044599d
--- /dev/null
+++ b/include/id3/id3lib_strings.h
@@ -0,0 +1,204 @@
+// -*- C++ -*-
+// $Id: id3lib_strings.h,v 1.4 2003/03/02 13:56:21 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_STRINGS_H_
+#define _ID3LIB_STRINGS_H_
+
+#include <string>
+#include <cstring>
+
+#if (defined(__GNUC__) && (__GNUC__ >= 3) || (defined(_MSC_VER) && _MSC_VER > 1000))
+namespace std
+{
+ template<>
+ struct char_traits<unsigned char>
+ {
+ typedef unsigned char char_type;
+ // Unsigned as wint_t in unsigned.
+ typedef unsigned long int_type;
+ typedef streampos pos_type;
+ typedef streamoff off_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ {
+ for (size_t __i = 0; __i < __n; ++__i)
+ if (!eq(__s1[__i], __s2[__i]))
+ return lt(__s1[__i], __s2[__i]) ? -1 : 1;
+ return 0;
+ }
+
+ static size_t
+ length(const char_type* __s)
+ {
+ const char_type* __p = __s;
+ while (__p)
+ ++__p;
+ return (__p - __s);
+ }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ {
+ for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
+ if (*__p == __a) return __p;
+ return 0;
+ }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ {
+ for (char_type* __p = __s; __p < __s + __n; ++__p)
+ assign(*__p, __a);
+ return __s;
+ }
+
+ static char_type
+ to_char_type(const int_type& __c)
+ { return char_type(); }
+
+ static int_type
+ to_int_type(const char_type& __c) { return int_type(); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static int_type
+ eof() { return static_cast<int_type>(-1); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
+ };
+
+#ifndef _GLIBCPP_USE_WCHAR_T
+#if (defined(ID3_NEED_WCHAR_TEMPLATE))
+ template<>
+ struct char_traits<wchar_t>
+ {
+ typedef wchar_t char_type;
+ typedef wint_t int_type;
+ typedef streamoff off_type;
+ typedef streampos pos_type;
+ typedef mbstate_t state_type;
+
+ static void
+ assign(char_type& __c1, const char_type& __c2)
+ { __c1 = __c2; }
+
+ static bool
+ eq(const char_type& __c1, const char_type& __c2)
+ { return __c1 == __c2; }
+
+ static bool
+ lt(const char_type& __c1, const char_type& __c2)
+ { return __c1 < __c2; }
+
+ static int
+ compare(const char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcmp(__s1, __s2, __n); }
+
+ static size_t
+ length(const char_type* __s)
+ { return wcslen(__s); }
+
+ static const char_type*
+ find(const char_type* __s, size_t __n, const char_type& __a)
+ { return wmemchr(__s, __a, __n); }
+
+ static char_type*
+ move(char_type* __s1, const char_type* __s2, int_type __n)
+ { return wmemmove(__s1, __s2, __n); }
+
+ static char_type*
+ copy(char_type* __s1, const char_type* __s2, size_t __n)
+ { return wmemcpy(__s1, __s2, __n); }
+
+ static char_type*
+ assign(char_type* __s, size_t __n, char_type __a)
+ { return wmemset(__s, __a, __n); }
+
+ static char_type
+ to_char_type(const int_type& __c) { return char_type(__c); }
+
+ static int_type
+ to_int_type(const char_type& __c) { return int_type(__c); }
+
+ static bool
+ eq_int_type(const int_type& __c1, const int_type& __c2)
+ { return __c1 == __c2; }
+
+ static state_type
+ _S_get_state(const pos_type& __pos) { return __pos.state(); }
+
+ static int_type
+ eof() { return static_cast<int_type>(WEOF); }
+
+ static int_type
+ _S_eos() { return char_type(); }
+
+ static int_type
+ not_eof(const int_type& __c)
+ { return eq_int_type(__c, eof()) ? 0 : __c; }
+ };
+#endif
+#endif
+} // namespace std
+#endif
+
+namespace dami
+{
+ typedef std::basic_string<char> String;
+ typedef std::basic_string<unsigned char> BString;
+ typedef std::basic_string<wchar_t> WString;
+};
+
+#endif /* _ID3LIB_STRINGS_H_ */
+
diff --git a/include/id3/io_decorators.h b/include/id3/io_decorators.h
new file mode 100644
index 0000000..3ec25d8
--- /dev/null
+++ b/include/id3/io_decorators.h
@@ -0,0 +1,218 @@
+// -*- C++ -*-
+// $Id: io_decorators.h,v 1.5 2002/07/02 22:10:51 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_READER_DECORATORS_H_
+#define _ID3LIB_READER_DECORATORS_H_
+
+#include "readers.h"
+#include "io_helpers.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+
+namespace dami
+{
+ namespace io
+ {
+ /**
+ * Set a window on the buffer. Characters can only be read within this
+ * window.
+ */
+ class ID3_CPP_EXPORT WindowedReader : public ID3_Reader
+ {
+ typedef ID3_Reader SUPER;
+
+ ID3_Reader& _reader;
+ pos_type _beg, _end;
+
+ bool inWindow(pos_type cur)
+ { return this->getBeg() <= cur && cur < this->getEnd(); }
+
+ public:
+ explicit WindowedReader(ID3_Reader& reader)
+ : _reader(reader), _beg(reader.getBeg()), _end(reader.getEnd()) { ; }
+
+ WindowedReader(ID3_Reader& reader, size_type size)
+ : _reader(reader), _beg(reader.getBeg()), _end(reader.getEnd())
+ { this->setWindow(this->getCur(), size); }
+
+ WindowedReader(ID3_Reader& reader, pos_type beg, size_type size)
+ : _reader(reader), _beg(reader.getBeg()), _end(reader.getEnd())
+ { this->setWindow(beg, size); }
+
+ void setWindow(pos_type beg, size_type size);
+
+ pos_type setBeg(pos_type);
+ pos_type setCur(pos_type cur)
+ {
+ return _reader.setCur(mid(this->getBeg(), cur, this->getEnd()));
+ }
+ pos_type setEnd(pos_type);
+
+ pos_type getCur() { return _reader.getCur(); }
+ pos_type getBeg() { return _beg; }
+ pos_type getEnd() { return _end; }
+
+ bool inWindow() { return this->inWindow(this->getCur()); }
+
+ int_type readChar();
+ int_type peekChar();
+
+ size_type readChars(char_type buf[], size_type len);
+ size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars((char_type*) buf, len);
+ }
+
+ void close() { ; }
+ };
+
+ class ID3_CPP_EXPORT CharReader : public ID3_Reader
+ {
+ typedef ID3_Reader SUPER;
+
+ protected:
+ ID3_Reader& _reader;
+
+ public:
+
+ CharReader(ID3_Reader& reader) : _reader(reader) { }
+ virtual ~CharReader() { ; }
+
+ /**
+ * Read \c len characters into the array \c buf. Since the stream needs
+ * might have been unsynced, this function copies the characters one at a
+ * time.
+ */
+ size_type readChars(char_type buf[], size_type len);
+ size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars((char_type*) buf, len);
+ }
+
+ void close() { ; }
+ int_type peekChar() { return _reader.peekChar(); }
+
+ pos_type getBeg() { return _reader.getBeg(); }
+ pos_type getCur() { return _reader.getCur(); }
+ pos_type getEnd() { return _reader.getEnd(); }
+
+ pos_type setCur(pos_type cur) { return _reader.setCur(cur); }
+ };
+
+
+ class ID3_CPP_EXPORT LineFeedReader : public CharReader
+ {
+ typedef CharReader SUPER;
+
+ public:
+ LineFeedReader(ID3_Reader& reader) : SUPER(reader) { ; }
+ int_type readChar();
+ };
+
+ class ID3_CPP_EXPORT UnsyncedReader : public CharReader
+ {
+ typedef CharReader SUPER;
+
+ public:
+ UnsyncedReader(ID3_Reader& reader) : SUPER(reader) { }
+ int_type readChar();
+ };
+
+ class ID3_CPP_EXPORT CompressedReader : public ID3_MemoryReader
+ {
+ char_type* _uncompressed;
+ public:
+ CompressedReader(ID3_Reader& reader, size_type newSize);
+ virtual ~CompressedReader();
+ };
+
+ class ID3_CPP_EXPORT UnsyncedWriter : public ID3_Writer
+ {
+ typedef ID3_Writer SUPER;
+
+ ID3_Writer& _writer;
+ int_type _last;
+ size_type _numSyncs;
+
+ public:
+ UnsyncedWriter(ID3_Writer& writer)
+ : _writer(writer), _last('\0'), _numSyncs(0)
+ { ; }
+
+ size_type getNumSyncs() const { return _numSyncs; }
+ int_type writeChar(char_type ch);
+ void flush();
+
+ /**
+ * Write \c len characters into the array \c buf. Since the stream needs
+ * might have been unsynced, this function copies the characters one at a
+ * time.
+ */
+ size_type writeChars(const char_type[], size_type len);
+ size_type writeChars(const char buf[], size_type len)
+ {
+ return this->writeChars(reinterpret_cast<const char_type *>(buf), len);
+ }
+
+ void close() { ; }
+
+ pos_type getBeg() { return _writer.getBeg(); }
+ pos_type getCur() { return _writer.getCur(); }
+ pos_type getEnd() { return _writer.getEnd(); }
+ };
+
+ class CompressedWriter : public ID3_Writer
+ {
+ typedef ID3_Writer SUPER;
+
+ ID3_Writer& _writer;
+ BString _data;
+ size_type _origSize;
+ public:
+
+ explicit CompressedWriter(ID3_Writer& writer)
+ : _writer(writer), _data(), _origSize(0)
+ { ; }
+ virtual ~CompressedWriter() { this->flush(); }
+
+ size_type getOrigSize() const { return _origSize; }
+
+ void flush();
+
+ size_type writeChars(const char_type buf[], size_type len);
+ size_type writeChars(const char buf[], size_type len)
+ {
+ return this->writeChars(reinterpret_cast<const char_type*>(buf), len);
+ }
+
+ pos_type getCur() { return _data.size(); }
+ void close() { ; }
+ };
+ };
+};
+
+#endif /* _ID3LIB_READER_DECORATORS_H_ */
+
diff --git a/include/id3/io_helpers.h b/include/id3/io_helpers.h
new file mode 100644
index 0000000..fae5406
--- /dev/null
+++ b/include/id3/io_helpers.h
@@ -0,0 +1,82 @@
+// -*- C++ -*-
+// $Id: io_helpers.h,v 1.7 2002/06/29 17:43:19 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_IO_HELPERS_H_
+#define _ID3LIB_IO_HELPERS_H_
+
+#include "id3/id3lib_strings.h"
+#include "reader.h"
+#include "writer.h"
+
+namespace dami
+{
+ namespace io
+ {
+ /**
+ **/
+ class ID3_CPP_EXPORT ExitTrigger
+ {
+ ID3_Reader& _reader;
+ ID3_Reader::pos_type _pos;
+ bool _locked;
+ public:
+ ExitTrigger(ID3_Reader& rdr)
+ : _reader(rdr), _pos(rdr.getCur()), _locked(true)
+ { ; }
+ ExitTrigger(ID3_Reader& rdr, ID3_Reader::pos_type pos)
+ : _reader(rdr), _pos(pos)
+ { ; }
+ virtual ~ExitTrigger() { if (_locked) _reader.setCur(_pos); }
+
+ void release() { _locked = false; }
+ void update() { _pos = _reader.getCur(); }
+ void setExitPos(ID3_Reader::pos_type pos) { _pos = pos; }
+ };
+
+ ID3_C_EXPORT String readString(ID3_Reader&);
+ ID3_C_EXPORT String readText(ID3_Reader&, size_t);
+ ID3_C_EXPORT String readUnicodeString(ID3_Reader&);
+ ID3_C_EXPORT String readUnicodeText(ID3_Reader&, size_t);
+ ID3_C_EXPORT BString readAllBinary(ID3_Reader&);
+ ID3_C_EXPORT BString readBinary(ID3_Reader&, size_t);
+ ID3_C_EXPORT uint32 readLENumber(ID3_Reader&, size_t);
+ ID3_C_EXPORT uint32 readBENumber(ID3_Reader&, size_t);
+ ID3_C_EXPORT String readTrailingSpaces(ID3_Reader&, size_t);
+ ID3_C_EXPORT uint32 readUInt28(ID3_Reader&);
+
+ ID3_C_EXPORT size_t writeString(ID3_Writer&, String);
+ ID3_C_EXPORT size_t writeText(ID3_Writer&, String);
+ ID3_C_EXPORT size_t writeUnicodeString(ID3_Writer&, String, bool = true);
+ ID3_C_EXPORT size_t writeUnicodeText(ID3_Writer&, String, bool = true);
+ ID3_C_EXPORT size_t writeBENumber(ID3_Writer&, uint32 val, size_t);
+ ID3_C_EXPORT size_t writeTrailingSpaces(ID3_Writer&, String, size_t);
+ ID3_C_EXPORT size_t writeUInt28(ID3_Writer&, uint32);
+ };
+};
+
+#endif /* _ID3LIB_IO_HELPERS_H_ */
+
diff --git a/include/id3/io_strings.h b/include/id3/io_strings.h
new file mode 100644
index 0000000..48df1bd
--- /dev/null
+++ b/include/id3/io_strings.h
@@ -0,0 +1,238 @@
+// -*- C++ -*-
+// $Id: io_strings.h,v 1.6 2002/06/29 17:43:24 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_IO_STRINGS_H_
+#define _ID3LIB_IO_STRINGS_H_
+
+#include "id3/id3lib_strings.h"
+#include "reader.h"
+#include "writer.h"
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+namespace dami
+{
+ namespace io
+ {
+ class ID3_CPP_EXPORT StringReader : public ID3_Reader
+ {
+ const String& _string;
+ pos_type _cur;
+ public:
+ StringReader(const String& string) : _string(string), _cur(0) { ; }
+ virtual ~StringReader() { ; }
+
+ virtual void close() { ; }
+ virtual int_type peekChar()
+ {
+ if (!this->atEnd())
+ {
+ return _string[_cur];
+ }
+ return END_OF_READER;
+ }
+
+ /** Read up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters read into buf.
+ **/
+ size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars((char_type*) buf, len);
+ }
+ virtual size_type readChars(char_type buf[], size_type len)
+ {
+ size_type size = min((unsigned int)len, (unsigned int)(_string.size() - _cur));
+ _string.copy(reinterpret_cast<String::value_type *>(buf), size, _cur);
+ _cur += size;
+ return size;
+ }
+
+ virtual pos_type getCur()
+ {
+ return _cur;
+ }
+
+ virtual pos_type getBeg()
+ {
+ return 0;
+ }
+
+ virtual pos_type getEnd()
+ {
+ return _string.size();
+ }
+
+ /** Set the value of the internal position for reading.
+ **/
+ virtual pos_type setCur(pos_type pos)
+ {
+ pos_type end = this->getEnd();
+ _cur = (pos < end) ? pos : end;
+ return _cur;
+ }
+
+ virtual bool atEnd()
+ {
+ return _cur >= _string.size();
+ }
+
+ virtual size_type skipChars(size_type len)
+ {
+ size_type size = min((unsigned int)len, (unsigned int)(_string.size() - _cur));
+ _cur += size;
+ return size;
+ }
+ };
+
+ class ID3_CPP_EXPORT BStringReader : public ID3_Reader
+ {
+ const BString& _string;
+ pos_type _cur;
+ public:
+ BStringReader(const BString& string) : _string(string), _cur(0) { ; }
+ virtual ~BStringReader() { ; }
+
+ virtual void close() { ; }
+ virtual int_type peekChar()
+ {
+ if (!this->atEnd())
+ {
+ return _string[_cur];
+ }
+ return END_OF_READER;
+ }
+
+ /** Read up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters read into buf.
+ **/
+ size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars((char_type*) buf, len);
+ }
+ virtual size_type readChars(char_type buf[], size_type len)
+ {
+ size_type size = min((unsigned int)len, (unsigned int)(_string.size() - _cur));
+ _string.copy(reinterpret_cast<BString::value_type *>(buf), size, _cur);
+ _cur += size;
+ return size;
+ }
+
+ virtual pos_type getCur()
+ {
+ return _cur;
+ }
+
+ virtual pos_type getBeg()
+ {
+ return 0;
+ }
+
+ virtual pos_type getEnd()
+ {
+ return _string.size();
+ }
+
+ /** Set the value of the internal position for reading.
+ **/
+ virtual pos_type setCur(pos_type pos)
+ {
+ pos_type end = this->getEnd();
+ _cur = (pos < end) ? pos : end;
+ return _cur;
+ }
+
+ virtual bool atEnd()
+ {
+ return _cur >= _string.size();
+ }
+
+ virtual size_type skipChars(size_type len)
+ {
+ size_type size = min((unsigned int)len,(unsigned int)( _string.size() - _cur));
+ _cur += size;
+ return size;
+ }
+ };
+
+ class ID3_CPP_EXPORT StringWriter : public ID3_Writer
+ {
+ String& _string;
+ public:
+ StringWriter(String& string) : _string(string) { ; }
+ virtual ~StringWriter() { ; }
+
+ void close() { ; }
+ void flush() { ; }
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ _string.append(reinterpret_cast<const String::value_type *>(buf), len);
+ return len;
+ }
+ size_type writeChars(const char_type buf[], size_type len)
+ {
+ _string.append(reinterpret_cast<const String::value_type *>(buf), len);
+ return len;
+ }
+
+ pos_type getCur()
+ {
+ return _string.size();
+ }
+ };
+
+ class ID3_CPP_EXPORT BStringWriter : public ID3_Writer
+ {
+ BString& _string;
+ public:
+ BStringWriter(BString& string) : _string(string) { ; }
+ virtual ~BStringWriter() { ; }
+
+ void close() { ; }
+ void flush() { ; }
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ _string.append(reinterpret_cast<const BString::value_type *>(buf), len);
+ return len;
+ }
+ size_type writeChars(const char_type buf[], size_type len)
+ {
+ _string.append(reinterpret_cast<const BString::value_type *>(buf), len);
+ return len;
+ }
+
+ pos_type getCur()
+ {
+ return _string.size();
+ }
+ };
+ };
+};
+
+#endif /* _ID3LIB_IO_STRINGS_H_ */
+
diff --git a/include/id3/misc_support.h b/include/id3/misc_support.h
new file mode 100644
index 0000000..097917c
--- /dev/null
+++ b/include/id3/misc_support.h
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+// $Id: misc_support.h,v 1.29 2002/09/19 10:21:57 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_MISC_SUPPORT_H_
+#define _ID3LIB_MISC_SUPPORT_H_
+
+#include <id3/tag.h>
+
+ID3_C_EXPORT char* ID3_GetString(const ID3_Frame *, ID3_FieldID);
+ID3_C_EXPORT char* ID3_GetString(const ID3_Frame *, ID3_FieldID, size_t nItems);
+
+ID3_C_EXPORT void ID3_FreeString(char *str);
+
+// defined in 'id3_misc_support.cpp'
+// these are 'convenience functions,' to make using the library easier for the
+// most common of operations
+ID3_C_EXPORT char* ID3_GetArtist(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddArtist(ID3_Tag*, const char*, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveArtists(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetAlbum(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddAlbum(ID3_Tag*, const char*, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveAlbums(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetTitle(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddTitle(ID3_Tag*, const char*, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveTitles(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetYear(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddYear(ID3_Tag*, const char*, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveYears(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetComment(const ID3_Tag*, const char* desc = NULL);
+ID3_C_EXPORT ID3_Frame* ID3_AddComment(ID3_Tag*, const char*, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddComment(ID3_Tag*, const char*, const char*, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddComment(ID3_Tag*, const char*, const char*, const char*,
+ bool = false);
+ID3_C_EXPORT size_t ID3_RemoveComments(ID3_Tag*, const char * = NULL);
+
+ID3_C_EXPORT char* ID3_GetTrack(const ID3_Tag*);
+ID3_C_EXPORT size_t ID3_GetTrackNum(const ID3_Tag*);
+//following routine courtesy of John George
+ID3_C_EXPORT ID3_Frame* ID3_AddTrack(ID3_Tag*, uchar ucTrack, uchar ucTotal = 0,
+ bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveTracks(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetGenre(const ID3_Tag*);
+ID3_C_EXPORT size_t ID3_GetGenreNum(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddGenre(ID3_Tag*, size_t ucGenre, bool replace = false);
+//following routine courtesy of John George
+ID3_C_EXPORT ID3_Frame* ID3_AddGenre(ID3_Tag*, const char *, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveGenres(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetLyrics(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddLyrics(ID3_Tag*, const char*, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddLyrics(ID3_Tag*, const char*, const char*, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddLyrics(ID3_Tag*, const char*, const char*, const char*,
+ bool = false);
+ID3_C_EXPORT size_t ID3_RemoveLyrics(ID3_Tag*);
+
+ID3_C_EXPORT char* ID3_GetLyricist(const ID3_Tag*);
+ID3_C_EXPORT ID3_Frame* ID3_AddLyricist(ID3_Tag *, const char *, bool replace = false);
+ID3_C_EXPORT size_t ID3_RemoveLyricist(ID3_Tag*);
+
+ID3_C_EXPORT ID3_Frame* ID3_AddSyncLyrics(ID3_Tag*, const uchar*, size_t,
+ ID3_TimeStampFormat, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddSyncLyrics(ID3_Tag*, const uchar*, size_t,
+ ID3_TimeStampFormat, const char *, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddSyncLyrics(ID3_Tag*, const uchar*, size_t,
+ ID3_TimeStampFormat, const char *, const char *,
+ bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddSyncLyrics(ID3_Tag*, const uchar*, size_t,
+ ID3_TimeStampFormat, const char *, const char *,
+ ID3_ContentType, bool = false);
+ID3_C_EXPORT ID3_Frame* ID3_GetSyncLyricsInfo(const ID3_Tag *tag, const char *lang,
+ const char *desc, char &stampformat,
+ char &type, size_t &size);
+ID3_C_EXPORT ID3_Frame* ID3_GetSyncLyrics(const ID3_Tag* tag, const char* lang,
+ const char* desc, const uchar* &pData, size_t& size);
+
+
+//following routine courtesy of John George
+ID3_C_EXPORT int ID3_GetPictureData(const ID3_Tag*, const char* TempPicPath);
+
+//following routine courtesy of John George
+ID3_C_EXPORT char* ID3_GetPictureMimeType(const ID3_Tag*);
+
+//following routine courtesy of John George
+ID3_C_EXPORT bool ID3_HasPicture(const ID3_Tag*);
+
+//following two routines courtesy of John George
+ID3_C_EXPORT ID3_Frame* ID3_AddPicture(ID3_Tag*, const char* TempPicPath, const char* MimeType, bool replace = false);
+ID3_C_EXPORT ID3_Frame* ID3_AddPicture(ID3_Tag*, const char* TempPicPath, const char* MimeType, ID3_PictureType pictype, const char* Description, bool replace = false);
+
+//following routine courtesy of John George
+ID3_C_EXPORT size_t ID3_RemovePictures(ID3_Tag*);
+
+//following routine courtesy of John George
+ID3_C_EXPORT size_t ID3_GetPictureDataOfPicType(ID3_Tag*, const char* TempPicPath, ID3_PictureType pictype);
+ID3_C_EXPORT size_t ID3_GetPictureDataOfPicType(ID3_Tag* tag, const uchar*& data, ID3_PictureType pictype);
+
+ID3_C_EXPORT size_t ID3_GetPictureDataOfPicTypeAndStartPosition(ID3_Tag*, const uchar*& data, size_t& start, ID3_PictureType pictype);
+
+//following routine courtesy of John George
+ID3_C_EXPORT char *ID3_GetMimeTypeOfPicType(ID3_Tag*, ID3_PictureType pictype);
+
+//following routine courtesy of John George
+ID3_C_EXPORT char *ID3_GetDescriptionOfPicType(ID3_Tag*, ID3_PictureType pictype);
+
+//following routine courtesy of John George
+ID3_C_EXPORT size_t ID3_RemovePictureType(ID3_Tag*, ID3_PictureType pictype);
+
+
+#endif /* _ID3LIB_MISC_SUPPORT_H_ */
+
diff --git a/include/id3/reader.h b/include/id3/reader.h
new file mode 100644
index 0000000..56ab5c1
--- /dev/null
+++ b/include/id3/reader.h
@@ -0,0 +1,129 @@
+// -*- C++ -*-
+// $Id: reader.h,v 1.13 2002/07/02 22:10:57 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_READER_H_
+#define _ID3LIB_READER_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+class ID3_CPP_EXPORT ID3_Reader
+{
+ public:
+ typedef uint32 size_type;
+ typedef uint8 char_type;
+ typedef uint32 pos_type;
+ typedef int32 off_type;
+ typedef int16 int_type;
+ static const int_type END_OF_READER;
+
+ /** Close the reader. Any further actions on the reader should fail.
+ **/
+ virtual void close() = 0;
+
+ /** Return the beginning position in the reader */
+ virtual pos_type getBeg() { return static_cast<pos_type>(0); }
+
+ /** Return the ending position in the reader */
+ virtual pos_type getEnd() { return static_cast<pos_type>(-1); }
+
+ /** Return the current position in the reader */
+ virtual pos_type getCur() = 0;
+
+ /** Set the value of the current position for reading.
+ **/
+ virtual pos_type setCur(pos_type pos) = 0;
+
+ /**
+ ** Read a single character and advance the internal position. Note that the
+ ** interal position may advance more than one byte for a single character
+ ** read. Returns END_OF_READER if there isn't a character to read.
+ **/
+ virtual int_type readChar()
+ {
+ if (this->atEnd())
+ {
+ return END_OF_READER;
+ }
+ char_type ch;
+ this->readChars(&ch, 1);
+ return ch;
+ }
+
+ /**
+ ** Return the next character to be read without advancing the internal
+ ** position. Returns END_OF_READER if there isn't a character to read.
+ **/
+ virtual int_type peekChar() = 0;
+
+ /** Read up to \c len characters into buf and advance the internal position
+ ** accordingly. Returns the number of characters read into buf. Note that
+ ** the value returned may be less than the number of bytes that the internal
+ ** position advances, due to multi-byte characters.
+ **/
+ virtual size_type readChars(char_type buf[], size_type len) = 0;
+ virtual size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars(reinterpret_cast<char_type *>(buf), len);
+ }
+
+ /** Skip up to \c len chars in the stream and advance the internal position
+ ** accordingly. Returns the number of characters actually skipped (may be
+ ** less than requested).
+ **/
+ virtual size_type skipChars(size_type len)
+ {
+ const size_type SIZE = 1024;
+ char_type bytes[SIZE];
+ size_type remaining = len;
+ while (!this->atEnd() && remaining > 0)
+ {
+ remaining -= this->readChars(bytes, (remaining < SIZE ? remaining : SIZE));
+ }
+ return len - remaining;
+ }
+
+ virtual size_type remainingBytes()
+ {
+ pos_type end = this->getEnd(), cur = this->getCur();
+ if (end == pos_type(-1))
+ {
+ return size_type(-1);
+ }
+
+ if (end >= cur)
+ {
+ return end - cur;
+ }
+
+ return 0;
+ }
+
+ virtual bool atEnd() { return this->getCur() >= this->getEnd(); }
+};
+
+#endif /* _ID3LIB_READER_H_ */
+
diff --git a/include/id3/readers.h b/include/id3/readers.h
new file mode 100644
index 0000000..0d0d5d8
--- /dev/null
+++ b/include/id3/readers.h
@@ -0,0 +1,161 @@
+// -*- C++ -*-
+// $Id: readers.h,v 1.12 2002/06/29 17:43:42 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_READERS_H_
+#define _ID3LIB_READERS_H_
+
+#include "id3/id3lib_streams.h"
+#include "id3/reader.h"
+
+class ID3_CPP_EXPORT ID3_IStreamReader : public ID3_Reader
+{
+ istream& _stream;
+ protected:
+ istream& getReader() const { return _stream; }
+ public:
+ ID3_IStreamReader(istream& reader) : _stream(reader) { ; }
+ virtual ~ID3_IStreamReader() { ; }
+ virtual void close() { ; }
+
+ virtual int_type peekChar() { return (int_type)_stream.peek(); }
+
+ /** Read up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters read into buf.
+ **/
+ virtual size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars(reinterpret_cast<uchar *>(buf), len);
+ }
+ virtual size_type readChars(char_type buf[], size_type len)
+ {
+ _stream.read((char *)buf, len);
+ return _stream.gcount();
+ }
+
+ virtual pos_type getBeg() { return 0; }
+ virtual pos_type getCur() { return _stream.tellg(); }
+ virtual pos_type getEnd()
+ {
+ pos_type cur = this->getCur();
+ _stream.seekg(0, ios::end);
+ pos_type end = this->getCur();
+ this->setCur(cur);
+ return end;
+ }
+
+ /** Set the value of the internal position for reading.
+ **/
+ virtual pos_type setCur(pos_type pos) { _stream.seekg(pos); return pos; }
+};
+
+class ID3_CPP_EXPORT ID3_IFStreamReader : public ID3_IStreamReader
+{
+ ifstream& _file;
+ public:
+ ID3_IFStreamReader(ifstream& reader)
+ : ID3_IStreamReader(reader), _file(reader) { ; }
+
+ virtual void close()
+ {
+ _file.close();
+ }
+};
+
+class ID3_CPP_EXPORT ID3_MemoryReader : public ID3_Reader
+{
+ const char_type* _beg;
+ const char_type* _cur;
+ const char_type* _end;
+ protected:
+ void setBuffer(const char_type* buf, size_type size)
+ {
+ _beg = buf;
+ _cur = buf;
+ _end = buf + size;
+ };
+ public:
+ ID3_MemoryReader()
+ {
+ this->setBuffer(NULL, 0);
+ }
+ ID3_MemoryReader(const char_type* buf, size_type size)
+ {
+ this->setBuffer(buf, size);
+ };
+ ID3_MemoryReader(const char* buf, size_type size)
+ {
+ this->setBuffer(reinterpret_cast<const char_type*>(buf), size);
+ };
+ virtual ~ID3_MemoryReader() { ; }
+ virtual void close() { ; }
+
+ virtual int_type peekChar()
+ {
+ if (!this->atEnd())
+ {
+ return *_cur;
+ }
+ return END_OF_READER;
+ }
+
+ /** Read up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters read into buf.
+ **/
+ virtual size_type readChars(char buf[], size_type len)
+ {
+ return this->readChars(reinterpret_cast<char_type *>(buf), len);
+ }
+ virtual size_type readChars(char_type buf[], size_type len);
+
+ virtual pos_type getCur()
+ {
+ return (pos_type)(_cur - _beg);
+ }
+
+ virtual pos_type getBeg()
+ {
+ return (pos_type)(_beg - _beg);
+ }
+
+ virtual pos_type getEnd()
+ {
+ return (pos_type)(_end - _beg);
+ }
+
+ /** Set the value of the internal position for reading.
+ **/
+ virtual pos_type setCur(pos_type pos)
+ {
+ pos_type end = this->getEnd();
+ size_type size = (pos < end) ? pos : end;
+ _cur = _beg + size;
+ return this->getCur();
+ }
+};
+
+#endif /* _ID3LIB_READERS_H_ */
+
diff --git a/include/id3/sized_types.h b/include/id3/sized_types.h
new file mode 100644
index 0000000..01900d3
--- /dev/null
+++ b/include/id3/sized_types.h
@@ -0,0 +1,87 @@
+// -*- C++ -*-
+/* $Id: sized_types.h,v 1.7 2002/07/23 16:28:44 t1mpy Exp $
+
+ * id3lib: a C++ library for creating and manipulating id3v1/v2 tags Copyright
+ * 1999, 2000 Scott Thomas Haug
+
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ * The id3lib authors encourage improvements and optimisations to be sent to
+ * the id3lib coordinator. Please see the README file for details on where to
+ * send such submissions. See the AUTHORS file for a list of people who have
+ * contributed to id3lib. See the ChangeLog file for a list of changes to
+ * id3lib. These files are distributed with id3lib at
+ * http://download.sourceforge.net/id3lib/
+ */
+
+/**
+ ** This file defines size-specific typedefs based on the macros defined in
+ ** limits.h
+ **/
+
+#ifndef _SIZED_TYPES_H_
+#define _SIZED_TYPES_H_
+
+#include <limits.h>
+
+/* define our datatypes */
+
+/* Define 8-bit types */
+#if UCHAR_MAX == 0xff
+
+typedef unsigned char uint8;
+typedef signed char int8;
+
+#else
+#error This machine has no 8-bit type; report compiler, and the contents of your limits.h to the persons in the AUTHORS file
+#endif /* UCHAR_MAX == 0xff */
+
+/* Define 16-bit types */
+#if UINT_MAX == 0xffff
+
+typedef unsigned int uint16;
+typedef int int16;
+
+#elif USHRT_MAX == 0xffff
+
+typedef unsigned short uint16;
+typedef short int16;
+
+#else
+#error This machine has no 16-bit type; report compiler, and the contents of your limits.h to the persons in the AUTHORS file
+#endif /* UINT_MAX == 0xffff */
+
+/* Define 32-bit types */
+#if UINT_MAX == 0xfffffffful
+
+typedef unsigned int uint32;
+typedef int int32;
+
+#elif ULONG_MAX == 0xfffffffful
+
+typedef unsigned long uint32;
+typedef long int32;
+
+#elif USHRT_MAX == 0xfffffffful
+
+typedef unsigned short uint32;
+typedef short int32;
+
+#else
+#error This machine has no 32-bit type; report compiler, and the contents of your limits.h to the persons in the AUTHORS file
+#endif /* UINT_MAX == 0xfffffffful */
+
+#endif /* _SIZED_TYPES_H_ */
+
diff --git a/include/id3/tag.h b/include/id3/tag.h
new file mode 100644
index 0000000..9611d80
--- /dev/null
+++ b/include/id3/tag.h
@@ -0,0 +1,164 @@
+// -*- C++ -*-
+// $Id: tag.h,v 1.63 2003/03/02 13:35:59 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_TAG_H_
+#define _ID3LIB_TAG_H_
+
+#include <id3/id3lib_frame.h>
+#include <id3/field.h>
+#include <id3/utils.h>//for ID3_PATH_LENGTH
+
+class ID3_Reader;
+class ID3_Writer;
+class ID3_TagImpl;
+class ID3_Tag;
+
+
+#ifdef __APPLE__
+#pragma GCC visibility push(default)
+#endif
+
+class ID3_CPP_EXPORT ID3_Tag
+{
+ ID3_TagImpl* _impl;
+ char _tmp_filename[ID3_PATH_LENGTH];
+public:
+
+ class Iterator
+ {
+ public:
+ virtual ID3_Frame* GetNext() = 0;
+ virtual ~Iterator() { } //Klenotic - Added by id3lib-3.8.3-VC8_AddFrame_Crash_Fix patch.
+ };
+
+ class ConstIterator
+ {
+ public:
+ virtual const ID3_Frame* GetNext() = 0;
+ virtual ~ConstIterator() { } //Klenotic - Added by id3lib-3.8.3-VC8_AddFrame_Crash_Fix patch.
+ };
+
+public:
+
+#ifdef WIN32
+ ID3_Tag(const wchar_t *name = NULL);
+#else
+ ID3_Tag(const char *name = NULL);
+#endif
+ ID3_Tag(const ID3_Tag &tag);
+ virtual ~ID3_Tag();
+
+ void Clear();
+ bool HasChanged() const;
+ size_t Size() const;
+
+ bool SetUnsync(bool);
+ bool SetExtendedHeader(bool);
+ bool SetExperimental(bool);
+
+ bool GetUnsync() const;
+ bool GetExtendedHeader() const;
+ bool GetExperimental() const;
+
+ bool SetPadding(bool);
+
+ void AddFrame(const ID3_Frame&);
+ void AddFrame(const ID3_Frame*);
+ bool AttachFrame(ID3_Frame*);
+ ID3_Frame* RemoveFrame(const ID3_Frame *);
+
+ size_t Parse(const uchar*, size_t);
+ bool Parse(ID3_Reader& reader);
+ size_t Render(uchar*, ID3_TagType = ID3TT_ID3V2) const;
+ size_t Render(ID3_Writer&, ID3_TagType = ID3TT_ID3V2) const;
+
+#ifdef WIN32
+ size_t Link(const wchar_t *fileInfo, flags_t = (flags_t) ID3TT_ALL);
+#else
+ size_t Link(const char *fileInfo, flags_t = (flags_t) ID3TT_ALL);
+#endif
+ size_t Link(ID3_Reader &reader, flags_t = (flags_t) ID3TT_ALL);
+ flags_t Update(flags_t = (flags_t) ID3TT_ALL);
+ flags_t Strip(flags_t = (flags_t) ID3TT_ALL);
+
+ size_t GetPrependedBytes() const;
+ size_t GetAppendedBytes() const;
+ size_t GetFileSize() const;
+ const char* GetFileName() const;
+
+ ID3_Frame* Find(ID3_FrameID) const;
+ ID3_Frame* Find(ID3_FrameID, ID3_FieldID, uint32) const;
+ ID3_Frame* Find(ID3_FrameID, ID3_FieldID, const char*) const;
+ ID3_Frame* Find(ID3_FrameID, ID3_FieldID, const unicode_t*) const;
+
+ size_t NumFrames() const;
+
+ const Mp3_Headerinfo* GetMp3HeaderInfo() const;
+
+ Iterator* CreateIterator();
+ ConstIterator* CreateIterator() const;
+
+ ID3_Tag& operator=( const ID3_Tag & );
+
+ bool HasTagType(ID3_TagType tt) const;
+ ID3_V2Spec GetSpec() const;
+ bool SetSpec(ID3_V2Spec);
+
+ static size_t IsV2Tag(const uchar*);
+ static size_t IsV2Tag(ID3_Reader&);
+
+ /* Deprecated! */
+ void AddNewFrame(ID3_Frame* f);
+#ifdef WIN32
+ size_t Link(const wchar_t *fileInfo, bool parseID3v1, bool parseLyrics3);
+#else
+ size_t Link(const char *fileInfo, bool parseID3v1, bool parseLyrics3);
+#endif
+ void SetCompression(bool);
+ void AddFrames(const ID3_Frame *, size_t);
+ bool HasLyrics() const;
+ bool HasV2Tag() const;
+ bool HasV1Tag() const;
+ size_t Parse(const uchar header[ID3_TAGHEADERSIZE], const uchar *buffer);
+ //ID3_Frame* operator[](size_t) const;
+ //ID3_Frame* GetFrameNum(size_t) const;
+
+ ID3_Tag& operator<<(const ID3_Frame &);
+ ID3_Tag& operator<<(const ID3_Frame *);
+};
+
+// deprecated!
+int32 ID3_C_EXPORT ID3_IsTagHeader(const uchar header[ID3_TAGHEADERSIZE]);
+
+
+#ifdef __APPLE__
+#pragma GCC visibility pop
+#endif
+
+#endif /* _ID3LIB_TAG_H_ */
+
diff --git a/include/id3/utils.h b/include/id3/utils.h
new file mode 100644
index 0000000..93ce34f
--- /dev/null
+++ b/include/id3/utils.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+// $Id: utils.h,v 1.22 2002/07/02 22:11:03 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_UTILS_H_
+#define _ID3LIB_UTILS_H_
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "id3/id3lib_streams.h"
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+#include "id3/id3lib_strings.h"
+
+#ifdef WIN32
+#include <string>
+#endif
+
+namespace dami
+{
+#ifdef MAXPATHLEN
+# define ID3_PATH_LENGTH (MAXPATHLEN + 1)
+#elif defined (PATH_MAX)
+# define ID3_PATH_LENGTH (PATH_MAX + 1)
+#else /* !MAXPATHLEN */
+# define ID3_PATH_LENGTH (2048 + 1)
+#endif /* !MAXPATHLEN && !PATH_MAX */
+
+#ifndef min
+ template<typename T>
+ const T& min(const T& a, const T& b)
+ {
+ return (a < b) ? a : b;
+ }
+#endif
+
+#ifndef max
+ template<typename T>
+ const T& max(const T& a, const T& b)
+ {
+ return (b < a) ? a : b;
+ }
+#endif
+
+#ifndef mid
+ template<typename T>
+ const T& mid(const T& lo, const T& mid, const T& hi)
+ {
+ return max(lo, min(mid, hi));
+ }
+#endif
+
+#ifndef abs
+ template<typename T>
+ T abs(const T& a)
+ {
+ return (a < T(0)) ? -a : a;
+ }
+#endif
+
+ size_t ID3_C_EXPORT renderNumber(uchar *buffer, uint32 val, size_t size = sizeof(uint32));
+ String ID3_C_EXPORT renderNumber(uint32 val, size_t size = sizeof(uint32));
+
+ String ID3_C_EXPORT toString(uint32 val);
+
+ size_t ID3_C_EXPORT ucslen(const unicode_t *unicode);
+ String ID3_C_EXPORT convert(String data, ID3_TextEnc, ID3_TextEnc);
+
+ // file utils
+ size_t ID3_C_EXPORT getFileSize(fstream&);
+ size_t ID3_C_EXPORT getFileSize(ifstream&);
+ size_t ID3_C_EXPORT getFileSize(ofstream&);
+ ID3_Err ID3_C_EXPORT createFile(String, fstream&);
+ ID3_Err ID3_C_EXPORT openWritableFile(String, fstream&);
+ ID3_Err ID3_C_EXPORT openWritableFile(String, ofstream&);
+ ID3_Err ID3_C_EXPORT openReadableFile(String, fstream&);
+#ifdef WIN32
+ ID3_Err ID3_C_EXPORT openReadableFile(std::wstring, ifstream&);
+#else
+ ID3_Err ID3_C_EXPORT openReadableFile(String, ifstream&);
+#endif
+
+};
+
+#endif /* _ID3LIB_UTILS_H_ */
+
diff --git a/include/id3/writer.h b/include/id3/writer.h
new file mode 100644
index 0000000..0f703b3
--- /dev/null
+++ b/include/id3/writer.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+// $Id: writer.h,v 1.8 2002/07/02 22:11:10 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_WRITER_H_
+#define _ID3LIB_WRITER_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+class ID3_CPP_EXPORT ID3_Writer
+{
+ public:
+ typedef uint32 size_type;
+ typedef uint8 char_type;
+ typedef uint32 pos_type;
+ typedef int32 off_type;
+ typedef int16 int_type;
+ static const int_type END_OF_WRITER;
+
+ /** Close the writer. Any further actions on the writer should fail. **/
+ virtual void close() = 0;
+
+ /** Flush the writer. **/
+ virtual void flush() = 0;
+
+ /** Return the beginning position in the writer **/
+ virtual pos_type getBeg() { return static_cast<pos_type>(0); }
+
+ /** Return the first position that can't be written to. A return value of
+ ** -1 indicates no (reasonable) limit to the writer.
+ **/
+ virtual pos_type getEnd() { return static_cast<pos_type>(-1); }
+
+ /** Return the next position that will be written to */
+ virtual pos_type getCur() = 0;
+
+ /** Return the number of bytes written **/
+ virtual size_type getSize() { return this->getCur() - this->getBeg(); }
+
+ /** Return the maximum number of bytes that can be written **/
+ virtual size_type getMaxSize() { return this->getEnd() - this->getBeg(); }
+
+ /** Write a single character and advance the internal position. Note that
+ ** the interal position may advance more than one byte for a single
+ ** character write. Returns END_OF_WRITER if there isn't a character to
+ ** write.
+ **/
+ virtual int_type writeChar(char_type ch)
+ {
+ if (this->atEnd())
+ {
+ return END_OF_WRITER;
+ }
+ this->writeChars(&ch, 1);
+ return ch;
+ }
+
+ /** Write up to \c len characters into buf and advance the internal position
+ ** accordingly. Returns the number of characters write into buf. Note that
+ ** the value returned may be less than the number of bytes that the internal
+ ** position advances, due to multi-byte characters.
+ **/
+ virtual size_type writeChars(const char_type buf[], size_type len) = 0;
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ return this->writeChars(reinterpret_cast<const char_type *>(buf), len);
+ }
+
+ virtual bool atEnd()
+ {
+ return this->getCur() >= this->getEnd();
+ }
+};
+
+#endif /* _ID3LIB_WRITER_H_ */
+
diff --git a/include/id3/writers.h b/include/id3/writers.h
new file mode 100644
index 0000000..e475221
--- /dev/null
+++ b/include/id3/writers.h
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+// $Id: writers.h,v 1.11 2002/07/02 22:11:16 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_WRITERS_H_
+#define _ID3LIB_WRITERS_H_
+
+#include "id3/writer.h"
+#include "id3/id3lib_streams.h"
+#include <cstring>
+
+class ID3_CPP_EXPORT ID3_OStreamWriter : public ID3_Writer
+{
+ ostream& _stream;
+ pos_type _beg;
+ protected:
+ ostream& getWriter() const { return _stream; }
+ public:
+ ID3_OStreamWriter(ostream& writer) : _stream(writer), _beg(_stream.tellp()) { ; }
+ virtual ~ID3_OStreamWriter() { ; }
+
+ virtual void close() { ; }
+ virtual void flush() { _stream.flush(); }
+
+ virtual int_type writeChar(char_type ch)
+ {
+ _stream.put(ch);
+ return ch;
+ }
+
+ /** Write up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters write into buf.
+ **/
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ _stream.write(buf, len);
+ return len;
+ }
+ virtual size_type writeChars(const char_type buf[], size_type len)
+ {
+ _stream.write(reinterpret_cast<const char*>(buf), len);
+ return len;
+ }
+
+ virtual pos_type getBeg() { return _beg; }
+ virtual pos_type getCur() { return _stream.tellp(); }
+};
+
+class ID3_CPP_EXPORT ID3_OFStreamWriter : public ID3_OStreamWriter
+{
+ ofstream& _file;
+ public:
+ ID3_OFStreamWriter(ofstream& writer)
+ : ID3_OStreamWriter(writer), _file(writer) { ; }
+
+ virtual void close()
+ {
+ _file.close();
+ }
+};
+
+class ID3_CPP_EXPORT ID3_IOStreamWriter : public ID3_Writer
+{
+ iostream& _stream;
+ pos_type _beg;
+ protected:
+ iostream& getWriter() const { return _stream; }
+ public:
+ ID3_IOStreamWriter(iostream& writer) : _stream(writer), _beg(_stream.tellp()) { ; }
+ virtual ~ID3_IOStreamWriter() { ; }
+
+ virtual void close() { ; }
+ virtual void flush() { _stream.flush(); }
+
+ virtual int_type writeChar(char_type ch)
+ {
+ _stream.put(ch);
+ return ch;
+ }
+
+ /** Write up to \c len chars into buf and advance the internal position
+ ** accordingly. Returns the number of characters write into buf.
+ **/
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ _stream.write(buf, len);
+ return len;
+ }
+ virtual size_type writeChars(const char_type buf[], size_type len)
+ {
+ _stream.write(reinterpret_cast<const char*>(buf), len);
+ return len;
+ }
+
+ virtual pos_type getBeg() { return _beg; }
+ virtual pos_type getCur() { return _stream.tellp(); }
+};
+
+class ID3_CPP_EXPORT ID3_FStreamWriter : public ID3_IOStreamWriter
+{
+ fstream& _file;
+ public:
+ ID3_FStreamWriter(fstream& writer)
+ : ID3_IOStreamWriter(writer), _file(writer) { ; }
+
+ virtual void close()
+ {
+ _file.close();
+ }
+};
+
+class ID3_CPP_EXPORT ID3_MemoryWriter : public ID3_Writer
+{
+ const char_type* _beg;
+ /* */ char_type* _cur;
+ const char_type* _end;
+ protected:
+ void setBuffer(char_type* buf, size_t size)
+ {
+ _beg = buf;
+ _cur = buf;
+ _end = buf + size;
+ };
+ public:
+ ID3_MemoryWriter()
+ {
+ this->setBuffer(NULL, 0);
+ }
+ ID3_MemoryWriter(char_type buf[], size_t size)
+ {
+ this->setBuffer(buf, size);
+ }
+ virtual ~ID3_MemoryWriter() { ; }
+ virtual void close() { ; }
+ virtual void flush() { ; }
+
+ /** Write up to \c len chars from buf and advance the internal position
+ ** accordingly. Returns the number of characters written from buf.
+ **/
+ virtual size_type writeChars(const char buf[], size_type len)
+ {
+ return this->writeChars(reinterpret_cast<const char_type *>(buf), len);
+ }
+ virtual size_type writeChars(const char_type buf[], size_type len)
+ {
+ size_type remaining = _end - _cur;
+ size_type size = (remaining > len) ? len : remaining;
+ ::memcpy(_cur, buf, size);
+ _cur += size;
+ return size;
+ }
+
+ virtual pos_type getCur()
+ {
+ return _cur - _beg;
+ }
+
+ virtual pos_type getBeg()
+ {
+ return _beg - _beg;
+ }
+
+ virtual pos_type getEnd()
+ {
+ return _end - _beg;
+ }
+};
+
+#endif /* _ID3LIB_WRITERS_H_ */
+
diff --git a/install-sh b/install-sh
new file mode 100644
index 0000000..e9de238
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/libprj/Makefile b/libprj/Makefile
new file mode 100644
index 0000000..c844065
--- /dev/null
+++ b/libprj/Makefile
@@ -0,0 +1,69 @@
+###################################################
+#
+# Makefile for libid3tag.so
+#
+###################################################
+
+C_SRCS =
+C_OPTIONS=
+
+CPP_SRCS= \
+ ../src/writers.cpp \
+ ../src/utils.cpp \
+ ../src/tag_render.cpp \
+ ../src/tag_parse_v1.cpp \
+ ../src/tag_parse_musicmatch.cpp \
+ ../src/tag_parse_lyrics3.cpp \
+ ../src/tag_parse.cpp \
+ ../src/tag_impl.cpp \
+ ../src/tag_find.cpp \
+ ../src/tag_file.cpp \
+ ../src/tag.cpp \
+ ../src/spec.cpp \
+ ../src/readers.cpp \
+ ../src/mp3_parse.cpp \
+ ../src/misc_support.cpp \
+ ../src/io_helpers.cpp \
+ ../src/io_decorators.cpp \
+ ../src/io.cpp \
+ ../src/helpers.cpp \
+ ../src/header_tag.cpp \
+ ../src/header_frame.cpp \
+ ../src/header.cpp \
+ ../src/globals.cpp \
+ ../src/frame_render.cpp \
+ ../src/frame_parse.cpp \
+ ../src/frame_impl.cpp \
+ ../src/frame.cpp \
+ ../src/field_string_unicode.cpp \
+ ../src/field_string_ascii.cpp \
+ ../src/field_integer.cpp \
+ ../src/field_binary.cpp \
+ ../src/field.cpp \
+ ../src/c_wrapper.cpp
+
+CPP_OPTIONS=-DHAVE_CONFIG_H -shared -fPIC
+
+INCLUDE = . .. ../src ../include ../include/id3 ../../../source/Shared
+
+# when cross-compiling target does not have Zlib
+ifneq ($(XTARGET),)
+ INCLUDE+= \
+ ../../zlib-1.2.3/$(XTARGET)/include
+endif
+
+DYNLIB=libid3tag.so
+
+all: ../config.h $(LIBRARY)
+
+include ../../../source/common.mak
+
+
+#
+# Build the parts of id3lib
+#
+
+../config.h: ../config_Linux32.h
+ cp ../config_Linux32.h ../config.h
+
+
diff --git a/libprj/Makefile.am b/libprj/Makefile.am
new file mode 100644
index 0000000..fedb7b4
--- /dev/null
+++ b/libprj/Makefile.am
@@ -0,0 +1,14 @@
+# Copyright 2000 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EXTRA_DIST = id3lib.dsp id3lib.dsw id3lib.mcp win32.readme.first.txt
+
+
diff --git a/libprj/Makefile.in b/libprj/Makefile.in
new file mode 100644
index 0000000..384e254
--- /dev/null
+++ b/libprj/Makefile.in
@@ -0,0 +1,250 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright 2000 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+EXTRA_DIST = id3lib.dsp id3lib.dsw id3lib.mcp win32.readme.first.txt
+subdir = libprj
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libprj/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libprj/id3lib.mcp b/libprj/id3lib.mcp
new file mode 100644
index 0000000..7866696
--- /dev/null
+++ b/libprj/id3lib.mcp
Binary files differ
diff --git a/libprj/id3lib.sln b/libprj/id3lib.sln
new file mode 100644
index 0000000..ab122fa
--- /dev/null
+++ b/libprj/id3lib.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "id3lib", "id3lib.vcproj", "{B1B5C626-7AFB-42F6-B3FE-32825D9152AD}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Debug|Win32.Build.0 = Debug|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Release|Win32.ActiveCfg = Release|Win32
+ {B1B5C626-7AFB-42F6-B3FE-32825D9152AD}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libprj/id3lib.vcproj b/libprj/id3lib.vcproj
new file mode 100644
index 0000000..74686b3
--- /dev/null
+++ b/libprj/id3lib.vcproj
@@ -0,0 +1,1029 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="id3lib"
+ ProjectGUID="{B1B5C626-7AFB-42F6-B3FE-32825D9152AD}"
+ RootNamespace="id3lib"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ Description="Copy Win32 config.h"
+ CommandLine="copy $(InputDir)..\config.h.win32 $(InputDir)..\config.h"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\;..\;..\include;..\include\id3;&quot;$(ProjectDir)..\..\zlib-1.2.3&quot;"
+ PreprocessorDefinitions="_DEBUG;WIN32;_USRDLL;DLL_EXPORTS;_WINDOWS;HAVE_CONFIG_H;ID3LIB_LINKOPTION=2;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS"
+ StringPooling="false"
+ RuntimeLibrary="3"
+ EnableEnhancedInstructionSet="1"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings=" 4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)..\..\build\products\$(ConfigurationName)\libid3tag.dll"
+ GenerateDebugInformation="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ UseOfMFC="0"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ Description="Copy Win32 config.h"
+ CommandLine="copy $(InputDir)..\config.h.win32 $(InputDir)..\config.h"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="0"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories=".\;..\;..\include;..\include\id3;&quot;$(ProjectDir)..\..\zlib-1.2.3&quot;"
+ PreprocessorDefinitions="NDEBUG;WIN32;_USRDLL;DLL_EXPORTS;_WINDOWS;HAVE_CONFIG_H;ID3LIB_LINKOPTION=2;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS"
+ RuntimeLibrary="2"
+ EnableEnhancedInstructionSet="1"
+ FloatingPointModel="0"
+ Detect64BitPortabilityProblems="false"
+ DisableSpecificWarnings=" 4996"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)..\..\build\products\$(ConfigurationName)\libid3tag.dll"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="..\src\c_wrapper.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_binary.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_integer.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_string_ascii.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_string_unicode.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_impl.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_render.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\globals.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header_frame.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header_tag.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\helpers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io_decorators.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io_helpers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\misc_support.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\mp3_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\readers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\spec.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_file.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_find.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_impl.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_lyrics3.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_musicmatch.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_v1.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_render.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\utils.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="&quot;$(SolutionDir)\..\Shared&quot;"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="&quot;$(SolutionDir)\..\Shared&quot;"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\writers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Include Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath="..\config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\field.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\field_def.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\field_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\flags.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\frame_def.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\frame_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\globals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header_frame.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header_tag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\helpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_frame.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_streams.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_strings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_decorators.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_helpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_strings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\misc_support.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\mp3_header.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\reader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\readers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\sized_types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\spec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\tag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tag_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\writer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\writers.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/libprj/id3lib.xcodeproj/project.pbxproj b/libprj/id3lib.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..6cd039d
--- /dev/null
+++ b/libprj/id3lib.xcodeproj/project.pbxproj
@@ -0,0 +1,462 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ D779EBE91124D6960083966D /* libz.1.2.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D779EBE31124D6960083966D /* libz.1.2.3.dylib */; };
+ D7FD006F1124D62D0074EF0B /* field.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00301124D62D0074EF0B /* field.h */; };
+ D7FD00701124D62D0074EF0B /* globals.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00311124D62D0074EF0B /* globals.h */; };
+ D7FD00711124D62D0074EF0B /* helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00321124D62D0074EF0B /* helpers.h */; };
+ D7FD00721124D62D0074EF0B /* id3lib_frame.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00331124D62D0074EF0B /* id3lib_frame.h */; };
+ D7FD00731124D62D0074EF0B /* id3lib_streams.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00341124D62D0074EF0B /* id3lib_streams.h */; };
+ D7FD00741124D62D0074EF0B /* id3lib_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00351124D62D0074EF0B /* id3lib_strings.h */; };
+ D7FD00751124D62D0074EF0B /* io_decorators.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00361124D62D0074EF0B /* io_decorators.h */; };
+ D7FD00761124D62D0074EF0B /* io_helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00371124D62D0074EF0B /* io_helpers.h */; };
+ D7FD00771124D62D0074EF0B /* io_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00381124D62D0074EF0B /* io_strings.h */; };
+ D7FD00781124D62D0074EF0B /* misc_support.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00391124D62D0074EF0B /* misc_support.h */; };
+ D7FD00791124D62D0074EF0B /* reader.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003A1124D62D0074EF0B /* reader.h */; };
+ D7FD007A1124D62D0074EF0B /* readers.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003B1124D62D0074EF0B /* readers.h */; };
+ D7FD007B1124D62D0074EF0B /* sized_types.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003C1124D62D0074EF0B /* sized_types.h */; };
+ D7FD007C1124D62D0074EF0B /* tag.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003D1124D62D0074EF0B /* tag.h */; };
+ D7FD007D1124D62D0074EF0B /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003E1124D62D0074EF0B /* utils.h */; };
+ D7FD007E1124D62D0074EF0B /* writer.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD003F1124D62D0074EF0B /* writer.h */; };
+ D7FD007F1124D62D0074EF0B /* writers.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00401124D62D0074EF0B /* writers.h */; };
+ D7FD00801124D62D0074EF0B /* id3.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00411124D62D0074EF0B /* id3.h */; };
+ D7FD00811124D62D0074EF0B /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00421124D62D0074EF0B /* config.h */; };
+ D7FD00821124D62D0074EF0B /* writers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00431124D62D0074EF0B /* writers.cpp */; };
+ D7FD00831124D62D0074EF0B /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00441124D62D0074EF0B /* utils.cpp */; };
+ D7FD00841124D62D0074EF0B /* tag_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00451124D62D0074EF0B /* tag_render.cpp */; };
+ D7FD00851124D62D0074EF0B /* tag_parse_v1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00461124D62D0074EF0B /* tag_parse_v1.cpp */; };
+ D7FD00861124D62D0074EF0B /* tag_parse_musicmatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00471124D62D0074EF0B /* tag_parse_musicmatch.cpp */; };
+ D7FD00871124D62D0074EF0B /* tag_parse_lyrics3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00481124D62D0074EF0B /* tag_parse_lyrics3.cpp */; };
+ D7FD00881124D62D0074EF0B /* tag_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00491124D62D0074EF0B /* tag_parse.cpp */; };
+ D7FD00891124D62D0074EF0B /* tag_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD004A1124D62D0074EF0B /* tag_impl.h */; };
+ D7FD008A1124D62D0074EF0B /* tag_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD004B1124D62D0074EF0B /* tag_impl.cpp */; };
+ D7FD008B1124D62D0074EF0B /* tag_find.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD004C1124D62D0074EF0B /* tag_find.cpp */; };
+ D7FD008C1124D62D0074EF0B /* tag_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD004D1124D62D0074EF0B /* tag_file.cpp */; };
+ D7FD008D1124D62D0074EF0B /* tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD004E1124D62D0074EF0B /* tag.cpp */; };
+ D7FD008E1124D62D0074EF0B /* spec.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD004F1124D62D0074EF0B /* spec.h */; };
+ D7FD008F1124D62D0074EF0B /* spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00501124D62D0074EF0B /* spec.cpp */; };
+ D7FD00901124D62D0074EF0B /* readers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00511124D62D0074EF0B /* readers.cpp */; };
+ D7FD00911124D62D0074EF0B /* mp3_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00521124D62D0074EF0B /* mp3_parse.cpp */; };
+ D7FD00921124D62D0074EF0B /* mp3_header.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00531124D62D0074EF0B /* mp3_header.h */; };
+ D7FD00931124D62D0074EF0B /* misc_support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00541124D62D0074EF0B /* misc_support.cpp */; };
+ D7FD00941124D62D0074EF0B /* io_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00551124D62D0074EF0B /* io_helpers.cpp */; };
+ D7FD00951124D62D0074EF0B /* io_decorators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00561124D62D0074EF0B /* io_decorators.cpp */; };
+ D7FD00961124D62D0074EF0B /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00571124D62D0074EF0B /* io.cpp */; };
+ D7FD00971124D62D0074EF0B /* helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00581124D62D0074EF0B /* helpers.cpp */; };
+ D7FD00981124D62D0074EF0B /* header_tag.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00591124D62D0074EF0B /* header_tag.h */; };
+ D7FD00991124D62D0074EF0B /* header_tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD005A1124D62D0074EF0B /* header_tag.cpp */; };
+ D7FD009A1124D62D0074EF0B /* header_frame.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD005B1124D62D0074EF0B /* header_frame.h */; };
+ D7FD009B1124D62D0074EF0B /* header_frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD005C1124D62D0074EF0B /* header_frame.cpp */; };
+ D7FD009C1124D62D0074EF0B /* header.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD005D1124D62D0074EF0B /* header.h */; };
+ D7FD009D1124D62D0074EF0B /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD005E1124D62D0074EF0B /* header.cpp */; };
+ D7FD009E1124D62D0074EF0B /* globals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD005F1124D62D0074EF0B /* globals.cpp */; };
+ D7FD009F1124D62D0074EF0B /* frame_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00601124D62D0074EF0B /* frame_render.cpp */; };
+ D7FD00A01124D62D0074EF0B /* frame_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00611124D62D0074EF0B /* frame_parse.cpp */; };
+ D7FD00A11124D62D0074EF0B /* frame_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00621124D62D0074EF0B /* frame_impl.h */; };
+ D7FD00A21124D62D0074EF0B /* frame_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00631124D62D0074EF0B /* frame_impl.cpp */; };
+ D7FD00A31124D62D0074EF0B /* frame_def.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00641124D62D0074EF0B /* frame_def.h */; };
+ D7FD00A41124D62D0074EF0B /* frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00651124D62D0074EF0B /* frame.cpp */; };
+ D7FD00A51124D62D0074EF0B /* flags.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD00661124D62D0074EF0B /* flags.h */; };
+ D7FD00A61124D62D0074EF0B /* field_string_unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00671124D62D0074EF0B /* field_string_unicode.cpp */; };
+ D7FD00A71124D62D0074EF0B /* field_string_ascii.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00681124D62D0074EF0B /* field_string_ascii.cpp */; };
+ D7FD00A81124D62D0074EF0B /* field_integer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD00691124D62D0074EF0B /* field_integer.cpp */; };
+ D7FD00A91124D62D0074EF0B /* field_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD006A1124D62D0074EF0B /* field_impl.h */; };
+ D7FD00AA1124D62D0074EF0B /* field_def.h in Headers */ = {isa = PBXBuildFile; fileRef = D7FD006B1124D62D0074EF0B /* field_def.h */; };
+ D7FD00AB1124D62D0074EF0B /* field_binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD006C1124D62D0074EF0B /* field_binary.cpp */; };
+ D7FD00AC1124D62D0074EF0B /* field.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD006D1124D62D0074EF0B /* field.cpp */; };
+ D7FD00AD1124D62D0074EF0B /* c_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D7FD006E1124D62D0074EF0B /* c_wrapper.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ D2AAC0630554660B00DB518D /* libid3tag.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libid3tag.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ D71350461124D56600E2C1DA /* MacConfigExternalDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = MacConfigExternalDebug.xcconfig; path = ../../MacConfigExternalDebug.xcconfig; sourceTree = SOURCE_ROOT; };
+ D71350471124D56600E2C1DA /* MacConfigExternalRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = MacConfigExternalRelease.xcconfig; path = ../../MacConfigExternalRelease.xcconfig; sourceTree = SOURCE_ROOT; };
+ D779EBE31124D6960083966D /* libz.1.2.3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.2.3.dylib; path = /usr/lib/libz.1.2.3.dylib; sourceTree = "<absolute>"; };
+ D7FD00301124D62D0074EF0B /* field.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = field.h; path = ../include/id3/field.h; sourceTree = SOURCE_ROOT; };
+ D7FD00311124D62D0074EF0B /* globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = globals.h; path = ../include/id3/globals.h; sourceTree = SOURCE_ROOT; };
+ D7FD00321124D62D0074EF0B /* helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = helpers.h; path = ../include/id3/helpers.h; sourceTree = SOURCE_ROOT; };
+ D7FD00331124D62D0074EF0B /* id3lib_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = id3lib_frame.h; path = ../include/id3/id3lib_frame.h; sourceTree = SOURCE_ROOT; };
+ D7FD00341124D62D0074EF0B /* id3lib_streams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = id3lib_streams.h; path = ../include/id3/id3lib_streams.h; sourceTree = SOURCE_ROOT; };
+ D7FD00351124D62D0074EF0B /* id3lib_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = id3lib_strings.h; path = ../include/id3/id3lib_strings.h; sourceTree = SOURCE_ROOT; };
+ D7FD00361124D62D0074EF0B /* io_decorators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io_decorators.h; path = ../include/id3/io_decorators.h; sourceTree = SOURCE_ROOT; };
+ D7FD00371124D62D0074EF0B /* io_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io_helpers.h; path = ../include/id3/io_helpers.h; sourceTree = SOURCE_ROOT; };
+ D7FD00381124D62D0074EF0B /* io_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io_strings.h; path = ../include/id3/io_strings.h; sourceTree = SOURCE_ROOT; };
+ D7FD00391124D62D0074EF0B /* misc_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = misc_support.h; path = ../include/id3/misc_support.h; sourceTree = SOURCE_ROOT; };
+ D7FD003A1124D62D0074EF0B /* reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = reader.h; path = ../include/id3/reader.h; sourceTree = SOURCE_ROOT; };
+ D7FD003B1124D62D0074EF0B /* readers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = readers.h; path = ../include/id3/readers.h; sourceTree = SOURCE_ROOT; };
+ D7FD003C1124D62D0074EF0B /* sized_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sized_types.h; path = ../include/id3/sized_types.h; sourceTree = SOURCE_ROOT; };
+ D7FD003D1124D62D0074EF0B /* tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag.h; path = ../include/id3/tag.h; sourceTree = SOURCE_ROOT; };
+ D7FD003E1124D62D0074EF0B /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../include/id3/utils.h; sourceTree = SOURCE_ROOT; };
+ D7FD003F1124D62D0074EF0B /* writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = writer.h; path = ../include/id3/writer.h; sourceTree = SOURCE_ROOT; };
+ D7FD00401124D62D0074EF0B /* writers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = writers.h; path = ../include/id3/writers.h; sourceTree = SOURCE_ROOT; };
+ D7FD00411124D62D0074EF0B /* id3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = id3.h; path = ../include/id3.h; sourceTree = SOURCE_ROOT; };
+ D7FD00421124D62D0074EF0B /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../prj/macosx/config.h; sourceTree = SOURCE_ROOT; };
+ D7FD00431124D62D0074EF0B /* writers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = writers.cpp; path = ../src/writers.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00441124D62D0074EF0B /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cpp; path = ../src/utils.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00451124D62D0074EF0B /* tag_render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_render.cpp; path = ../src/tag_render.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00461124D62D0074EF0B /* tag_parse_v1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_v1.cpp; path = ../src/tag_parse_v1.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00471124D62D0074EF0B /* tag_parse_musicmatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_musicmatch.cpp; path = ../src/tag_parse_musicmatch.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00481124D62D0074EF0B /* tag_parse_lyrics3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_lyrics3.cpp; path = ../src/tag_parse_lyrics3.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00491124D62D0074EF0B /* tag_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse.cpp; path = ../src/tag_parse.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD004A1124D62D0074EF0B /* tag_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag_impl.h; path = ../src/tag_impl.h; sourceTree = SOURCE_ROOT; };
+ D7FD004B1124D62D0074EF0B /* tag_impl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_impl.cpp; path = ../src/tag_impl.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD004C1124D62D0074EF0B /* tag_find.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_find.cpp; path = ../src/tag_find.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD004D1124D62D0074EF0B /* tag_file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag_file.cpp; path = ../src/tag_file.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD004E1124D62D0074EF0B /* tag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tag.cpp; path = ../src/tag.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD004F1124D62D0074EF0B /* spec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spec.h; path = ../src/spec.h; sourceTree = SOURCE_ROOT; };
+ D7FD00501124D62D0074EF0B /* spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = spec.cpp; path = ../src/spec.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00511124D62D0074EF0B /* readers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = readers.cpp; path = ../src/readers.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00521124D62D0074EF0B /* mp3_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mp3_parse.cpp; path = ../src/mp3_parse.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00531124D62D0074EF0B /* mp3_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mp3_header.h; path = ../src/mp3_header.h; sourceTree = SOURCE_ROOT; };
+ D7FD00541124D62D0074EF0B /* misc_support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = misc_support.cpp; path = ../src/misc_support.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00551124D62D0074EF0B /* io_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io_helpers.cpp; path = ../src/io_helpers.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00561124D62D0074EF0B /* io_decorators.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io_decorators.cpp; path = ../src/io_decorators.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00571124D62D0074EF0B /* io.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io.cpp; path = ../src/io.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00581124D62D0074EF0B /* helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = helpers.cpp; path = ../src/helpers.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00591124D62D0074EF0B /* header_tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = header_tag.h; path = ../src/header_tag.h; sourceTree = SOURCE_ROOT; };
+ D7FD005A1124D62D0074EF0B /* header_tag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = header_tag.cpp; path = ../src/header_tag.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD005B1124D62D0074EF0B /* header_frame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = header_frame.h; path = ../src/header_frame.h; sourceTree = SOURCE_ROOT; };
+ D7FD005C1124D62D0074EF0B /* header_frame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = header_frame.cpp; path = ../src/header_frame.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD005D1124D62D0074EF0B /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = header.h; path = ../src/header.h; sourceTree = SOURCE_ROOT; };
+ D7FD005E1124D62D0074EF0B /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = header.cpp; path = ../src/header.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD005F1124D62D0074EF0B /* globals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = globals.cpp; path = ../src/globals.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00601124D62D0074EF0B /* frame_render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame_render.cpp; path = ../src/frame_render.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00611124D62D0074EF0B /* frame_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame_parse.cpp; path = ../src/frame_parse.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00621124D62D0074EF0B /* frame_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = frame_impl.h; path = ../src/frame_impl.h; sourceTree = SOURCE_ROOT; };
+ D7FD00631124D62D0074EF0B /* frame_impl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame_impl.cpp; path = ../src/frame_impl.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00641124D62D0074EF0B /* frame_def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = frame_def.h; path = ../src/frame_def.h; sourceTree = SOURCE_ROOT; };
+ D7FD00651124D62D0074EF0B /* frame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = frame.cpp; path = ../src/frame.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00661124D62D0074EF0B /* flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = flags.h; path = ../src/flags.h; sourceTree = SOURCE_ROOT; };
+ D7FD00671124D62D0074EF0B /* field_string_unicode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = field_string_unicode.cpp; path = ../src/field_string_unicode.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00681124D62D0074EF0B /* field_string_ascii.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = field_string_ascii.cpp; path = ../src/field_string_ascii.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD00691124D62D0074EF0B /* field_integer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = field_integer.cpp; path = ../src/field_integer.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD006A1124D62D0074EF0B /* field_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = field_impl.h; path = ../src/field_impl.h; sourceTree = SOURCE_ROOT; };
+ D7FD006B1124D62D0074EF0B /* field_def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = field_def.h; path = ../src/field_def.h; sourceTree = SOURCE_ROOT; };
+ D7FD006C1124D62D0074EF0B /* field_binary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = field_binary.cpp; path = ../src/field_binary.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD006D1124D62D0074EF0B /* field.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = field.cpp; path = ../src/field.cpp; sourceTree = SOURCE_ROOT; };
+ D7FD006E1124D62D0074EF0B /* c_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = c_wrapper.cpp; path = ../src/c_wrapper.cpp; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D289988505E68E00004EDB86 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D779EBE91124D6960083966D /* libz.1.2.3.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* id3lib */ = {
+ isa = PBXGroup;
+ children = (
+ D71350461124D56600E2C1DA /* MacConfigExternalDebug.xcconfig */,
+ D71350471124D56600E2C1DA /* MacConfigExternalRelease.xcconfig */,
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ D779EBE21124D6960083966D /* External Libraries */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = id3lib;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ D7FD002F1124D62D0074EF0B /* id3 */,
+ D7FD00411124D62D0074EF0B /* id3.h */,
+ D7FD00421124D62D0074EF0B /* config.h */,
+ D7FD00431124D62D0074EF0B /* writers.cpp */,
+ D7FD00441124D62D0074EF0B /* utils.cpp */,
+ D7FD00451124D62D0074EF0B /* tag_render.cpp */,
+ D7FD00461124D62D0074EF0B /* tag_parse_v1.cpp */,
+ D7FD00471124D62D0074EF0B /* tag_parse_musicmatch.cpp */,
+ D7FD00481124D62D0074EF0B /* tag_parse_lyrics3.cpp */,
+ D7FD00491124D62D0074EF0B /* tag_parse.cpp */,
+ D7FD004A1124D62D0074EF0B /* tag_impl.h */,
+ D7FD004B1124D62D0074EF0B /* tag_impl.cpp */,
+ D7FD004C1124D62D0074EF0B /* tag_find.cpp */,
+ D7FD004D1124D62D0074EF0B /* tag_file.cpp */,
+ D7FD004E1124D62D0074EF0B /* tag.cpp */,
+ D7FD004F1124D62D0074EF0B /* spec.h */,
+ D7FD00501124D62D0074EF0B /* spec.cpp */,
+ D7FD00511124D62D0074EF0B /* readers.cpp */,
+ D7FD00521124D62D0074EF0B /* mp3_parse.cpp */,
+ D7FD00531124D62D0074EF0B /* mp3_header.h */,
+ D7FD00541124D62D0074EF0B /* misc_support.cpp */,
+ D7FD00551124D62D0074EF0B /* io_helpers.cpp */,
+ D7FD00561124D62D0074EF0B /* io_decorators.cpp */,
+ D7FD00571124D62D0074EF0B /* io.cpp */,
+ D7FD00581124D62D0074EF0B /* helpers.cpp */,
+ D7FD00591124D62D0074EF0B /* header_tag.h */,
+ D7FD005A1124D62D0074EF0B /* header_tag.cpp */,
+ D7FD005B1124D62D0074EF0B /* header_frame.h */,
+ D7FD005C1124D62D0074EF0B /* header_frame.cpp */,
+ D7FD005D1124D62D0074EF0B /* header.h */,
+ D7FD005E1124D62D0074EF0B /* header.cpp */,
+ D7FD005F1124D62D0074EF0B /* globals.cpp */,
+ D7FD00601124D62D0074EF0B /* frame_render.cpp */,
+ D7FD00611124D62D0074EF0B /* frame_parse.cpp */,
+ D7FD00621124D62D0074EF0B /* frame_impl.h */,
+ D7FD00631124D62D0074EF0B /* frame_impl.cpp */,
+ D7FD00641124D62D0074EF0B /* frame_def.h */,
+ D7FD00651124D62D0074EF0B /* frame.cpp */,
+ D7FD00661124D62D0074EF0B /* flags.h */,
+ D7FD00671124D62D0074EF0B /* field_string_unicode.cpp */,
+ D7FD00681124D62D0074EF0B /* field_string_ascii.cpp */,
+ D7FD00691124D62D0074EF0B /* field_integer.cpp */,
+ D7FD006A1124D62D0074EF0B /* field_impl.h */,
+ D7FD006B1124D62D0074EF0B /* field_def.h */,
+ D7FD006C1124D62D0074EF0B /* field_binary.cpp */,
+ D7FD006D1124D62D0074EF0B /* field.cpp */,
+ D7FD006E1124D62D0074EF0B /* c_wrapper.cpp */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D2AAC0630554660B00DB518D /* libid3tag.dylib */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ D779EBE21124D6960083966D /* External Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ D779EBE31124D6960083966D /* libz.1.2.3.dylib */,
+ );
+ name = "External Libraries";
+ path = "/Volumes/Home/Builds/Work/project/branches/dlls/External/id3lib-3.8.3/libprj";
+ sourceTree = "<absolute>";
+ };
+ D7FD002F1124D62D0074EF0B /* id3 */ = {
+ isa = PBXGroup;
+ children = (
+ D7FD00301124D62D0074EF0B /* field.h */,
+ D7FD00311124D62D0074EF0B /* globals.h */,
+ D7FD00321124D62D0074EF0B /* helpers.h */,
+ D7FD00331124D62D0074EF0B /* id3lib_frame.h */,
+ D7FD00341124D62D0074EF0B /* id3lib_streams.h */,
+ D7FD00351124D62D0074EF0B /* id3lib_strings.h */,
+ D7FD00361124D62D0074EF0B /* io_decorators.h */,
+ D7FD00371124D62D0074EF0B /* io_helpers.h */,
+ D7FD00381124D62D0074EF0B /* io_strings.h */,
+ D7FD00391124D62D0074EF0B /* misc_support.h */,
+ D7FD003A1124D62D0074EF0B /* reader.h */,
+ D7FD003B1124D62D0074EF0B /* readers.h */,
+ D7FD003C1124D62D0074EF0B /* sized_types.h */,
+ D7FD003D1124D62D0074EF0B /* tag.h */,
+ D7FD003E1124D62D0074EF0B /* utils.h */,
+ D7FD003F1124D62D0074EF0B /* writer.h */,
+ D7FD00401124D62D0074EF0B /* writers.h */,
+ );
+ name = id3;
+ path = ../include/id3;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D2AAC0600554660B00DB518D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D7FD006F1124D62D0074EF0B /* field.h in Headers */,
+ D7FD00701124D62D0074EF0B /* globals.h in Headers */,
+ D7FD00711124D62D0074EF0B /* helpers.h in Headers */,
+ D7FD00721124D62D0074EF0B /* id3lib_frame.h in Headers */,
+ D7FD00731124D62D0074EF0B /* id3lib_streams.h in Headers */,
+ D7FD00741124D62D0074EF0B /* id3lib_strings.h in Headers */,
+ D7FD00751124D62D0074EF0B /* io_decorators.h in Headers */,
+ D7FD00761124D62D0074EF0B /* io_helpers.h in Headers */,
+ D7FD00771124D62D0074EF0B /* io_strings.h in Headers */,
+ D7FD00781124D62D0074EF0B /* misc_support.h in Headers */,
+ D7FD00791124D62D0074EF0B /* reader.h in Headers */,
+ D7FD007A1124D62D0074EF0B /* readers.h in Headers */,
+ D7FD007B1124D62D0074EF0B /* sized_types.h in Headers */,
+ D7FD007C1124D62D0074EF0B /* tag.h in Headers */,
+ D7FD007D1124D62D0074EF0B /* utils.h in Headers */,
+ D7FD007E1124D62D0074EF0B /* writer.h in Headers */,
+ D7FD007F1124D62D0074EF0B /* writers.h in Headers */,
+ D7FD00801124D62D0074EF0B /* id3.h in Headers */,
+ D7FD00811124D62D0074EF0B /* config.h in Headers */,
+ D7FD00891124D62D0074EF0B /* tag_impl.h in Headers */,
+ D7FD008E1124D62D0074EF0B /* spec.h in Headers */,
+ D7FD00921124D62D0074EF0B /* mp3_header.h in Headers */,
+ D7FD00981124D62D0074EF0B /* header_tag.h in Headers */,
+ D7FD009A1124D62D0074EF0B /* header_frame.h in Headers */,
+ D7FD009C1124D62D0074EF0B /* header.h in Headers */,
+ D7FD00A11124D62D0074EF0B /* frame_impl.h in Headers */,
+ D7FD00A31124D62D0074EF0B /* frame_def.h in Headers */,
+ D7FD00A51124D62D0074EF0B /* flags.h in Headers */,
+ D7FD00A91124D62D0074EF0B /* field_impl.h in Headers */,
+ D7FD00AA1124D62D0074EF0B /* field_def.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D2AAC0620554660B00DB518D /* id3lib */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "id3lib" */;
+ buildPhases = (
+ D2AAC0600554660B00DB518D /* Headers */,
+ D2AAC0610554660B00DB518D /* Sources */,
+ D289988505E68E00004EDB86 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = id3lib;
+ productName = id3lib;
+ productReference = D2AAC0630554660B00DB518D /* libid3tag.dylib */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "id3lib" */;
+ compatibilityVersion = "Xcode 3.1";
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* id3lib */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D2AAC0620554660B00DB518D /* id3lib */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D2AAC0610554660B00DB518D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D7FD00821124D62D0074EF0B /* writers.cpp in Sources */,
+ D7FD00831124D62D0074EF0B /* utils.cpp in Sources */,
+ D7FD00841124D62D0074EF0B /* tag_render.cpp in Sources */,
+ D7FD00851124D62D0074EF0B /* tag_parse_v1.cpp in Sources */,
+ D7FD00861124D62D0074EF0B /* tag_parse_musicmatch.cpp in Sources */,
+ D7FD00871124D62D0074EF0B /* tag_parse_lyrics3.cpp in Sources */,
+ D7FD00881124D62D0074EF0B /* tag_parse.cpp in Sources */,
+ D7FD008A1124D62D0074EF0B /* tag_impl.cpp in Sources */,
+ D7FD008B1124D62D0074EF0B /* tag_find.cpp in Sources */,
+ D7FD008C1124D62D0074EF0B /* tag_file.cpp in Sources */,
+ D7FD008D1124D62D0074EF0B /* tag.cpp in Sources */,
+ D7FD008F1124D62D0074EF0B /* spec.cpp in Sources */,
+ D7FD00901124D62D0074EF0B /* readers.cpp in Sources */,
+ D7FD00911124D62D0074EF0B /* mp3_parse.cpp in Sources */,
+ D7FD00931124D62D0074EF0B /* misc_support.cpp in Sources */,
+ D7FD00941124D62D0074EF0B /* io_helpers.cpp in Sources */,
+ D7FD00951124D62D0074EF0B /* io_decorators.cpp in Sources */,
+ D7FD00961124D62D0074EF0B /* io.cpp in Sources */,
+ D7FD00971124D62D0074EF0B /* helpers.cpp in Sources */,
+ D7FD00991124D62D0074EF0B /* header_tag.cpp in Sources */,
+ D7FD009B1124D62D0074EF0B /* header_frame.cpp in Sources */,
+ D7FD009D1124D62D0074EF0B /* header.cpp in Sources */,
+ D7FD009E1124D62D0074EF0B /* globals.cpp in Sources */,
+ D7FD009F1124D62D0074EF0B /* frame_render.cpp in Sources */,
+ D7FD00A01124D62D0074EF0B /* frame_parse.cpp in Sources */,
+ D7FD00A21124D62D0074EF0B /* frame_impl.cpp in Sources */,
+ D7FD00A41124D62D0074EF0B /* frame.cpp in Sources */,
+ D7FD00A61124D62D0074EF0B /* field_string_unicode.cpp in Sources */,
+ D7FD00A71124D62D0074EF0B /* field_string_ascii.cpp in Sources */,
+ D7FD00A81124D62D0074EF0B /* field_integer.cpp in Sources */,
+ D7FD00AB1124D62D0074EF0B /* field_binary.cpp in Sources */,
+ D7FD00AC1124D62D0074EF0B /* field.cpp in Sources */,
+ D7FD00AD1124D62D0074EF0B /* c_wrapper.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB914B08733D8E0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ HAVE_CONFIG_H,
+ "$(inherited)",
+ );
+ HEADER_SEARCH_PATHS = (
+ ../include,
+ ../include/id3,
+ ../../../Source/Shared,
+ );
+ PRODUCT_NAME = id3tag;
+ };
+ name = Debug;
+ };
+ 1DEB914C08733D8E0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXECUTABLE_PREFIX = lib;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ HAVE_CONFIG_H,
+ "$(inherited)",
+ );
+ HEADER_SEARCH_PATHS = (
+ ../include,
+ ../include/id3,
+ ../../../Source/Shared,
+ );
+ PRODUCT_NAME = id3tag;
+ STRIP_STYLE = "non-global";
+ };
+ name = Release;
+ };
+ 1DEB914F08733D8E0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = D71350461124D56600E2C1DA /* MacConfigExternalDebug.xcconfig */;
+ buildSettings = {
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ };
+ name = Debug;
+ };
+ 1DEB915008733D8E0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = D71350471124D56600E2C1DA /* MacConfigExternalRelease.xcconfig */;
+ buildSettings = {
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "id3lib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB914B08733D8E0010E9CD /* Debug */,
+ 1DEB914C08733D8E0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "id3lib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB914F08733D8E0010E9CD /* Debug */,
+ 1DEB915008733D8E0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/libprj/win32.readme.first.txt b/libprj/win32.readme.first.txt
new file mode 100644
index 0000000..584c0b0
--- /dev/null
+++ b/libprj/win32.readme.first.txt
@@ -0,0 +1,75 @@
+Compiling on win32:
+
+So far, it has only been confirmed it compiles on visual C 6.0 (service pack 5),
+but if you got it working on Borland or other compilers, drop me a mail, or better, add a patch
+here: http://sourceforge.net/tracker/?group_id=979&atid=300979 with the (e.g.) borland project files.
+
+These are the directories you'll be needing:
+id3lib/prj
+id3lib/libprj
+id3lib/id3com
+
+The first one (id3lib/prj) creates the standard dll (no COM interface)
+The Second one (id3lib/libprj) creates the .lib file for static linking.
+And the third one (id3lib/id3com) creates a dll with com interface. A Visual basic demo using it is included.
+
+Before you compile, you'll need to rename id3lib/config.h.win32 to id3lib/config.h
+
+The third one is not too much tested, it was created outside this project but
+it doesn't seem to be maintained anymore. I've included it as a service.
+The original location is http://sourceforge.net/projects/id3com
+
+And, last but not least, there is a delphi project in cvs
+(http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/id3lib/id3lib-stable/delphi/)
+which uses the allready compiled dll.
+Also in there is a file called Id3lib.pas which has the interface to the dll
+defined.
+
+How to start:
+
+A) ***Your project wants to link id3lib static, and has mfc linked static:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcd" or(release) /nodefaultlib:"libc"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+B)***Your project wants to link id3lib static, and has mfc linked dynamic or has no MFC:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcmtd" or(release) /nodefaultlib:"libcmt"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+C)***Your project wants to link id3lib dynamic: (instructions below for vc)
+1) Rename config.h.win32 to config.h
+2) include prj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace (*note this is a different id3lib than above)
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=3 to your project options (settings, C/C++ tab) (*note this is a different option than above)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Compile.
+8) dump id3lib.dll in your programs project dir.
+9) distribute your program including id3lib.dll
+(MS recommend you distribute it in your programs dir and not in system(32) to avoid version conficts)
+
+Thijmen
+thijmen@id3lib.org
+
diff --git a/ltconfig b/ltconfig
new file mode 100644
index 0000000..65ec6f6
--- /dev/null
+++ b/ltconfig
@@ -0,0 +1,3017 @@
+#! /bin/sh
+
+# ltconfig - Create a system-specific libtool.
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A lot of this script is taken from autoconf-2.10.
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+echo=echo
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec "$SHELL" "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# Find the correct PATH separator. Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != "Xset"; then
+ UNAME=${UNAME-`uname 2>/dev/null`}
+ case X$UNAME in
+ *-DOS) PATH_SEPARATOR=';' ;;
+ *) PATH_SEPARATOR=':' ;;
+ esac
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+
+if test "X${echo_test_string+set}" != "Xset"; then
+ # find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
+ test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for dir in $PATH /usr/ucb; do
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running ltconfig again with it.
+ ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf "%s\n"'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+ test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+ CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+ test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# The name of this program.
+progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
+
+# Constants:
+PROGRAM=ltconfig
+PACKAGE=libtool
+VERSION=1.3.3
+TIMESTAMP=" (1.385.2.181 1999/07/02 15:49:11)"
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5'
+rm="rm -f"
+
+help="Try \`$progname --help' for more information."
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+enable_shared=yes
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+enable_static=yes
+enable_fast_install=yes
+enable_dlopen=unknown
+enable_win32_dll=no
+ltmain=
+silent=
+srcdir=
+ac_config_guess=
+ac_config_sub=
+host=
+nonopt=
+ofile="$default_ofile"
+verify_host=yes
+with_gcc=no
+with_gnu_ld=no
+need_locks=yes
+ac_ext=c
+objext=o
+libext=a
+exeext=
+cache_file=
+
+old_AR="$AR"
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+old_CPPFLAGS="$CPPFLAGS"
+old_LDFLAGS="$LDFLAGS"
+old_LD="$LD"
+old_LN_S="$LN_S"
+old_LIBS="$LIBS"
+old_NM="$NM"
+old_RANLIB="$RANLIB"
+old_DLLTOOL="$DLLTOOL"
+old_OBJDUMP="$OBJDUMP"
+old_AS="$AS"
+
+# Parse the command line options.
+args=
+prev=
+for option
+do
+ case "$option" in
+ -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ eval "$prev=\$option"
+ prev=
+ continue
+ fi
+
+ case "$option" in
+ --help) cat <<EOM
+Usage: $progname [OPTION]... [HOST [LTMAIN]]
+
+Generate a system-specific libtool script.
+
+ --debug enable verbose shell tracing
+ --disable-shared do not build shared libraries
+ --disable-static do not build static libraries
+ --disable-fast-install do not optimize for fast installation
+ --enable-dlopen enable dlopen support
+ --enable-win32-dll enable building dlls on win32 hosts
+ --help display this help and exit
+ --no-verify do not verify that HOST is a valid host type
+-o, --output=FILE specify the output file [default=$default_ofile]
+ --quiet same as \`--silent'
+ --silent do not print informational messages
+ --srcdir=DIR find \`config.guess' in DIR
+ --version output version information and exit
+ --with-gcc assume that the GNU C compiler will be used
+ --with-gnu-ld assume that the C compiler uses the GNU linker
+ --disable-lock disable file locking
+ --cache-file=FILE configure cache file
+
+LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
+that provides basic libtool functionality.
+
+HOST is the canonical host system name [default=guessed].
+EOM
+ exit 0
+ ;;
+
+ --debug)
+ echo "$progname: enabling shell trace mode"
+ set -x
+ ;;
+
+ --disable-shared) enable_shared=no ;;
+
+ --disable-static) enable_static=no ;;
+
+ --disable-fast-install) enable_fast_install=no ;;
+
+ --enable-dlopen) enable_dlopen=yes ;;
+
+ --enable-win32-dll) enable_win32_dll=yes ;;
+
+ --quiet | --silent) silent=yes ;;
+
+ --srcdir) prev=srcdir ;;
+ --srcdir=*) srcdir="$optarg" ;;
+
+ --no-verify) verify_host=no ;;
+
+ --output | -o) prev=ofile ;;
+ --output=*) ofile="$optarg" ;;
+
+ --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"; exit 0 ;;
+
+ --with-gcc) with_gcc=yes ;;
+ --with-gnu-ld) with_gnu_ld=yes ;;
+
+ --disable-lock) need_locks=no ;;
+
+ --cache-file=*) cache_file="$optarg" ;;
+
+ -*)
+ echo "$progname: unrecognized option \`$option'" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ ;;
+
+ *)
+ if test -z "$ltmain"; then
+ ltmain="$option"
+ elif test -z "$host"; then
+# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
+# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
+# echo "$progname: warning \`$option' is not a valid host type" 1>&2
+# fi
+ host="$option"
+ else
+ echo "$progname: too many arguments" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi ;;
+ esac
+done
+
+if test -z "$ltmain"; then
+ echo "$progname: you must specify a LTMAIN file" 1>&2
+ echo "$help" 1>&2
+ exit 1
+fi
+
+if test ! -f "$ltmain"; then
+ echo "$progname: \`$ltmain' does not exist" 1>&2
+ echo "$help" 1>&2
+ exit 1
+fi
+
+# Quote any args containing shell metacharacters.
+ltconfig_args=
+for arg
+do
+ case "$arg" in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ltconfig_args="$ltconfig_args '$arg'" ;;
+ *) ltconfig_args="$ltconfig_args $arg" ;;
+ esac
+done
+
+# A relevant subset of AC_INIT.
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 compiler messages saved in config.log
+# 6 checking for... messages and results
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>>./config.log
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+
+if test -n "$cache_file" && test -r "$cache_file"; then
+ echo "loading cache $cache_file within ltconfig"
+ . $cache_file
+fi
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+if test -z "$srcdir"; then
+ # Assume the source directory is the same one as the path to LTMAIN.
+ srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'`
+ test "$srcdir" = "$ltmain" && srcdir=.
+fi
+
+trap "$rm conftest*; exit 1" 1 2 15
+if test "$verify_host" = yes; then
+ # Check for config.guess and config.sub.
+ ac_aux_dir=
+ for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/config.guess; then
+ ac_aux_dir=$ac_dir
+ break
+ fi
+ done
+ if test -z "$ac_aux_dir"; then
+ echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi
+ ac_config_guess=$ac_aux_dir/config.guess
+ ac_config_sub=$ac_aux_dir/config.sub
+
+ # Make sure we can run config.sub.
+ if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
+ else
+ echo "$progname: cannot run $ac_config_sub" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi
+
+ echo $ac_n "checking host system type""... $ac_c" 1>&6
+
+ host_alias=$host
+ case "$host_alias" in
+ "")
+ if host_alias=`$SHELL $ac_config_guess`; then :
+ else
+ echo "$progname: cannot guess host type; you must specify one" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi ;;
+ esac
+ host=`$SHELL $ac_config_sub $host_alias`
+ echo "$ac_t$host" 1>&6
+
+ # Make sure the host verified.
+ test -z "$host" && exit 1
+
+elif test -z "$host"; then
+ echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
+ echo "$help" 1>&2
+ exit 1
+else
+ host_alias=$host
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case "$host_os" in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+case "$host_os" in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "${COLLECT_NAMES+set}" != set; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR cru $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+# Set a sane default for `AR'.
+test -z "$AR" && AR=ar
+
+# Set a sane default for `OBJDUMP'.
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+# If RANLIB is not set, then run the test.
+if test "${RANLIB+set}" != "set"; then
+ result=no
+
+ echo $ac_n "checking for ranlib... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then
+ RANLIB="ranlib"
+ result="ranlib"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ echo "$ac_t$result" 1>&6
+fi
+
+if test -n "$RANLIB"; then
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+fi
+
+# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$AS" && AS=as
+
+# Check to see if we are using GCC.
+if test "$with_gcc" != yes || test -z "$CC"; then
+ # If CC is not set, then try to find GCC or a usable CC.
+ if test -z "$CC"; then
+ echo $ac_n "checking for gcc... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then
+ CC="gcc"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ if test -n "$CC"; then
+ echo "$ac_t$CC" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+ fi
+
+ # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
+ if test -z "$CC"; then
+ echo $ac_n "checking for cc... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ cc_rejected=no
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/cc || test -f $dir/cc$ac_exeext; then
+ if test "$dir/cc" = "/usr/ucb/cc"; then
+ cc_rejected=yes
+ continue
+ fi
+ CC="cc"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test $cc_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same name, so the bogon will be chosen
+ # first if we set CC to just the name; use the full file name.
+ shift
+ set dummy "$dir/cc" "$@"
+ shift
+ CC="$@"
+ fi
+ fi
+
+ if test -n "$CC"; then
+ echo "$ac_t$CC" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+
+ if test -z "$CC"; then
+ echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
+ exit 1
+ fi
+ fi
+
+ # Now see if the compiler is really GCC.
+ with_gcc=no
+ echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
+ echo "$progname:581: checking whether we are using GNU C" >&5
+
+ $rm conftest.c
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+ if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ with_gcc=yes
+ fi
+ $rm conftest.c
+ echo "$ac_t$with_gcc" 1>&6
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo $ac_n "checking for object suffix... $ac_c" 1>&6
+$rm conftest*
+echo 'int i = 1;' > conftest.c
+echo "$progname:603: checking for object suffix" >& 5
+if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
+ # Append any warnings to the config.log.
+ cat conftest.err 1>&5
+
+ for ac_file in conftest.*; do
+ case $ac_file in
+ *.c) ;;
+ *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
+ esac
+ done
+else
+ cat conftest.err 1>&5
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+fi
+$rm conftest*
+echo "$ac_t$objext" 1>&6
+
+echo $ac_n "checking for executable suffix... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_exeext="no"
+ $rm conftest*
+ echo 'main () { return 0; }' > conftest.c
+ echo "$progname:629: checking for executable suffix" >& 5
+ if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then
+ # Append any warnings to the config.log.
+ cat conftest.err 1>&5
+
+ for ac_file in conftest.*; do
+ case $ac_file in
+ *.c | *.err | *.$objext ) ;;
+ *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;
+ esac
+ done
+ else
+ cat conftest.err 1>&5
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ $rm conftest*
+fi
+if test "X$ac_cv_exeext" = Xno; then
+ exeext=""
+else
+ exeext="$ac_cv_exeext"
+fi
+echo "$ac_t$ac_cv_exeext" 1>&6
+
+echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
+pic_flag=
+special_shlib_compile_flags=
+wl=
+link_static_flag=
+no_builtin_flag=
+
+if test "$with_gcc" = yes; then
+ wl='-Wl,'
+ link_static_flag='-static'
+
+ case "$host_os" in
+ beos* | irix5* | irix6* | osf3* | osf4*)
+ # PIC is the default for these OSes.
+ ;;
+ aix*)
+ # Below there is a dirty hack to force normal static linking with -ldl
+ # The problem is because libdl dynamically linked with both libc and
+ # libC (AIX C++ library), which obviously doesn't included in libraries
+ # list by gcc. This cause undefined symbols with -static flags.
+ # This hack allows C programs to be linked with "-static -ldl", but
+ # we not sure about C++ programs.
+ link_static_flag="$link_static_flag ${wl}-lC"
+ ;;
+ cygwin* | mingw* | os2*)
+ # We can build DLLs from non-PIC.
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ pic_flag='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ pic_flag=-Kconform_pic
+ fi
+ ;;
+ *)
+ pic_flag='-fPIC'
+ ;;
+ esac
+else
+ # PORTME Check for PIC flags for the system compiler.
+ case "$host_os" in
+ aix3* | aix4*)
+ # All AIX code is PIC.
+ link_static_flag='-bnso -bI:/lib/syscalls.exp'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ # Is there a better link_static_flag that works with the bundled CC?
+ wl='-Wl,'
+ link_static_flag="${wl}-a ${wl}archive"
+ pic_flag='+Z'
+ ;;
+
+ irix5* | irix6*)
+ wl='-Wl,'
+ link_static_flag='-non_shared'
+ # PIC (with -KPIC) is the default.
+ ;;
+
+ cygwin* | mingw* | os2*)
+ # We can build DLLs from non-PIC.
+ ;;
+
+ osf3* | osf4*)
+ # All OSF/1 code is PIC.
+ wl='-Wl,'
+ link_static_flag='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ pic_flag='-Kpic'
+ link_static_flag='-dn'
+ special_shlib_compile_flags='-belf'
+ ;;
+
+ solaris*)
+ pic_flag='-KPIC'
+ link_static_flag='-Bstatic'
+ wl='-Wl,'
+ ;;
+
+ sunos4*)
+ pic_flag='-PIC'
+ link_static_flag='-Bstatic'
+ wl='-Qoption ld '
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ pic_flag='-KPIC'
+ link_static_flag='-Bstatic'
+ wl='-Wl,'
+ ;;
+
+ uts4*)
+ pic_flag='-pic'
+ link_static_flag='-Bstatic'
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ pic_flag='-Kconform_pic'
+ link_static_flag='-Bstatic'
+ fi
+ ;;
+ *)
+ can_build_shared=no
+ ;;
+ esac
+fi
+
+if test -n "$pic_flag"; then
+ echo "$ac_t$pic_flag" 1>&6
+
+ # Check to make sure the pic_flag actually works.
+ echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
+ $rm conftest*
+ echo "int some_variable = 0;" > conftest.c
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $pic_flag -DPIC"
+ echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5
+ if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
+ # Append any warnings to the config.log.
+ cat conftest.err 1>&5
+
+ case "$host_os" in
+ hpux9* | hpux10* | hpux11*)
+ # On HP-UX, both CC and GCC only warn that PIC is supported... then they
+ # create non-PIC objects. So, if there were any warnings, we assume that
+ # PIC is not supported.
+ if test -s conftest.err; then
+ echo "$ac_t"no 1>&6
+ can_build_shared=no
+ pic_flag=
+ else
+ echo "$ac_t"yes 1>&6
+ pic_flag=" $pic_flag"
+ fi
+ ;;
+ *)
+ echo "$ac_t"yes 1>&6
+ pic_flag=" $pic_flag"
+ ;;
+ esac
+ else
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ can_build_shared=no
+ pic_flag=
+ echo "$ac_t"no 1>&6
+ fi
+ CFLAGS="$save_CFLAGS"
+ $rm conftest*
+else
+ echo "$ac_t"none 1>&6
+fi
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+$rm conftest*
+echo "int some_variable = 0;" > conftest.c
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory. Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.o"
+echo "$progname:829: checking if $compiler supports -c -o file.o" >&5
+if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then
+
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s out/conftest.err; then
+ echo "$ac_t"no 1>&6
+ compiler_c_o=no
+ else
+ echo "$ac_t"yes 1>&6
+ compiler_c_o=yes
+ fi
+else
+ # Append any errors to the config.log.
+ cat out/conftest.err 1>&5
+ compiler_c_o=no
+ echo "$ac_t"no 1>&6
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+if test x"$compiler_c_o" = x"yes"; then
+ # Check to see if we can write to a .lo
+ echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
+ $rm conftest*
+ echo "int some_variable = 0;" > conftest.c
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -c -o conftest.lo"
+ echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5
+if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
+
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ echo "$ac_t"no 1>&6
+ compiler_o_lo=no
+ else
+ echo "$ac_t"yes 1>&6
+ compiler_o_lo=yes
+ fi
+ else
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ compiler_o_lo=no
+ echo "$ac_t"no 1>&6
+ fi
+ CFLAGS="$save_CFLAGS"
+ $rm conftest*
+else
+ compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$ac_t$hard_links" 1>&6
+ $rm conftest*
+ if test "$hard_links" = no; then
+ echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+if test "$with_gcc" = yes; then
+ # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+ echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
+ $rm conftest*
+ echo "int some_variable = 0;" > conftest.c
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
+ echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+ if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
+
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ echo "$ac_t"no 1>&6
+ compiler_rtti_exceptions=no
+ else
+ echo "$ac_t"yes 1>&6
+ compiler_rtti_exceptions=yes
+ fi
+ else
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ compiler_rtti_exceptions=no
+ echo "$ac_t"no 1>&6
+ fi
+ CFLAGS="$save_CFLAGS"
+ $rm conftest*
+
+ if test "$compiler_rtti_exceptions" = "yes"; then
+ no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+ else
+ no_builtin_flag=' -fno-builtin'
+ fi
+
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$special_shlib_compile_flags"; then
+ echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
+ if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then :
+ else
+ echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
+ can_build_shared=no
+ fi
+fi
+
+echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
+$rm conftest*
+echo 'main(){return(0);}' > conftest.c
+save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $link_static_flag"
+echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5
+if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ echo "$ac_t$link_static_flag" 1>&6
+else
+ echo "$ac_t"none 1>&6
+ link_static_flag=
+fi
+LDFLAGS="$save_LDFLAGS"
+$rm conftest*
+
+if test -z "$LN_S"; then
+ # Check to see if we can use ln -s, or we need hard links.
+ echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
+ $rm conftest.dat
+ if ln -s X conftest.dat 2>/dev/null; then
+ $rm conftest.dat
+ LN_S="ln -s"
+ else
+ LN_S=ln
+ fi
+ if test "$LN_S" = "ln -s"; then
+ echo "$ac_t"yes 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+fi
+
+# Make sure LD is an absolute path.
+if test -z "$LD"; then
+ ac_prog=ld
+ if test "$with_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
+ echo "$progname:991: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we are not using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld... $ac_c" 1>&6
+ echo "$progname:1015: checking for GNU ld" >&5
+ else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+ echo "$progname:1018: checking for non-GNU ld" >&5
+ fi
+
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ fi
+
+ if test -n "$LD"; then
+ echo "$ac_t$LD" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+
+ if test -z "$LD"; then
+ echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
+ exit 1
+ fi
+fi
+
+# Check to see if it really is or is not GNU ld.
+echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
+# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+echo "$ac_t$with_gnu_ld" 1>&6
+
+# See if the linker supports building shared libraries.
+echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced. Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+
+case "$host_os" in
+cygwin* | mingw*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$with_gcc" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case "$host_os" in
+ aix3* | aix4*)
+ # On AIX, the GNU linker is very broken
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+
+ # Extract the symbol export list from an `--export-all' def file,
+ # then regenerate the def file from the symbol export list, so that
+ # the compiled dll only exports the symbol export list.
+ export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+ test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+ $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~
+ sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols'
+
+ archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
+ _lt_hint=1;
+ for symbol in `cat $export_symbols`; do
+ echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def;
+ _lt_hint=`expr 1 + \$_lt_hint`;
+ done~
+ test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+ test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+ $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+ $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+ $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'
+
+ old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a'
+ ;;
+
+ netbsd*)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'
+ # can we support soname and/or expsyms with a.out? -oliva
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ case $host_os in
+ cygwin* | mingw*)
+ # dlltool doesn't understand --whole-archive et. al.
+ whole_archive_flag_spec=
+ ;;
+ *)
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ ;;
+ esac
+ fi
+else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case "$host_os" in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$with_gcc" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4*)
+ hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
+ hardcode_libdir_separator=':'
+ if test "$with_gcc" = yes; then
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ shared_flag='-shared'
+ else
+ shared_flag='${wl}-bM:SRE'
+ hardcode_direct=yes
+ fi
+ allow_undefined_flag=' ${wl}-berok'
+ archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'
+ archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'
+ case "$host_os" in aix4.[01]|aix4.[01].*)
+ # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on
+ always_export_symbols=yes ;;
+ esac
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ cygwin* | mingw*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs'
+ fix_srcfile_path='`cygpath -w $srcfile`'
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ case "$host_os" in
+ hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;
+ *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;
+ esac
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_minus_L=yes # Not in the search PATH, but as the default
+ # location of the library.
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ irix5* | irix6*)
+ if test "$with_gcc" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF
+ fi
+ hardcode_libdir_flag_spec='${wl}-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
+ ;;
+
+ osf3* | osf4*)
+ if test "$with_gcc" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case "$host_os" in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ # archive_cmds='$LD -G -z text -h $soname -o $lib$libobjs$deplibs'
+ archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+echo "$ac_t$ld_shlibs" 1>&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+if test -z "$NM"; then
+ echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
+ case "$NM" in
+ [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path.
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+ for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ NM="$ac_dir/nm -p"
+ break
+ else
+ NM=${NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$NM" && NM=nm
+ ;;
+ esac
+ echo "$ac_t$NM" 1>&6
+fi
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ symcode='[BDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+ global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+ $rm conftest*
+ cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ echo "$progname:1592: checking if global_symbol_pipe works" >&5
+ if { (eval echo $progname:1593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { echo "$progname:1596: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$objext conftstm.$objext
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo $progname:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ pipe_works=yes
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ LIBS="$save_LIBS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ $rm conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ global_symbol_pipe=
+ fi
+done
+if test "$pipe_works" = yes; then
+ echo "${ac_t}ok" 1>&6
+else
+ echo "${ac_t}failed" 1>&6
+fi
+
+if test -z "$global_symbol_pipe"; then
+ global_symbol_to_cdecl=
+fi
+
+# Check hardcoding attributes.
+echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var"; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$hardcode_shlibpath_var" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+echo "$ac_t$hardcode_action" 1>&6
+
+
+reload_flag=
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
+# PORTME Some linkers may need a different reload flag.
+reload_flag='-r'
+echo "$ac_t$reload_flag" 1>&6
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+# PORTME Fill in your ld.so characteristics
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+file_magic_cmd=
+file_magic_test_file=
+deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [regex]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
+case "$host_os" in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}.so$major'
+ ;;
+
+aix4*)
+ version_type=linux
+ # AIX has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ # We preserve .a as extension for shared libraries though AIX4.2
+ # and later linker supports .so
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'
+ shlibpath_var=LIBPATH
+ deplibs_check_method=pass_all
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}.so'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ deplibs_check_method=pass_all
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+bsdi4*)
+ version_type=linux
+ library_names_spec='${libname}.so$major ${libname}.so'
+ soname_spec='${libname}.so'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=/shlib/libc.so
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw*)
+ version_type=windows
+ need_version=no
+ need_lib_prefix=no
+ if test "$with_gcc" = yes; then
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
+ else
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+ fi
+ dynamic_linker='Win32 ld.exe'
+ deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ file_magic_cmd='${OBJDUMP} -f'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case "$version_type" in
+ freebsd-elf*)
+ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=`echo /usr/lib/libc.so*`
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ deplibs_check_method=unknown
+ library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+ need_version=yes
+ ;;
+ esac
+ finish_cmds='PATH="\$PATH:/sbin" OBJFORMAT="'"$objformat"'" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ case "$host_os" in
+ freebsd2* | freebsd3.[01]*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ dynamic_linker="$host_os dld.sl"
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+ soname_spec='${libname}${release}.sl$major'
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6*)
+ version_type=irix
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}.so.$major'
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'
+ case "$host_os" in
+ irix5*)
+ libsuff= shlibsuff=
+ # this will be overridden with pass_all, but let us keep it just in case
+ deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+ ;;
+ *)
+ case "$LD" in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ # this will be overridden with pass_all, but let us keep it just in case
+ deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+ deplibs_check_method='pass_all'
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+
+ if test -f /lib/ld.so.1; then
+ dynamic_linker='GNU ld.so'
+ else
+ # Only the GNU ld.so supports shared libraries on MkLinux.
+ case "$host_cpu" in
+ powerpc*) dynamic_linker=no ;;
+ *) dynamic_linker='Linux ld.so' ;;
+ esac
+ fi
+ ;;
+
+netbsd*)
+ version_type=sunos
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+ soname_spec='${libname}${release}.so$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+openbsd*)
+ version_type=sunos
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ need_version=no
+ fi
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+os2*)
+ libname_spec='$name'
+ need_lib_prefix=no
+ library_names_spec='$libname.dll $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4*)
+ version_type=osf
+ need_version=no
+ soname_spec='${libname}${release}.so'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ # this will be overridden with pass_all, but let us keep it just in case
+ deplibs_check_method='file_magic COFF format alpha shared library'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=/shlib/libc.so
+ deplibs_check_method='pass_all'
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}.so$major'
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib"
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=/lib/libc.so
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case "$host_vendor" in
+ ncr)
+ deplibs_check_method='pass_all'
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ file_magic_cmd=/usr/bin/file
+ file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ esac
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+ soname_spec='${libname}${release}.so$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+ soname_spec='$libname.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$ac_t$dynamic_linker" 1>&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
+
+# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in
+# configure.in, otherwise build static only libraries.
+case "$host_os" in
+cygwin* | mingw* | os2*)
+ if test x$can_build_shared = xyes; then
+ test x$enable_win32_dll = xno && can_build_shared=no
+ echo "checking if package supports dlls... $can_build_shared" 1>&6
+ fi
+;;
+esac
+
+if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then
+ case "$deplibs_check_method" in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ egrep "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+fi
+
+echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4*)
+ test "$enable_shared" = yes && enable_static=no
+ ;;
+esac
+
+echo "$ac_t$enable_shared" 1>&6
+
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+
+echo "checking whether to build static libraries... $enable_static" 1>&6
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+echo $ac_n "checking for objdir... $ac_c" 1>&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$ac_t$objdir" 1>&6
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
+ lt_cv_dlopen=no lt_cv_dlopen_libs=
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "$progname:2170: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2178 "ltconfig"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo $progname:2188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen""... $ac_c" 1>&6
+echo "$progname:2207: checking for dlopen" >&5
+if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2212 "ltconfig"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+dlopen();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_dlopen=yes"
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_dlopen=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ lt_cv_dlopen="dlopen"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
+echo "$progname:2251: checking for dld_link in -ldld" >&5
+ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldld $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2259 "ltconfig"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link();
+
+int main() {
+dld_link()
+; return 0; }
+EOF
+if { (eval echo $progname:2269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load""... $ac_c" 1>&6
+echo "$progname:2288: checking for shl_load" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2293 "ltconfig"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+shl_load();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_shl_load=yes"
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_shl_load=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ lt_cv_dlopen="shl_load"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
+echo "$progname:2333: checking for shl_load in -ldld" >&5
+ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldld $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2341 "ltconfig"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load();
+
+int main() {
+shl_load()
+; return 0; }
+EOF
+if { (eval echo $progname:2352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+fi
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ fi
+
+ case "$lt_cv_dlopen" in
+ dlopen)
+for ac_hdr in dlfcn.h; do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "$progname:2395: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2400 "ltconfig"
+#include <$ac_hdr>
+int fnord = 0;
+EOF
+ac_try="$ac_compile conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo $progname:2405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ if test "x$ac_cv_header_dlfcn_h" = xyes; then
+ CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+ fi
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2433: checking whether a program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ lt_cv_dlopen_self=cross
+ else
+ cat > conftest.c <<EOF
+#line 2441 "ltconfig"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LTDL_GLOBAL DL_GLOBAL
+# else
+# define LTDL_GLOBAL 0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LTDL_LAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LTDL_LAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LTDL_LAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LTDL_LAZY_OR_NOW DL_NOW
+# else
+# define LTDL_LAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+ if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+ if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
+
+EOF
+if { (eval echo $progname:2487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ lt_cv_dlopen_self=yes
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ lt_cv_dlopen_self=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self" 1>&6
+
+ if test "$lt_cv_dlopen_self" = yes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2506: checking whether a statically linked program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ lt_cv_dlopen_self_static=cross
+ else
+ cat > conftest.c <<EOF
+#line 2514 "ltconfig"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LTDL_GLOBAL DL_GLOBAL
+# else
+# define LTDL_GLOBAL 0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LTDL_LAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LTDL_LAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LTDL_LAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LTDL_LAZY_OR_NOW DL_NOW
+# else
+# define LTDL_LAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+ if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+ if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
+
+EOF
+if { (eval echo $progname:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ lt_cv_dlopen_self_static=yes
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ lt_cv_dlopen_self_static=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
+fi
+ ;;
+ esac
+
+ case "$lt_cv_dlopen_self" in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case "$lt_cv_dlopen_self_static" in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+# Copy echo and quote the copy, instead of the original, because it is
+# used later.
+ltecho="$echo"
+if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ltecho="$CONFIG_SHELL \$0 --fallback-echo"
+fi
+LTSHELL="$SHELL"
+
+LTCONFIG_VERSION="$VERSION"
+
+# Only quote variables if we're using ltmain.sh.
+case "$ltmain" in
+*.sh)
+ # Now quote all the things that may contain metacharacters.
+ for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \
+ old_LD old_LDFLAGS old_LIBS \
+ old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \
+ AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \
+ reload_flag reload_cmds wl \
+ pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+ thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+ library_names_spec soname_spec \
+ RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+ old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \
+ file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \
+ finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+ hardcode_libdir_flag_spec hardcode_libdir_separator \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+ case "$var" in
+ reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case "$ltecho" in
+ *'\$0 --fallback-echo"')
+ ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+ trap "$rm \"$ofile\"; exit 1" 1 2 15
+ echo "creating $ofile"
+ $rm "$ofile"
+ cat <<EOF > "$ofile"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
+#
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+
+### BEGIN LIBTOOL CONFIG
+EOF
+ cfgfile="$ofile"
+ ;;
+
+*)
+ # Double-quote the variables that need it (for aesthetics).
+ for var in old_CC old_CFLAGS old_CPPFLAGS \
+ old_LD old_LDFLAGS old_LIBS \
+ old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do
+ eval "$var=\\\"\$var\\\""
+ done
+
+ # Just create a config file.
+ cfgfile="$ofile.cfg"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ echo "creating $cfgfile"
+ $rm "$cfgfile"
+ cat <<EOF > "$cfgfile"
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+EOF
+ ;;
+esac
+
+cat <<EOF >> "$cfgfile"
+# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
+# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\
+# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
+# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\
+# $0$ltconfig_args
+#
+# Compiler and other test output produced by $progname, useful for
+# debugging $progname, is in ./config.log if it exists.
+
+# The version of $progname that generated this script.
+LTCONFIG_VERSION=$LTCONFIG_VERSION
+
+# Shell to use when invoking shell scripts.
+SHELL=$LTSHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$ltecho
+
+# The archiver.
+AR=$AR
+
+# The default C compiler.
+CC=$CC
+
+# The linker used to build libraries.
+LD=$LD
+
+# Whether we need hard or soft links.
+LN_S=$LN_S
+
+# A BSD-compatible nm program.
+NM=$NM
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$reload_flag
+reload_cmds=$reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$wl
+
+# Object file suffix (normally "o").
+objext="$objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$pic_flag
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$RANLIB
+old_archive_cmds=$old_archive_cmds
+old_postinstall_cmds=$old_postinstall_cmds
+old_postuninstall_cmds=$old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$old_archive_from_new_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$archive_cmds
+archive_expsym_cmds=$archive_expsym_cmds
+postinstall_cmds=$postinstall_cmds
+postuninstall_cmds=$postuninstall_cmds
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$global_symbol_to_cdecl
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$include_expsyms
+
+EOF
+
+case "$ltmain" in
+*.sh)
+ echo '### END LIBTOOL CONFIG' >> "$ofile"
+ echo >> "$ofile"
+ case "$host_os" in
+ aix3*)
+ cat <<\EOF >> "$ofile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "${COLLECT_NAMES+set}" != set; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # Append the ltmain.sh script.
+ sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
+
+ chmod +x "$ofile"
+ ;;
+
+*)
+ # Compile the libtool program.
+ echo "FIXME: would compile $ltmain"
+ ;;
+esac
+
+test -n "$cache_file" || exit 0
+
+# AC_CACHE_SAVE
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100755
index 0000000..1113682
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,5009 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The name of this program.
+progname=`$echo "$0" | sed 's%^.*/%%'`
+modename="$progname"
+
+# Constants.
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.4.2
+TIMESTAMP=" (1.922.2.54 2001/09/11 03:33:37)"
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+SP2NL='tr \040 \012'
+NL2SP='tr \015\012 \040\040'
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+: ${IFS=" "}
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ echo "$modename: not configured to build any kind of library" 1>&2
+ echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ exit 0
+ ;;
+
+ --config)
+ sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0
+ exit 0
+ ;;
+
+ --debug)
+ echo "$progname: enabling shell trace mode"
+ set -x
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ echo "enable shared libraries"
+ else
+ echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ echo "enable static libraries"
+ else
+ echo "disable static libraries"
+ fi
+ exit 0
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --quiet | --silent)
+ show=:
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+fi
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ case $nonopt in
+ *cc | *++ | gcc* | *-gcc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ prev=
+ lastarg=
+ srcfile="$nonopt"
+ suppress_output=
+
+ user_target=no
+ for arg
+ do
+ case $prev in
+ "") ;;
+ xcompiler)
+ # Aesthetically quote the previous argument.
+ prev=
+ lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+
+ case $arg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+
+ # Add the previous argument to base_compile.
+ if test -z "$base_compile"; then
+ base_compile="$lastarg"
+ else
+ base_compile="$base_compile $lastarg"
+ fi
+ continue
+ ;;
+ esac
+
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ if test "$user_target" != "no"; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit 1
+ fi
+ user_target=next
+ ;;
+
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ if test -z "$base_compile"; then
+ base_compile="$lastarg"
+ else
+ base_compile="$base_compile $lastarg"
+ fi
+ continue
+ ;;
+ esac
+
+ case $user_target in
+ next)
+ # The next one is the -o target name
+ user_target=yes
+ continue
+ ;;
+ yes)
+ # We got the output file
+ user_target=set
+ libobj="$arg"
+ continue
+ ;;
+ esac
+
+ # Accept the current argument as the source file.
+ lastarg="$srcfile"
+ srcfile="$arg"
+
+ # Aesthetically quote the previous argument.
+
+ # Backslashify any backslashes, double quotes, and dollar signs.
+ # These are the only characters that are still specially
+ # interpreted inside of double-quoted scrings.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $lastarg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ # Add the previous argument to base_compile.
+ if test -z "$base_compile"; then
+ base_compile="$lastarg"
+ else
+ base_compile="$base_compile $lastarg"
+ fi
+ done
+
+ case $user_target in
+ set)
+ ;;
+ no)
+ # Get the name of the library object.
+ libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ *)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSfmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit 1
+ ;;
+ esac
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $libobj"
+ else
+ removelist="$libobj"
+ fi
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit 1" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit 1" 1 2 15
+ else
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $run ln "$0" "$lockfile" 2>/dev/null; do
+ $show "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit 1
+ fi
+ echo $srcfile > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ # All platforms use -DPIC, to notify preprocessed assembler code.
+ command="$base_compile $srcfile $pic_flag -DPIC"
+ else
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ fi
+ if test "$build_old_libs" = yes; then
+ lo_libobj="$libobj"
+ dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$libobj"; then
+ dir="$objdir"
+ else
+ dir="$dir/$objdir"
+ fi
+ libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+
+ if test -d "$dir"; then
+ $show "$rm $libobj"
+ $run $rm $libobj
+ else
+ $show "$mkdir $dir"
+ $run $mkdir $dir
+ status=$?
+ if test $status -ne 0 && test ! -d $dir; then
+ exit $status
+ fi
+ fi
+ fi
+ if test "$compiler_o_lo" = yes; then
+ output_obj="$libobj"
+ command="$command -o $output_obj"
+ elif test "$compiler_c_o" = yes; then
+ output_obj="$obj"
+ command="$command -o $output_obj"
+ fi
+
+ $run $rm "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit 1
+ fi
+
+ if test "$need_locks" = warn &&
+ test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+ echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit 1
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test x"$output_obj" != x"$libobj"; then
+ $show "$mv $output_obj $libobj"
+ if $run $mv $output_obj $libobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # If we have no pic_flag, then copy the object into place and finish.
+ if (test -z "$pic_flag" || test "$pic_mode" != default) &&
+ test "$build_old_libs" = yes; then
+ # Rename the .lo from within objdir to obj
+ if test -f $obj; then
+ $show $rm $obj
+ $run $rm $obj
+ fi
+
+ $show "$mv $libobj $obj"
+ if $run $mv $libobj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+ libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+ # Now arrange that obj and lo_libobj become the same file
+ $show "(cd $xdir && $LN_S $baseobj $libobj)"
+ if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+ exit 0
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Allow error messages only from the first compilation.
+ suppress_output=' >/dev/null 2>&1'
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ else
+ # All platforms use -DPIC, to notify preprocessed assembler code.
+ command="$base_compile $srcfile $pic_flag -DPIC"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ output_obj="$obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit 1
+ fi
+
+ if test "$need_locks" = warn &&
+ test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+ echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit 1
+ fi
+
+ # Just move the object if needed
+ if test x"$output_obj" != x"$obj"; then
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we do not
+ # accidentally link it into a program.
+ if test "$build_libtool_libs" != yes; then
+ $show "echo timestamp > $libobj"
+ $run eval "echo timestamp > \$libobj" || exit $?
+ else
+ # Move the .lo from within objdir
+ $show "$mv $libobj $lo_libobj"
+ if $run $mv $libobj $lo_libobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+ fi
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit 0
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invokation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args="$nonopt"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ fi
+ build_libtool_libs=no
+ build_old_libs=yes
+ prefer_static_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test $# -gt 0; do
+ arg="$1"
+ shift
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit 1
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit 1
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n $prev
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit 1
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ exit 1
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-pw32* | *-*-beos*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-mingw* | *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit 1
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.lo | *.$objext)
+ # A library or standard object.
+ if test "$prev" = dlfiles; then
+ # This file was specified with -dlopen.
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $arg"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
+ prev=
+ else
+ case $arg in
+ *.lo) libobjs="$libobjs $arg" ;;
+ *) objs="$objs $arg" ;;
+ esac
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ specialdeplibs=
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ libs="$libs $deplib"
+ done
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ notinst_path= # paths that contain not-installed libtool libraries
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+ for pass in $passes; do
+ if test "$linkmode" = prog; then
+ # Determine which files to process
+ case $pass in
+ dlopen)
+ libs="$dlfiles"
+ save_deplibs="$deplibs" # Collect dlpreopened libraries
+ deplibs=
+ ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -l*)
+ if test "$linkmode" = oldlib && test "$linkmode" = obj; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2
+ continue
+ fi
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}.la"
+ if test -f "$lib"; then
+ found=yes
+ break
+ fi
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ ;; # -l
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ if test "$deplibs_check_method" != pass_all; then
+ echo
+ echo "*** Warning: This library needs some functionality provided by $deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ else
+ echo
+ echo "*** Warning: Linking the shared library $output against the"
+ echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib'" 1>&2
+ exit 1
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variable installed.
+ installed=yes
+
+ # Read the .la file
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" = oldlib && test "$linkmode" = obj; }; then
+ # Add dl[pre]opened files of deplib
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit 1
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit 1
+ fi
+ continue
+ fi # $pass = conv
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit 1
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit 1
+ fi
+ if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload.
+ dlprefiles="$dlprefiles $lib"
+ else
+ newdlfiles="$newdlfiles $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$libdir"
+ fi
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit 1
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs"
+ fi
+ continue
+ fi
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ newlib_search_path="$newlib_search_path $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ tmp_libs="$tmp_libs $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ link_static=no # Whether the deplib will be linked statically
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ # Link against this shared library
+
+ if test "$linkmode,$pass" = "prog,link" ||
+ { test "$linkmode" = lib && test "$hardcode_into_libs" = yes; }; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ if test "$linkmode" = prog; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var"; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$temp_rpath $dir" ;;
+ esac
+ fi
+ fi
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+ libname=`eval \\$echo \"$libname_spec\"`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`echo $soroot | sed -e 's/^.*\///'`
+ newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ eval cmds=\"$extract_expsyms_cmds\"
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ eval cmds=\"$old_archive_from_expsyms_cmds\"
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit 1
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ add="-l$name"
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+
+ # Try to link the static library
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ echo
+ echo "*** Warning: This library needs some functionality provided by $lib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ echo "*** Therefore, libtool will create a static module, that should work "
+ echo "*** as long as the dlopening application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ convenience="$convenience $dir/$old_library"
+ old_convenience="$old_convenience $dir/$old_library"
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$newlib_search_path $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="-L$absdir/$objdir"
+ else
+ eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="-L$absdir"
+ fi
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$deplibs $path" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ test "$pass" != scan && dependency_libs="$newdependency_libs"
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) lib_search_path="$lib_search_path $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ if test "$pass" = "conv" &&
+ { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then
+ libs="$deplibs" # reset libs
+ deplibs=
+ fi
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit 1
+ else
+ echo
+ echo "*** Warning: Linking the shared library $output against the non-libtool"
+ echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ libext=al
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ current="$2"
+ revision="$3"
+ age="$4"
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ case $revision in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ case $age in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix)
+ major=`expr $current - $age + 1`
+ verstring="sgi$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="sgi$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=`expr $current - $age`
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ verstring="0.0"
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=""
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$mode" != relink; then
+ # Remove our outputs.
+ $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
+ $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'`
+ deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'`
+ dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'`
+ done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) dlfiles="$dlfiles $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd*)
+ # Do not include libc due to us having libc/libc_r.
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ deplibs="$deplibs -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behaviour.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $CC -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" -a "$name" -ne "0"; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ echo
+ echo "*** Warning: This library needs some functionality provided by $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ else
+ # Error occured in the first compile. Let's try to salvage the situation:
+ # Compile a seperate program for each library.
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" -a "$name" != "0"; then
+ $rm conftest
+ $CC -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ echo
+ echo "*** Warning: This library needs some functionality provided by $i."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ fi
+ else
+ droppeddeps=yes
+ echo
+ echo "*** Warning! Library $i is needed by this library but I was not able to"
+ echo "*** make it link in! You will probably need to install it or some"
+ echo "*** library that it depends on before this library will be fully"
+ echo "*** functional. Installing it before continuing would be even better."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" -a "$name" != "0"; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null \
+ | grep " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | sed 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ # It is ok to link against an archive when
+ # building a shared library.
+ if $AR -t $potlib > /dev/null 2>&1; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | sed 10q \
+ | egrep "$file_magic_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ echo
+ echo "*** Warning: This library needs some functionality provided by $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ if eval echo \"$potent_lib\" 2>/dev/null \
+ | sed 10q \
+ | egrep "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ echo
+ echo "*** Warning: This library needs some functionality provided by $a_deplib."
+ echo "*** I have the capability to make that library automatically link in when"
+ echo "*** you link to this library. But I can only do this if you have a"
+ echo "*** shared version of the library, which you do not appear to have."
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' |
+ grep . >/dev/null; then
+ echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ fi
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ echo
+ echo "*** Warning: libtool could not satisfy all declared inter-library"
+ echo "*** dependencies of module $libname. Therefore, libtool will create"
+ echo "*** a static module, that should work as long as the dlopening"
+ echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ echo
+ echo "*** However, this would only work if libtool was able to extract symbol"
+ echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** not find such a program. So, this module is probably useless."
+ echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ echo "*** The inter-library dependencies that have been dropped here will be"
+ echo "*** automatically added whenever a program is linked with this library"
+ echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ echo
+ echo "*** Since this library must not contain undefined symbols,"
+ echo "*** because either the platform does not support them or"
+ echo "*** it was explicitly requested with -no-undefined,"
+ echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ test -z "$dlname" && dlname=$soname
+
+ lib="$output_objdir/$realname"
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Ensure that we have .o objects for linkers which dislike .lo
+ # (e.g. aix) in case we are running --disable-static
+ for obj in $libobjs; do
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+ if test ! -f $xdir/$oldobj; then
+ $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+ $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+ fi
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ eval cmds=\"$export_symbols_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex"; then
+ $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "mkdir $gentop"
+ $run mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "mkdir $xdir"
+ $run mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+ libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval cmds=\"$archive_expsym_cmds\"
+ else
+ eval cmds=\"$archive_cmds\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+ exit 0
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit 1
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "mkdir $gentop"
+ $run mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "mkdir $xdir"
+ $run mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+ reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ eval cmds=\"$reload_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit 0
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ $show "echo timestamp > $libobj"
+ $run eval "echo timestamp > $libobj" || exit $?
+ exit 0
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ eval cmds=\"$reload_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ else
+ # Just create a symlink.
+ $show $rm $libobj
+ $run $rm $libobj
+ xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$libobj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+ oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+ $show "(cd $xdir && $LN_S $oldobj $baseobj)"
+ $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit 0
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$finalize_command $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$output.exp"
+ $run $rm $export_symbols
+ $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ else
+ $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+ $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`echo "$arg" | sed -e 's%^.*/%%'`
+ $run eval 'echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $mv "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
+ :
+ else
+ grep -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+ else
+ echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DPIC";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit 1
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ exit 0
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
+ case $0 in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$0 --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*) exeext=.exe ;;
+ *) exeext= ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit 1" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variable:
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ echo >> $output "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" || \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $mkdir \"\$progdir\"
+ else
+ $rm \"\$progdir/\$file\"
+ fi"
+
+ echo >> $output "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $echo \"\$relink_command_output\" >&2
+ $rm \"\$progdir/\$file\"
+ exit 1
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # win32 systems need to use the prog path for dll
+ # lookup to work
+ *-*-cygwin* | *-*-pw32*)
+ $echo >> $output "\
+ exec \$progdir/\$program \${1+\"\$@\"}
+"
+ ;;
+
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ # Export the path to the program.
+ PATH=\"\$progdir:\$PATH\"
+ export PATH
+
+ exec \$program \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit 1
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit 1
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit 0
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "mkdir $gentop"
+ $run mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ # Add in members from convenience archives.
+ for xlib in $addlibs; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "mkdir $xdir"
+ $run mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+ oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ eval cmds=\"$old_archive_from_new_cmds\"
+ else
+ # Ensure that we have .o objects in place in case we decided
+ # not to build a shared library, and have fallen back to building
+ # static libs even though --disable-static was passed!
+ for oldobj in $oldobjs; do
+ if test ! -f $oldobj; then
+ xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$oldobj"; then
+ xdir="."
+ else
+ xdir="$xdir"
+ fi
+ baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+ obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+ $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+ $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
+ fi
+ done
+
+ eval cmds=\"$old_archive_cmds\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $echo >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit 0
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg="$nonopt"
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest="$arg"
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f) prev="-f" ;;
+ -g) prev="-g" ;;
+ -m) prev="-m" ;;
+ -o) prev="-o" ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*) ;;
+
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest="$arg"
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ continue
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run eval "$striplib $destdir/$realname" || exit $?
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ for linkname
+ do
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ eval cmds=\"$postinstall_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit 0
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Do a test to see if this is really a libtool program.
+ if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
+ exit 1
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir="/tmp"
+ test -n "$TMPDIR" && tmpdir="$TMPDIR"
+ tmpdir=`mktemp -d $tmpdir/libtool-XXXXXX 2> /dev/null`
+ if test $? = 0 ; then :
+ else
+ tmpdir="$tmpdir/libtool-$$"
+ fi
+ if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
+ else
+ $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+ continue
+ fi
+ file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyways
+ case $install_prog,$host in
+ /usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ destfile=`echo $destfile | sed -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ eval cmds=\"$old_postinstall_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $0 --finish$current_libdirs'
+ else
+ exit 0
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ eval cmds=\"$finish_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit 0
+
+ echo "----------------------------------------------------------------------"
+ echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ echo " $libdir"
+ done
+ echo
+ echo "If you ever happen to want to link against installed libraries"
+ echo "in a given directory, LIBDIR, you must either use libtool, and"
+ echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ echo " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ echo " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ echo
+ echo "See any operating system documentation about shared libraries for"
+ echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ echo "----------------------------------------------------------------------"
+ exit 0
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit 1
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit 1
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved enviroment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
+ $echo "$cmd$args"
+ exit 0
+ fi
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ rm="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ rmdirs=
+
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$objdir"
+ else
+ objdir="$dir/$objdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if (test -L "$file") >/dev/null 2>&1 \
+ || (test -h "$file") >/dev/null 2>&1 \
+ || test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+ test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+ if test "$mode" = uninstall; then
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ eval cmds=\"$postuninstall_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ eval cmds=\"$old_postuninstall_cmds\"
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$rmfiles $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" \
+ && test "$non_pic_object" != none; then
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ # Do a test to see if this is a libtool program.
+ if test "$mode" = clean &&
+ (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$file
+
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit 1
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit 1
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit 1
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+-n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --version print version information
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+ exit 0
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..56891f3
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,17 @@
+# Copyright 2000 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+m4macros = \
+ id3_debug.m4 \
+ id3_unicode.m4 \
+ id3_cxx.m4
+
+EXTRA_DIST = $(m4macros)
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..047f0ae
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,256 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright 2000 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+m4macros = \
+ id3_debug.m4 \
+ id3_unicode.m4 \
+ id3_cxx.m4
+
+
+EXTRA_DIST = $(m4macros)
+subdir = m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu m4/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/id3_cxx.m4 b/m4/id3_cxx.m4
new file mode 100644
index 0000000..06248ae
--- /dev/null
+++ b/m4/id3_cxx.m4
@@ -0,0 +1,134 @@
+dnl Autoconf support for C++
+
+AC_DEFUN([ID3_CXX_WARNINGS],[
+ AC_ARG_ENABLE(cxx-warnings,
+ [ --enable-cxx-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_cxx_warnings=minimum)
+
+ AC_MSG_CHECKING(what warning flags to pass to the C++ compiler)
+ warnCXXFLAGS=
+ if test "x$GCC" != xyes; then
+ enable_compile_warnings=no
+ fi
+ if test "x$enable_cxx_warnings" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) warnCXXFLAGS="-Wall -Wno-unused -Wno-inline -Woverloaded-virtual -Wmissing-declarations" ;;
+ esac
+
+ ## -W is not all that useful. And it cannot be controlled
+ ## with individual -Wno-xxx flags, unlike -Wall
+ if test "x$enable_cxx_warnings" = "xyes"; then
+ warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Woverloaded-virtual"
+ fi
+ fi
+ fi
+ AC_MSG_RESULT($warnCXXFLAGS)
+
+ AC_ARG_ENABLE(iso-cxx,
+ [ --enable-iso-cxx Try to warn if code is not ISO C++ ],,
+ enable_iso_cxx=no)
+
+ AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler)
+ complCXXFLAGS=
+ if test "x$enable_iso_cxx" != "xno"; then
+ if test "x$GCC" = "xyes"; then
+ case " $CXXFLAGS " in
+ *[\ \ ]-ansi[\ \ ]*) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -ansi" ;;
+ esac
+
+ case " $CXXFLAGS " in
+ *[\ \ ]-pedantic[\ \ ]*) ;;
+ *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;;
+ esac
+ fi
+ fi
+ AC_MSG_RESULT($complCXXFLAGS)
+ if test "x$cxxflags_set" != "xyes"; then
+ CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS"
+ cxxflags_set=yes
+ AC_SUBST(cxxflags_set)
+ fi
+])
+
+
+# -----------------------------------------------------------------------
+# This macro tests the C++ compiler for various portability problem.
+# 1. Defines CXX_HAS_NO_BOOL if the compiler does not support the bool
+# data type
+# 2. Defines CXX_HAS_BUGGY_FOR_LOOPS if the compiler has buggy
+# scoping for the for-loop
+# Seperately we provide some config.h.bot code to be added to acconfig.h
+# that implements work-arounds for these problems.
+# -----------------------------------------------------------------------
+
+dnl ACCONFIG TEMPLATE
+dnl #undef CXX_HAS_BUGGY_FOR_LOOPS
+dnl #undef CXX_HAS_NO_BOOL
+dnl END ACCONFIG
+
+AC_DEFUN(ID3_CXX_PORTABILITY,[
+
+ AC_PROVIDE([$0])
+
+ dnl
+ dnl Check for common C++ portability problems
+ dnl
+
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ dnl Check whether we have bool
+ AC_MSG_CHECKING(whether C++ has bool)
+ AC_TRY_RUN([main() { bool b1=true; bool b2=false; }],
+ [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no)
+ AC_DEFINE(CXX_HAS_NO_BOOL) ],
+ [ AC_MSG_WARN(Don't cross-compile)]
+ )
+
+ dnl Test whether C++ has buggy for-loops
+ AC_MSG_CHECKING(whether C++ has correct scoping in for-loops)
+ AC_TRY_COMPILE([#include <iostream.h>], [
+ for (int i=0;i<10;i++) { }
+ for (int i=0;i<10;i++) { }
+], [ AC_MSG_RESULT(yes) ],
+ [ AC_MSG_RESULT(no)
+ AC_DEFINE(CXX_HAS_BUGGY_FOR_LOOPS) ])
+
+ dnl Done with the portability checks
+ AC_LANG_RESTORE
+])
+
+dnl ACCONFIG BOTTOM
+dnl
+dnl // This file defines portability work-arounds for various proprietory
+dnl // C++ compilers
+dnl
+dnl // Workaround for compilers with buggy for-loop scoping
+dnl // That's quite a few compilers actually including recent versions of
+dnl // Dec Alpha cxx, HP-UX CC and SGI CC.
+dnl // The trivial "if" statement provides the correct scoping to the
+dnl // for loop
+dnl
+dnl #ifdef CXX_HAS_BUGGY_FOR_LOOPS
+dnl #undef for
+dnl #define for if(1) for
+dnl #endif
+dnl
+dnl //
+dnl // If the C++ compiler we use doesn't have bool, then
+dnl // the following is a near-perfect work-around.
+dnl // You must make sure your code does not depend on "int" and "bool"
+dnl // being two different types, in overloading for instance.
+dnl //
+dnl
+dnl #ifdef CXX_HAS_NO_BOOL
+dnl #define bool int
+dnl #define true 1
+dnl #define false 0
+dnl #endif
+dnl
+dnl END ACCONFIG
+
diff --git a/m4/id3_debug.m4 b/m4/id3_debug.m4
new file mode 100644
index 0000000..c1a52ab
--- /dev/null
+++ b/m4/id3_debug.m4
@@ -0,0 +1,45 @@
+AC_DEFUN([ID3_DEBUG],[
+ AC_ARG_ENABLE(debug, [ --enable-debug=[no/minimum/yes] turn on debugging [default=$debug_default]],,enable_debug=$debug_default)
+
+ if test "x$enable_debug" = "xyes"; then
+ test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
+ AC_DEFINE(ID3_ENABLE_DEBUG)
+ else
+ if test "x$enable_debug" = "xno"; then
+ AC_DEFINE(ID3_DISABLE_ASSERT)
+ AC_DEFINE(ID3_DISABLE_CHECKS)
+ fi
+ fi
+])
+
+dnl ACCONFIG TEMPLATE
+dnl #undef ID3_ENABLE_DEBUG
+dnl #undef ID3_DISABLE_ASSERT
+dnl #undef ID3_DISABLE_CHECKS
+dnl END ACCONFIG
+dnl ACCONFIG BOTTOM
+dnl #if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+dnl
+dnl #define DEBUG
+dnl
+dnl #include <libcw/sys.h>
+dnl #include <libcw/debug.h>
+dnl
+dnl #define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+dnl #define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+dnl #define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+dnl #define ID3D_NOTICE(x) Dout( dc::notice, x )
+dnl #define ID3D_WARNING(x) Dout( dc::warning, x )
+dnl
+dnl #else
+dnl
+dnl # define ID3D_INIT_DOUT()
+dnl # define ID3D_INIT_WARNING()
+dnl # define ID3D_INIT_NOTICE()
+dnl # define ID3D_NOTICE(x)
+dnl # define ID3D_WARNING(x)
+dnl
+dnl #endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+dnl
+dnl END ACCONFIG
+
diff --git a/m4/id3_unicode.m4 b/m4/id3_unicode.m4
new file mode 100644
index 0000000..04429bd
--- /dev/null
+++ b/m4/id3_unicode.m4
@@ -0,0 +1,53 @@
+dnl ACCONFIG TEMPLATE
+dnl #undef ID3_ICONV_FORMAT_UTF16BE
+dnl #undef ID3_ICONV_FORMAT_UTF16LE
+dnl #undef ID3_ICONV_FORMAT_UTF8
+dnl #undef ID3_ICONV_FORMAT_ISO_8859_1
+dnl END ACCONFIG
+
+AC_DEFUN(ID3_CHECK_ICONV_FORMAT,[
+ if eval "test \"x\$$1\" = \"xno\""; then
+ AC_MSG_CHECKING(whether iconv supports $2)
+ AC_TRY_RUN([#include <iconv.h>
+ int main() { return iconv_open("$2", "$2") == -1; } ],
+ [ eval $1=yes
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED($1, "$2") ],
+ [ AC_MSG_RESULT(no) ],
+ [ AC_MSG_WARN(Don't cross-compile) ])
+ fi
+])
+
+AC_DEFUN([ID3_UNICODE],[
+ if test "x$ac_cv_header_iconv_h" = "xyes"; then
+ ID3_ICONV_FORMAT_UTF8=no
+ ID3_ICONV_FORMAT_UTF16LE=no
+ ID3_ICONV_FORMAT_UTF16BE=no
+ ID3_ICONV_FORMAT_ISO_8859_1=no
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8, UTF-8)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8, UTF8)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF8)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UTF-16BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UTF16BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UCS-2BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UCS2BE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE, UNICODEBIG)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16BE)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE, UTF-16LE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE, UTF16LE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE, UCS-2LE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE, UCS2LE)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE, UNICODE)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_UTF16LE)
+
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ISO_8859_1, ISO-8859-1)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ISO_8859_1, ASCII)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ISO_8859_1, US-ASCII)
+ ID3_CHECK_ICONV_FORMAT(ID3_ICONV_FORMAT_ISO_8859_1, US)
+# ID3_CLEAR_ICONV_FORMAT(ID3_ICONV_FORMAT_ASCII)
+ fi
+])
+
diff --git a/makefile.win32 b/makefile.win32
new file mode 100644
index 0000000..2f27836
--- /dev/null
+++ b/makefile.win32
@@ -0,0 +1,148 @@
+# $Id: makefile.win32,v 1.3 2002/08/10 11:49:08 t1mpy Exp $
+#
+# Win32 makefile for id3lib
+#
+# First off, copy config.h.win32 to config.h
+#
+# You should run this using 'name -f makefile.win32' from the
+# id3lib root directory (for instance, c:\projects\id3lib-3.8.0\).
+#
+# If you want a debug version of the lib, add DEBUG=1 to
+# the nmake command line.
+#
+# The library will be produced as 'id3lib.lib' for the release
+# version, or 'id3libd.lib' for the debug version.
+#
+# Comments, bugs, go to johan@linkdata.se
+# Mail me on how to run the command line compiler, and I'll flame you. RTFM.
+#
+# PS.
+# Wtf is it that everyone insists on using the Visual C++ IDE?
+# I mean, I found the instructions for building this lib under
+# the IDE posted on a mailing list. It was 4 pages long, at least.
+#
+
+CFLAGS=-nologo -I. -Iinclude -Iinclude\id3 -Izlib\include \
+ -W3 -WX -GX \
+ -DHAVE_CONFIG_H -DID3LIB_LINKOPTION=1
+
+!ifdef DEBUG
+SUFFIX=d
+CFLAGS=$(CFLAGS) -Od -Z7 -Oy- -MD -D "WIN32" -D "_DEBUG"
+!else
+SUFFIX=
+CFLAGS=$(CFLAGS) -Ox -Oy- -MD -D "WIN32" -D "NDEBUG"
+!endif
+
+SRCDIR=src
+ZLIBDIR=zlib\src
+OBJDIR=obj$(SUFFIX)
+
+SRCS=\
+ $(SRCDIR)\c_wrapper.cpp \
+ $(SRCDIR)\field.cpp \
+ $(SRCDIR)\field_binary.cpp \
+ $(SRCDIR)\field_integer.cpp \
+ $(SRCDIR)\field_string_ascii.cpp \
+ $(SRCDIR)\field_string_unicode.cpp \
+ $(SRCDIR)\frame.cpp \
+ $(SRCDIR)\frame_impl.cpp \
+ $(SRCDIR)\frame_parse.cpp \
+ $(SRCDIR)\frame_render.cpp \
+ $(SRCDIR)\globals.cpp \
+ $(SRCDIR)\header.cpp \
+ $(SRCDIR)\header_frame.cpp \
+ $(SRCDIR)\header_tag.cpp \
+ $(SRCDIR)\helpers.cpp \
+ $(SRCDIR)\io.cpp \
+ $(SRCDIR)\io_decorators.cpp \
+ $(SRCDIR)\io_helpers.cpp \
+ $(SRCDIR)\misc_support.cpp \
+ $(SRCDIR)\mp3_parse.cpp \
+ $(SRCDIR)\readers.cpp \
+ $(SRCDIR)\spec.cpp \
+ $(SRCDIR)\tag.cpp \
+ $(SRCDIR)\tag_file.cpp \
+ $(SRCDIR)\tag_find.cpp \
+ $(SRCDIR)\tag_impl.cpp \
+ $(SRCDIR)\tag_parse.cpp \
+ $(SRCDIR)\tag_parse_lyrics3.cpp \
+ $(SRCDIR)\tag_parse_musicmatch.cpp \
+ $(SRCDIR)\tag_parse_v1.cpp \
+ $(SRCDIR)\tag_render.cpp \
+ $(SRCDIR)\utils.cpp \
+ $(SRCDIR)\writers.cpp \
+ $(ZLIBDIR)\adler32.c \
+ $(ZLIBDIR)\compress.c \
+ $(ZLIBDIR)\crc32.c \
+ $(ZLIBDIR)\deflate.c \
+ $(ZLIBDIR)\gzio.c \
+ $(ZLIBDIR)\infblock.c \
+ $(ZLIBDIR)\infcodes.c \
+ $(ZLIBDIR)\inffast.c \
+ $(ZLIBDIR)\inflate.c \
+ $(ZLIBDIR)\inftrees.c \
+ $(ZLIBDIR)\infutil.c \
+ $(ZLIBDIR)\trees.c \
+ $(ZLIBDIR)\uncompr.c \
+ $(ZLIBDIR)\zutil.c
+
+OBJS=\
+ $(OBJDIR)\c_wrapper.obj \
+ $(OBJDIR)\field.obj \
+ $(OBJDIR)\field_binary.obj \
+ $(OBJDIR)\field_integer.obj \
+ $(OBJDIR)\field_string_ascii.obj \
+ $(OBJDIR)\field_string_unicode.obj \
+ $(OBJDIR)\frame.obj \
+ $(OBJDIR)\frame_impl.obj \
+ $(OBJDIR)\frame_parse.obj \
+ $(OBJDIR)\frame_render.obj \
+ $(OBJDIR)\globals.obj \
+ $(OBJDIR)\header.obj \
+ $(OBJDIR)\header_frame.obj \
+ $(OBJDIR)\header_tag.obj \
+ $(OBJDIR)\helpers.obj \
+ $(OBJDIR)\io.obj \
+ $(OBJDIR)\io_decorators.obj \
+ $(OBJDIR)\io_helpers.obj \
+ $(OBJDIR)\misc_support.obj \
+ $(OBJDIR)\mp3_parse.obj \
+ $(OBJDIR)\readers.obj \
+ $(OBJDIR)\spec.obj \
+ $(OBJDIR)\tag.obj \
+ $(OBJDIR)\tag_file.obj \
+ $(OBJDIR)\tag_find.obj \
+ $(OBJDIR)\tag_impl.obj \
+ $(OBJDIR)\tag_parse.obj \
+ $(OBJDIR)\tag_parse_lyrics3.obj \
+ $(OBJDIR)\tag_parse_musicmatch.obj \
+ $(OBJDIR)\tag_parse_v1.obj \
+ $(OBJDIR)\tag_render.obj \
+ $(OBJDIR)\utils.obj \
+ $(OBJDIR)\writers.obj \
+ $(OBJDIR)\adler32.obj \
+ $(OBJDIR)\compress.obj \
+ $(OBJDIR)\crc32.obj \
+ $(OBJDIR)\deflate.obj \
+ $(OBJDIR)\gzio.obj \
+ $(OBJDIR)\infblock.obj \
+ $(OBJDIR)\infcodes.obj \
+ $(OBJDIR)\inffast.obj \
+ $(OBJDIR)\inflate.obj \
+ $(OBJDIR)\inftrees.obj \
+ $(OBJDIR)\infutil.obj \
+ $(OBJDIR)\trees.obj \
+ $(OBJDIR)\uncompr.obj \
+ $(OBJDIR)\zutil.obj
+
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+ @if not exist $(OBJDIR) md $(OBJDIR)
+ @$(CC) $(CFLAGS) -Fo$*.obj -c $(SRCDIR)\$(*F).cpp
+
+{$(ZLIBDIR)}.c{$(OBJDIR)}.obj:
+ @if not exist $(OBJDIR) md $(OBJDIR)
+ @$(CC) $(CFLAGS) -Fo$*.obj -c $(ZLIBDIR)\$(*F).c
+
+id3lib$(SUFFIX).lib : $(OBJS)
+ @lib /nologo /out:id3lib$(SUFFIX).lib $(OBJS)
diff --git a/makewin32.bat b/makewin32.bat
new file mode 100755
index 0000000..7cf5563
--- /dev/null
+++ b/makewin32.bat
@@ -0,0 +1,35 @@
+REM $Id: makewin32.bat,v 1.2 2001/12/16 11:11:52 shadrack Exp $
+@echo off
+
+REM Comments, bugs go to johan@linkdata.se
+REM Mail me on how to run the command line compiler, and I'll flame you. RTFM.
+
+if defined INCLUDE goto ok
+if not exist "\program files\microsoft visual studio\VC98\bin\vcvars32.bat" goto altloc1
+call "\program files\microsoft visual studio\VC98\bin\vcvars32.bat"
+goto ok
+
+:altloc1
+if not exist "\programs\microsoft visual studio\VC98\bin\vcvars32.bat" goto altloc2
+call "\programs\microsoft visual studio\VC98\bin\vcvars32.bat"
+goto ok
+
+:altloc2
+if not exist "\programs\msvs\VC98\bin\vcvars32.bat" goto runvc
+call "\programs\msvs\VC98\bin\vcvars32.bat"
+goto ok
+
+:ok
+if not defined INCLUDE goto runvc
+if not exist config.h copy config.h.win32 config.h
+nmake DEBUG=1 -f makefile.win32
+nmake -f makefile.win32
+goto done
+
+:runvc
+echo You need to run the VCVARS32.BAT batch file.
+echo You'll find it in the Visual C++ binaries directory.
+echo Also, when installing Visual C++, you are asked if to automatically
+echo run this file when starting a command shell.
+
+:done
diff --git a/missing b/missing
new file mode 100644
index 0000000..0a7fb5a
--- /dev/null
+++ b/missing
@@ -0,0 +1,283 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.3 - GNU automake"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar ${1+"$@"} && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar ${1+"$@"} && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" ${1+"$@"} && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100644
index 0000000..c460c19
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 1999/11/01 04:12:39 scott Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/prj/Makefile.am b/prj/Makefile.am
new file mode 100644
index 0000000..0368395
--- /dev/null
+++ b/prj/Makefile.am
@@ -0,0 +1,15 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EXTRA_DIST = id3lib.dsp id3lib.dsw id3lib.mak version.rc id3lib.def win32.readme.first.txt
+
+DIST_SUBDIRS = macosx
+
diff --git a/prj/Makefile.in b/prj/Makefile.in
new file mode 100644
index 0000000..49821d1
--- /dev/null
+++ b/prj/Makefile.in
@@ -0,0 +1,250 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+EXTRA_DIST = id3lib.dsp id3lib.dsw id3lib.mak version.rc id3lib.def win32.readme.first.txt
+subdir = prj
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu prj/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/prj/id3lib.def b/prj/id3lib.def
new file mode 100644
index 0000000..b82f5bc
--- /dev/null
+++ b/prj/id3lib.def
@@ -0,0 +1,66 @@
+LIBRARY "id3lib"
+DESCRIPTION 'id3lib for windows'
+VERSION 3.8.0
+
+EXPORTS
+
+ ID3Tag_New @1
+ ID3Tag_Delete @2
+ ID3Tag_Clear @3
+ ID3Tag_HasChanged @4
+ ID3Tag_SetUnsync @5
+ ID3Tag_SetExtendedHeader @6
+ ID3Tag_SetPadding @7
+ ID3Tag_AddFrame @8
+ ID3Tag_AttachFrame @9
+ ID3Tag_AddFrames @10
+ ID3Tag_RemoveFrame @11
+ ID3Tag_Parse @12
+ ID3Tag_Link @13
+ ID3Tag_LinkWithFlags @14
+ ID3Tag_Update @15
+ ID3Tag_UpdateByTagType @16
+ ID3Tag_Strip @17
+ ID3Tag_FindFrameWithID @18
+ ID3Tag_FindFrameWithINT @19
+ ID3Tag_FindFrameWithASCII @20
+ ID3Tag_FindFrameWithUNICODE @21
+ ID3Tag_NumFrames @22
+ ID3Tag_HasTagType @23
+ ID3Tag_CreateIterator @24
+ ID3Tag_CreateConstIterator @25
+ ID3TagIterator_Delete @26
+ ID3TagIterator_GetNext @27
+ ID3TagConstIterator_Delete @28
+ ID3TagConstIterator_GetNext @29
+
+ ID3Frame_New @30
+ ID3Frame_NewID @31
+ ID3Frame_Delete @32
+ ID3Frame_Clear @33
+ ID3Frame_SetID @34
+ ID3Frame_GetID @35
+ ID3Frame_GetField @36
+ ID3Frame_SetCompression @37
+ ID3Frame_GetCompression @38
+
+
+ ID3Field_Clear @39
+ ID3Field_Size @40
+ ID3Field_GetNumTextItems @41
+ ID3Field_SetINT @42
+ ID3Field_GetINT @43
+ ID3Field_SetUNICODE @44
+ ID3Field_GetUNICODE @45
+ ID3Field_GetUNICODEItem @46
+ ID3Field_AddUNICODE @47
+ ID3Field_SetASCII @48
+ ID3Field_GetASCII @49
+ ID3Field_GetASCIIItem @50
+ ID3Field_AddASCII @51
+ ID3Field_SetBINARY @52
+ ID3Field_GetBINARY @53
+ ID3Field_FromFile @54
+ ID3Field_ToFile @55
+ ID3Tag_GetMp3HeaderInfo @56
+
diff --git a/prj/id3lib.mak b/prj/id3lib.mak
new file mode 100644
index 0000000..e62904d
--- /dev/null
+++ b/prj/id3lib.mak
@@ -0,0 +1,721 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on id3lib.dsp
+!IF "$(CFG)" == ""
+CFG=id3lib - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to id3lib - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "id3lib - Win32 Release" && "$(CFG)" != "id3lib - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "id3lib.mak" CFG="id3lib - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "id3lib - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "id3lib - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "id3lib - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\id3lib.dll"
+
+!ELSE
+
+ALL : "$(OUTDIR)\id3lib.dll"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\c_wrapper.obj"
+ -@erase "$(INTDIR)\error.obj"
+ -@erase "$(INTDIR)\field.obj"
+ -@erase "$(INTDIR)\field_binary.obj"
+ -@erase "$(INTDIR)\field_integer.obj"
+ -@erase "$(INTDIR)\field_string_ascii.obj"
+ -@erase "$(INTDIR)\field_string_unicode.obj"
+ -@erase "$(INTDIR)\frame.obj"
+ -@erase "$(INTDIR)\frame_parse.obj"
+ -@erase "$(INTDIR)\frame_render.obj"
+ -@erase "$(INTDIR)\header.obj"
+ -@erase "$(INTDIR)\globals.obj"
+ -@erase "$(INTDIR)\header_frame.obj"
+ -@erase "$(INTDIR)\header_tag.obj"
+ -@erase "$(INTDIR)\int28.obj"
+ -@erase "$(INTDIR)\misc_support.obj"
+ -@erase "$(INTDIR)\tag.obj"
+ -@erase "$(INTDIR)\tag_file.obj"
+ -@erase "$(INTDIR)\tag_find.obj"
+ -@erase "$(INTDIR)\tag_parse.obj"
+ -@erase "$(INTDIR)\tag_parse_lyrics3.obj"
+ -@erase "$(INTDIR)\tag_parse_v1.obj"
+ -@erase "$(INTDIR)\tag_render.obj"
+ -@erase "$(INTDIR)\tag_sync.obj"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(OUTDIR)\id3lib.dll"
+ -@erase "$(OUTDIR)\id3lib.exp"
+ -@erase "$(OUTDIR)\id3lib.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I ".\\" /I "..\\" /I "..\include" /I\
+ "..\include\id3" /I "..\zlib\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS"\
+ /D "HAVE_CONFIG_H" /D "__DLL" /Fp"$(INTDIR)\id3lib.pch" /YX /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\id3lib.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=zlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib\
+ comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib\
+ odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)\id3lib.pdb" /machine:I386 /out:"$(OUTDIR)\id3lib.dll"\
+ /implib:"$(OUTDIR)\id3lib.lib" /libpath:"..\zlib"
+LINK32_OBJS= \
+ "$(INTDIR)\c_wrapper.obj" \
+ "$(INTDIR)\error.obj" \
+ "$(INTDIR)\field.obj" \
+ "$(INTDIR)\field_binary.obj" \
+ "$(INTDIR)\field_integer.obj" \
+ "$(INTDIR)\field_string_ascii.obj" \
+ "$(INTDIR)\field_string_unicode.obj" \
+ "$(INTDIR)\frame.obj" \
+ "$(INTDIR)\frame_parse.obj" \
+ "$(INTDIR)\frame_render.obj" \
+ "$(INTDIR)\globals.obj" \
+ "$(INTDIR)\header.obj" \
+ "$(INTDIR)\header_frame.obj" \
+ "$(INTDIR)\header_tag.obj" \
+ "$(INTDIR)\int28.obj" \
+ "$(INTDIR)\misc_support.obj" \
+ "$(INTDIR)\tag.obj" \
+ "$(INTDIR)\tag_file.obj" \
+ "$(INTDIR)\tag_find.obj" \
+ "$(INTDIR)\tag_parse.obj" \
+ "$(INTDIR)\tag_parse_lyrics3.obj" \
+ "$(INTDIR)\tag_parse_v1.obj" \
+ "$(INTDIR)\tag_render.obj" \
+ "$(INTDIR)\tag_sync.obj"
+
+"$(OUTDIR)\id3lib.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "id3lib - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\id3lib.dll"
+
+!ELSE
+
+ALL : "$(OUTDIR)\id3lib.dll"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\c_wrapper.obj"
+ -@erase "$(INTDIR)\error.obj"
+ -@erase "$(INTDIR)\field.obj"
+ -@erase "$(INTDIR)\field_binary.obj"
+ -@erase "$(INTDIR)\field_integer.obj"
+ -@erase "$(INTDIR)\field_string_ascii.obj"
+ -@erase "$(INTDIR)\field_string_unicode.obj"
+ -@erase "$(INTDIR)\frame.obj"
+ -@erase "$(INTDIR)\frame_parse.obj"
+ -@erase "$(INTDIR)\frame_render.obj"
+ -@erase "$(INTDIR)\globals.obj"
+ -@erase "$(INTDIR)\header.obj"
+ -@erase "$(INTDIR)\header_frame.obj"
+ -@erase "$(INTDIR)\header_tag.obj"
+ -@erase "$(INTDIR)\int28.obj"
+ -@erase "$(INTDIR)\misc_support.obj"
+ -@erase "$(INTDIR)\tag.obj"
+ -@erase "$(INTDIR)\tag_file.obj"
+ -@erase "$(INTDIR)\tag_find.obj"
+ -@erase "$(INTDIR)\tag_parse.obj"
+ -@erase "$(INTDIR)\tag_parse_lyrics3.obj"
+ -@erase "$(INTDIR)\tag_parse_v1.obj"
+ -@erase "$(INTDIR)\tag_render.obj"
+ -@erase "$(INTDIR)\tag_sync.obj"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(INTDIR)\vc50.pdb"
+ -@erase "$(OUTDIR)\id3lib.dll"
+ -@erase "$(OUTDIR)\id3lib.exp"
+ -@erase "$(OUTDIR)\id3lib.ilk"
+ -@erase "$(OUTDIR)\id3lib.lib"
+ -@erase "$(OUTDIR)\id3lib.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I ".\\" /I "..\\" /I "..\include" /I\
+ "..\include\id3" /I "..\zlib\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\
+ /D "HAVE_CONFIG_H" /D "__DLL" /Fp"$(INTDIR)\id3lib.pch" /YX /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=.
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\id3lib.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=zlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib\
+ comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib\
+ odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:yes\
+ /pdb:"$(OUTDIR)\id3lib.pdb" /debug /machine:I386 /out:"$(OUTDIR)\id3lib.dll"\
+ /implib:"$(OUTDIR)\id3lib.lib" /pdbtype:sept /libpath:"..\zlib"
+LINK32_OBJS= \
+ "$(INTDIR)\c_wrapper.obj" \
+ "$(INTDIR)\error.obj" \
+ "$(INTDIR)\field.obj" \
+ "$(INTDIR)\field_binary.obj" \
+ "$(INTDIR)\field_integer.obj" \
+ "$(INTDIR)\field_string_ascii.obj" \
+ "$(INTDIR)\field_string_unicode.obj" \
+ "$(INTDIR)\frame.obj" \
+ "$(INTDIR)\frame_parse.obj" \
+ "$(INTDIR)\frame_render.obj" \
+ "$(INTDIR)\globals.obj" \
+ "$(INTDIR)\header.obj" \
+ "$(INTDIR)\header_frame.obj" \
+ "$(INTDIR)\header_tag.obj" \
+ "$(INTDIR)\int28.obj" \
+ "$(INTDIR)\misc_support.obj" \
+ "$(INTDIR)\tag.obj" \
+ "$(INTDIR)\tag_file.obj" \
+ "$(INTDIR)\tag_find.obj" \
+ "$(INTDIR)\tag_parse.obj" \
+ "$(INTDIR)\tag_parse_lyrics3.obj" \
+ "$(INTDIR)\tag_parse_v1.obj" \
+ "$(INTDIR)\tag_render.obj" \
+ "$(INTDIR)\tag_sync.obj"
+
+"$(OUTDIR)\id3lib.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+
+!IF "$(CFG)" == "id3lib - Win32 Release" || "$(CFG)" == "id3lib - Win32 Debug"
+SOURCE=..\src\c_wrapper.cpp
+DEP_CPP_DLL_W=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\c_wrapper.obj" : $(SOURCE) $(DEP_CPP_DLL_W) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\error.cpp
+DEP_CPP_ERROR=\
+ "..\config.h"\
+
+
+"$(INTDIR)\error.obj" : $(SOURCE) $(DEP_CPP_ERROR) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\field.cpp
+DEP_CPP_FIELD=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\field.obj" : $(SOURCE) $(DEP_CPP_FIELD) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\field_binary.cpp
+DEP_CPP_FIELD_=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\field_binary.obj" : $(SOURCE) $(DEP_CPP_FIELD_) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\field_integer.cpp
+DEP_CPP_FIELD_I=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\field_integer.obj" : $(SOURCE) $(DEP_CPP_FIELD_I) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\field_string_ascii.cpp
+DEP_CPP_FIELD_S=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\field_string_ascii.obj" : $(SOURCE) $(DEP_CPP_FIELD_S) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\field_string_unicode.cpp
+DEP_CPP_FIELD_ST=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\field_string_unicode.obj" : $(SOURCE) $(DEP_CPP_FIELD_ST)\
+ "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\frame.cpp
+DEP_CPP_FRAME=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\frame.obj" : $(SOURCE) $(DEP_CPP_FRAME) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\frame_parse.cpp
+DEP_CPP_FRAME_=\
+ "..\zlib\include\zconf.h"\
+ "..\zlib\include\zlib.h"\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\frame_parse.obj" : $(SOURCE) $(DEP_CPP_FRAME_) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\frame_render.cpp
+DEP_CPP_FRAME_R=\
+ "..\zlib\include\zconf.h"\
+ "..\zlib\include\zlib.h"\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\frame_render.obj" : $(SOURCE) $(DEP_CPP_FRAME_R) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\globals.cpp
+DEP_CPP_HEADE=\
+ "..\config.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\globals.obj" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\header.cpp
+DEP_CPP_HEADE=\
+ "..\config.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\header.obj" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\header_frame.cpp
+DEP_CPP_HEADER=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\header_frame.obj" : $(SOURCE) $(DEP_CPP_HEADER) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\header_tag.cpp
+DEP_CPP_HEADER_=\
+ "..\config.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\header_tag.obj" : $(SOURCE) $(DEP_CPP_HEADER_) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\int28.cpp
+DEP_CPP_INT28=\
+ "..\config.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+
+
+"$(INTDIR)\int28.obj" : $(SOURCE) $(DEP_CPP_INT28) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\misc_support.cpp
+DEP_CPP_MISC_=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\misc_support.obj" : $(SOURCE) $(DEP_CPP_MISC_) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag.cpp
+DEP_CPP_TAG_C=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag.obj" : $(SOURCE) $(DEP_CPP_TAG_C) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_file.cpp
+DEP_CPP_TAG_F=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_file.obj" : $(SOURCE) $(DEP_CPP_TAG_F) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_find.cpp
+DEP_CPP_TAG_FI=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_find.obj" : $(SOURCE) $(DEP_CPP_TAG_FI) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_parse.cpp
+DEP_CPP_TAG_P=\
+ "..\zlib\include\zconf.h"\
+ "..\zlib\include\zlib.h"\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\tag_parse.obj" : $(SOURCE) $(DEP_CPP_TAG_P) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_parse_lyrics3.cpp
+DEP_CPP_TAG_PA=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_parse_lyrics3.obj" : $(SOURCE) $(DEP_CPP_TAG_PA) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_parse_v1.cpp
+DEP_CPP_TAG_PAR=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_parse_v1.obj" : $(SOURCE) $(DEP_CPP_TAG_PAR) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_render.cpp
+DEP_CPP_TAG_R=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\misc_support.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_render.obj" : $(SOURCE) $(DEP_CPP_TAG_R) "$(INTDIR)"\
+ "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\src\tag_sync.cpp
+DEP_CPP_TAG_S=\
+ "..\config.h"\
+ "..\include\id3\error.h"\
+ "..\include\id3\field.h"\
+ "..\include\id3\frame.h"\
+ "..\include\id3\globals.h"\
+ "..\include\id3\header.h"\
+ "..\include\id3\header_frame.h"\
+ "..\include\id3\header_tag.h"\
+ "..\include\id3\int28.h"\
+ "..\include\id3\sized_types.h"\
+ "..\include\id3\tag.h"\
+
+
+"$(INTDIR)\tag_sync.obj" : $(SOURCE) $(DEP_CPP_TAG_S) "$(INTDIR)" "..\config.h"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\config.win32
+
+!IF "$(CFG)" == "id3lib - Win32 Release"
+
+InputPath=..\config.win32
+
+"..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy ..\config.win32 ..\config.h
+
+!ELSEIF "$(CFG)" == "id3lib - Win32 Debug"
+
+InputPath=..\config.win32
+
+"..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy ..\config.win32 ..\config.h
+
+!ENDIF
+
+
+!ENDIF
+
diff --git a/prj/id3lib.sln b/prj/id3lib.sln
new file mode 100644
index 0000000..6b822ab
--- /dev/null
+++ b/prj/id3lib.sln
@@ -0,0 +1,39 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "id3lib", "id3lib.vcproj", "{9388DDE8-4580-449D-BD1C-54132832EB7F}"
+ ProjectSection(ProjectDependencies) = postProject
+ {C09E9E48-8707-465B-935D-D4B0D1B74999} = {C09E9E48-8707-465B-935D-D4B0D1B74999}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\zlib\prj\zlib.vcproj", "{C09E9E48-8707-465B-935D-D4B0D1B74999}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ NASM Debug|Win32 = NASM Debug|Win32
+ NASM Release|Win32 = NASM Release|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.Debug|Win32.Build.0 = Debug|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.NASM Debug|Win32.ActiveCfg = Debug|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.NASM Debug|Win32.Build.0 = Debug|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.NASM Release|Win32.ActiveCfg = Release|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.NASM Release|Win32.Build.0 = Release|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.Release|Win32.ActiveCfg = Release|Win32
+ {9388DDE8-4580-449D-BD1C-54132832EB7F}.Release|Win32.Build.0 = Release|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.Debug|Win32.Build.0 = Debug|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.NASM Debug|Win32.ActiveCfg = NASM Debug|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.NASM Debug|Win32.Build.0 = NASM Debug|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.NASM Release|Win32.ActiveCfg = NASM Release|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.NASM Release|Win32.Build.0 = NASM Release|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.Release|Win32.ActiveCfg = Release|Win32
+ {C09E9E48-8707-465B-935D-D4B0D1B74999}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/prj/id3lib.vcproj b/prj/id3lib.vcproj
new file mode 100644
index 0000000..a36f3dd
--- /dev/null
+++ b/prj/id3lib.vcproj
@@ -0,0 +1,1117 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="id3lib"
+ ProjectGUID="{9388DDE8-4580-449D-BD1C-54132832EB7F}"
+ SccLocalPath="H/PC Ver. 2.00"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Debug/id3lib.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+
+ AdditionalIncludeDirectories=".\,..\,..\include,..\include\id3,..\zlib\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;__DLL;HAVE_CONFIG_H;ID3LIB_LINKOPTION=2;_CRT_SECURE_NO_WARNINGS"
+
+
+ PrecompiledHeaderFile=".\Debug/id3lib.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ BrowseInformation="1"
+
+ SuppressStartupBanner="true"
+
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies=" "
+
+ SuppressStartupBanner="true"
+ ModuleDefinitionFile=".\Id3lib.def"
+
+ ProgramDatabaseFile=".\Debug/id3lib.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Debug/id3lib.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Debug/id3lib.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\Release/id3lib.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\,..\,..\include,..\include\id3,..\zlib\include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;__DLL;HAVE_CONFIG_H;ID3LIB_LINKOPTION=2;_CRT_SECURE_NO_WARNINGS"
+ StringPooling="true"
+
+
+ PrecompiledHeaderFile=".\Release/id3lib.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies=" "
+
+ SuppressStartupBanner="true"
+ ModuleDefinitionFile=".\Id3lib.def"
+ ProgramDatabaseFile=".\Release/id3lib.pdb"
+ SubSystem="2"
+ ImportLibrary=".\Release/id3lib.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/id3lib.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="source"
+ Filter="c;cpp"
+ >
+ <File
+ RelativePath="..\src\c_wrapper.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_binary.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_integer.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_string_ascii.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\field_string_unicode.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_impl.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\frame_render.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\globals.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header_frame.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\header_tag.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\helpers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io_decorators.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\io_helpers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\misc_support.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\mp3_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\readers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\spec.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_file.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_find.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_impl.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_lyrics3.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_musicmatch.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_parse_v1.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\tag_render.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\utils.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\writers.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="include"
+ Filter="h;hpp"
+ >
+ <File
+ RelativePath="..\include\id3\field.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\field_def.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\field_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\flags.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\frame_def.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\frame_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\globals.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header_frame.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\header_tag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\helpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_frame.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_streams.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\id3lib_strings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_decorators.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_helpers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\io_strings.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\misc_support.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\mp3_header.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\reader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\readers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\sized_types.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\spec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\tag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tag_impl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\writer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\include\id3\writers.h"
+ >
+ </File>
+ <File
+ RelativePath="..\zlib\include\zconf.h"
+ >
+ </File>
+ <File
+ RelativePath="..\zlib\include\zlib.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="config"
+ >
+ <File
+ RelativePath="..\config.h.win32"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="definition file"
+ Filter="def"
+ >
+ <File
+ RelativePath="Id3lib.def"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resources"
+ Filter="rc"
+ >
+ <File
+ RelativePath="version.rc"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/prj/macosx/Makefile.am b/prj/macosx/Makefile.am
new file mode 100644
index 0000000..10e39a1
--- /dev/null
+++ b/prj/macosx/Makefile.am
@@ -0,0 +1,16 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+# Copyright (C) 2006 Andre Pang <ozone@algorithm.com.au>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EXTRA_DIST = config.h id3lib-Info.plist
+
+DIST_SBUDIRS = id3lib.xcodeproj
+
diff --git a/prj/macosx/config.h b/prj/macosx/config.h
new file mode 100755
index 0000000..a0a4784
--- /dev/null
+++ b/prj/macosx/config.h
@@ -0,0 +1,222 @@
+/*
+** Copyright (C) 1988 Eleftherios Gkioulekas <lf@amath.washington.edu>
+** Copyright (C) 2006 Andre Pang <ozone@algorithm.com.au>
+**
+** This file is free software; as a special exception the author gives
+** unlimited permission to copy and/or distribute it, with or without
+** modifications, as long as this notice is preserved.
+**
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+** implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+/* This is the top section */
+
+/* And now the rest of the boys */
+/* #undef CXX_HAS_BUGGY_FOR_LOOPS */
+/* the following is added due to a bug in autoconf, checking for booleans in gcc while g++ is used for compiling */
+#ifndef __cplusplus
+/* #undef CXX_HAS_NO_BOOL */
+#endif
+/* #undef ID3_ENABLE_DEBUG */
+/* #undef ID3_DISABLE_ASSERT */
+/* #undef ID3_DISABLE_CHECKS */
+#define ID3_ICONV_FORMAT_UTF16BE "UTF-16BE"
+#define ID3_ICONV_FORMAT_UTF16LE "UTF-16LE"
+#define ID3_ICONV_FORMAT_UTF8 "UTF-8"
+#define ID3_ICONV_FORMAT_ISO_8859_1 "ISO-8859-1"
+#define ID3LIB_ICONV_OLDSTYLE 1
+/* #undef ID3LIB_ICONV_CAST_OK */
+
+/* config.h defines these preprocesser symbols to be used by id3lib for
+ * determining internal versioning information. The intent is that these
+ * macros will be made available in the library via constants, functions,
+ * or static methods.
+ */
+#define HAVE_ZLIB 1
+#define HAVE_GETOPT_LONG 1
+#define _ID3LIB_NAME "id3lib"
+#define _ID3LIB_VERSION "3.8.3"
+#define _ID3LIB_FULLNAME "id3lib-3.8.3"
+#define _ID3LIB_MAJOR_VERSION 3
+#define _ID3LIB_MINOR_VERSION 8
+#define _ID3LIB_PATCH_VERSION 3
+#define _ID3LIB_INTERFACE_AGE 0
+#define _ID3LIB_BINARY_AGE 0
+#define _ID3_COMPILED_WITH_DEBUGGING "minimum"
+/* */
+
+
+/* Define if you have the <cctype> header file. */
+#define HAVE_CCTYPE 1
+
+/* Define if you have the <climits> header file. */
+#define HAVE_CLIMITS 1
+
+/* Define if you have the <cstdio> header file. */
+#define HAVE_CSTDIO 1
+
+/* Define if you have the <cstdlib> header file. */
+#define HAVE_CSTDLIB 1
+
+/* Define if you have the <cstring> header file. */
+#define HAVE_CSTRING 1
+
+/* Define if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define if you have the <fstream> header file. */
+#define HAVE_FSTREAM 1
+
+/* Define if you have the <fstream.h> header file. */
+/* #undef HAVE_FSTREAM_H */
+
+/* Define if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define if you have the <iconv.h> header file. */
+#define HAVE_ICONV_H 1
+
+/* Define if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if you have the <iomanip> header file. */
+#define HAVE_IOMANIP 1
+
+/* Define if you have the <iomanip.h> header file. */
+#define HAVE_IOMANIP_H 1
+
+/* Define if you have the <iostream> header file. */
+#define HAVE_IOSTREAM 1
+
+/* Define if you have the <iostream.h> header file. */
+/* #undef HAVE_IOSTREAM_H */
+
+/* Define if you have the <libcw/sys.h> header file. */
+/* #undef HAVE_LIBCW_SYS_H */
+
+/* Define if you have the <bitset> header file. */
+#define HAVE_BITSET 1
+
+/* Define if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string> header file. */
+#define HAVE_STRING 1
+
+/* Define if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the `truncate' function. */
+#define HAVE_TRUNCATE 1
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define if you have the <zlib.h> header file. */
+#define HAVE_ZLIB_H 1
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#ifdef __APPLE__
+ #ifdef __BIG_ENDIAN__
+ #define WORDS_BIGENDIAN 1
+ #else
+ #undef WORDS_BIGENDIAN
+ #endif
+#else
+ Error this config.h file is only valid for Mac OS. Run ./configure for other OSes
+#endif
+
+/* Name of package */
+#define PACKAGE "id3lib"
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "3.8.3"
+
+/* Define if you need to in order for stat and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+/* #undef size_t */
+/* This is the bottom section */
+
+// This file defines portability work-arounds for various proprietory
+// C++ compilers
+
+// Workaround for compilers with buggy for-loop scoping
+// That's quite a few compilers actually including recent versions of
+// Dec Alpha cxx, HP-UX CC and SGI CC.
+// The trivial "if" statement provides the correct scoping to the
+// for loop
+
+#ifdef CXX_HAS_BUGGY_FOR_LOOPS
+/* #undef for */
+#define for if(1) for
+#endif
+
+//
+// If the C++ compiler we use doesn't have bool, then
+// the following is a near-perfect work-around.
+// You must make sure your code does not depend on "int" and "bool"
+// being two different types, in overloading for instance.
+//
+
+#ifdef CXX_HAS_NO_BOOL
+#define bool int
+#define true 1
+#define false 0
+#endif
+
+#if defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) && defined (__cplusplus)
+
+#define DEBUG
+
+#include <libcw/sys.h>
+#include <libcw/debug.h>
+
+#define ID3D_INIT_DOUT() Debug( libcw_do.on() )
+#define ID3D_INIT_WARNING() Debug( dc::warning.on() )
+#define ID3D_INIT_NOTICE() Debug( dc::notice.on() )
+#define ID3D_NOTICE(x) Dout( dc::notice, x )
+#define ID3D_WARNING(x) Dout( dc::warning, x )
+
+#else
+
+# define ID3D_INIT_DOUT()
+# define ID3D_INIT_WARNING()
+# define ID3D_INIT_NOTICE()
+# define ID3D_NOTICE(x)
+# define ID3D_WARNING(x)
+
+#endif /* defined (ID3_ENABLE_DEBUG) && defined (HAVE_LIBCW_SYS_H) */
+
+
diff --git a/prj/macosx/id3lib-Info.plist b/prj/macosx/id3lib-Info.plist
new file mode 100644
index 0000000..f59ed9f
--- /dev/null
+++ b/prj/macosx/id3lib-Info.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.id3.id3lib</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleSignature</key>
+ <string>id3l</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
diff --git a/prj/macosx/id3lib.xcodeproj/Makefile.am b/prj/macosx/id3lib.xcodeproj/Makefile.am
new file mode 100644
index 0000000..8042958
--- /dev/null
+++ b/prj/macosx/id3lib.xcodeproj/Makefile.am
@@ -0,0 +1,14 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+# Copyright (C) 2006 Andre Pang <ozone@algorithm.com.au>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+EXTRA_DIST = project.pbxproj
+
diff --git a/prj/macosx/id3lib.xcodeproj/project.pbxproj b/prj/macosx/id3lib.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..94a3abf
--- /dev/null
+++ b/prj/macosx/id3lib.xcodeproj/project.pbxproj
@@ -0,0 +1,717 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 44;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 7BB3E140096F74B8008E6AD0 /* id3.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E129096F74B8008E6AD0 /* id3.h */; };
+ 7BB3E141096F74B8008E6AD0 /* field.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12B096F74B8008E6AD0 /* field.h */; };
+ 7BB3E142096F74B8008E6AD0 /* globals.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12C096F74B8008E6AD0 /* globals.h */; };
+ 7BB3E143096F74B8008E6AD0 /* helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12D096F74B8008E6AD0 /* helpers.h */; };
+ 7BB3E144096F74B8008E6AD0 /* id3lib_frame.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12F096F74B8008E6AD0 /* id3lib_frame.h */; };
+ 7BB3E145096F74B8008E6AD0 /* id3lib_streams.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E130096F74B8008E6AD0 /* id3lib_streams.h */; };
+ 7BB3E146096F74B8008E6AD0 /* id3lib_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E131096F74B8008E6AD0 /* id3lib_strings.h */; };
+ 7BB3E147096F74B8008E6AD0 /* io_decorators.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E132096F74B8008E6AD0 /* io_decorators.h */; };
+ 7BB3E148096F74B8008E6AD0 /* io_helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E133096F74B8008E6AD0 /* io_helpers.h */; };
+ 7BB3E149096F74B8008E6AD0 /* io_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E134096F74B8008E6AD0 /* io_strings.h */; };
+ 7BB3E14B096F74B8008E6AD0 /* misc_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E138096F74B8008E6AD0 /* misc_support.h */; };
+ 7BB3E14C096F74B8008E6AD0 /* reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E139096F74B8008E6AD0 /* reader.h */; };
+ 7BB3E14D096F74B8008E6AD0 /* readers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13A096F74B8008E6AD0 /* readers.h */; };
+ 7BB3E14E096F74B8008E6AD0 /* sized_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13B096F74B8008E6AD0 /* sized_types.h */; };
+ 7BB3E14F096F74B8008E6AD0 /* tag.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13C096F74B8008E6AD0 /* tag.h */; };
+ 7BB3E150096F74B8008E6AD0 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13D096F74B8008E6AD0 /* utils.h */; };
+ 7BB3E151096F74B8008E6AD0 /* writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13E096F74B8008E6AD0 /* writer.h */; };
+ 7BB3E152096F74B8008E6AD0 /* writers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13F096F74B8008E6AD0 /* writers.h */; };
+ 7BB3E17F096F74E3008E6AD0 /* writers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E153096F74E3008E6AD0 /* writers.cpp */; };
+ 7BB3E180096F74E3008E6AD0 /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E154096F74E3008E6AD0 /* utils.cpp */; };
+ 7BB3E181096F74E3008E6AD0 /* tag_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E155096F74E3008E6AD0 /* tag_render.cpp */; };
+ 7BB3E182096F74E3008E6AD0 /* tag_parse_v1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E156096F74E3008E6AD0 /* tag_parse_v1.cpp */; };
+ 7BB3E183096F74E3008E6AD0 /* tag_parse_musicmatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E157096F74E3008E6AD0 /* tag_parse_musicmatch.cpp */; };
+ 7BB3E184096F74E3008E6AD0 /* tag_parse_lyrics3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E158096F74E3008E6AD0 /* tag_parse_lyrics3.cpp */; };
+ 7BB3E185096F74E3008E6AD0 /* tag_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E159096F74E3008E6AD0 /* tag_parse.cpp */; };
+ 7BB3E186096F74E3008E6AD0 /* tag_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E15A096F74E3008E6AD0 /* tag_impl.h */; };
+ 7BB3E187096F74E3008E6AD0 /* tag_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15B096F74E3008E6AD0 /* tag_impl.cpp */; };
+ 7BB3E188096F74E3008E6AD0 /* tag_find.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15C096F74E3008E6AD0 /* tag_find.cpp */; };
+ 7BB3E189096F74E3008E6AD0 /* tag_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15D096F74E3008E6AD0 /* tag_file.cpp */; };
+ 7BB3E18A096F74E3008E6AD0 /* tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15E096F74E3008E6AD0 /* tag.cpp */; };
+ 7BB3E18B096F74E3008E6AD0 /* spec.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E15F096F74E3008E6AD0 /* spec.h */; };
+ 7BB3E18C096F74E3008E6AD0 /* spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E160096F74E3008E6AD0 /* spec.cpp */; };
+ 7BB3E18D096F74E3008E6AD0 /* readers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E161096F74E3008E6AD0 /* readers.cpp */; };
+ 7BB3E18E096F74E3008E6AD0 /* mp3_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E162096F74E3008E6AD0 /* mp3_parse.cpp */; };
+ 7BB3E18F096F74E3008E6AD0 /* mp3_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E163096F74E3008E6AD0 /* mp3_header.h */; };
+ 7BB3E190096F74E3008E6AD0 /* misc_support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E164096F74E3008E6AD0 /* misc_support.cpp */; };
+ 7BB3E191096F74E3008E6AD0 /* io_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E165096F74E3008E6AD0 /* io_helpers.cpp */; };
+ 7BB3E192096F74E3008E6AD0 /* io_decorators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E166096F74E3008E6AD0 /* io_decorators.cpp */; };
+ 7BB3E193096F74E3008E6AD0 /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E167096F74E3008E6AD0 /* io.cpp */; };
+ 7BB3E194096F74E3008E6AD0 /* helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E168096F74E3008E6AD0 /* helpers.cpp */; };
+ 7BB3E195096F74E3008E6AD0 /* header_tag.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E169096F74E3008E6AD0 /* header_tag.h */; };
+ 7BB3E196096F74E3008E6AD0 /* header_tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16A096F74E3008E6AD0 /* header_tag.cpp */; };
+ 7BB3E197096F74E3008E6AD0 /* header_frame.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E16B096F74E3008E6AD0 /* header_frame.h */; };
+ 7BB3E198096F74E3008E6AD0 /* header_frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16C096F74E3008E6AD0 /* header_frame.cpp */; };
+ 7BB3E199096F74E3008E6AD0 /* header.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E16D096F74E3008E6AD0 /* header.h */; };
+ 7BB3E19A096F74E3008E6AD0 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16E096F74E3008E6AD0 /* header.cpp */; };
+ 7BB3E19B096F74E3008E6AD0 /* globals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16F096F74E3008E6AD0 /* globals.cpp */; };
+ 7BB3E19C096F74E3008E6AD0 /* frame_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E170096F74E3008E6AD0 /* frame_render.cpp */; };
+ 7BB3E19D096F74E3008E6AD0 /* frame_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E171096F74E3008E6AD0 /* frame_parse.cpp */; };
+ 7BB3E19E096F74E3008E6AD0 /* frame_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E172096F74E3008E6AD0 /* frame_impl.h */; };
+ 7BB3E19F096F74E3008E6AD0 /* frame_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E173096F74E3008E6AD0 /* frame_impl.cpp */; };
+ 7BB3E1A0096F74E3008E6AD0 /* frame_def.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E174096F74E3008E6AD0 /* frame_def.h */; };
+ 7BB3E1A1096F74E3008E6AD0 /* frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E175096F74E3008E6AD0 /* frame.cpp */; };
+ 7BB3E1A2096F74E3008E6AD0 /* flags.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E176096F74E3008E6AD0 /* flags.h */; };
+ 7BB3E1A3096F74E3008E6AD0 /* field_string_unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E177096F74E3008E6AD0 /* field_string_unicode.cpp */; };
+ 7BB3E1A4096F74E3008E6AD0 /* field_string_ascii.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E178096F74E3008E6AD0 /* field_string_ascii.cpp */; };
+ 7BB3E1A5096F74E3008E6AD0 /* field_integer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E179096F74E3008E6AD0 /* field_integer.cpp */; };
+ 7BB3E1A6096F74E3008E6AD0 /* field_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E17A096F74E3008E6AD0 /* field_impl.h */; };
+ 7BB3E1A7096F74E3008E6AD0 /* field_def.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E17B096F74E3008E6AD0 /* field_def.h */; };
+ 7BB3E1A8096F74E3008E6AD0 /* field_binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17C096F74E3008E6AD0 /* field_binary.cpp */; };
+ 7BB3E1A9096F74E3008E6AD0 /* field.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17D096F74E3008E6AD0 /* field.cpp */; };
+ 7BB3E1AA096F74E3008E6AD0 /* c_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17E096F74E3008E6AD0 /* c_wrapper.cpp */; };
+ 7BB3E1C7096F7558008E6AD0 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E1C6096F7558008E6AD0 /* config.h */; };
+ 7BB3E1F9096F760A008E6AD0 /* field.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12B096F74B8008E6AD0 /* field.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FA096F760A008E6AD0 /* globals.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12C096F74B8008E6AD0 /* globals.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FB096F760A008E6AD0 /* helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12D096F74B8008E6AD0 /* helpers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FC096F760A008E6AD0 /* id3.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E129096F74B8008E6AD0 /* id3.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FD096F760A008E6AD0 /* id3lib_bitset in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12E096F74B8008E6AD0 /* id3lib_bitset */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FE096F760A008E6AD0 /* id3lib_frame.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E12F096F74B8008E6AD0 /* id3lib_frame.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E1FF096F760A008E6AD0 /* id3lib_streams.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E130096F74B8008E6AD0 /* id3lib_streams.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E200096F760A008E6AD0 /* id3lib_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E131096F74B8008E6AD0 /* id3lib_strings.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E201096F760A008E6AD0 /* io_decorators.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E132096F74B8008E6AD0 /* io_decorators.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E202096F760A008E6AD0 /* io_helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E133096F74B8008E6AD0 /* io_helpers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E203096F760A008E6AD0 /* io_strings.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E134096F74B8008E6AD0 /* io_strings.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E204096F760A008E6AD0 /* misc_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E138096F74B8008E6AD0 /* misc_support.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E205096F760A008E6AD0 /* reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E139096F74B8008E6AD0 /* reader.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E206096F760A008E6AD0 /* readers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13A096F74B8008E6AD0 /* readers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E207096F760A008E6AD0 /* sized_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13B096F74B8008E6AD0 /* sized_types.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E208096F760A008E6AD0 /* tag.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13C096F74B8008E6AD0 /* tag.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E209096F760A008E6AD0 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13D096F74B8008E6AD0 /* utils.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E20A096F760A008E6AD0 /* writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13E096F74B8008E6AD0 /* writer.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E20B096F760A008E6AD0 /* writers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB3E13F096F74B8008E6AD0 /* writers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 7BB3E20D096F7620008E6AD0 /* c_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17E096F74E3008E6AD0 /* c_wrapper.cpp */; };
+ 7BB3E20E096F7620008E6AD0 /* field.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17D096F74E3008E6AD0 /* field.cpp */; };
+ 7BB3E20F096F7620008E6AD0 /* field_binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E17C096F74E3008E6AD0 /* field_binary.cpp */; };
+ 7BB3E210096F7620008E6AD0 /* field_integer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E179096F74E3008E6AD0 /* field_integer.cpp */; };
+ 7BB3E211096F7620008E6AD0 /* field_string_ascii.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E178096F74E3008E6AD0 /* field_string_ascii.cpp */; };
+ 7BB3E212096F7620008E6AD0 /* field_string_unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E177096F74E3008E6AD0 /* field_string_unicode.cpp */; };
+ 7BB3E213096F7620008E6AD0 /* frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E175096F74E3008E6AD0 /* frame.cpp */; };
+ 7BB3E214096F7620008E6AD0 /* frame_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E173096F74E3008E6AD0 /* frame_impl.cpp */; };
+ 7BB3E215096F7620008E6AD0 /* frame_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E171096F74E3008E6AD0 /* frame_parse.cpp */; };
+ 7BB3E216096F7620008E6AD0 /* frame_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E170096F74E3008E6AD0 /* frame_render.cpp */; };
+ 7BB3E217096F7620008E6AD0 /* globals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16F096F74E3008E6AD0 /* globals.cpp */; };
+ 7BB3E218096F7620008E6AD0 /* header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16E096F74E3008E6AD0 /* header.cpp */; };
+ 7BB3E219096F7620008E6AD0 /* header_frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16C096F74E3008E6AD0 /* header_frame.cpp */; };
+ 7BB3E21A096F7620008E6AD0 /* header_tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E16A096F74E3008E6AD0 /* header_tag.cpp */; };
+ 7BB3E21B096F7620008E6AD0 /* helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E168096F74E3008E6AD0 /* helpers.cpp */; };
+ 7BB3E21C096F7620008E6AD0 /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E167096F74E3008E6AD0 /* io.cpp */; };
+ 7BB3E21D096F7620008E6AD0 /* io_decorators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E166096F74E3008E6AD0 /* io_decorators.cpp */; };
+ 7BB3E21E096F7620008E6AD0 /* io_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E165096F74E3008E6AD0 /* io_helpers.cpp */; };
+ 7BB3E21F096F7620008E6AD0 /* misc_support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E164096F74E3008E6AD0 /* misc_support.cpp */; };
+ 7BB3E220096F7620008E6AD0 /* mp3_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E162096F74E3008E6AD0 /* mp3_parse.cpp */; };
+ 7BB3E221096F7620008E6AD0 /* readers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E161096F74E3008E6AD0 /* readers.cpp */; };
+ 7BB3E222096F7620008E6AD0 /* spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E160096F74E3008E6AD0 /* spec.cpp */; };
+ 7BB3E223096F7620008E6AD0 /* tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15E096F74E3008E6AD0 /* tag.cpp */; };
+ 7BB3E224096F7620008E6AD0 /* tag_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15D096F74E3008E6AD0 /* tag_file.cpp */; };
+ 7BB3E225096F7620008E6AD0 /* tag_find.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15C096F74E3008E6AD0 /* tag_find.cpp */; };
+ 7BB3E226096F7620008E6AD0 /* tag_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E15B096F74E3008E6AD0 /* tag_impl.cpp */; };
+ 7BB3E227096F7620008E6AD0 /* tag_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E159096F74E3008E6AD0 /* tag_parse.cpp */; };
+ 7BB3E228096F7620008E6AD0 /* tag_parse_lyrics3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E158096F74E3008E6AD0 /* tag_parse_lyrics3.cpp */; };
+ 7BB3E229096F7620008E6AD0 /* tag_parse_musicmatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E157096F74E3008E6AD0 /* tag_parse_musicmatch.cpp */; };
+ 7BB3E22A096F7620008E6AD0 /* tag_parse_v1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E156096F74E3008E6AD0 /* tag_parse_v1.cpp */; };
+ 7BB3E22B096F7620008E6AD0 /* tag_render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E155096F74E3008E6AD0 /* tag_render.cpp */; };
+ 7BB3E22C096F7620008E6AD0 /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E154096F74E3008E6AD0 /* utils.cpp */; };
+ 7BB3E22D096F7620008E6AD0 /* writers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB3E153096F74E3008E6AD0 /* writers.cpp */; };
+ 7BB3E238096F7676008E6AD0 /* AUTHORS in Resources */ = {isa = PBXBuildFile; fileRef = 7BB3E234096F7676008E6AD0 /* AUTHORS */; };
+ 7BB3E239096F7676008E6AD0 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = 7BB3E235096F7676008E6AD0 /* COPYING */; };
+ 7BB3E23A096F7676008E6AD0 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 7BB3E236096F7676008E6AD0 /* README */; };
+ 7BB3E23B096F7676008E6AD0 /* THANKS in Resources */ = {isa = PBXBuildFile; fileRef = 7BB3E237096F7676008E6AD0 /* THANKS */; };
+ 7BB3E25B096F784A008E6AD0 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7BB3E25A096F784A008E6AD0 /* libiconv.dylib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 7BB3E09D096F72A4008E6AD0 /* liblibid3.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblibid3.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7BB3E129096F74B8008E6AD0 /* id3.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = id3.h; path = ../../include/id3.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E12B096F74B8008E6AD0 /* field.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = field.h; sourceTree = "<group>"; };
+ 7BB3E12C096F74B8008E6AD0 /* globals.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = globals.h; sourceTree = "<group>"; };
+ 7BB3E12D096F74B8008E6AD0 /* helpers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = helpers.h; sourceTree = "<group>"; };
+ 7BB3E12E096F74B8008E6AD0 /* id3lib_bitset */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = id3lib_bitset; sourceTree = "<group>"; };
+ 7BB3E12F096F74B8008E6AD0 /* id3lib_frame.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = id3lib_frame.h; sourceTree = "<group>"; };
+ 7BB3E130096F74B8008E6AD0 /* id3lib_streams.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = id3lib_streams.h; sourceTree = "<group>"; };
+ 7BB3E131096F74B8008E6AD0 /* id3lib_strings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = id3lib_strings.h; sourceTree = "<group>"; };
+ 7BB3E132096F74B8008E6AD0 /* io_decorators.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = io_decorators.h; sourceTree = "<group>"; };
+ 7BB3E133096F74B8008E6AD0 /* io_helpers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = io_helpers.h; sourceTree = "<group>"; };
+ 7BB3E134096F74B8008E6AD0 /* io_strings.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = io_strings.h; sourceTree = "<group>"; };
+ 7BB3E138096F74B8008E6AD0 /* misc_support.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = misc_support.h; sourceTree = "<group>"; };
+ 7BB3E139096F74B8008E6AD0 /* reader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = "<group>"; };
+ 7BB3E13A096F74B8008E6AD0 /* readers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = readers.h; sourceTree = "<group>"; };
+ 7BB3E13B096F74B8008E6AD0 /* sized_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = sized_types.h; sourceTree = "<group>"; };
+ 7BB3E13C096F74B8008E6AD0 /* tag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = tag.h; sourceTree = "<group>"; };
+ 7BB3E13D096F74B8008E6AD0 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = "<group>"; };
+ 7BB3E13E096F74B8008E6AD0 /* writer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = writer.h; sourceTree = "<group>"; };
+ 7BB3E13F096F74B8008E6AD0 /* writers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = writers.h; sourceTree = "<group>"; };
+ 7BB3E153096F74E3008E6AD0 /* writers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = writers.cpp; path = ../../src/writers.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E154096F74E3008E6AD0 /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = utils.cpp; path = ../../src/utils.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E155096F74E3008E6AD0 /* tag_render.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_render.cpp; path = ../../src/tag_render.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E156096F74E3008E6AD0 /* tag_parse_v1.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_v1.cpp; path = ../../src/tag_parse_v1.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E157096F74E3008E6AD0 /* tag_parse_musicmatch.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_musicmatch.cpp; path = ../../src/tag_parse_musicmatch.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E158096F74E3008E6AD0 /* tag_parse_lyrics3.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse_lyrics3.cpp; path = ../../src/tag_parse_lyrics3.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E159096F74E3008E6AD0 /* tag_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_parse.cpp; path = ../../src/tag_parse.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E15A096F74E3008E6AD0 /* tag_impl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = tag_impl.h; path = ../../src/tag_impl.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E15B096F74E3008E6AD0 /* tag_impl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_impl.cpp; path = ../../src/tag_impl.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E15C096F74E3008E6AD0 /* tag_find.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_find.cpp; path = ../../src/tag_find.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E15D096F74E3008E6AD0 /* tag_file.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag_file.cpp; path = ../../src/tag_file.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E15E096F74E3008E6AD0 /* tag.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = tag.cpp; path = ../../src/tag.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E15F096F74E3008E6AD0 /* spec.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = spec.h; path = ../../src/spec.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E160096F74E3008E6AD0 /* spec.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = spec.cpp; path = ../../src/spec.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E161096F74E3008E6AD0 /* readers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = readers.cpp; path = ../../src/readers.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E162096F74E3008E6AD0 /* mp3_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = mp3_parse.cpp; path = ../../src/mp3_parse.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E163096F74E3008E6AD0 /* mp3_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = mp3_header.h; path = ../../src/mp3_header.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E164096F74E3008E6AD0 /* misc_support.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = misc_support.cpp; path = ../../src/misc_support.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E165096F74E3008E6AD0 /* io_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = io_helpers.cpp; path = ../../src/io_helpers.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E166096F74E3008E6AD0 /* io_decorators.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = io_decorators.cpp; path = ../../src/io_decorators.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E167096F74E3008E6AD0 /* io.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = io.cpp; path = ../../src/io.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E168096F74E3008E6AD0 /* helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = helpers.cpp; path = ../../src/helpers.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E169096F74E3008E6AD0 /* header_tag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = header_tag.h; path = ../../src/header_tag.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E16A096F74E3008E6AD0 /* header_tag.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = header_tag.cpp; path = ../../src/header_tag.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E16B096F74E3008E6AD0 /* header_frame.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = header_frame.h; path = ../../src/header_frame.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E16C096F74E3008E6AD0 /* header_frame.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = header_frame.cpp; path = ../../src/header_frame.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E16D096F74E3008E6AD0 /* header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = header.h; path = ../../src/header.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E16E096F74E3008E6AD0 /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = header.cpp; path = ../../src/header.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E16F096F74E3008E6AD0 /* globals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = globals.cpp; path = ../../src/globals.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E170096F74E3008E6AD0 /* frame_render.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = frame_render.cpp; path = ../../src/frame_render.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E171096F74E3008E6AD0 /* frame_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = frame_parse.cpp; path = ../../src/frame_parse.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E172096F74E3008E6AD0 /* frame_impl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = frame_impl.h; path = ../../src/frame_impl.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E173096F74E3008E6AD0 /* frame_impl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = frame_impl.cpp; path = ../../src/frame_impl.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E174096F74E3008E6AD0 /* frame_def.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = frame_def.h; path = ../../src/frame_def.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E175096F74E3008E6AD0 /* frame.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = frame.cpp; path = ../../src/frame.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E176096F74E3008E6AD0 /* flags.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = flags.h; path = ../../src/flags.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E177096F74E3008E6AD0 /* field_string_unicode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = field_string_unicode.cpp; path = ../../src/field_string_unicode.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E178096F74E3008E6AD0 /* field_string_ascii.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = field_string_ascii.cpp; path = ../../src/field_string_ascii.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E179096F74E3008E6AD0 /* field_integer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = field_integer.cpp; path = ../../src/field_integer.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E17A096F74E3008E6AD0 /* field_impl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = field_impl.h; path = ../../src/field_impl.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E17B096F74E3008E6AD0 /* field_def.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = field_def.h; path = ../../src/field_def.h; sourceTree = SOURCE_ROOT; };
+ 7BB3E17C096F74E3008E6AD0 /* field_binary.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = field_binary.cpp; path = ../../src/field_binary.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E17D096F74E3008E6AD0 /* field.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = field.cpp; path = ../../src/field.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E17E096F74E3008E6AD0 /* c_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = c_wrapper.cpp; path = ../../src/c_wrapper.cpp; sourceTree = SOURCE_ROOT; };
+ 7BB3E1C6096F7558008E6AD0 /* config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+ 7BB3E1F2096F75F9008E6AD0 /* id3lib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = id3lib.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7BB3E1F3096F75F9008E6AD0 /* id3lib-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "id3lib-Info.plist"; sourceTree = "<group>"; };
+ 7BB3E234096F7676008E6AD0 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = AUTHORS; path = ../../AUTHORS; sourceTree = SOURCE_ROOT; };
+ 7BB3E235096F7676008E6AD0 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = COPYING; path = ../../COPYING; sourceTree = SOURCE_ROOT; };
+ 7BB3E236096F7676008E6AD0 /* README */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = README; path = ../../README; sourceTree = SOURCE_ROOT; };
+ 7BB3E237096F7676008E6AD0 /* THANKS */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = THANKS; path = ../../THANKS; sourceTree = SOURCE_ROOT; };
+ 7BB3E25A096F784A008E6AD0 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = /usr/lib/libiconv.dylib; sourceTree = "<absolute>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 7BB3E09B096F72A4008E6AD0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7BB3E1F0096F75F9008E6AD0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E25B096F784A008E6AD0 /* libiconv.dylib in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 7BB3E059096F7066008E6AD0 = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E252096F77BD008E6AD0 /* Dependencies */,
+ 7BB3E0E2096F7310008E6AD0 /* Public Includes */,
+ 7BB3E06A096F7082008E6AD0 /* Sources */,
+ 7BB3E232096F7648008E6AD0 /* Resources */,
+ 7BB3E09E096F72A4008E6AD0 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 7BB3E06A096F7082008E6AD0 /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E1C6096F7558008E6AD0 /* config.h */,
+ 7BB3E153096F74E3008E6AD0 /* writers.cpp */,
+ 7BB3E154096F74E3008E6AD0 /* utils.cpp */,
+ 7BB3E155096F74E3008E6AD0 /* tag_render.cpp */,
+ 7BB3E156096F74E3008E6AD0 /* tag_parse_v1.cpp */,
+ 7BB3E157096F74E3008E6AD0 /* tag_parse_musicmatch.cpp */,
+ 7BB3E158096F74E3008E6AD0 /* tag_parse_lyrics3.cpp */,
+ 7BB3E159096F74E3008E6AD0 /* tag_parse.cpp */,
+ 7BB3E15A096F74E3008E6AD0 /* tag_impl.h */,
+ 7BB3E15B096F74E3008E6AD0 /* tag_impl.cpp */,
+ 7BB3E15C096F74E3008E6AD0 /* tag_find.cpp */,
+ 7BB3E15D096F74E3008E6AD0 /* tag_file.cpp */,
+ 7BB3E15E096F74E3008E6AD0 /* tag.cpp */,
+ 7BB3E15F096F74E3008E6AD0 /* spec.h */,
+ 7BB3E160096F74E3008E6AD0 /* spec.cpp */,
+ 7BB3E161096F74E3008E6AD0 /* readers.cpp */,
+ 7BB3E162096F74E3008E6AD0 /* mp3_parse.cpp */,
+ 7BB3E163096F74E3008E6AD0 /* mp3_header.h */,
+ 7BB3E164096F74E3008E6AD0 /* misc_support.cpp */,
+ 7BB3E165096F74E3008E6AD0 /* io_helpers.cpp */,
+ 7BB3E166096F74E3008E6AD0 /* io_decorators.cpp */,
+ 7BB3E167096F74E3008E6AD0 /* io.cpp */,
+ 7BB3E168096F74E3008E6AD0 /* helpers.cpp */,
+ 7BB3E169096F74E3008E6AD0 /* header_tag.h */,
+ 7BB3E16A096F74E3008E6AD0 /* header_tag.cpp */,
+ 7BB3E16B096F74E3008E6AD0 /* header_frame.h */,
+ 7BB3E16C096F74E3008E6AD0 /* header_frame.cpp */,
+ 7BB3E16D096F74E3008E6AD0 /* header.h */,
+ 7BB3E16E096F74E3008E6AD0 /* header.cpp */,
+ 7BB3E16F096F74E3008E6AD0 /* globals.cpp */,
+ 7BB3E170096F74E3008E6AD0 /* frame_render.cpp */,
+ 7BB3E171096F74E3008E6AD0 /* frame_parse.cpp */,
+ 7BB3E172096F74E3008E6AD0 /* frame_impl.h */,
+ 7BB3E173096F74E3008E6AD0 /* frame_impl.cpp */,
+ 7BB3E174096F74E3008E6AD0 /* frame_def.h */,
+ 7BB3E175096F74E3008E6AD0 /* frame.cpp */,
+ 7BB3E176096F74E3008E6AD0 /* flags.h */,
+ 7BB3E177096F74E3008E6AD0 /* field_string_unicode.cpp */,
+ 7BB3E178096F74E3008E6AD0 /* field_string_ascii.cpp */,
+ 7BB3E179096F74E3008E6AD0 /* field_integer.cpp */,
+ 7BB3E17A096F74E3008E6AD0 /* field_impl.h */,
+ 7BB3E17B096F74E3008E6AD0 /* field_def.h */,
+ 7BB3E17C096F74E3008E6AD0 /* field_binary.cpp */,
+ 7BB3E17D096F74E3008E6AD0 /* field.cpp */,
+ 7BB3E17E096F74E3008E6AD0 /* c_wrapper.cpp */,
+ );
+ name = Sources;
+ sourceTree = "<group>";
+ };
+ 7BB3E09E096F72A4008E6AD0 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E09D096F72A4008E6AD0 /* liblibid3.a */,
+ 7BB3E1F2096F75F9008E6AD0 /* id3lib.framework */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 7BB3E0E2096F7310008E6AD0 /* Public Includes */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E129096F74B8008E6AD0 /* id3.h */,
+ 7BB3E12A096F74B8008E6AD0 /* id3 */,
+ );
+ name = "Public Includes";
+ sourceTree = "<group>";
+ };
+ 7BB3E12A096F74B8008E6AD0 /* id3 */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E12B096F74B8008E6AD0 /* field.h */,
+ 7BB3E12C096F74B8008E6AD0 /* globals.h */,
+ 7BB3E12D096F74B8008E6AD0 /* helpers.h */,
+ 7BB3E12E096F74B8008E6AD0 /* id3lib_bitset */,
+ 7BB3E12F096F74B8008E6AD0 /* id3lib_frame.h */,
+ 7BB3E130096F74B8008E6AD0 /* id3lib_streams.h */,
+ 7BB3E131096F74B8008E6AD0 /* id3lib_strings.h */,
+ 7BB3E132096F74B8008E6AD0 /* io_decorators.h */,
+ 7BB3E133096F74B8008E6AD0 /* io_helpers.h */,
+ 7BB3E134096F74B8008E6AD0 /* io_strings.h */,
+ 7BB3E138096F74B8008E6AD0 /* misc_support.h */,
+ 7BB3E139096F74B8008E6AD0 /* reader.h */,
+ 7BB3E13A096F74B8008E6AD0 /* readers.h */,
+ 7BB3E13B096F74B8008E6AD0 /* sized_types.h */,
+ 7BB3E13C096F74B8008E6AD0 /* tag.h */,
+ 7BB3E13D096F74B8008E6AD0 /* utils.h */,
+ 7BB3E13E096F74B8008E6AD0 /* writer.h */,
+ 7BB3E13F096F74B8008E6AD0 /* writers.h */,
+ );
+ name = id3;
+ path = ../../include/id3;
+ sourceTree = SOURCE_ROOT;
+ };
+ 7BB3E232096F7648008E6AD0 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E234096F7676008E6AD0 /* AUTHORS */,
+ 7BB3E235096F7676008E6AD0 /* COPYING */,
+ 7BB3E236096F7676008E6AD0 /* README */,
+ 7BB3E237096F7676008E6AD0 /* THANKS */,
+ 7BB3E1F3096F75F9008E6AD0 /* id3lib-Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 7BB3E252096F77BD008E6AD0 /* Dependencies */ = {
+ isa = PBXGroup;
+ children = (
+ 7BB3E25A096F784A008E6AD0 /* libiconv.dylib */,
+ );
+ name = Dependencies;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 7BB3E099096F72A4008E6AD0 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E140096F74B8008E6AD0 /* id3.h in Headers */,
+ 7BB3E141096F74B8008E6AD0 /* field.h in Headers */,
+ 7BB3E142096F74B8008E6AD0 /* globals.h in Headers */,
+ 7BB3E143096F74B8008E6AD0 /* helpers.h in Headers */,
+ 7BB3E144096F74B8008E6AD0 /* id3lib_frame.h in Headers */,
+ 7BB3E145096F74B8008E6AD0 /* id3lib_streams.h in Headers */,
+ 7BB3E146096F74B8008E6AD0 /* id3lib_strings.h in Headers */,
+ 7BB3E147096F74B8008E6AD0 /* io_decorators.h in Headers */,
+ 7BB3E148096F74B8008E6AD0 /* io_helpers.h in Headers */,
+ 7BB3E149096F74B8008E6AD0 /* io_strings.h in Headers */,
+ 7BB3E14B096F74B8008E6AD0 /* misc_support.h in Headers */,
+ 7BB3E14C096F74B8008E6AD0 /* reader.h in Headers */,
+ 7BB3E14D096F74B8008E6AD0 /* readers.h in Headers */,
+ 7BB3E14E096F74B8008E6AD0 /* sized_types.h in Headers */,
+ 7BB3E14F096F74B8008E6AD0 /* tag.h in Headers */,
+ 7BB3E150096F74B8008E6AD0 /* utils.h in Headers */,
+ 7BB3E151096F74B8008E6AD0 /* writer.h in Headers */,
+ 7BB3E152096F74B8008E6AD0 /* writers.h in Headers */,
+ 7BB3E186096F74E3008E6AD0 /* tag_impl.h in Headers */,
+ 7BB3E18B096F74E3008E6AD0 /* spec.h in Headers */,
+ 7BB3E18F096F74E3008E6AD0 /* mp3_header.h in Headers */,
+ 7BB3E195096F74E3008E6AD0 /* header_tag.h in Headers */,
+ 7BB3E197096F74E3008E6AD0 /* header_frame.h in Headers */,
+ 7BB3E199096F74E3008E6AD0 /* header.h in Headers */,
+ 7BB3E19E096F74E3008E6AD0 /* frame_impl.h in Headers */,
+ 7BB3E1A0096F74E3008E6AD0 /* frame_def.h in Headers */,
+ 7BB3E1A2096F74E3008E6AD0 /* flags.h in Headers */,
+ 7BB3E1A6096F74E3008E6AD0 /* field_impl.h in Headers */,
+ 7BB3E1A7096F74E3008E6AD0 /* field_def.h in Headers */,
+ 7BB3E1C7096F7558008E6AD0 /* config.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7BB3E1ED096F75F9008E6AD0 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E1F9096F760A008E6AD0 /* field.h in Headers */,
+ 7BB3E1FA096F760A008E6AD0 /* globals.h in Headers */,
+ 7BB3E1FB096F760A008E6AD0 /* helpers.h in Headers */,
+ 7BB3E1FC096F760A008E6AD0 /* id3.h in Headers */,
+ 7BB3E1FD096F760A008E6AD0 /* id3lib_bitset in Headers */,
+ 7BB3E1FE096F760A008E6AD0 /* id3lib_frame.h in Headers */,
+ 7BB3E1FF096F760A008E6AD0 /* id3lib_streams.h in Headers */,
+ 7BB3E200096F760A008E6AD0 /* id3lib_strings.h in Headers */,
+ 7BB3E201096F760A008E6AD0 /* io_decorators.h in Headers */,
+ 7BB3E202096F760A008E6AD0 /* io_helpers.h in Headers */,
+ 7BB3E203096F760A008E6AD0 /* io_strings.h in Headers */,
+ 7BB3E204096F760A008E6AD0 /* misc_support.h in Headers */,
+ 7BB3E205096F760A008E6AD0 /* reader.h in Headers */,
+ 7BB3E206096F760A008E6AD0 /* readers.h in Headers */,
+ 7BB3E207096F760A008E6AD0 /* sized_types.h in Headers */,
+ 7BB3E208096F760A008E6AD0 /* tag.h in Headers */,
+ 7BB3E209096F760A008E6AD0 /* utils.h in Headers */,
+ 7BB3E20A096F760A008E6AD0 /* writer.h in Headers */,
+ 7BB3E20B096F760A008E6AD0 /* writers.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 7BB3E09C096F72A4008E6AD0 /* libid3 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7BB3E09F096F72A5008E6AD0 /* Build configuration list for PBXNativeTarget "libid3" */;
+ buildPhases = (
+ 7BB3E099096F72A4008E6AD0 /* Headers */,
+ 7BB3E09A096F72A4008E6AD0 /* Sources */,
+ 7BB3E09B096F72A4008E6AD0 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = libid3;
+ productName = libid3;
+ productReference = 7BB3E09D096F72A4008E6AD0 /* liblibid3.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+ 7BB3E1F1096F75F9008E6AD0 /* id3lib */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7BB3E1F4096F75FA008E6AD0 /* Build configuration list for PBXNativeTarget "id3lib" */;
+ buildPhases = (
+ 7BB3E1ED096F75F9008E6AD0 /* Headers */,
+ 7BB3E1EE096F75F9008E6AD0 /* Resources */,
+ 7BB3E1EF096F75F9008E6AD0 /* Sources */,
+ 7BB3E1F0096F75F9008E6AD0 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = id3lib;
+ productName = id3lib;
+ productReference = 7BB3E1F2096F75F9008E6AD0 /* id3lib.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 7BB3E05B096F7066008E6AD0 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 7BB3E05C096F7066008E6AD0 /* Build configuration list for PBXProject "id3lib" */;
+ compatibilityVersion = "Xcode 3.0";
+ hasScannedForEncodings = 0;
+ mainGroup = 7BB3E059096F7066008E6AD0;
+ productRefGroup = 7BB3E09E096F72A4008E6AD0 /* Products */;
+ projectDirPath = "";
+ projectRoot = ../..;
+ targets = (
+ 7BB3E09C096F72A4008E6AD0 /* libid3 */,
+ 7BB3E1F1096F75F9008E6AD0 /* id3lib */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 7BB3E1EE096F75F9008E6AD0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E238096F7676008E6AD0 /* AUTHORS in Resources */,
+ 7BB3E239096F7676008E6AD0 /* COPYING in Resources */,
+ 7BB3E23A096F7676008E6AD0 /* README in Resources */,
+ 7BB3E23B096F7676008E6AD0 /* THANKS in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 7BB3E09A096F72A4008E6AD0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E17F096F74E3008E6AD0 /* writers.cpp in Sources */,
+ 7BB3E180096F74E3008E6AD0 /* utils.cpp in Sources */,
+ 7BB3E181096F74E3008E6AD0 /* tag_render.cpp in Sources */,
+ 7BB3E182096F74E3008E6AD0 /* tag_parse_v1.cpp in Sources */,
+ 7BB3E183096F74E3008E6AD0 /* tag_parse_musicmatch.cpp in Sources */,
+ 7BB3E184096F74E3008E6AD0 /* tag_parse_lyrics3.cpp in Sources */,
+ 7BB3E185096F74E3008E6AD0 /* tag_parse.cpp in Sources */,
+ 7BB3E187096F74E3008E6AD0 /* tag_impl.cpp in Sources */,
+ 7BB3E188096F74E3008E6AD0 /* tag_find.cpp in Sources */,
+ 7BB3E189096F74E3008E6AD0 /* tag_file.cpp in Sources */,
+ 7BB3E18A096F74E3008E6AD0 /* tag.cpp in Sources */,
+ 7BB3E18C096F74E3008E6AD0 /* spec.cpp in Sources */,
+ 7BB3E18D096F74E3008E6AD0 /* readers.cpp in Sources */,
+ 7BB3E18E096F74E3008E6AD0 /* mp3_parse.cpp in Sources */,
+ 7BB3E190096F74E3008E6AD0 /* misc_support.cpp in Sources */,
+ 7BB3E191096F74E3008E6AD0 /* io_helpers.cpp in Sources */,
+ 7BB3E192096F74E3008E6AD0 /* io_decorators.cpp in Sources */,
+ 7BB3E193096F74E3008E6AD0 /* io.cpp in Sources */,
+ 7BB3E194096F74E3008E6AD0 /* helpers.cpp in Sources */,
+ 7BB3E196096F74E3008E6AD0 /* header_tag.cpp in Sources */,
+ 7BB3E198096F74E3008E6AD0 /* header_frame.cpp in Sources */,
+ 7BB3E19A096F74E3008E6AD0 /* header.cpp in Sources */,
+ 7BB3E19B096F74E3008E6AD0 /* globals.cpp in Sources */,
+ 7BB3E19C096F74E3008E6AD0 /* frame_render.cpp in Sources */,
+ 7BB3E19D096F74E3008E6AD0 /* frame_parse.cpp in Sources */,
+ 7BB3E19F096F74E3008E6AD0 /* frame_impl.cpp in Sources */,
+ 7BB3E1A1096F74E3008E6AD0 /* frame.cpp in Sources */,
+ 7BB3E1A3096F74E3008E6AD0 /* field_string_unicode.cpp in Sources */,
+ 7BB3E1A4096F74E3008E6AD0 /* field_string_ascii.cpp in Sources */,
+ 7BB3E1A5096F74E3008E6AD0 /* field_integer.cpp in Sources */,
+ 7BB3E1A8096F74E3008E6AD0 /* field_binary.cpp in Sources */,
+ 7BB3E1A9096F74E3008E6AD0 /* field.cpp in Sources */,
+ 7BB3E1AA096F74E3008E6AD0 /* c_wrapper.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7BB3E1EF096F75F9008E6AD0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7BB3E20D096F7620008E6AD0 /* c_wrapper.cpp in Sources */,
+ 7BB3E20E096F7620008E6AD0 /* field.cpp in Sources */,
+ 7BB3E20F096F7620008E6AD0 /* field_binary.cpp in Sources */,
+ 7BB3E210096F7620008E6AD0 /* field_integer.cpp in Sources */,
+ 7BB3E211096F7620008E6AD0 /* field_string_ascii.cpp in Sources */,
+ 7BB3E212096F7620008E6AD0 /* field_string_unicode.cpp in Sources */,
+ 7BB3E213096F7620008E6AD0 /* frame.cpp in Sources */,
+ 7BB3E214096F7620008E6AD0 /* frame_impl.cpp in Sources */,
+ 7BB3E215096F7620008E6AD0 /* frame_parse.cpp in Sources */,
+ 7BB3E216096F7620008E6AD0 /* frame_render.cpp in Sources */,
+ 7BB3E217096F7620008E6AD0 /* globals.cpp in Sources */,
+ 7BB3E218096F7620008E6AD0 /* header.cpp in Sources */,
+ 7BB3E219096F7620008E6AD0 /* header_frame.cpp in Sources */,
+ 7BB3E21A096F7620008E6AD0 /* header_tag.cpp in Sources */,
+ 7BB3E21B096F7620008E6AD0 /* helpers.cpp in Sources */,
+ 7BB3E21C096F7620008E6AD0 /* io.cpp in Sources */,
+ 7BB3E21D096F7620008E6AD0 /* io_decorators.cpp in Sources */,
+ 7BB3E21E096F7620008E6AD0 /* io_helpers.cpp in Sources */,
+ 7BB3E21F096F7620008E6AD0 /* misc_support.cpp in Sources */,
+ 7BB3E220096F7620008E6AD0 /* mp3_parse.cpp in Sources */,
+ 7BB3E221096F7620008E6AD0 /* readers.cpp in Sources */,
+ 7BB3E222096F7620008E6AD0 /* spec.cpp in Sources */,
+ 7BB3E223096F7620008E6AD0 /* tag.cpp in Sources */,
+ 7BB3E224096F7620008E6AD0 /* tag_file.cpp in Sources */,
+ 7BB3E225096F7620008E6AD0 /* tag_find.cpp in Sources */,
+ 7BB3E226096F7620008E6AD0 /* tag_impl.cpp in Sources */,
+ 7BB3E227096F7620008E6AD0 /* tag_parse.cpp in Sources */,
+ 7BB3E228096F7620008E6AD0 /* tag_parse_lyrics3.cpp in Sources */,
+ 7BB3E229096F7620008E6AD0 /* tag_parse_musicmatch.cpp in Sources */,
+ 7BB3E22A096F7620008E6AD0 /* tag_parse_v1.cpp in Sources */,
+ 7BB3E22B096F7620008E6AD0 /* tag_render.cpp in Sources */,
+ 7BB3E22C096F7620008E6AD0 /* utils.cpp in Sources */,
+ 7BB3E22D096F7620008E6AD0 /* writers.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 7BB3E05D096F7066008E6AD0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+
+ };
+ name = Debug;
+ };
+ 7BB3E05E096F7066008E6AD0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+
+ };
+ name = Release;
+ };
+ 7BB3E0A0096F72A5008E6AD0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CONFIG_H;
+ HEADER_SEARCH_PATHS = (
+ ../../include,
+ ../../include/id3,
+ );
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = libid3;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 7BB3E0A1096F72A5008E6AD0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CONFIG_H;
+ HEADER_SEARCH_PATHS = (
+ ../../include,
+ ../../include/id3,
+ );
+ INSTALL_PATH = /usr/local/lib;
+ PREBINDING = NO;
+ PRODUCT_NAME = libid3;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+ 7BB3E1F5096F75FA008E6AD0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ FRAMEWORK_VERSION = A;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_PREFIX_HEADER = "";
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CONFIG_H;
+ HEADER_SEARCH_PATHS = ../../include;
+ INFOPLIST_FILE = "id3lib-Info.plist";
+ INSTALL_PATH = "$(HOME)/Library/Frameworks";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Carbon,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = id3lib;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 7BB3E1F6096F75FA008E6AD0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ FRAMEWORK_VERSION = A;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_PREFIX_HEADER = "";
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CONFIG_H;
+ HEADER_SEARCH_PATHS = ../../include;
+ INFOPLIST_FILE = "id3lib-Info.plist";
+ INSTALL_PATH = "$(HOME)/Library/Frameworks";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Carbon,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = id3lib;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 7BB3E05C096F7066008E6AD0 /* Build configuration list for PBXProject "id3lib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7BB3E05D096F7066008E6AD0 /* Debug */,
+ 7BB3E05E096F7066008E6AD0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 7BB3E09F096F72A5008E6AD0 /* Build configuration list for PBXNativeTarget "libid3" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7BB3E0A0096F72A5008E6AD0 /* Debug */,
+ 7BB3E0A1096F72A5008E6AD0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 7BB3E1F4096F75FA008E6AD0 /* Build configuration list for PBXNativeTarget "id3lib" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7BB3E1F5096F75FA008E6AD0 /* Debug */,
+ 7BB3E1F6096F75FA008E6AD0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 7BB3E05B096F7066008E6AD0 /* Project object */;
+}
diff --git a/prj/version.rc b/prj/version.rc
new file mode 100644
index 0000000..525b9e7
--- /dev/null
+++ b/prj/version.rc
@@ -0,0 +1,41 @@
+#define APSTUDIO_READONLY_SYMBOLS
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#ifndef RC_INVOKED
+#define RC_INVOKED
+#endif
+#include <winver.h>
+#undef APSTUDIO_READONLY_SYMBOLS
+#include "../config.h" //for id3lib version info
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION _ID3LIB_MAJOR_VERSION,_ID3LIB_MINOR_VERSION,_ID3LIB_PATCH_VERSION,_ID3LIB_INTERFACE_AGE
+ PRODUCTVERSION _ID3LIB_MAJOR_VERSION,_ID3LIB_MINOR_VERSION,_ID3LIB_PATCH_VERSION,_ID3LIB_INTERFACE_AGE
+
+ BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "ID3lib is a library for tagging mp3's with ID3v1 or ID3v2 tags\0"
+ VALUE "CompanyName", "http://www.id3lib.org/\0"
+ VALUE "FileDescription", "ID3lib Dynamic Link Library\0"
+ VALUE "FileVersion", _ID3LIB_VERSION0//"\0"
+ VALUE "LegalCopyright", "Copyright © 2002 Thijmen Klok\0"
+ VALUE "OriginalFilename", "ID3lib.dll\0"
+ VALUE "ProductName", "ID3lib Dynamic Link Library\0"
+ VALUE "ProductVersion", _ID3LIB_VERSION0//"\0"
+ VALUE "PrivateBuild", "Patch 1016290 + Win32 mods\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // !_MAC
diff --git a/prj/win32.readme.first.txt b/prj/win32.readme.first.txt
new file mode 100644
index 0000000..584c0b0
--- /dev/null
+++ b/prj/win32.readme.first.txt
@@ -0,0 +1,75 @@
+Compiling on win32:
+
+So far, it has only been confirmed it compiles on visual C 6.0 (service pack 5),
+but if you got it working on Borland or other compilers, drop me a mail, or better, add a patch
+here: http://sourceforge.net/tracker/?group_id=979&atid=300979 with the (e.g.) borland project files.
+
+These are the directories you'll be needing:
+id3lib/prj
+id3lib/libprj
+id3lib/id3com
+
+The first one (id3lib/prj) creates the standard dll (no COM interface)
+The Second one (id3lib/libprj) creates the .lib file for static linking.
+And the third one (id3lib/id3com) creates a dll with com interface. A Visual basic demo using it is included.
+
+Before you compile, you'll need to rename id3lib/config.h.win32 to id3lib/config.h
+
+The third one is not too much tested, it was created outside this project but
+it doesn't seem to be maintained anymore. I've included it as a service.
+The original location is http://sourceforge.net/projects/id3com
+
+And, last but not least, there is a delphi project in cvs
+(http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/id3lib/id3lib-stable/delphi/)
+which uses the allready compiled dll.
+Also in there is a file called Id3lib.pas which has the interface to the dll
+defined.
+
+How to start:
+
+A) ***Your project wants to link id3lib static, and has mfc linked static:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcd" or(release) /nodefaultlib:"libc"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+B)***Your project wants to link id3lib static, and has mfc linked dynamic or has no MFC:
+1) Rename config.h.win32 to config.h
+2) include libprj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=1 to your project options (settings, C/C++ tab)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Try to compile, and see if you need any of the following:
+ (debug) /nodefaultlib:"msvcprtd" or(release) /nodefaultlib:"msvcprt"
+ (debug) /nodefaultlib:"MSVCRTD" or(release) /nodefaultlib:"MSVCRT"
+ (debug) /nodefaultlib:"libcmtd" or(release) /nodefaultlib:"libcmt"
+ different programs may require different 'nodefaultlib' 's, or none at all, these worked for me.
+ If none you try work, revert to C)
+
+C)***Your project wants to link id3lib dynamic: (instructions below for vc)
+1) Rename config.h.win32 to config.h
+2) include prj/id3lib.dsp and zlib/prj/zlib.dsp to your workspace (*note this is a different id3lib than above)
+3) make your project dependend on id3lib, and make id3lib dependend on zlib
+4) Add /D ID3LIB_LINKOPTION=3 to your project options (settings, C/C++ tab) (*note this is a different option than above)
+5) Add the following include dirs to your program:
+ /I <path_to_id3lib>\\include /I <path_to_id3lib>\\include\\id3
+6) (add your code which uses id3lib)
+7) Compile.
+8) dump id3lib.dll in your programs project dir.
+9) distribute your program including id3lib.dll
+(MS recommend you distribute it in your programs dir and not in system(32) to avoid version conficts)
+
+Thijmen
+thijmen@id3lib.org
+
diff --git a/reconf b/reconf
new file mode 100644
index 0000000..662fe10
--- /dev/null
+++ b/reconf
@@ -0,0 +1,27 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+#!/bin/sh
+rm -f config.cache
+rm -f acconfig.h
+echo "- aclocal."
+aclocal -I m4
+echo "- autoconf."
+autoconf
+echo "- acconfig."
+./acconfig
+echo "- autoheader."
+autoheader
+echo "- automake."
+automake -a
+echo "- Cleaning up after automake."
+rm -rf autom4te.cache
+rm -rf zlib/autom4te.cache
+exit
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..8b0f682
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,82 @@
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+LT_VERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+
+if ID3_NEEDZLIB
+zlib_include = -I$(top_srcdir)/zlib/include
+else
+zlib_include =
+endif
+
+INCLUDES = \
+ @ID3LIB_DEBUG_FLAGS@ -I$(top_srcdir)/include/id3 -I$(top_srcdir)/include $(zlib_include)
+
+noinst_HEADERS = \
+ field_def.h \
+ field_impl.h \
+ flags.h \
+ frame_def.h \
+ frame_impl.h \
+ header.h \
+ header_frame.h \
+ header_tag.h \
+ mp3_header.h \
+ tag_impl.h \
+ spec.h
+
+id3lib_sources = \
+ c_wrapper.cpp \
+ field.cpp \
+ field_binary.cpp \
+ field_integer.cpp \
+ field_string_ascii.cpp \
+ field_string_unicode.cpp \
+ frame.cpp \
+ frame_impl.cpp \
+ frame_parse.cpp \
+ frame_render.cpp \
+ globals.cpp \
+ header.cpp \
+ header_frame.cpp \
+ header_tag.cpp \
+ helpers.cpp \
+ io.cpp \
+ io_decorators.cpp \
+ io_helpers.cpp \
+ misc_support.cpp \
+ mp3_parse.cpp \
+ readers.cpp \
+ spec.cpp \
+ tag.cpp \
+ tag_file.cpp \
+ tag_find.cpp \
+ tag_impl.cpp \
+ tag_parse.cpp \
+ tag_parse_lyrics3.cpp \
+ tag_parse_musicmatch.cpp \
+ tag_parse_v1.cpp \
+ tag_render.cpp \
+ utils.cpp \
+ writers.cpp
+
+lib_LTLIBRARIES = libid3.la
+
+libid3_la_SOURCES = $(id3lib_sources)
+
+if ID3_NEEDZLIB
+LDADD = $(top_builddir)/zlib/src/libz.la
+endif
+
+libid3_la_LDFLAGS = \
+ -version-info $(LT_VERSION) \
+ -release $(LT_RELEASE) \
+ -export-dynamic
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..ee16d5d
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,509 @@
+# Makefile.in generated by automake 1.6.2 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1999 Scott Thomas Haug <scott@id3.org>
+# Copyright (C) 2002 Thijmen Klok <thijmen@id3lib.org>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOX_DIR_HTML = @DOX_DIR_HTML@
+DOX_DIR_LATEX = @DOX_DIR_LATEX@
+DOX_DIR_MAN = @DOX_DIR_MAN@
+DOX_DIR_RTF = @DOX_DIR_RTF@
+ECHO = @ECHO@
+ID3LIB_BINARY_AGE = @ID3LIB_BINARY_AGE@
+ID3LIB_DEBUG_FLAGS = @ID3LIB_DEBUG_FLAGS@
+ID3LIB_FULLNAME = @ID3LIB_FULLNAME@
+ID3LIB_INTERFACE_AGE = @ID3LIB_INTERFACE_AGE@
+ID3LIB_MAJOR_VERSION = @ID3LIB_MAJOR_VERSION@
+ID3LIB_MINOR_VERSION = @ID3LIB_MINOR_VERSION@
+ID3LIB_NAME = @ID3LIB_NAME@
+ID3LIB_PATCH_VERSION = @ID3LIB_PATCH_VERSION@
+ID3LIB_VERSION = @ID3LIB_VERSION@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+cxxflags_set = @cxxflags_set@
+install_sh = @install_sh@
+
+LT_VERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+
+@ID3_NEEDZLIB_TRUE@zlib_include = -I$(top_srcdir)/zlib/include
+@ID3_NEEDZLIB_FALSE@zlib_include =
+
+INCLUDES = \
+ @ID3LIB_DEBUG_FLAGS@ -I$(top_srcdir)/include/id3 -I$(top_srcdir)/include $(zlib_include)
+
+
+noinst_HEADERS = \
+ field_def.h \
+ field_impl.h \
+ flags.h \
+ frame_def.h \
+ frame_impl.h \
+ header.h \
+ header_frame.h \
+ header_tag.h \
+ mp3_header.h \
+ tag_impl.h \
+ spec.h
+
+
+id3lib_sources = \
+ c_wrapper.cpp \
+ field.cpp \
+ field_binary.cpp \
+ field_integer.cpp \
+ field_string_ascii.cpp \
+ field_string_unicode.cpp \
+ frame.cpp \
+ frame_impl.cpp \
+ frame_parse.cpp \
+ frame_render.cpp \
+ globals.cpp \
+ header.cpp \
+ header_frame.cpp \
+ header_tag.cpp \
+ helpers.cpp \
+ io.cpp \
+ io_decorators.cpp \
+ io_helpers.cpp \
+ misc_support.cpp \
+ mp3_parse.cpp \
+ readers.cpp \
+ spec.cpp \
+ tag.cpp \
+ tag_file.cpp \
+ tag_find.cpp \
+ tag_impl.cpp \
+ tag_parse.cpp \
+ tag_parse_lyrics3.cpp \
+ tag_parse_musicmatch.cpp \
+ tag_parse_v1.cpp \
+ tag_render.cpp \
+ utils.cpp \
+ writers.cpp
+
+
+lib_LTLIBRARIES = libid3.la
+
+libid3_la_SOURCES = $(id3lib_sources)
+
+@ID3_NEEDZLIB_TRUE@LDADD = $(top_builddir)/zlib/src/libz.la
+
+libid3_la_LDFLAGS = \
+ -version-info $(LT_VERSION) \
+ -release $(LT_RELEASE) \
+ -export-dynamic
+
+subdir = src
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(lib_LTLIBRARIES)
+
+libid3_la_LIBADD =
+am__objects_1 = c_wrapper.lo field.lo field_binary.lo field_integer.lo \
+ field_string_ascii.lo field_string_unicode.lo frame.lo \
+ frame_impl.lo frame_parse.lo frame_render.lo globals.lo \
+ header.lo header_frame.lo header_tag.lo helpers.lo io.lo \
+ io_decorators.lo io_helpers.lo misc_support.lo mp3_parse.lo \
+ readers.lo spec.lo tag.lo tag_file.lo tag_find.lo tag_impl.lo \
+ tag_parse.lo tag_parse_lyrics3.lo tag_parse_musicmatch.lo \
+ tag_parse_v1.lo tag_render.lo utils.lo writers.lo
+am_libid3_la_OBJECTS = $(am__objects_1)
+libid3_la_OBJECTS = $(am_libid3_la_OBJECTS)
+
+DEFS = @DEFS@
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/c_wrapper.Plo ./$(DEPDIR)/field.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/field_binary.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/field_integer.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/field_string_ascii.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/field_string_unicode.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/frame.Plo ./$(DEPDIR)/frame_impl.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/frame_parse.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/frame_render.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/globals.Plo ./$(DEPDIR)/header.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/header_frame.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/header_tag.Plo ./$(DEPDIR)/helpers.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/io.Plo ./$(DEPDIR)/io_decorators.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/io_helpers.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/misc_support.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/mp3_parse.Plo ./$(DEPDIR)/readers.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/spec.Plo ./$(DEPDIR)/tag.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_file.Plo ./$(DEPDIR)/tag_find.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_impl.Plo ./$(DEPDIR)/tag_parse.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_parse_lyrics3.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_parse_musicmatch.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_parse_v1.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/tag_render.Plo ./$(DEPDIR)/utils.Plo \
+@AMDEP_TRUE@ ./$(DEPDIR)/writers.Plo
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXFLAGS = @CXXFLAGS@
+DIST_SOURCES = $(libid3_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
+SOURCES = $(libid3_la_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+libLTLIBRARIES_INSTALL = $(INSTALL)
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p="`echo $$p | sed -e 's|^.*/||'`"; \
+ echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test -z "$dir" && dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libid3.la: $(libid3_la_OBJECTS) $(libid3_la_DEPENDENCIES)
+ $(CXXLINK) -rpath $(libdir) $(libid3_la_LDFLAGS) $(libid3_la_OBJECTS) $(libid3_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_wrapper.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field_binary.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field_integer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field_string_ascii.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field_string_unicode.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame_impl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame_parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame_render.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header_frame.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header_tag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helpers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io_decorators.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io_helpers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_support.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3_parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_file.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_find.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_impl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_parse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_parse_lyrics3.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_parse_musicmatch.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_parse_v1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_render.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writers.Plo@am__quote@
+
+distclean-depend:
+ -rm -rf ./$(DEPDIR)
+
+.cpp.o:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.cpp.obj:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
+
+.cpp.lo:
+@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+CXXDEPMODE = @CXXDEPMODE@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$tags$$unique" \
+ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+ @list='$(DISTFILES)'; for file in $$list; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkinstalldirs) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+ distclean-generic distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES
+
+.PHONY: GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool distclean distclean-compile \
+ distclean-depend distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool tags uninstall \
+ uninstall-am uninstall-info-am uninstall-libLTLIBRARIES
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/c_wrapper.cpp b/src/c_wrapper.cpp
new file mode 100644
index 0000000..7cb321c
--- /dev/null
+++ b/src/c_wrapper.cpp
@@ -0,0 +1,722 @@
+// $Id: c_wrapper.cpp,v 1.22 2002/09/21 17:23:32 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+//#include <string.h>
+#include "id3.h"
+#include "tag.h"
+#include "field.h"
+#include "id3lib_strings.h"
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+ // tag wrappers
+
+#define ID3_CATCH(code) try { code; } catch (...) { }
+
+ ID3_C_EXPORT ID3Tag* CCONV
+ ID3Tag_New(void)
+ {
+ ID3_Tag* tag = NULL;
+ ID3_CATCH(tag = new ID3_Tag);
+ return reinterpret_cast<ID3Tag *>(tag);
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_Delete(ID3Tag *tag)
+ {
+ if (tag)
+ {
+ ID3_CATCH(delete reinterpret_cast<ID3_Tag*>(tag));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_Clear(ID3Tag *tag)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag*>(tag)->Clear());
+ }
+ }
+
+
+ ID3_C_EXPORT bool CCONV
+ ID3Tag_HasChanged(const ID3Tag *tag)
+ {
+ bool changed = false;
+
+ if (tag)
+ {
+ ID3_CATCH(changed = reinterpret_cast<const ID3_Tag * >(tag)->HasChanged());
+ }
+
+ return changed;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_SetUnsync(ID3Tag *tag, bool unsync)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->SetUnsync(unsync));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_SetExtendedHeader(ID3Tag *tag, bool ext)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->SetExtendedHeader(ext));
+ }
+ }
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_SetPadding(ID3Tag *tag, bool pad)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->SetPadding(pad));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_AddFrame(ID3Tag *tag, const ID3Frame *frame)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->AddFrame(reinterpret_cast<const ID3_Frame *>(frame)));
+ }
+ }
+
+
+ ID3_C_EXPORT bool CCONV
+ ID3Tag_AttachFrame(ID3Tag *tag, ID3Frame *frame)
+ {
+ bool b = false;
+ if (tag)
+ {
+ ID3_CATCH(b = reinterpret_cast<ID3_Tag *>(tag)->AttachFrame(reinterpret_cast<ID3_Frame *>(frame)));
+ }
+ return b;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Tag_AddFrames(ID3Tag *tag, const ID3Frame *frames, size_t num)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->AddFrames(reinterpret_cast<const ID3_Frame *>(frames), num));
+ }
+ }
+
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Tag_RemoveFrame(ID3Tag *tag, const ID3Frame *frame)
+ {
+ ID3_Frame* rem_frame = NULL;
+ if (tag)
+ {
+ ID3_CATCH(rem_frame = reinterpret_cast<ID3_Tag *>(tag)->RemoveFrame(reinterpret_cast<const ID3_Frame *>(frame)));
+ }
+ return reinterpret_cast<ID3Frame*>(rem_frame);
+ }
+
+
+ ID3_C_EXPORT ID3_Err CCONV
+ ID3Tag_Parse(ID3Tag *tag, const uchar header[ ID3_TAGHEADERSIZE ],
+ const uchar *buffer)
+ {
+ size_t size = 0;
+ if (tag)
+ {
+ ID3_CATCH(size = reinterpret_cast<ID3_Tag *>(tag)->Parse(header, buffer));
+ }
+ return ID3E_NoError;
+ }
+
+
+#ifdef WIN32
+ ID3_C_EXPORT size_t CCONV
+ ID3Tag_Link(ID3Tag *tag, const wchar_t *fileName)
+#else
+ ID3_C_EXPORT size_t CCONV
+ ID3Tag_Link(ID3Tag *tag, const char *fileName)
+#endif
+ {
+ size_t offset = 0;
+ if (tag)
+ {
+ ID3_CATCH(offset = reinterpret_cast<ID3_Tag *>(tag)->Link(fileName));
+ }
+ return offset;
+ }
+
+#ifdef WIN32
+ ID3_C_EXPORT size_t CCONV
+ ID3Tag_LinkWithFlags(ID3Tag *tag, const wchar_t *fileName, flags_t flags)
+#else
+ ID3_C_EXPORT size_t CCONV
+ ID3Tag_LinkWithFlags(ID3Tag *tag, const char *fileName, flags_t flags)
+#endif
+ {
+ size_t offset = 0;
+ if (tag)
+ {
+ ID3_CATCH(offset = reinterpret_cast<ID3_Tag *>(tag)->Link(fileName,flags));
+ }
+ return offset;
+ }
+
+
+
+ ID3_C_EXPORT ID3_Err CCONV
+ ID3Tag_Update(ID3Tag *tag)
+ {
+ flags_t flags = 0;
+ if (tag)
+ {
+ ID3_CATCH(flags = reinterpret_cast<ID3_Tag *>(tag)->Update());
+ }
+ return ID3E_NoError;
+ }
+
+ ID3_C_EXPORT ID3_Err CCONV
+ ID3Tag_UpdateByTagType(ID3Tag *tag, flags_t tag_type)
+ {
+ flags_t flags = 0;
+ if (tag)
+ {
+ ID3_CATCH(flags = reinterpret_cast<ID3_Tag *>(tag)->Update(tag_type));
+ }
+ return ID3E_NoError;
+ }
+
+
+ ID3_C_EXPORT ID3_Err CCONV
+ ID3Tag_Strip(ID3Tag *tag, flags_t ulTagFlags)
+ {
+ if (tag)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Tag *>(tag)->Strip(ulTagFlags));
+ }
+ return ID3E_NoError;
+ }
+
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Tag_FindFrameWithID(const ID3Tag *tag, ID3_FrameID id)
+ {
+ ID3_Frame *frame = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(frame = reinterpret_cast<const ID3_Tag *>(tag)->Find(id));
+ }
+
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Tag_FindFrameWithINT(const ID3Tag *tag, ID3_FrameID id,
+ ID3_FieldID fld, uint32 data)
+ {
+ ID3_Frame *frame = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(frame = reinterpret_cast<const ID3_Tag *>(tag)->Find(id, fld, data));
+ }
+
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Tag_FindFrameWithASCII(const ID3Tag *tag, ID3_FrameID id,
+ ID3_FieldID fld, const char *data)
+ {
+ ID3_Frame *frame = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(frame = reinterpret_cast<const ID3_Tag *>(tag)->Find(id, fld, data));
+ }
+
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Tag_FindFrameWithUNICODE(const ID3Tag *tag, ID3_FrameID id,
+ ID3_FieldID fld, const unicode_t *data)
+ {
+ ID3_Frame *frame = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(frame = reinterpret_cast<const ID3_Tag *>(tag)->Find(id, fld, data));
+ }
+
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Tag_NumFrames(const ID3Tag *tag)
+ {
+ size_t num = 0;
+
+ if (tag)
+ {
+ ID3_CATCH(num = reinterpret_cast<const ID3_Tag *>(tag)->NumFrames());
+ }
+
+ return num;
+ }
+
+
+ ID3_C_EXPORT bool CCONV
+ ID3Tag_HasTagType(const ID3Tag *tag, ID3_TagType tt)
+ {
+ bool has_tt = false;
+
+ if (tag)
+ {
+ ID3_CATCH(has_tt = reinterpret_cast<const ID3_Tag *>(tag)->HasTagType(tt));
+ }
+
+ return has_tt;
+ }
+
+ ID3_C_EXPORT ID3TagIterator* CCONV
+ ID3Tag_CreateIterator(ID3Tag* tag)
+ {
+ ID3_Tag::Iterator* iter = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(iter = reinterpret_cast<ID3_Tag*>(tag)->CreateIterator());
+ }
+
+ return reinterpret_cast<ID3TagIterator*>(iter);
+ }
+
+ ID3_C_EXPORT ID3TagConstIterator* CCONV
+ ID3Tag_CreateConstIterator(const ID3Tag* tag)
+ {
+ ID3_Tag::ConstIterator* iter = NULL;
+
+ if (tag)
+ {
+ ID3_CATCH(iter = reinterpret_cast<const ID3_Tag*>(tag)->CreateIterator());
+ }
+
+ return reinterpret_cast<ID3TagConstIterator*>(iter);
+ }
+
+ ID3_C_EXPORT void CCONV
+ ID3TagIterator_Delete(ID3TagIterator *iter)
+ {
+ if (iter)
+ {
+ ID3_CATCH(delete reinterpret_cast<ID3_Tag::Iterator*>(iter));
+ }
+ }
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3TagIterator_GetNext(ID3TagIterator *iter)
+ {
+ ID3_Frame* frame = NULL;
+ if (iter)
+ {
+ ID3_CATCH(frame = reinterpret_cast<ID3_Tag::Iterator*>(iter)->GetNext());
+ }
+ return reinterpret_cast<ID3Frame*>(frame);
+ }
+
+ ID3_C_EXPORT void CCONV
+ ID3TagConstIterator_Delete(ID3TagConstIterator *iter)
+ {
+ if (iter)
+ {
+ ID3_CATCH(delete reinterpret_cast<ID3_Tag::ConstIterator*>(iter));
+ }
+ }
+
+ ID3_C_EXPORT const ID3Frame* CCONV
+ ID3TagConstIterator_GetNext(ID3TagConstIterator *iter)
+ {
+ const ID3_Frame* frame = NULL;
+ if (iter)
+ {
+ ID3_CATCH(frame = reinterpret_cast<ID3_Tag::ConstIterator*>(iter)->GetNext());
+ }
+ return reinterpret_cast<const ID3Frame*>(frame);
+ }
+
+ // frame wrappers
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Frame_New(void)
+ {
+ ID3_Frame* frame = NULL;
+ ID3_CATCH(frame = new ID3_Frame);
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+ ID3_C_EXPORT ID3Frame* CCONV
+ ID3Frame_NewID(ID3_FrameID id)
+ {
+ ID3_Frame* frame = NULL;
+ ID3_CATCH(frame = new ID3_Frame(id));
+ return reinterpret_cast<ID3Frame *>(frame);
+ }
+
+ ID3_C_EXPORT void CCONV
+ ID3Frame_Delete(ID3Frame *frame)
+ {
+ if (frame)
+ {
+ ID3_CATCH(delete reinterpret_cast<ID3_Frame *>(frame));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Frame_Clear(ID3Frame *frame)
+ {
+ if (frame)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Frame *>(frame)->Clear());
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Frame_SetID(ID3Frame *frame, ID3_FrameID id)
+ {
+ if (frame)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Frame *>(frame)->SetID(id));
+ }
+ }
+
+
+ ID3_C_EXPORT ID3_FrameID CCONV
+ ID3Frame_GetID(const ID3Frame *frame)
+ {
+ ID3_FrameID id = ID3FID_NOFRAME;
+
+ if (frame)
+ {
+ ID3_CATCH(id = reinterpret_cast<const ID3_Frame *>(frame)->GetID());
+ }
+
+ return id;
+ }
+
+
+ ID3_C_EXPORT ID3Field* CCONV
+ ID3Frame_GetField(const ID3Frame *frame, ID3_FieldID name)
+ {
+ ID3_Field *field = NULL;
+
+ if (frame)
+ {
+ ID3_CATCH(field = reinterpret_cast<const ID3_Frame *>(frame)->GetField(name));
+ }
+
+ return reinterpret_cast<ID3Field *>(field);
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Frame_SetCompression(ID3Frame *frame, bool comp)
+ {
+ if (frame)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Frame *>(frame)->SetCompression(comp));
+ }
+ }
+
+
+ ID3_C_EXPORT bool CCONV
+ ID3Frame_GetCompression(const ID3Frame *frame)
+ {
+ bool compressed = false;
+ if (frame)
+ {
+ ID3_CATCH(compressed = reinterpret_cast<const ID3_Frame *>(frame)->GetCompression());
+ }
+ return compressed;
+ }
+
+
+ // field wrappers
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_Clear(ID3Field *field)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Clear());
+ }
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_Size(const ID3Field *field)
+ {
+ size_t size = 0;
+
+ if (field)
+ {
+ ID3_CATCH(size = reinterpret_cast<const ID3_Field *>(field)->Size());
+ }
+
+ return size;
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_GetNumTextItems(const ID3Field *field)
+ {
+ size_t items = 0;
+
+ if (field)
+ {
+ ID3_CATCH(items = reinterpret_cast<const ID3_Field *>(field)->GetNumTextItems());
+ }
+
+ return items;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_SetINT(ID3Field *field, uint32 data)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Set(data));
+ }
+ }
+
+
+ ID3_C_EXPORT uint32 CCONV
+ ID3Field_GetINT(const ID3Field *field)
+ {
+ uint32 value = 0;
+
+ if (field)
+ {
+ ID3_CATCH(value = reinterpret_cast<const ID3_Field *>(field)->Get());
+ }
+
+ return value;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_SetUNICODE(ID3Field *field, const unicode_t *string)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Set(string));
+ }
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_GetUNICODE(const ID3Field *field, unicode_t *buffer, size_t maxChars)
+ {
+ size_t numChars = 0;
+
+ if (field)
+ {
+ ID3_CATCH(numChars = reinterpret_cast<const ID3_Field *>(field)->Get(buffer, maxChars));
+ }
+
+ return numChars;
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_GetUNICODEItem(const ID3Field *field, unicode_t *buffer,
+ size_t maxChars, size_t itemNum)
+ {
+ size_t numChars = 0;
+
+ if (field)
+ {
+ ID3_CATCH(numChars = reinterpret_cast<const ID3_Field *>(field)->Get(buffer, maxChars, itemNum));
+ }
+
+ return numChars;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_AddUNICODE(ID3Field *field, const unicode_t *string)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Add(string));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_SetASCII(ID3Field *field, const char *string)
+ {
+ dami::String Str ;
+
+ if (field)
+ {
+ Str.append ( string ) ;
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->SetText(string));
+ }
+ }
+
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_GetASCII(const ID3Field *field, char *buffer, size_t maxChars)
+ {
+
+ return ID3Field_GetASCIIItem ( field, buffer, maxChars, 0 ) ;
+ }
+
+ ID3_C_EXPORT size_t CCONV
+ ID3Field_GetASCIIItem(const ID3Field *field, char *buffer,
+ size_t maxChars, size_t itemNum)
+ {
+ const char *p ;
+ dami::String Str ;
+ size_t numChars = 0 ;
+
+ if (field)
+ {
+ ID3_CATCH(Str = reinterpret_cast<const ID3_Field *>(field)->GetText(itemNum,ID3TE_ASCII));
+ p = Str.c_str() ;
+ strncpy ( buffer, p, maxChars ) ;
+ buffer[maxChars-1] = 0 ;
+ numChars = strlen ( buffer ) ;
+ }
+
+ return numChars;
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_AddASCII(ID3Field *field, const char *string)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Add(string));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_SetEncoding(ID3Field *field, const ID3_TextEnc enc)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->SetEncoding(enc));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_SetBINARY(ID3Field *field, const uchar *data, size_t size)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->Set(data, size));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_GetBINARY(const ID3Field *field, uchar *buffer, size_t buffLength)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<const ID3_Field *>(field)->Get(buffer, buffLength));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_FromFile(ID3Field *field, const char *fileName)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<ID3_Field *>(field)->FromFile(fileName));
+ }
+ }
+
+
+ ID3_C_EXPORT void CCONV
+ ID3Field_ToFile(const ID3Field *field, const char *fileName)
+ {
+ if (field)
+ {
+ ID3_CATCH(reinterpret_cast<const ID3_Field *>(field)->ToFile(fileName));
+ }
+ }
+
+ ID3_C_EXPORT const Mp3_Headerinfo* CCONV
+ ID3Tag_GetMp3HeaderInfo ( ID3Tag *tag )
+ {
+ const Mp3_Headerinfo *HeaderInfo = NULL ;
+ if ( tag )
+ {
+ ID3_CATCH(HeaderInfo = reinterpret_cast<ID3_Tag *>(tag)->GetMp3HeaderInfo()) ;
+ }
+ return HeaderInfo ;
+ }
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/src/field.cpp b/src/field.cpp
new file mode 100644
index 0000000..5199092
--- /dev/null
+++ b/src/field.cpp
@@ -0,0 +1,1327 @@
+// $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+
+#include "field_impl.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "field_def.h"
+#include "frame_def.h"
+#include "readers.h"
+#include <assert.h>
+
+using namespace dami;
+
+// This is used for unimplemented frames so that their data is preserved when
+// parsing and rendering
+static ID3_FieldDef ID3FD_Unimplemented[] =
+{
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+const ID3_FieldDef* ID3_FieldDef::DEFAULT = ID3FD_Unimplemented;
+
+static ID3_FieldDef ID3FD_URL[] =
+{
+ {
+ ID3FN_URL, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_UserURL[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_URL, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Text[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_UserText[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_GeneralText[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_LANGUAGE, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 3, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_TermsOfUse[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_LANGUAGE, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 3, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_LinkedInfo[] =
+{
+ {
+ ID3FN_ID, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 3, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_2_1, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_ID, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 4, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_URL, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Picture[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_IMAGEFORMAT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 3, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_2_1, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_MIMETYPE, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_PICTURETYPE, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_GEO[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_MIMETYPE, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_FILENAME, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_UFI[] =
+{
+ {
+ ID3FN_OWNER, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_PlayCounter[] =
+{
+ {
+ ID3FN_COUNTER, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 4, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Popularimeter[] =
+{
+ {
+ ID3FN_EMAIL, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_RATING, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_COUNTER, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 4, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Private[] =
+{
+ {
+ ID3FN_OWNER, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Registration[] =
+{
+ {
+ ID3FN_OWNER, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_ID, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_3_0, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_InvolvedPeople[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TEXT, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_TEXTLIST, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_CDM[] =
+{
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_2_1, // INITIAL SPEC
+ ID3V2_2_1, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ }
+};
+
+static ID3_FieldDef ID3FD_SyncLyrics[] =
+{
+ {
+ ID3FN_TEXTENC, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_LANGUAGE, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 3, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_TIMESTAMPFORMAT, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_CONTENTTYPE, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DESCRIPTION, // FIELD NAME
+ ID3FTY_TEXTSTRING, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_DATA, // FIELD NAME
+ ID3FTY_BINARY, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+
+
+/*
+ * Currently unused
+ */
+#if defined _UNDEFINED_
+static ID3_FieldDef ID3FD_Volume[] =
+{
+ {
+ ID3FN_VOLUMEADJ, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_NUMBITS, // FIELD NAME
+ ID3FTY_INTEGER, // FIELD TYPE
+ 1, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_NONE, // FLAGS
+ ID3FN_NOFIELD // LINKED FIELD
+ },
+ {
+ ID3FN_VOLCHGRIGHT, // FIELD NAME
+ ID3FTY_BITFIELD, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ADJUSTEDBY, // FLAGS
+ ID3FN_NUMBITS // LINKED FIELD
+ },
+ {
+ ID3FN_VOLCHGLEFT, // FIELD NAME
+ ID3FTY_BITFIELD, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ADJUSTEDBY, // FLAGS
+ ID3FN_NUMBITS // LINKED FIELD
+ },
+ {
+ ID3FN_PEAKVOLRIGHT, // FIELD NAME
+ ID3FTY_BITFIELD, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ADJUSTEDBY, // FLAGS
+ ID3FN_NUMBITS // LINKED FIELD
+ },
+ {
+ ID3FN_PEAKVOLLEFT, // FIELD NAME
+ ID3FTY_BITFIELD, // FIELD TYPE
+ 0, // FIXED LEN
+ ID3V2_EARLIEST, // INITIAL SPEC
+ ID3V2_LATEST, // ENDING SPEC
+ ID3FF_ADJUSTEDBY, // FLAGS
+ ID3FN_NUMBITS // LINKED FIELD
+ },
+ { ID3FN_NOFIELD }
+};
+#endif /* _UNDEFINED_ */
+
+// **** Currently Implemented Frames
+// APIC PIC ID3FID_PICTURE Attached picture
+// COMM COM ID3FID_COMMENT Comments
+// ENCR ID3FID_CRYPTOREG Encryption method registration
+// GEOB GEO ID3FID_GENERALOBJECT General encapsulated object
+// GRID ID3FID_GROUPINGREG Group identification registration
+// IPLS IPL ID3FID_INVOLVEDPEOPLE Involved people list
+// LINK LNK ID3FID_LINKEDINFO Linked information
+// PCNT CNT ID3FID_PLAYCOUNTER Play counter
+// POPM POP ID3FID_POPULARIMETER Popularimeter
+// PRIV ID3FID_PRIVATE Private frame
+// SYLT SLT ID3FID_SYNCEDLYRICS Synchronized lyric/text
+// TALB TAL ID3FID_ALBUM Album/Movie/Show title
+// TBPM TBP ID3FID_BPM BPM (beats per minute)
+// TCOM TCM ID3FID_COMPOSER Composer
+// TCON TCO ID3FID_CONTENTTYPE Content type
+// TCOP TCR ID3FID_COPYRIGHT Copyright message
+// TDAT TDA ID3FID_DATE Date
+// TDLY TDY ID3FID_PLAYLISTDELAY Playlist delay
+// TENC TEN ID3FID_ENCODEDBY Encoded by
+// TEXT TXT ID3FID_LYRICIST Lyricist/Text writer
+// TFLT TFT ID3FID_FILETYPE File type
+// TIME TKE ID3FID_TIME Time
+// TIT1 TIM ID3FID_CONTENTGROUP Content group description
+// TIT2 TT1 ID3FID_TITLE Title/songname/content description
+// TIT3 TT2 ID3FID_SUBTITLE Subtitle/Description refinement
+// TKEY TT3 ID3FID_INITIALKEY Initial key
+// TLAN TLA ID3FID_LANGUAGE Language(s)
+// TLEN TLE ID3FID_SONGLEN Length
+// TMED TMT ID3FID_MEDIATYPE Media type
+// TOAL TOT ID3FID_ORIGALBUM Original album/movie/show title
+// TOFN TOF ID3FID_ORIGFILENAME Original filename
+// TOLY TOL ID3FID_ORIGLYRICIST Original lyricist(s)/text writer(s)
+// TOPE TOA ID3FID_ORIGARTIST Original artist(s)/performer(s)
+// TORY TOR ID3FID_ORIGYEAR Original release year
+// TOWN ID3FID_FILEOWNER File owner/licensee
+// TPE1 TP1 ID3FID_LEADARTIST Lead performer(s)/Soloist(s)
+// TPE2 TP2 ID3FID_BAND Band/orchestra/accompaniment
+// TPE3 TP3 ID3FID_CONDUCTOR Conductor/performer refinement
+// TPE4 TP4 ID3FID_MIXARTIST Interpreted, remixed, or otherwise modified
+// TPOS TPA ID3FID_PARTINSET Part of a set
+// TPUB TPB ID3FID_PUBLISHER Publisher
+// TRCK TRK ID3FID_TRACKNUM Track number/Position in set
+// TRDA TRD ID3FID_RECORDINGDATES Recording dates
+// TRSN TRN ID3FID_NETRADIOSTATION Internet radio station name
+// TRSO TRO ID3FID_NETRADIOOWNER Internet radio station owner
+// TSIZ TSI ID3FID_SIZE Size
+// TSRC TRC ID3FID_ISRC ISRC (international standard recording code)
+// TSSE TSS ID3FID_ENCODERSETTINGS Software/Hardware and encoding settings
+// TXXX TXX ID3FID_USERTEXT User defined text information
+// TYER TYE ID3FID_YEAR Year
+// UFID UFI ID3FID_UNIQUEFILEID Unique file identifier
+// USER ID3FID_TERMSOFUSE Terms of use
+// USLT ULT ID3FID_UNSYNCEDLYRICS Unsynchronized lyric/text transcription
+// WCOM WCM ID3FID_WWWCOMMERCIALINFO Commercial information
+// WCOP WCM ID3FID_WWWCOPYRIGHT Copyright/Legal infromation
+// WOAF WCP ID3FID_WWWAUDIOFILE Official audio file webpage
+// WOAR WAF ID3FID_WWWARTIST Official artist/performer webpage
+// WOAS WAR ID3FID_WWWAUDIOSOURCE Official audio source webpage
+// WORS WAS ID3FID_WWWRADIOPAGE Official internet radio station homepage
+// WPAY WRA ID3FID_WWWPAYMENT Payment
+// WPUB WPY ID3FID_WWWPUBLISHER Official publisher webpage
+// WXXX WXX ID3FID_WWWUSER User defined URL link
+// CDM ID3FID_METACOMPRESSION Compressed data meta frame
+
+// **** Currently unimplemented frames
+// AENC CRA ID3FID_AUDIOCRYPTO Audio encryption
+// COMR ID3FID_COMMERCIAL Commercial frame
+// EQUA EQU ID3FID_EQUALIZATION Equalization
+// ETCO ETC ID3FID_EVENTTIMING Event timing codes
+// MCDI MCI ID3FID_CDID Music CD identifier
+// MLLT MLL ID3FID_MPEGLOOKUP MPEG location lookup table
+// OWNE ID3FID_OWNERSHIP Ownership frame
+// POSS ID3FID_POSITIONSYNC Position synchronisation frame
+// RBUF BUF ID3FID_BUFFERSIZE Recommended buffer size
+// RVAD RVA ID3FID_VOLUMEADJ Relative volume adjustment
+// RVRB REV ID3FID_REVERB Reverb
+// SYTC STC ID3FID_SYNCEDTEMPO Synchronized tempo codes
+// CRM ID3FID_METACRYPTO Encrypted meta frame
+static ID3_FrameDef ID3_FrameDefs[] =
+{
+ // short long tag file
+ // frame id id id discrd discrd field defs description
+ {ID3FID_AUDIOCRYPTO, "CRA", "AENC", false, false, ID3FD_Unimplemented, "Audio encryption"},
+ {ID3FID_PICTURE, "PIC", "APIC", false, false, ID3FD_Picture, "Attached picture"},
+ {ID3FID_COMMENT, "COM", "COMM", false, false, ID3FD_GeneralText, "Comments"},
+ {ID3FID_COMMERCIAL, "" , "COMR", false, false, ID3FD_Unimplemented, "Commercial"},
+ {ID3FID_CRYPTOREG, "" , "ENCR", false, false, ID3FD_Registration, "Encryption method registration"},
+ {ID3FID_EQUALIZATION, "EQU", "EQUA", false, true, ID3FD_Unimplemented, "Equalization"},
+ {ID3FID_EVENTTIMING, "ETC", "ETCO", false, true, ID3FD_Unimplemented, "Event timing codes"},
+ {ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, ID3FD_GEO, "General encapsulated object"},
+ {ID3FID_GROUPINGREG, "" , "GRID", false, false, ID3FD_Registration, "Group identification registration"},
+ {ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, ID3FD_InvolvedPeople,"Involved people list"},
+ {ID3FID_LINKEDINFO, "LNK", "LINK", false, false, ID3FD_LinkedInfo, "Linked information"},
+ {ID3FID_CDID, "MCI", "MCDI", false, false, ID3FD_Unimplemented, "Music CD identifier"},
+ {ID3FID_MPEGLOOKUP, "MLL", "MLLT", false, true, ID3FD_Unimplemented, "MPEG location lookup table"},
+ {ID3FID_OWNERSHIP, "" , "OWNE", false, false, ID3FD_Unimplemented, "Ownership frame"},
+ {ID3FID_PRIVATE, "" , "PRIV", false, false, ID3FD_Private, "Private frame"},
+ {ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, ID3FD_PlayCounter, "Play counter"},
+ {ID3FID_POPULARIMETER, "POP", "POPM", false, false, ID3FD_Popularimeter, "Popularimeter"},
+ {ID3FID_POSITIONSYNC, "" , "POSS", false, true, ID3FD_Unimplemented, "Position synchronisation frame"},
+ {ID3FID_BUFFERSIZE, "BUF", "RBUF", false, false, ID3FD_Unimplemented, "Recommended buffer size"},
+ {ID3FID_VOLUMEADJ, "RVA", "RVAD", false, true, ID3FD_Unimplemented, "Relative volume adjustment"},
+ {ID3FID_REVERB, "REV", "RVRB", false, false, ID3FD_Unimplemented, "Reverb"},
+ {ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, ID3FD_SyncLyrics, "Synchronized lyric/text"},
+ {ID3FID_SYNCEDTEMPO, "STC", "SYTC", false, true, ID3FD_Unimplemented, "Synchronized tempo codes"},
+ {ID3FID_ALBUM, "TAL", "TALB", false, false, ID3FD_Text, "Album/Movie/Show title"},
+ {ID3FID_BPM, "TBP", "TBPM", false, false, ID3FD_Text, "BPM (beats per minute)"},
+ {ID3FID_COMPOSER, "TCM", "TCOM", false, false, ID3FD_Text, "Composer"},
+ {ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, ID3FD_Text, "Content type"},
+ {ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, ID3FD_Text, "Copyright message"},
+ {ID3FID_DATE, "TDA", "TDAT", false, false, ID3FD_Text, "Date"},
+ {ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, ID3FD_Text, "Playlist delay"},
+ {ID3FID_ENCODEDBY, "TEN", "TENC", false, true, ID3FD_Text, "Encoded by"},
+ {ID3FID_LYRICIST, "TXT", "TEXT", false, false, ID3FD_Text, "Lyricist/Text writer"},
+ {ID3FID_FILETYPE, "TFT", "TFLT", false, false, ID3FD_Text, "File type"},
+ {ID3FID_TIME, "TIM", "TIME", false, false, ID3FD_Text, "Time"},
+ {ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, ID3FD_Text, "Content group description"},
+ {ID3FID_TITLE, "TT2", "TIT2", false, false, ID3FD_Text, "Title/songname/content description"},
+ {ID3FID_SUBTITLE, "TT3", "TIT3", false, false, ID3FD_Text, "Subtitle/Description refinement"},
+ {ID3FID_INITIALKEY, "TKE", "TKEY", false, false, ID3FD_Text, "Initial key"},
+ {ID3FID_LANGUAGE, "TLA", "TLAN", false, false, ID3FD_Text, "Language(s)"},
+ {ID3FID_SONGLEN, "TLE", "TLEN", false, true, ID3FD_Text, "Length"},
+ {ID3FID_MEDIATYPE, "TMT", "TMED", false, false, ID3FD_Text, "Media type"},
+ {ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, ID3FD_Text, "Original album/movie/show title"},
+ {ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, ID3FD_Text, "Original filename"},
+ {ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, ID3FD_Text, "Original lyricist(s)/text writer(s)"},
+ {ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, ID3FD_Text, "Original artist(s)/performer(s)"},
+ {ID3FID_ORIGYEAR, "TOR", "TORY", false, false, ID3FD_Text, "Original release year"},
+ {ID3FID_FILEOWNER, "" , "TOWN", false, false, ID3FD_Text, "File owner/licensee"},
+ {ID3FID_LEADARTIST, "TP1", "TPE1", false, false, ID3FD_Text, "Lead performer(s)/Soloist(s)"},
+ {ID3FID_BAND, "TP2", "TPE2", false, false, ID3FD_Text, "Band/orchestra/accompaniment"},
+ {ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, ID3FD_Text, "Conductor/performer refinement"},
+ {ID3FID_MIXARTIST, "TP4", "TPE4", false, false, ID3FD_Text, "Interpreted, remixed, or otherwise modified by"},
+ {ID3FID_PARTINSET, "TPA", "TPOS", false, false, ID3FD_Text, "Part of a set"},
+ {ID3FID_PUBLISHER, "TPB", "TPUB", false, false, ID3FD_Text, "Publisher"},
+ {ID3FID_TRACKNUM, "TRK", "TRCK", false, false, ID3FD_Text, "Track number/Position in set"},
+ {ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, ID3FD_Text, "Recording dates"},
+ {ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, ID3FD_Text, "Internet radio station name"},
+ {ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, ID3FD_Text, "Internet radio station owner"},
+ {ID3FID_SIZE, "TSI", "TSIZ", false, true, ID3FD_Text, "Size"},
+ {ID3FID_ISRC, "TRC", "TSRC", false, false, ID3FD_Text, "ISRC (international standard recording code)"},
+ {ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, ID3FD_Text, "Software/Hardware and settings used for encoding"},
+ {ID3FID_USERTEXT, "TXX", "TXXX", false, false, ID3FD_UserText, "User defined text information"},
+ {ID3FID_YEAR, "TYE", "TYER", false, false, ID3FD_Text, "Year"},
+ {ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, ID3FD_UFI, "Unique file identifier"},
+ {ID3FID_TERMSOFUSE, "" , "USER", false, false, ID3FD_TermsOfUse, "Terms of use"},
+ {ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, ID3FD_GeneralText, "Unsynchronized lyric/text transcription"},
+ {ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, ID3FD_URL, "Commercial information"},
+ {ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, ID3FD_URL, "Copyright/Legal infromation"},
+ {ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, ID3FD_URL, "Official audio file webpage"},
+ {ID3FID_WWWARTIST, "WAR", "WOAR", false, false, ID3FD_URL, "Official artist/performer webpage"},
+ {ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, ID3FD_URL, "Official audio source webpage"},
+ {ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, ID3FD_URL, "Official internet radio station homepage"},
+ {ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, ID3FD_URL, "Payment"},
+ {ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, ID3FD_URL, "Official publisher webpage"},
+ {ID3FID_WWWUSER, "WXX", "WXXX", false, false, ID3FD_UserURL, "User defined URL link"},
+ {ID3FID_METACRYPTO, "CRM", "" , false, false, ID3FD_Unimplemented, "Encrypted meta frame"},
+ {ID3FID_METACOMPRESSION, "CDM", "" , false, false, ID3FD_CDM, "Compressed data meta frame"},
+ {ID3FID_ITUNESCOMPILATION, "TCP", "TCMP", false, false, ID3FD_Unimplemented, "iTunes Compilation Flag"},
+ {ID3FID_NOFRAME}
+};
+
+/** \class ID3_Field field.h id3/field.h
+ ** \brief The representative class of an ID3v2 field.
+ **
+ ** As a general rule, you need never create an object of this type. id3lib
+ ** uses them internally as part of the id3_frame class. You must know how to
+ ** interact with these objects, though, and that's what this section is about.
+ **
+ ** The ID3_Field contains many overloaded methods to provide these facilities
+ ** for four different data types: integers, ASCII strings, Unicode strings,
+ ** and binary data.
+ **
+ ** An integer field supports the Get(), Set(uint32), and operator=(uint32)
+ ** methods.
+ **
+ ** Both types of strings support the GetNumTextItems() method.
+ **
+ ** An ASCII string field supports the Get(char*, size_t, size_t)),
+ ** Set(const char*), Add(const char*), and operator=(const char*) methods.
+ **
+ ** A Unicode field also supports Get(unicode_t*, size_t, size_t),
+ ** Set(const unicode_t*), Add(const unicode_t*), and
+ ** operator=(const unicode_t*). Without elaborating, the Unicode
+ ** methods behave exactly the same as their ASCII counterparts, taking
+ ** \c unicode_t pointers in place of \c char pointers.
+ **
+ ** All strings in id3lib are handled internally as Unicode. This means that
+ ** when you set a field with an ASCII source type, it will be converted and
+ ** stored internally as a Unicode string. id3lib will handle all necessary
+ ** conversions when parsing, rendering, and retrieving. If you set a field as
+ ** an ASCII string, then try to read the string into a \c unicode_t buffer,
+ ** id3lib will automatically convert the string into Unicode so this will
+ ** function as expected. The same holds true in reverse. Of course, when
+ ** converting from Unicode to ASCII, you will experience problems when the
+ ** Unicode string contains characters that don't map to ISO-8859-1.
+ **
+ ** A binary field supports the Get(uchar*, size_t), Set(const uchar*, size_t),
+ ** FromFile(const char*), and ToFile(const char*) methods. The binary field
+ ** holds miscellaneous data that can't easily be described any other way, such
+ ** as a JPEG image.
+ **
+ ** As a general implementation note, you should be prepared to support all
+ ** fields in an id3lib frame, even if all fields in the id3lib version of the
+ ** frame aren't present in the id3v2 version. This is because of frames like
+ ** the picture frame, which changed slightly from one version of the id3v2
+ ** standard to the next (the IMAGEFORMAT format in 2.0 changed to a MIMETYPE
+ ** in 3.0). If you support all id3lib fields in a given frame, id3lib can
+ ** generate the correct id3v2 frame for the id3v2 version you wish to support.
+ ** Alternatively, just support the fields you know will be used in, say, 3.0
+ ** if you only plan to generate 3.0 tags.
+ **
+ ** @author Dirk Mahoney
+ ** @version $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
+ ** \sa ID3_Tag
+ ** \sa ID3_Frame
+ ** \sa ID3_Err
+ **/
+
+ID3_FieldImpl::ID3_FieldImpl()
+ : _id(ID3FN_NOFIELD),
+ _type(ID3FTY_INTEGER),
+ _spec_begin(ID3V2_EARLIEST),
+ _spec_end(ID3V2_LATEST),
+ _flags(0),
+ _changed(false),
+ _fixed_size(0),
+ _num_items(0),
+ _enc(ID3TE_NONE)
+{
+ this->Clear();
+}
+
+ID3_FieldImpl::ID3_FieldImpl(const ID3_FieldDef& def)
+ : _id(def._id),
+ _type(def._type),
+ _spec_begin(def._spec_begin),
+ _spec_end(def._spec_end),
+ _flags(def._flags),
+ _changed(false),
+ _fixed_size(def._fixed_size),
+ _num_items(0),
+ _enc((_type == ID3FTY_TEXTSTRING) ? ID3TE_ASCII : ID3TE_NONE)
+{
+ this->Clear();
+}
+
+ID3_FieldImpl::~ID3_FieldImpl()
+{
+}
+
+/** Clears any data and frees any memory associated with the field
+ **
+ ** \sa ID3_Tag::Clear()
+ ** \sa ID3_Frame::Clear()
+ **/
+void ID3_FieldImpl::Clear()
+{
+ switch (_type)
+ {
+ case ID3FTY_INTEGER:
+ {
+ _integer = 0;
+ break;
+ }
+ case ID3FTY_BINARY:
+ {
+ _binary.erase();
+ if (_fixed_size > 0)
+ {
+ _binary.assign(_fixed_size, '\0');
+ }
+ break;
+ }
+ case ID3FTY_TEXTSTRING:
+ {
+ _text.erase();
+ if (_fixed_size > 0)
+ {
+ if (ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()))
+ {
+ _text.assign(_fixed_size * 2, '\0');
+ }
+ else if (ID3TE_IS_SINGLE_BYTE_ENC(this->GetEncoding()))
+ {
+ _text.assign(_fixed_size, '\0');
+ }
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ _changed = true;
+
+ return ;
+}
+
+bool
+ID3_FieldImpl::HasChanged() const
+{
+ return _changed;
+}
+
+/** \fn size_t ID3_Field::Size() const
+ ** \brief Returns the size of a field.
+ **
+ ** The value returned is dependent on the type of the field. For ASCII
+ ** strings, this returns the number of characters in the field, not including
+ ** any NULL-terminator. The same holds true for Unicode---it returns the
+ ** number of characters in the field, not bytes, and this does not include
+ ** the Unicode BOM, which isn't put in a Unicode string obtained by the
+ ** Get(unicode_t*, size_t, size_t) method anyway. For binary and
+ ** integer fields, this returns the number of bytes in the field.
+ **
+ ** \code
+ ** size_t howBig = myFrame.GetField(ID3FN_DATA)->Size();
+ ** \endcode
+ **
+ ** \return The size of the field, either in bytes (for binary or integer
+ ** fields) or characters (for strings).
+ **/
+
+size_t ID3_FieldImpl::BinSize() const
+{
+ if (_fixed_size > 0)
+ {
+ return _fixed_size;
+ }
+ size_t size = this->Size();
+ if (_type == ID3FTY_TEXTSTRING)
+ {
+ ID3_TextEnc enc = this->GetEncoding();
+ if (ID3TE_IS_DOUBLE_BYTE_ENC(enc) && size > 0)
+ {
+ size++;
+ }
+ if (_flags & ID3FF_CSTR)
+ {
+ size++;
+ }
+ if (ID3TE_IS_DOUBLE_BYTE_ENC(enc))
+ {
+ size *= 2; // FIXME: I guess this is wrong
+ }
+ }
+ return size;
+}
+
+size_t ID3_FieldImpl::Size() const
+{
+ size_t size = 0;
+ // check to see if we are within the legal limit for this field 0 means
+ // arbitrary length field
+ if (_fixed_size > 0)
+ {
+ size = _fixed_size;
+ }
+ else if (_type == ID3FTY_INTEGER)
+ {
+ size = sizeof(uint32);
+ }
+ else if (_type == ID3FTY_TEXTSTRING)
+ {
+ size = _text.size();
+ }
+ else
+ {
+ size = _binary.size();
+ }
+
+ return size;
+}
+
+bool ID3_FieldImpl::Parse(ID3_Reader& reader)
+{
+ bool success = false;
+ switch (this->GetType())
+ {
+ case ID3FTY_INTEGER:
+ {
+ success = this->ParseInteger(reader);
+ break;
+ }
+
+ case ID3FTY_BINARY:
+ {
+ success = this->ParseBinary(reader);
+ break;
+ }
+
+ case ID3FTY_TEXTSTRING:
+ {
+ success = this->ParseText(reader);
+ break;
+ }
+
+ default:
+ {
+ ID3D_WARNING( "ID3_FieldImpl::Parse(): unknown field type" );
+ break;
+ }
+ }
+ return success;
+}
+
+ID3_FrameDef* ID3_FindFrameDef(ID3_FrameID id)
+{
+ ID3_FrameDef *info = NULL;
+
+ for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
+ {
+ if (ID3_FrameDefs[cur].eID == id)
+ {
+ info = &ID3_FrameDefs[cur];
+ break;
+ }
+ }
+
+ return info;
+}
+
+ID3_FrameID
+ID3_FindFrameID(const char *id)
+{
+ ID3_FrameID fid = ID3FID_NOFRAME;
+ const int slen = strlen(id);
+
+ for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
+ {
+ if (((strcmp(ID3_FrameDefs[cur].sShortTextID, id) == 0) &&
+ slen == 3) ||
+ ((strcmp(ID3_FrameDefs[cur].sLongTextID, id) == 0) &&
+ slen == 4))
+ {
+ fid = ID3_FrameDefs[cur].eID;
+ break;
+ }
+ }
+
+ return fid;
+}
+
+void ID3_FieldImpl::Render(ID3_Writer& writer) const
+{
+ switch (this->GetType())
+ {
+ case ID3FTY_INTEGER:
+ {
+ RenderInteger(writer);
+ break;
+ }
+
+ case ID3FTY_BINARY:
+ {
+ RenderBinary(writer);
+ break;
+ }
+
+ case ID3FTY_TEXTSTRING:
+ {
+ RenderText(writer);
+ break;
+ }
+
+ default:
+ {
+ ID3D_WARNING ( "ID3D_FieldImpl::Render(): unknown field type" );
+ break;
+ }
+ }
+}
+
+
+/** Copies the content of one field to another.
+ * WOW, this is another strange conditional function.
+ * It copies the content BUT only if the types match from the start.
+ * Strange (Ralf)
+ */
+ID3_Field &
+ID3_FieldImpl::operator=( const ID3_Field &rhs )
+{
+ const ID3_FieldImpl* fld = (const ID3_FieldImpl*) &rhs;
+ if (this != &rhs && this->GetType() == fld->GetType())
+ {
+ switch (fld->GetType())
+ {
+ case ID3FTY_INTEGER:
+ {
+ this->SetInteger(fld->GetInteger());
+ break;
+ }
+ case ID3FTY_TEXTSTRING:
+ {
+ this->SetEncoding(fld->GetEncoding());
+ this->SetText(fld->GetText());
+ break;
+ }
+ case ID3FTY_BINARY:
+ {
+ this->SetBinary(fld->GetBinary());
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ return *this;
+}
+
+
+/** Sets the encoding of the underlaying text.
+ * Please note that the id3-spec does not allow size-limited texts with encodings other than ASCII.
+ * Also note that you should set the matching encoding field or because write operations are made
+ * with the TEXT_ENC field value.
+ */
+bool ID3_FieldImpl::SetEncoding(ID3_TextEnc enc)
+{
+ bool changed = this->IsEncodable() && (enc != this->GetEncoding()) &&
+ (ID3TE_NONE < enc && enc < ID3TE_NUMENCODINGS);
+ if (changed)
+ {
+ _text = convert(_text, _enc, enc);
+ _enc = enc;
+ _changed = true;
+ }
+ return changed;
+}
+
+/** \class ID3_FrameInfo field.h id3/field.h
+ ** \brief Provides information about the frame and field types supported by id3lib
+ **
+ ** You normally only need (at most) one instance of the ID3_FrameInfo. It
+ ** has no member data -- only methods which provide information about the
+ ** frame types (and their component fields) supported by id3lib as defined
+ ** in field.cpp .
+ **
+ ** Usage is straightforward. The following function uses ID3_FrameInfo
+ ** to display a summary of all the frames known to id3lib:
+ ** \code
+ **
+ ** void ShowKnownFrameInfo {
+ ** ID3_FrameInfo myFrameInfo;
+ ** for (int cur = ID3FID_NOFRAME+1; cur <= myFrameInfo.MaxFrameID(); cur ++)
+ ** {
+ ** cout << "Short ID: " << myFrameInfo.ShortName(ID3_FrameID(cur)) <<
+ ** " Long ID: " << myFrameInfo.LongName(ID3_FrameID(cur)) <<
+ ** " Desription: " << myFrameInfo.Description(ID3_FrameID(cur)) << endl;
+ ** }
+ ** }
+ ** \endcode
+ **
+ ** Functions are also provided to glean more information about the individual
+ ** fields which make up any given frame type. The following for() loop,
+ ** embedded into the previous for() loop would provide a raw look at such
+ ** information. Realize, of course, that the field type is meaningless
+ ** when printed. Only when it is taken in the context of the ID3_FieldType enum
+ ** does it take on any meaningful significance.
+ **
+ ** \code
+ ** for (int cur = ID3FID_NOFRAME+1; cur <= fi.MaxFrameID(); cur ++)
+ ** {
+ ** int numfields = fi.NumFields(ID3_FrameID(cur));
+ **
+ ** cout << "ID: " << fi.LongName(ID3_FrameID(cur)) <<
+ ** " FIELDS: " << numfields << endl;
+ ** for(int i=0;i<numfields;i++) {
+ ** cout << "TYPE: " << fi.FieldType(ID3_FrameID(cur),i) <<
+ ** " SIZE: " << fi.FieldSize(ID3_FrameID(cur),i) <<
+ ** " FLAGS: " << fi.FieldFlags(ID3_FrameID(cur),i) << endl;
+ **
+ ** }
+ **
+ ** cout << endl;
+ **
+ ** }
+ ** \endcode
+ **
+ ** @author Cedric Tefft
+ ** @version $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
+ **/
+
+
+char *ID3_FrameInfo::ShortName(ID3_FrameID frameID)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return pFD->sShortTextID;
+ else
+ return NULL;
+}
+
+char *ID3_FrameInfo::LongName(ID3_FrameID frameID)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return pFD->sLongTextID;
+ else
+ return NULL;
+}
+
+const char *ID3_FrameInfo::Description(ID3_FrameID frameID)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return pFD->sDescription;
+ else
+ return NULL;
+}
+
+int ID3_FrameInfo::MaxFrameID()
+{
+ return ID3FID_LASTFRAMEID-1;
+}
+
+int ID3_FrameInfo::NumFields(ID3_FrameID frameID)
+{
+ int fieldnum=0;
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ {
+ while (pFD->aeFieldDefs[fieldnum]._id != ID3FN_NOFIELD)
+ {
+ ++fieldnum;
+ }
+ }
+ return fieldnum;
+}
+
+ID3_FieldType ID3_FrameInfo::FieldType(ID3_FrameID frameID, int fieldnum)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return (pFD->aeFieldDefs[fieldnum]._type);
+ else
+ return ID3FTY_NONE;
+}
+
+size_t ID3_FrameInfo::FieldSize(ID3_FrameID frameID, int fieldnum)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return (pFD->aeFieldDefs[fieldnum]._fixed_size);
+ else
+ return 0;
+}
+
+flags_t ID3_FrameInfo::FieldFlags(ID3_FrameID frameID, int fieldnum)
+{
+ ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
+ if (pFD!=NULL)
+ return (pFD->aeFieldDefs[fieldnum]._flags);
+ else
+ return 0;
+}
+
diff --git a/src/field_binary.cpp b/src/field_binary.cpp
new file mode 100644
index 0000000..b386965
--- /dev/null
+++ b/src/field_binary.cpp
@@ -0,0 +1,217 @@
+// $Id: field_binary.cpp,v 1.27 2003/03/02 14:23:59 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include <stdio.h>
+//#include <string.h>
+#include <memory.h>
+
+#include "field_impl.h"
+#include "reader.h"
+#include "writer.h"
+#include "io_helpers.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+
+using namespace dami;
+
+size_t ID3_FieldImpl::Set(const uchar* data, size_t len)
+{
+ size_t size = 0;
+ if ((this->GetType() == ID3FTY_BINARY) && data && len)
+ {
+ BString str(data, len);
+ size = dami::min(len, this->SetBinary(str));
+ }
+ return size;
+}
+
+/** Copies the supplied unicode string to the field.
+ **
+ ** Again, like the string types, the binary Set() function copies the data
+ ** so you may dispose of the source data after a call to this method.
+ **/
+size_t ID3_FieldImpl::SetBinary(BString data) //< data to assign to this field.
+{
+ size_t size = 0;
+ if (this->GetType() == ID3FTY_BINARY)
+ {
+ this->Clear();
+ size_t fixed = _fixed_size;
+ size = data.size();
+ if (fixed == 0)
+ {
+ _binary = data;
+ }
+ else
+ {
+ _binary.assign(data, 0, dami::min(size, fixed));
+ if (size < fixed)
+ {
+ _binary.append(fixed - size, '\0');
+ }
+ }
+ size = _binary.size();
+ _changed = true;
+ }
+ return size;
+}
+
+BString ID3_FieldImpl::GetBinary() const
+{
+ BString data;
+ if (this->GetType() == ID3FTY_BINARY)
+ {
+ data = _binary;
+ }
+ return data;
+}
+
+
+const uchar* ID3_FieldImpl::GetRawBinary() const
+{
+ const uchar* data = NULL;
+ if (this->GetType() == ID3FTY_BINARY)
+ {
+ data = _binary.data();
+ }
+ return data;
+}
+
+size_t ID3_FieldImpl::GetBinaryStartPosition()
+{
+ if (this->GetType() != ID3FTY_BINARY)
+ {
+ return 0;
+ }
+ return _start_position;
+}
+
+
+/** Copies the field's internal string to the buffer.
+ **
+ ** It copies the data in the field into the buffer, for as many bytes as the
+ ** field contains, or the size of buffer, whichever is smaller.
+ **
+ ** \code
+ ** uchar buffer[1024];
+ ** myFrame.GetField(ID3FN_DATA)->Get(buffer, sizeof(buffer));
+ ** \endcode
+ **/
+size_t ID3_FieldImpl::Get(uchar *buffer, //< Destination of retrieved string
+ size_t max_bytes //< Max number of bytes to copy
+ ) const
+{
+ size_t bytes = 0;
+ if (this->GetType() == ID3FTY_BINARY)
+ {
+ bytes = dami::min(max_bytes, this->Size());
+ if (NULL != buffer && bytes > 0)
+ {
+ ::memcpy(buffer, _binary.data(), bytes);
+ }
+ }
+ return bytes;
+}
+
+
+/** Copies binary data from the file specified to the field.
+ **
+ ** \code
+ ** myFrame.GetField(ID3FN_DATA)->FromFile("mypic.jpg");
+ ** \endcode
+ **/
+void ID3_FieldImpl::FromFile(const char *info //< Source filename
+ )
+{
+ if (this->GetType() != ID3FTY_BINARY || NULL == info)
+ {
+ return;
+ }
+
+ FILE* temp_file = ::fopen(info, "rb");
+ if (temp_file != NULL)
+ {
+ ::fseek(temp_file, 0, SEEK_END);
+ size_t fileSize = ::ftell(temp_file);
+ ::fseek(temp_file, 0, SEEK_SET);
+
+ uchar* buffer = new uchar[fileSize];
+ if (buffer != NULL)
+ {
+ ::fread(buffer, 1, fileSize, temp_file);
+
+ this->Set(buffer, fileSize);
+
+ delete [] buffer;
+ }
+
+ ::fclose(temp_file);
+ }
+}
+
+
+/** Copies binary data from the field to the specified file.
+ **
+ ** \code
+ ** myFrame.GetField(ID3FN_DATA)->ToFile("output.bin");
+ ** \endcode
+ **/
+void ID3_FieldImpl::ToFile(const char *info //< Destination filename
+ ) const
+{
+ if (this->GetType() != ID3FTY_BINARY || NULL == info)
+ {
+ return;
+ }
+
+ size_t size = this->Size();
+ if (size > 0)
+ {
+ FILE* temp_file = ::fopen(info, "wb");
+ if (temp_file != NULL)
+ {
+ ::fwrite(_binary.data(), 1, size, temp_file);
+ ::fclose(temp_file);
+ }
+ }
+
+ return ;
+}
+
+
+bool ID3_FieldImpl::ParseBinary(ID3_Reader& reader)
+{
+ // copy the remaining bytes, unless we're fixed length, in which case copy
+ // the minimum of the remaining bytes vs. the fixed length
+ _start_position = reader.getCur();
+ _binary = io::readAllBinary(reader);
+ return true;
+}
+
+void ID3_FieldImpl::RenderBinary(ID3_Writer& writer) const
+{
+ writer.writeChars(this->GetRawBinary(), this->Size());
+}
+
diff --git a/src/field_def.h b/src/field_def.h
new file mode 100644
index 0000000..3da9040
--- /dev/null
+++ b/src/field_def.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+// $Id: field_def.h,v 1.2 2002/07/02 22:12:07 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FIELD_DEF_H_
+#define _ID3LIB_FIELD_DEF_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+struct ID3_FieldDef
+{
+ ID3_FieldID _id;
+ ID3_FieldType _type;
+ size_t _fixed_size;
+ ID3_V2Spec _spec_begin;
+ ID3_V2Spec _spec_end;
+ flags_t _flags;
+ ID3_FieldID _linked_field;
+ static const ID3_FieldDef* DEFAULT;
+};
+
+#endif
+
diff --git a/src/field_impl.h b/src/field_impl.h
new file mode 100644
index 0000000..2163ce6
--- /dev/null
+++ b/src/field_impl.h
@@ -0,0 +1,154 @@
+// -*- C++ -*-
+// $Id: field_impl.h,v 1.4 2002/06/29 14:43:00 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FIELD_IMPL_H_
+#define _ID3LIB_FIELD_IMPL_H_
+
+#include <stdlib.h>
+#include "field.h"
+#include "id3/id3lib_strings.h"
+
+struct ID3_FieldDef;
+struct ID3_FrameDef;
+class ID3_Frame;
+class ID3_Reader;
+
+class ID3_FieldImpl : public ID3_Field
+{
+ friend class ID3_FrameImpl;
+public:
+ ~ID3_FieldImpl();
+
+ void Clear();
+
+ size_t Size() const;
+ size_t BinSize() const;
+ size_t GetNumTextItems() const;
+
+ // integer field functions
+ ID3_Field& operator= (uint32 val) { this->Set(val); return *this; }
+ void Set(uint32); // we have SetInteger functions. Why do we try to overload Set?
+ uint32 Get() const; // same for GetInteger
+
+ // text field functions
+ dami::String GetText( size_t index = 0, ID3_TextEnc enc = ID3TE_ISO8859_1 ) const;
+ size_t SetText( dami::String data, size_t index = 0, ID3_TextEnc enc = ID3TE_ISO8859_1 );
+
+ // ASCII string field functions
+ ID3_Field& operator= (const char* s) { this->Set(s); return *this; }
+ size_t Set(const char* data);
+ size_t Get(char*, size_t) const;
+ size_t Get(char*, size_t, size_t) const;
+ const char* GetRawText() const;
+ const char* GetRawTextItem(size_t) const;
+ size_t Add(const char* data);
+
+ // Unicode string field functions
+ ID3_Field& operator= (const unicode_t* s) { this->Set(s); return *this; }
+ size_t Set(const unicode_t*);
+ size_t Get(unicode_t *buffer, size_t) const;
+ size_t Get(unicode_t *buffer, size_t, size_t) const;
+ const unicode_t* GetRawUnicodeText() const;
+ const unicode_t* GetRawUnicodeTextItem(size_t) const;
+ size_t Add(const unicode_t*);
+
+ // binary field functions
+ size_t Set(const uchar* buf, size_t size);
+ size_t Set(const char* buf, size_t size)
+ {
+ return this->Set(reinterpret_cast<const uchar *>(buf), size);
+ }
+ size_t Get(uchar*, size_t) const;
+ const uchar* GetRawBinary() const;
+ void FromFile(const char*);
+ void ToFile(const char *sInfo) const;
+ size_t GetBinaryStartPosition();
+
+ // miscelaneous functions
+ ID3_Field& operator=( const ID3_Field & );
+ bool InScope(ID3_V2Spec spec) const
+ { return _spec_begin <= spec && spec <= _spec_end; }
+
+ ID3_FieldID GetID() const { return _id; }
+ ID3_FieldType GetType() const { return _type; }
+ bool SetEncoding(ID3_TextEnc enc);
+ ID3_TextEnc GetEncoding() const { return _enc; }
+ bool IsEncodable() const { return (_flags & ID3FF_ENCODABLE) > 0; }
+
+
+ void Render(ID3_Writer&) const;
+ bool Parse(ID3_Reader&);
+ bool HasChanged() const;
+
+private:
+ size_t GetRawTextItemLen( size_t index =0 ) const;
+
+private:
+ // To prevent public instantiation, the constructor is made private
+ ID3_FieldImpl();
+ ID3_FieldImpl(const ID3_FieldDef&);
+
+ const ID3_FieldID _id; // the ID of this field
+ const ID3_FieldType _type; // what type is this field or should be
+ const ID3_V2Spec _spec_begin; // spec end
+ const ID3_V2Spec _spec_end; // spec begin
+ const flags_t _flags; // special field flags
+ mutable bool _changed; // field changed since last parse/render?
+
+ dami::BString _binary; // for binary strings
+ dami::String _text; // for all strings
+ uint32 _integer; // for numbers
+
+ const size_t _fixed_size; // for fixed length fields (0 if not)
+ size_t _num_items; // the number of items in the text string
+ ID3_TextEnc _enc; // encoding for text fields
+
+ uint32 _start_position;
+protected:
+ void SetInteger(uint32);
+ uint32 GetInteger() const;
+
+ size_t SetBinary(dami::BString);
+ dami::BString GetBinary() const;
+
+ void RenderInteger(ID3_Writer&) const;
+ void RenderText(ID3_Writer&) const;
+ void RenderBinary(ID3_Writer&) const;
+
+ bool ParseInteger(ID3_Reader&);
+ bool ParseText(ID3_Reader&);
+ bool ParseBinary(ID3_Reader&);
+
+};
+
+
+// Ack! Not for public use
+ID3_FrameDef *ID3_FindFrameDef(ID3_FrameID id);
+ID3_FrameID ID3_FindFrameID(const char *id);
+
+#endif /* _ID3LIB_FIELD_H_ */
+
diff --git a/src/field_integer.cpp b/src/field_integer.cpp
new file mode 100644
index 0000000..ef6e943
--- /dev/null
+++ b/src/field_integer.cpp
@@ -0,0 +1,109 @@
+// $Id: field_integer.cpp,v 1.21 2002/07/02 22:12:13 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "field_impl.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "io_helpers.h"
+
+using namespace dami;
+
+/** \fn ID3_Field& ID3_Field::operator=(uint32 val)
+ ** \brief A shortcut for the Set method.
+ **
+ ** \code
+ ** myFrame.GetField(ID3FN_PICTURETYPE)->= 0x0B;
+ ** \endcode
+ **
+ ** \param val The data to assign to this field
+ ** \sa Set(uint32)
+ **/
+
+/** \brief Sets the value of the field to the specified integer.
+ ** \param data The data to assign to this field
+ **/
+void ID3_FieldImpl::Set(uint32 val)
+{
+ this->SetInteger(val);
+}
+
+void ID3_FieldImpl::SetInteger(uint32 val)
+{
+ if (this->GetType() == ID3FTY_INTEGER)
+ {
+ this->Clear();
+
+ _integer = val;
+ _changed = true;
+ }
+}
+
+/** \fn uint32 ID3_Field::Get() const
+ ** \brief Returns the value of the integer field.
+ **
+ ** \code
+ ** uint32 picType = myFrame.GetField(ID3FN_PICTURETYPE)->Get();
+ ** \endcode
+ **
+ ** \return The value of the integer field
+ **/
+uint32 ID3_FieldImpl::Get() const
+{
+ return this->GetInteger();
+}
+
+uint32 ID3_FieldImpl::GetInteger() const
+{
+ uint32 val = 0;
+ if (this->GetType() == ID3FTY_INTEGER)
+ {
+ val = _integer;
+ }
+ return val;
+}
+
+bool ID3_FieldImpl::ParseInteger(ID3_Reader& reader)
+{
+ ID3D_NOTICE( "ID3_FieldImpl::ParseInteger(): beg = " << reader.getBeg() );
+ ID3D_NOTICE( "ID3_FieldImpl::ParseInteger(): cur = " << reader.getCur() );
+ ID3D_NOTICE( "ID3_FieldImpl::ParseInteger(): end = " << reader.getEnd() );
+ bool success = false;
+ if (!reader.atEnd())
+ {
+ this->Clear();
+ size_t fixed = this->Size();
+ size_t nBytes = (fixed > 0) ? fixed : sizeof(uint32);
+ this->Set(io::readBENumber(reader, nBytes));
+ _changed = false;
+ success = true;
+ }
+ return success;
+}
+
+void ID3_FieldImpl::RenderInteger(ID3_Writer& writer) const
+{
+ io::writeBENumber(writer, _integer, this->Size());
+}
+
diff --git a/src/field_string_ascii.cpp b/src/field_string_ascii.cpp
new file mode 100644
index 0000000..485fb21
--- /dev/null
+++ b/src/field_string_ascii.cpp
@@ -0,0 +1,287 @@
+// $Id: field_string_ascii.cpp,v 1.29 2003/03/02 14:23:58 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "field_impl.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "io_helpers.h"
+
+using namespace dami;
+
+/** \fn ID3_Field& ID3_Field::operator=(const char* data)
+ ** \brief Shortcut for the Set operator.
+ ** \param data The string to assign to this field
+ ** \sa Set(const char*)
+ **/
+
+/** \brief Copies the supplied string to the field.
+ ** You may dispose of the source string after a call to this method.
+ ** \code
+ ** myFrame.GetField(ID3FN_TEXT)->Set("ID3Lib is very cool!");
+ ** \endcode
+ **/
+size_t ID3_FieldImpl::Set(const char* data)
+{
+ size_t len = 0;
+ if ((GetType() == ID3FTY_TEXTSTRING) && data)
+ {
+ String str(data);
+ Clear();
+ SetText( String(data), 0, ID3TE_ISO8859_1 );
+ }
+ return len;
+}
+
+
+size_t ID3_FieldImpl::Add(const char* data)
+{
+ return SetText( String(data), GetNumTextItems(), ID3TE_ISO8859_1 );
+}
+
+// the ::Get() function for ASCII
+
+/** Copies the contents of the field into the supplied buffer, up to the
+ ** number of characters specified; for fields with multiple entries, the
+ ** optional third parameter indicates which of the fields to retrieve.
+ **
+ ** The third parameter is useful when using text lists (see Add(const char*)
+ ** for more details). The default value for this third parameter is 1,
+ ** (Note, I think this is wrong. the first item has the number 0 (Ralf))
+ ** which returns the entire string if the field contains only one item.
+ **
+ ** It returns the number of characters (not bytes necessarily, and not
+ ** including any NULL terminator) of the supplied buffer that are now used.
+ **
+ ** \code
+ ** char myBuffer[1024];
+ ** size_t charsUsed = myFrame.GetField(ID3FN_TEXT)->Get(buffer, 1024);
+ ** \endcode
+ **
+ ** It fills the buffer with as much data from the field as is present in the
+ ** field, or as large as the buffer, whichever is smaller.
+ **
+ ** \code
+ ** char myBuffer[1024];
+ ** size_t charsUsed = myFrame.GetField(ID3FN_TEXT)->Get(buffer, 1024, 3);
+ ** \endcode
+ **
+ ** This fills the buffer with up to the first 1024 characters from the third
+ ** element of the text list.
+ **
+ ** \sa Add(const char*)
+ **/
+size_t ID3_FieldImpl::Get(char* buffer, size_t maxLength) const
+{
+ return Get( buffer, maxLength, 0 );
+}
+
+size_t ID3_FieldImpl::Get(char* buf, size_t maxLen, size_t index) const
+{
+ size_t length = 0;
+ if ( ID3TE_IS_SINGLE_BYTE_ENC(this->GetEncoding()) &&
+ buf != NULL &&
+ maxLen > 0 )
+ {
+ const char* text = GetRawTextItem(index);
+ if( text ) {
+ size_t itemLen = GetRawTextItemLen(index);
+ length = dami::min(maxLen, itemLen);
+ ::memcpy(buf, text, length);
+ if (length < maxLen)
+ buf[length] = '\0';
+ }
+ }
+ return length;
+}
+
+
+const char* ID3_FieldImpl::GetRawText() const
+{
+ return GetRawTextItem(0);
+}
+
+/** Get a text item by number.
+ * \return null if not a text string or index is to big.
+ */
+const char* ID3_FieldImpl::GetRawTextItem(size_t index) const
+{
+ if( GetType() != ID3FTY_TEXTSTRING ||
+ (index>0 && index >= GetNumTextItems()) ) // we have at least one text item
+ return NULL;
+
+ const char* text = _text.c_str();
+ for ( size_t i = 0; i < index; ++i ) {
+
+ // find next text start
+ if( ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()) )
+ text += (ucslen((const unicode_t*)text) + 1)*2;
+ else
+ text += strlen(text) + 1;
+ }
+ return text;
+}
+
+/** Get the length of a item by number
+ * \return the number of bytes or 0 if the index is to big.
+ */
+size_t ID3_FieldImpl::GetRawTextItemLen( size_t index ) const
+{
+ if( GetType() != ID3FTY_TEXTSTRING ||
+ index >= GetNumTextItems() )
+ return 0;
+
+ if( GetNumTextItems() == 1 )
+ return _text.size();
+
+ const char* text = GetRawTextItem( index );
+ if( !text )
+ return 0;
+
+ // the last item has no termination
+ if( index == GetNumTextItems()-1 )
+ return _text.size() - (text-_text.c_str() );
+
+ if( ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()) )
+ return ucslen((const unicode_t*)text)*2;
+ else
+ return strlen(text);
+}
+
+namespace
+{
+ String readEncodedText(ID3_Reader& reader, size_t len, ID3_TextEnc enc)
+ {
+ if (ID3TE_IS_SINGLE_BYTE_ENC(enc))
+ {
+ return io::readText(reader, len);
+ }
+ return io::readUnicodeText(reader, len);
+ }
+
+ String readEncodedString(ID3_Reader& reader, ID3_TextEnc enc)
+ {
+ if (ID3TE_IS_SINGLE_BYTE_ENC(enc))
+ {
+ return io::readString(reader);
+ }
+ return io::readUnicodeString(reader);
+ }
+
+ size_t writeEncodedText(ID3_Writer& writer, String data, ID3_TextEnc enc)
+ {
+ if (ID3TE_IS_SINGLE_BYTE_ENC(enc))
+ {
+ return io::writeText(writer, data);
+ }
+ return io::writeUnicodeText(writer, data, enc == ID3TE_UTF16);
+ }
+
+ size_t writeEncodedString(ID3_Writer& writer, String data, ID3_TextEnc enc)
+ {
+ if (ID3TE_IS_SINGLE_BYTE_ENC(enc))
+ {
+ return io::writeString(writer, data);
+ }
+ return io::writeUnicodeString(writer, data, enc == ID3TE_UTF16);
+ }
+}
+
+bool ID3_FieldImpl::ParseText(ID3_Reader& reader)
+{
+ ID3D_NOTICE( "ID3_Field::ParseText(): reader.getBeg() = " << reader.getBeg() );
+ ID3D_NOTICE( "ID3_Field::ParseText(): reader.getCur() = " << reader.getCur() );
+ ID3D_NOTICE( "ID3_Field::ParseText(): reader.getEnd() = " << reader.getEnd() );
+ this->Clear();
+
+ ID3_TextEnc enc = this->GetEncoding();
+ size_t fixed_size = this->Size();
+ if (fixed_size)
+ {
+ ID3D_NOTICE( "ID3_Field::ParseText(): fixed size string" );
+ // The string is of fixed length
+ String text = readEncodedText(reader, fixed_size, enc);
+ SetText(text, 0, enc);
+ ID3D_NOTICE( "ID3_Field::ParseText(): fixed size string = " << text );
+ }
+ else if (_flags & ID3FF_LIST)
+ {
+ ID3D_NOTICE( "ID3_Field::ParseText(): text list" );
+ // lists are always the last field in a frame. parse all remaining
+ // characters in the reader
+ while (!reader.atEnd())
+ {
+ String text = readEncodedString(reader, enc);
+ SetText(text, GetNumTextItems(), enc);
+ ID3D_NOTICE( "ID3_Field::ParseText(): adding string = " << text );
+ }
+ }
+ else if (_flags & ID3FF_CSTR)
+ {
+ ID3D_NOTICE( "ID3_Field::ParseText(): null terminated string" );
+ String text = readEncodedString(reader, enc);
+ SetText(text, 0, enc);
+ ID3D_NOTICE( "ID3_Field::ParseText(): null terminated string = " << text );
+ }
+ else
+ {
+ ID3D_NOTICE( "ID3_Field::ParseText(): last field string" );
+ String text = readEncodedText(reader, reader.remainingBytes(), enc);
+ // not null terminated.
+ SetText(text, GetNumTextItems(), enc);
+ ID3D_NOTICE( "ID3_Field::ParseText(): last field string = " << text );
+ }
+
+ _changed = false;
+ return true;
+}
+
+void ID3_FieldImpl::RenderText(ID3_Writer& writer) const
+{
+ ID3_TextEnc enc = this->GetEncoding();
+
+ if (_flags & ID3FF_CSTR)
+ {
+ writeEncodedString(writer, _text, enc);
+ }
+ else
+ {
+ writeEncodedText(writer, _text, enc);
+ }
+ _changed = false;
+};
+
+/** Returns the number of items in a text list.
+ **
+ ** \code
+ ** size_t numItems = myFrame.GetField(ID3FN_UNICODE)->GetNumItems();
+ ** \endcode
+ **
+ ** \return The number of items in a text list.
+ **/
+size_t ID3_FieldImpl::GetNumTextItems() const
+{
+ return _num_items;
+}
+
diff --git a/src/field_string_unicode.cpp b/src/field_string_unicode.cpp
new file mode 100644
index 0000000..3e28313
--- /dev/null
+++ b/src/field_string_unicode.cpp
@@ -0,0 +1,253 @@
+// $Id: field_string_unicode.cpp,v 1.33 2003/03/02 14:23:58 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "field_impl.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "io_helpers.h"
+
+using namespace dami;
+
+/** \fn ID3_Field& ID3_Field::operator=(const unicode_t*)
+ ** \brief Shortcut for the Set operator.
+ ** Performs similarly as operator=(const char*), taking a unicode_t
+ ** string as a parameter rather than an ascii string.
+ ** \sa Set(const unicode_t*)
+ ** \param string The string to assign to the field
+ **/
+
+/** \brief Copies the supplied unicode string to the field.
+ **
+ ** Performs similarly as the ASCII Set() method, taking a unicode_t string
+ ** as a parameter rather than an ascii string.
+ **
+ ** \param string The unicode string to set this field to.
+ ** \sa Add(const unicode_t*)
+ **/
+size_t ID3_FieldImpl::Set(const unicode_t* data)
+{
+ if (GetType() == ID3FTY_TEXTSTRING &&
+ ID3TE_IS_DOUBLE_BYTE_ENC(GetEncoding()) &&
+ data)
+ {
+ String str((const char*) data, ucslen(data) * 2);
+ Clear();
+ return SetText( str, 0, GetEncoding() );
+ }
+ else
+ return 0;
+}
+
+size_t ID3_FieldImpl::Add(const unicode_t* data)
+{
+ if (GetType() == ID3FTY_TEXTSTRING &&
+ ID3TE_IS_DOUBLE_BYTE_ENC(GetEncoding()) &&
+ data)
+ {
+ String str((const char*) data, ucslen(data) * 2);
+ return SetText( str, GetNumTextItems(), GetEncoding() );
+ }
+ else
+ return 0;
+}
+
+
+
+const unicode_t* ID3_FieldImpl::GetRawUnicodeText() const
+{
+ return (unicode_t *)GetRawTextItem(0);
+}
+
+
+const unicode_t* ID3_FieldImpl::GetRawUnicodeTextItem(size_t index) const
+{
+ const unicode_t* text = NULL;
+ if (GetType() == ID3FTY_TEXTSTRING &&
+ GetEncoding() == ID3TE_UNICODE &&
+ index < this->GetNumTextItems())
+ {
+ String unicode = _text + '\0' + '\0';
+ text = (unicode_t *) unicode.data();
+ for (size_t i = 0; i < index; ++i)
+ {
+ text += ucslen(text) + 1;
+ }
+ }
+ return text;
+}
+
+
+/** Returns the text of this field (if it really is a textfield) in the
+ ** requested encoding.
+ **
+ **
+ ** \return The text of this field converted to the requested encoding.
+ ** If the field is not a textfield or the text cannot be converted
+ ** the function returns a nullpointer.
+ ** Warning: in case of a unicode text the string, c_str is only terminated with one null char.
+ ** use string.size.
+ **
+ ** \param enc The requested encoding.
+ **
+ ** TODO: a return value of an empty string can mean different things, e.g. emtpy string, no such item, unable to convert, ...
+ **/
+String ID3_FieldImpl::GetText( size_t index, ID3_TextEnc enc ) const
+{
+ const char* text = GetRawTextItem(index);
+ if( !text )
+ return String("");
+
+ size_t len = GetRawTextItemLen(index);
+
+ String sText( text, len );
+ return convert( sText, GetEncoding(), enc );
+}
+
+
+/** Set the text of this field (if it really is a textfield)
+ **
+ ** \param data The new text to be set. Note that unicode strings should just be put into the (char) string.
+ ** \param enc The source encoding.
+ ** \return The number of bytes set to the text
+ **
+ **/
+size_t ID3_FieldImpl::SetText( String data, size_t index, ID3_TextEnc enc )
+{
+ if( GetType() != ID3FTY_TEXTSTRING )
+ return 0;
+
+ if( index > _num_items )
+ return 0;
+
+ // there are no fields with fixed size and multiple fields or fancy encoding.
+ if( _fixed_size != 0 &&
+ (index>0 || GetEncoding()!=ID3TE_ISO8859_1) )
+ return 0;
+
+ String str = convert( data, enc, GetEncoding() );
+
+ // fixed size (always first item, always ISO8859_1)
+ if( _fixed_size != 0 ) {
+ _text = String(str, 0, _fixed_size);
+ if( str.size()<_fixed_size )
+ _text.append( _fixed_size - str.size(), '\0' );
+
+ // no fixed size
+ } else {
+
+ // printf("Debug: SetText0: numItems: %d, index: %d %d, %s\n", _num_items, index, _text.size(), _text.c_str() );
+ String newText;
+
+ // add old items in front
+ for( size_t i=0; i<index; i++ ) {
+ if( i>0 ) {
+ newText += '\0';
+ if ( ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()) )
+ newText += '\0';
+ }
+ newText.append( GetRawTextItem(i) );
+ }
+
+ // printf("Debug: SetText1: %d, %s\n", newText.size(), newText.c_str() );
+ // add new item
+ if( index>0 ) {
+ newText += '\0';
+ if ( ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()) )
+ newText += '\0';
+ }
+ newText.append( str );
+ // printf("Debug: SetText2: %d, %s\n", newText.size(), newText.c_str() );
+
+ // add old items in back (if any)
+ for( size_t i=index+1; i<_num_items; i++ ) {
+ if( i>0 ) {
+ newText += '\0';
+ if ( ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()) )
+ newText += '\0';
+ }
+ newText.append( GetRawTextItem(i) );
+ }
+
+ _text = newText;
+ }
+
+ _changed = true;
+ if( index >= _num_items )
+ _num_items++;
+
+ // printf("Debug: SetText end: items: %d\n", _num_items );
+
+ return GetRawTextItemLen( index );
+}
+
+size_t ID3_FieldImpl::Get(unicode_t* buffer, size_t maxLength) const
+{
+ return Get( buffer, maxLength, 0 );
+}
+
+/** Copies the contents of the field into the supplied buffer, up to the
+ ** number of characters specified; for fields with multiple entries, the
+ ** optional third parameter indicates which of the fields to retrieve.
+ **
+ ** Performs similarly as the ASCII Get(char *, size_t, size_t) method, taking
+ ** a unicode_t string as a parameter rather than an ascii string. The
+ ** maxChars parameter still represents the maximum number of characters, not
+ ** bytes.
+ **
+ ** \code
+ ** unicode_t myBuffer[1024];
+ ** size_t charsUsed = myFrame.GetField(ID3FN_UNICODE)->Get(buffer, 1024);
+ ** \endcode
+ **
+ ** \param buffer Where the field's data is copied to
+ ** \param maxChars The maximum number of characters to copy to the buffer.
+ ** \param itemNum For fields with multiple items (such as the involved
+ ** people frame, the item number to retrieve.
+ ** \sa Get(char *, size_t, size_t)
+ **/
+size_t ID3_FieldImpl::Get(unicode_t *buffer, size_t maxLength, size_t index) const
+{
+ size_t length = 0;
+
+ if ( ID3TE_IS_DOUBLE_BYTE_ENC(GetEncoding()) &&
+ buffer != NULL &&
+ maxLength > 0 )
+ {
+ const unicode_t* text = (unicode_t*)GetRawTextItem(index);
+ if( text )
+ {
+ size_t itemLen = GetRawTextItemLen(index)/2;
+ length = dami::min(maxLength, itemLen);
+
+ ::memcpy(buffer, text, length * 2);
+ if (length < maxLength)
+ buffer[length] = NULL_UNICODE;
+ }
+ }
+
+ return length;
+}
+
+
diff --git a/src/flags.h b/src/flags.h
new file mode 100644
index 0000000..b2c16af
--- /dev/null
+++ b/src/flags.h
@@ -0,0 +1,56 @@
+// -*- C++ -*-
+// $Id: flags.h,v 1.1 2000/10/24 16:22:47 eldamitri Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FLAGS_H_
+#define _ID3LIB_FLAGS_H_
+
+#include "flags.h"
+
+class ID3_Flags
+{
+public:
+ typedef flags_t TYPE;
+
+ ID3_Flags() : _f(0) { ; }
+ virtual ~ID3_Flags() { ; }
+
+ TYPE get() const { return _f; }
+ bool test(TYPE f) const { return (this->get() & f) == f; }
+ bool set(TYPE f) { bool r = (_f != f); _f = f; return r; }
+ bool add(TYPE f) { return this->set(this->get() | f); }
+ bool remove(TYPE f) { return this->set(this->get() & ~f); }
+ bool clear() { return this->set(0); }
+ bool set(TYPE f, bool b){ if (b) return this->add(f); return this->remove(f); }
+
+ ID3_Flags& operator=(const ID3_Flags& f)
+ { if (this != &f) { this->set(f.get()); } return *this; }
+
+private:
+ TYPE _f;
+};
+
+#endif /* _ID3LIB_FLAGS_H_ */
diff --git a/src/frame.cpp b/src/frame.cpp
new file mode 100644
index 0000000..d28ef30
--- /dev/null
+++ b/src/frame.cpp
@@ -0,0 +1,327 @@
+// $Id: frame.cpp,v 1.35 2002/08/10 10:42:42 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+//#include "frame.h"
+#include "readers.h"
+#include "frame_impl.h"
+
+/** \class ID3_Frame frame.h id3/frame.h
+ ** \brief The representative class of an id3v2 frame.
+ **
+ ** id3lib defines frames in a funny way. Using some nice c++ conventions,
+ ** ID3_FrameImpl class objects appear to be quite polymorphic; that is, they
+ ** can take on many forms. The same ID3_FrameImpl class provides the
+ ** facilities for the implementation of a complex APIC frame and for a simple
+ ** text frame.
+ **
+ ** @author Dirk Mahoney
+ ** @version $Id: frame.cpp,v 1.35 2002/08/10 10:42:42 t1mpy Exp $
+ ** @see ID3_Tag
+ ** @see ID3_Field
+ ** @see ID3_Err
+ **/
+
+/** Default constructor; accepts as a default parameter the type of frame
+ ** to create.
+ **
+ ** The parameter which will internally set the frame's structure. See
+ ** SetID() for more details.
+ **
+ ** @param id The type of frame to create
+ ** @see ID3_FrameID
+ ** @see SetID
+ **/
+ID3_Frame::ID3_Frame(ID3_FrameID id)
+ : _impl(new ID3_FrameImpl(id))
+{
+}
+
+ID3_Frame::ID3_Frame(const ID3_Frame& frame)
+ : _impl(new ID3_FrameImpl(frame))
+{
+}
+
+ID3_Frame::~ID3_Frame()
+{
+ delete _impl;
+}
+
+/** Clears the frame of all data and resets the frame such that it can take
+ ** on the form of any id3v2 frame that id3lib supports.
+ **
+ ** @see ID3_Tag::Clear
+ **/
+void ID3_Frame::Clear()
+{
+ _impl->Clear();
+}
+
+/** Returns the type of frame that the object represents.
+ **
+ ** Useful in conjunction with ID3_Tag::Find() method
+ **
+ ** @returns The type, or id, of the frame
+ ** @see ID3_Tag::Find
+ **/
+ID3_FrameID ID3_Frame::GetID() const
+{
+ return _impl->GetID();
+}
+
+/** Establishes the internal structure of an ID3_FrameImpl object so
+ ** that it represents the id3v2 frame indicated by the parameter
+ **
+ ** Given an ID3_FrameID (a list of which is found in &lt;id3/field.h&gt;),
+ ** SetID() will structure the object according to the
+ ** frame you wish to implement.
+ **
+ ** Either using this call or via the constructor, this must be the first
+ ** command performed on an ID3_FrameImpl object.
+ **
+ ** \code
+ ** myFrame.SetID(ID3FID_TITLE);
+ ** \endcode
+ **
+ ** @param id The type of frame this frame should be set to
+ ** @see ID3_FrameID
+ **/
+bool ID3_Frame::SetID(ID3_FrameID id)
+{
+ return _impl->SetID(id);
+}
+
+bool ID3_Frame::SetSpec(ID3_V2Spec spec)
+{
+ return _impl->SetSpec(spec);
+}
+
+ID3_V2Spec ID3_Frame::GetSpec() const
+{
+ return _impl->GetSpec();
+}
+
+/** Returns a pointer to the frame's internal field indicated by the
+ ** parameter.
+ **
+ ** \code
+ ** ID3_TextEnc enc;
+ ** enc = (ID3_TextEnc) myFrame.GetField(ID3FN_TEXTENC)->Get();
+ ** \endcode
+ **
+ ** @param name The name of the field to be retrieved
+ ** @returns A reference to the desired field
+ **/
+ID3_Field& ID3_Frame::Field(ID3_FieldID fieldName) const
+{
+ return *this->GetField(fieldName);
+}
+
+ID3_Field* ID3_Frame::GetField(ID3_FieldID fieldName) const
+{
+ return _impl->GetField(fieldName);
+}
+
+size_t ID3_Frame::NumFields() const
+{
+ return _impl->NumFields();
+}
+
+/*
+ID3_Field* ID3_Frame::GetFieldNum(size_t index) const
+{
+ return _impl->GetFieldNum(index);
+}
+*/
+
+size_t ID3_Frame::Size()
+{
+ return _impl->Size();
+}
+
+
+bool ID3_Frame::HasChanged() const
+{
+ return _impl->HasChanged();
+}
+
+ID3_Frame& ID3_Frame::operator=( const ID3_Frame &rFrame )
+{
+ if (this != &rFrame)
+ {
+ *_impl = rFrame;
+ }
+ return *this;
+}
+
+const char* ID3_Frame::GetDescription(ID3_FrameID id)
+{
+ return ID3_FrameImpl::GetDescription(id);
+}
+
+const char* ID3_Frame::GetDescription() const
+{
+ return _impl->GetDescription();
+}
+
+const char* ID3_Frame::GetTextID() const
+{
+ return _impl->GetTextID();
+}
+
+bool ID3_Frame::Parse(ID3_Reader& reader)
+{
+ try // Klenotic: Catch errors and return false instead of crashing.
+ {
+ return _impl->Parse(reader);
+ }
+ catch(...)
+ {
+ ID3D_WARNING( "ID3_Frame::Parse: call to _impl->Parse() failed");
+ return false;
+ }
+}
+
+void ID3_Frame::Render(ID3_Writer& writer) const
+{
+ _impl->Render(writer);
+}
+
+bool ID3_Frame::Contains(ID3_FieldID id) const
+{
+ return _impl->Contains(id);
+}
+
+/** Sets the compression flag within the frame. When the compression flag is
+ ** is set, compression will be attempted. However, the frame might not
+ ** actually be compressed after it is rendered if the "compressed" data is
+ ** no smaller than the "uncompressed" data.
+ **/
+bool ID3_Frame::SetCompression(bool b)
+{
+ return _impl->SetCompression(b);
+}
+
+/** Returns whether or not the compression flag is set. After parsing a tag,
+ ** this will indicate whether or not the frame was compressed. After
+ ** rendering a tag, however, it does not actually indicate if the frame is
+ ** compressed rendering. It only indicates whether or not compression was
+ ** attempted. A frame will not be compressed, even whent the compression
+ ** flag is set, if the "compressed" data is no smaller than the
+ ** "uncompressed" data.
+ **/
+bool ID3_Frame::GetCompression() const
+{
+ return _impl->GetCompression();
+}
+
+size_t ID3_Frame::GetDataSize() const
+{
+ return _impl->GetDataSize();
+}
+
+bool ID3_Frame::SetEncryptionID(uchar id)
+{
+ return _impl->SetEncryptionID(id);
+}
+
+uchar ID3_Frame::GetEncryptionID() const
+{
+ return _impl->GetEncryptionID();
+}
+
+bool ID3_Frame::SetGroupingID(uchar id)
+{
+ return _impl->SetGroupingID(id);
+}
+
+uchar ID3_Frame::GetGroupingID() const
+{
+ return _impl->GetGroupingID();
+}
+
+namespace
+{
+ class IteratorImpl : public ID3_Frame::Iterator
+ {
+ ID3_FrameImpl::iterator _cur;
+ ID3_FrameImpl::iterator _end;
+ public:
+ IteratorImpl(ID3_FrameImpl& frame)
+ : _cur(frame.begin()), _end(frame.end())
+ {
+ }
+
+ ID3_Field* GetNext()
+ {
+ ID3_Field* next = NULL;
+ while (next == NULL && _cur != _end)
+ {
+ next = *_cur;
+ ++_cur;
+ }
+ return next;
+ }
+ };
+
+
+ class ConstIteratorImpl : public ID3_Frame::ConstIterator
+ {
+ ID3_FrameImpl::const_iterator _cur;
+ ID3_FrameImpl::const_iterator _end;
+ public:
+ ConstIteratorImpl(ID3_FrameImpl& frame)
+ : _cur(frame.begin()), _end(frame.end())
+ {
+ }
+ const ID3_Field* GetNext()
+ {
+ ID3_Field* next = NULL;
+ while (next == NULL && _cur != _end)
+ {
+ next = *_cur;
+ ++_cur;
+ }
+ return next;
+ }
+ };
+}
+
+ID3_Frame::Iterator*
+ID3_Frame::CreateIterator()
+{
+ return new IteratorImpl(*_impl);
+}
+
+ID3_Frame::ConstIterator*
+ID3_Frame::CreateIterator() const
+{
+ return new ConstIteratorImpl(*_impl);
+}
diff --git a/src/frame_def.h b/src/frame_def.h
new file mode 100644
index 0000000..5934df8
--- /dev/null
+++ b/src/frame_def.h
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+// $Id: frame_def.h,v 1.2 2002/07/02 22:12:32 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FRAME_DEF_H_
+#define _ID3LIB_FRAME_DEF_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+struct ID3_FieldDef;
+
+// Structure used for defining how frames are defined internally.
+struct ID3_FrameDef
+{
+ ID3_FrameID eID;
+ char sShortTextID[3 + 1];
+ char sLongTextID[4 + 1];
+ bool bTagDiscard;
+ bool bFileDiscard;
+ const ID3_FieldDef* aeFieldDefs;
+ const char * sDescription;
+};
+
+#endif
diff --git a/src/frame_impl.cpp b/src/frame_impl.cpp
new file mode 100644
index 0000000..955bc14
--- /dev/null
+++ b/src/frame_impl.cpp
@@ -0,0 +1,269 @@
+// $Id: frame_impl.cpp,v 1.9 2002/07/02 22:12:38 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+//#include <string.h>
+#include "tag.h"
+#include "frame_impl.h"
+#include "field_impl.h"
+#include "frame_def.h"
+#include "field_def.h"
+
+ID3_FrameImpl::ID3_FrameImpl(ID3_FrameID id)
+ : _changed(false),
+ _bitset(),
+ _fields(),
+ _encryption_id('\0'),
+ _grouping_id('\0')
+{
+ this->SetSpec(ID3V2_LATEST);
+ this->SetID(id);
+}
+
+ID3_FrameImpl::ID3_FrameImpl(const ID3_FrameHeader &hdr)
+ : _changed(false),
+ _bitset(),
+ _fields(),
+ _hdr(hdr),
+ _encryption_id('\0'),
+ _grouping_id('\0')
+{
+ this->_InitFields();
+}
+
+ID3_FrameImpl::ID3_FrameImpl(const ID3_Frame& frame)
+ : _changed(false),
+ _bitset(),
+ _fields(),
+ _encryption_id('\0'),
+ _grouping_id('\0')
+{
+ *this = frame;
+}
+
+ID3_FrameImpl::~ID3_FrameImpl()
+{
+ Clear();
+}
+
+bool ID3_FrameImpl::_ClearFields()
+{
+ for (iterator fi = _fields.begin(); fi != _fields.end(); ++fi)
+ {
+ delete (ID3_FieldImpl*) *fi;
+ }
+
+ _fields.clear();
+ _bitset.reset();
+
+ _changed = true;
+ return true;
+}
+
+void ID3_FrameImpl::Clear()
+{
+ this->_ClearFields();
+ _hdr.Clear();
+ _encryption_id = '\0';
+ _grouping_id = '\0';
+}
+
+void ID3_FrameImpl::_InitFields()
+{
+ const ID3_FrameDef* info = _hdr.GetFrameDef();
+ if (NULL == info)
+ {
+ // log this
+ ID3_Field* fld = new ID3_FieldImpl(ID3_FieldDef::DEFAULT[0]);
+ _fields.push_back(fld);
+ _bitset.set(fld->GetID());
+ }
+ else
+ {
+
+ for (size_t i = 0; info->aeFieldDefs[i]._id != ID3FN_NOFIELD; ++i)
+ {
+ ID3_Field* fld = new ID3_FieldImpl(info->aeFieldDefs[i]);
+ _fields.push_back(fld);
+ _bitset.set(fld->GetID());
+ }
+
+ _changed = true;
+ }
+}
+
+bool ID3_FrameImpl::SetID(ID3_FrameID id)
+{
+ bool changed = (this->GetID() != id);
+ if (changed)
+ {
+ this->_SetID(id);
+ _changed = true;
+ }
+ return changed;
+}
+
+bool ID3_FrameImpl::_SetID(ID3_FrameID id)
+{
+ bool changed = this->_ClearFields();
+ changed = _hdr.SetFrameID(id) || changed;
+ this->_InitFields();
+ return changed;
+}
+
+bool ID3_FrameImpl::SetSpec(ID3_V2Spec spec)
+{
+ return _hdr.SetSpec(spec);
+}
+
+ID3_V2Spec ID3_FrameImpl::GetSpec() const
+{
+ return _hdr.GetSpec();
+}
+
+ID3_Field* ID3_FrameImpl::GetField(ID3_FieldID fieldName) const
+{
+ ID3_Field* field = NULL;
+ if (this->Contains(fieldName))
+ {
+ for (const_iterator fi = _fields.begin(); fi != _fields.end(); ++fi)
+ {
+ if ((*fi)->GetID() == fieldName)
+ {
+ field = *fi;
+ break;
+ }
+ }
+ }
+ return field;
+}
+
+size_t ID3_FrameImpl::NumFields() const
+{
+ return _fields.size();
+}
+
+size_t ID3_FrameImpl::Size()
+{
+ size_t bytesUsed = _hdr.Size();
+
+ if (this->GetEncryptionID())
+ {
+ bytesUsed++;
+ }
+
+ if (this->GetGroupingID())
+ {
+ bytesUsed++;
+ }
+
+ // Go through all frames, sum up the size and set the encoding according to the encoding field
+ ID3_TextEnc enc = ID3TE_ISO8859_1;
+ for (iterator fi = _fields.begin(); fi != _fields.end(); ++fi)
+ {
+ if (*fi && (*fi)->InScope(this->GetSpec()))
+ {
+ if ((*fi)->GetID() == ID3FN_TEXTENC)
+ {
+ uint32 dummy = (*fi)->Get();
+ enc = static_cast<ID3_TextEnc>(dummy);
+ }
+ else
+ {
+ (*fi)->SetEncoding(enc);
+ }
+ bytesUsed += (*fi)->BinSize();
+ }
+ }
+
+ return bytesUsed;
+}
+
+
+bool ID3_FrameImpl::HasChanged() const
+{
+ bool changed = _changed;
+
+ for (const_iterator fi = _fields.begin(); fi != _fields.end(); ++fi)
+ {
+ if (*fi && (*fi)->InScope(this->GetSpec()))
+ {
+ changed = (*fi)->HasChanged();
+ }
+ }
+
+ return changed;
+}
+
+ID3_FrameImpl &
+ID3_FrameImpl::operator=( const ID3_Frame &rFrame )
+{
+ ID3_FrameID eID = rFrame.GetID();
+ this->SetID(eID);
+ ID3_Frame::ConstIterator* ri = rFrame.CreateIterator();
+ iterator li = this->begin();
+ while (li != this->end())
+ {
+ ID3_Field* thisFld = *li++;
+ const ID3_Field* thatFld = ri->GetNext();
+ if (thisFld != NULL && thatFld != NULL)
+ {
+ *thisFld = *thatFld;
+ }
+ }
+ delete ri;
+ this->SetEncryptionID(rFrame.GetEncryptionID());
+ this->SetGroupingID(rFrame.GetGroupingID());
+ this->SetCompression(rFrame.GetCompression());
+ this->SetSpec(rFrame.GetSpec());
+ _changed = false;
+
+ return *this;
+}
+
+const char* ID3_FrameImpl::GetDescription(ID3_FrameID id)
+{
+ ID3_FrameDef* myFrameDef = ID3_FindFrameDef(id);
+ if (myFrameDef != NULL)
+ {
+ return myFrameDef->sDescription;
+ }
+ return NULL;
+}
+
+const char* ID3_FrameImpl::GetDescription() const
+{
+ const ID3_FrameDef* def = _hdr.GetFrameDef();
+ if (def)
+ {
+ return def->sDescription;
+ }
+ return NULL;
+}
+
diff --git a/src/frame_impl.h b/src/frame_impl.h
new file mode 100644
index 0000000..689af8a
--- /dev/null
+++ b/src/frame_impl.h
@@ -0,0 +1,138 @@
+// -*- C++ -*-
+// $Id: frame_impl.h,v 1.6 2002/08/10 10:50:31 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_FRAME_IMPL_H_
+#define _ID3LIB_FRAME_IMPL_H_
+
+#include <vector>
+#ifndef HAVE_BITSET
+#include "id3/id3lib_bitset"
+#else
+#include <bitset>
+#endif
+#include "id3/id3lib_frame.h"
+#include "header_frame.h"
+
+class ID3_FrameImpl
+{
+ typedef std::bitset<ID3FN_LASTFIELDID> Bitset;
+ typedef std::vector<ID3_Field *> Fields;
+public:
+ typedef Fields::iterator iterator;
+ typedef Fields::const_iterator const_iterator;
+public:
+ ID3_FrameImpl(ID3_FrameID id = ID3FID_NOFRAME);
+ ID3_FrameImpl(const ID3_FrameHeader&);
+ ID3_FrameImpl(const ID3_Frame&);
+
+ /// Destructor.
+ virtual ~ID3_FrameImpl();
+
+ void Clear();
+
+ bool SetID(ID3_FrameID id);
+ ID3_FrameID GetID() const { return _hdr.GetFrameID(); }
+
+ ID3_Field* GetField(ID3_FieldID name) const;
+
+ size_t NumFields() const;
+
+ const char* GetDescription() const;
+ static const char* GetDescription(ID3_FrameID);
+
+ const char* GetTextID() const { return _hdr.GetTextID(); }
+
+ ID3_FrameImpl& operator=(const ID3_Frame &);
+ bool HasChanged() const;
+ bool Parse(ID3_Reader&);
+ void Render(ID3_Writer&) const;
+ size_t Size();
+ bool Contains(ID3_FieldID fld) const
+ { return _bitset.test(fld); }
+ bool SetSpec(ID3_V2Spec);
+ ID3_V2Spec GetSpec() const;
+
+ /** Sets the compression flag within the frame. When the compression flag is
+ ** is set, compression will be attempted. However, the frame might not
+ ** actually be compressed after it is rendered if the "compressed" data is
+ ** no smaller than the "uncompressed" data.
+ **/
+ bool SetCompression(bool b) { return _hdr.SetCompression(b); }
+ /** Returns whether or not the compression flag is set. After parsing a tag,
+ ** this will indicate whether or not the frame was compressed. After
+ ** rendering a tag, however, it does not actually indicate if the frame is
+ ** compressed rendering. It only indicates whether or not compression was
+ ** attempted. A frame will not be compressed, even whent the compression
+ ** flag is set, if the "compressed" data is no smaller than the
+ ** "uncompressed" data.
+ **/
+ bool GetCompression() const { return _hdr.GetCompression(); }
+ size_t GetDataSize() const { return _hdr.GetDataSize(); }
+
+ bool SetEncryptionID(uchar id)
+ {
+ bool changed = id != _encryption_id;
+ _encryption_id = id;
+ _changed = _changed || changed;
+ _hdr.SetEncryption(true);
+ return changed;
+ }
+ uchar GetEncryptionID() const { return _encryption_id; }
+ bool SetGroupingID(uchar id)
+ {
+ bool changed = id != _grouping_id;
+ _grouping_id = id;
+ _changed = _changed || changed;
+ _hdr.SetGrouping(true);
+ return changed;
+ }
+ uchar GetGroupingID() const { return _grouping_id; }
+
+ iterator begin() { return _fields.begin(); }
+ iterator end() { return _fields.end(); }
+ const_iterator begin() const { return _fields.begin(); }
+ const_iterator end() const { return _fields.end(); }
+
+protected:
+ bool _SetID(ID3_FrameID);
+ bool _ClearFields();
+ void _InitFields();
+ void _InitFieldBits();
+ void _UpdateFieldDeps();
+
+private:
+ mutable bool _changed; // frame changed since last parse/render?
+ Bitset _bitset; // which fields are present?
+ Fields _fields;
+ ID3_FrameHeader _hdr; //
+ uchar _encryption_id; // encryption id
+ uchar _grouping_id; // grouping id
+}
+;
+
+#endif /* _ID3LIB_FRAME_IMPL_H_ */
diff --git a/src/frame_parse.cpp b/src/frame_parse.cpp
new file mode 100644
index 0000000..a90e02f
--- /dev/null
+++ b/src/frame_parse.cpp
@@ -0,0 +1,186 @@
+// $Id: frame_parse.cpp,v 1.34 2002/07/06 13:53:18 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "frame_impl.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+
+using namespace dami;
+
+namespace
+{
+ bool parseFields(ID3_Reader& rdr, ID3_FrameImpl& frame)
+ {
+ int iLoop;
+ int iFields;
+ io::ExitTrigger et(rdr);
+ ID3_TextEnc enc = ID3TE_ASCII; // set the default encoding
+ ID3_V2Spec spec = frame.GetSpec();
+ // parse the frame's fields
+ iFields = frame.NumFields();
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): num_fields = " << iFields );
+ iLoop = 0;
+ for (ID3_FrameImpl::iterator fi = frame.begin(); fi != frame.end(); ++fi)
+ {
+ ID3_Field* fp = *fi;
+ ++iLoop;
+
+ if (rdr.atEnd())
+ {
+ // there's no remaining data to parse!
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): out of data at postion " <<
+ rdr.getCur() );
+ if (iLoop == iFields)
+ {
+ //if we are at the last field, (the 'data' field) it's apparently
+ //an empty tag used for filling up padding, it's no problem
+ //break will set the current 'cursor' to the right spot outside the for loop
+ break;
+ }
+ return false;
+ }
+
+ if (NULL == fp)
+ {
+ // Ack! Why is the field NULL? Log this...
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): field is null" );
+ continue;
+ }
+
+ if (!fp->InScope(spec))
+ {
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): field is not in scope" );
+ // continue with the rest of the fields
+ continue;
+ }
+
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): setting enc to " << enc );
+ fp->SetEncoding(enc);
+ ID3_Reader::pos_type beg = rdr.getCur();
+ et.setExitPos(beg);
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): parsing field, cur = " << beg );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): parsing field, end = " <<
+ rdr.getEnd() );
+ if (!fp->Parse(rdr) || rdr.getCur() == beg)
+ {
+ // nothing to parse! ack! parse error...
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): no data parsed, bad parse" );
+ return false;
+ }
+
+ if (fp->GetID() == ID3FN_TEXTENC)
+ {
+ enc = static_cast<ID3_TextEnc>(fp->Get());
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): found encoding = " << enc );
+ }
+ }
+ et.setExitPos(rdr.getCur());
+
+ return true;
+ }
+};
+
+bool ID3_FrameImpl::Parse(ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getBeg() = " << reader.getBeg() );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getCur() = " << reader.getCur() );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getEnd() = " << reader.getEnd() );
+ ID3_Reader::pos_type beg = reader.getCur();
+
+ if (!_hdr.Parse(reader) || reader.getCur() == beg)
+ {
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): no header to parse" );
+ return false;
+ }
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): after hdr, getCur() = " << reader.getCur() );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): found frame! id = " << _hdr.GetTextID() );
+
+ // data is the part of the frame buffer that appears after the header
+ const size_t dataSize = _hdr.GetDataSize();
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): dataSize = " << dataSize );
+ if (reader.getEnd() < beg + dataSize)
+ {
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): not enough data to parse frame" );
+ return false;
+ }
+
+ if (dataSize > 16777216) //Klenotic: The max frame size is 16MB according to http://www.id3.org/easy.html. A corrupted tag that reports a frame size of (-1) will crash the program.
+ {
+ ID3D_WARNING( "ID3_FrameImpl::Parse(): frame size too large" );
+ return false;
+ }
+
+ io::WindowedReader wr(reader, dataSize);
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getBeg() = " << wr.getBeg() );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getCur() = " << wr.getCur() );
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getEnd() = " << wr.getEnd() );
+
+ unsigned long origSize = 0;
+ if (_hdr.GetCompression())
+ {
+ origSize = io::readBENumber(reader, sizeof(uint32));
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is compressed, origSize = " << origSize );
+ }
+
+ if (_hdr.GetEncryption())
+ {
+ char ch = wr.readChar();
+ this->SetEncryptionID(ch);
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is encrypted, encryption_id = " << (int) ch );
+ }
+
+ if (_hdr.GetGrouping())
+ {
+ char ch = wr.readChar();
+ this->SetGroupingID(ch);
+ ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is encrypted, grouping_id = " << (int) ch );
+ }
+
+ // set the type of frame based on the parsed header
+ this->_ClearFields();
+ this->_InitFields();
+
+ bool success = false;
+ // expand out the data if it's compressed
+ if (!_hdr.GetCompression())
+ {
+ success = parseFields(wr, *this);
+ }
+ else
+ {
+ io::CompressedReader csr(wr, origSize);
+ success = parseFields(csr, *this);
+ }
+ et.setExitPos(wr.getCur());
+
+ _changed = false;
+ return true;
+}
+
diff --git a/src/frame_render.cpp b/src/frame_render.cpp
new file mode 100644
index 0000000..355e601
--- /dev/null
+++ b/src/frame_render.cpp
@@ -0,0 +1,161 @@
+// $Id: frame_render.cpp,v 1.27 2002/07/31 13:45:18 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+
+//#include <string.h>
+#include <memory.h>
+#include <zlib.h>
+
+#include "tag.h"
+#include "frame_impl.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "io_strings.h"
+#include "io_helpers.h"
+
+using namespace dami;
+
+namespace
+{
+ void renderFields(ID3_Writer& writer, const ID3_FrameImpl& frame)
+ {
+ ID3_TextEnc enc = ID3TE_ISO8859_1;
+ for (ID3_FrameImpl::const_iterator fi = frame.begin(); fi != frame.end(); ++fi)
+ {
+ ID3_Field* fld = *fi;
+ if (fld != NULL && fld->InScope(frame.GetSpec()))
+ {
+ if (fld->GetID() == ID3FN_TEXTENC)
+ {
+ enc = static_cast<ID3_TextEnc>(fld->Get());
+ ID3D_NOTICE( "id3::v2::renderFields(): found encoding = " << enc );
+ }
+ else
+ {
+ fld->SetEncoding(enc);
+ }
+ fld->Render(writer);
+ }
+ }
+ }
+}
+
+void ID3_FrameImpl::Render(ID3_Writer& writer) const
+{
+ // Return immediately if we have no fields, which (usually) means we're
+ // trying to render a frame which has been Cleared or hasn't been initialized
+ if (!this->NumFields())
+ {
+ return;
+ }
+
+ ID3_FrameHeader hdr;
+
+ const size_t hdr_size = hdr.Size();
+
+ // 1. Write out the field data to the buffer, with the assumption that
+ // we won't be decompressing, since this is the usual behavior
+ String flds;
+ io::StringWriter fldWriter(flds);
+ size_t origSize = 0;
+ if (!this->GetCompression())
+ {
+ renderFields(fldWriter, *this);
+ origSize = flds.size();
+ ID3D_NOTICE ( "ID3_FrameImpl::Render(): uncompressed fields" );
+ }
+ else
+ {
+ io::CompressedWriter cr(fldWriter);
+ renderFields(cr, *this);
+ cr.flush();
+ origSize = cr.getOrigSize();
+ ID3D_NOTICE ( "ID3_FrameImpl::Render(): compressed fields, orig size = " <<
+ origSize );
+ }
+
+ size_t fldSize = flds.size();
+ ID3D_NOTICE ( "ID3_FrameImpl::Render(): field size = " << fldSize );
+// No need to not write empty frames, why would we not? They can be used to fill up padding space
+// which is even recommended in the id3 spec.
+// if (fldSize == 0)
+// {
+// ID3D_WARNING ( "ID3_FrameImpl::Render(): no field data" );
+// return;
+// }
+
+ // determine which flags need to be set
+ uchar eID = this->GetEncryptionID(), gID = this->GetGroupingID();
+ ID3_FrameID fid = this->GetID();
+ if (fid == ID3FID_NOFRAME)
+ {
+ const char *tid = this->GetTextID();
+ hdr.SetUnknownFrame(tid);
+ }
+ else
+ {
+ hdr.SetFrameID(fid);
+ }
+ hdr.SetEncryption(eID > 0);
+ hdr.SetGrouping(gID > 0);
+ hdr.SetCompression(origSize > fldSize);
+ hdr.SetDataSize(fldSize + ((hdr.GetCompression() ? 4 : 0) +
+ (hdr.GetEncryption() ? 1 : 0) +
+ (hdr.GetGrouping() ? 1 : 0)));
+
+ // write out the header
+ hdr.Render(writer);
+
+ if (fldSize != 0)
+ {
+ // No-man's land! Not part of the header, not part of the data
+ if (hdr.GetCompression())
+ {
+ io::writeBENumber(writer, origSize, sizeof(uint32));
+ ID3D_NOTICE( "ID3_FrameImpl::Render(): frame is compressed, wrote origSize = " << origSize );
+ }
+ if (hdr.GetEncryption())
+ {
+ writer.writeChar(eID);
+ ID3D_NOTICE( "ID3_FrameImpl::Render(): frame is compressed, encryption id = " << eID );
+ }
+ if (hdr.GetGrouping())
+ {
+ writer.writeChar(gID);
+ ID3D_NOTICE( "ID3_FrameImpl::Render(): frame is compressed, grouping id = " << gID );
+ }
+
+ // Write the field data
+ writer.writeChars(flds.data(), fldSize);
+ }
+ _changed = false;
+}
+
diff --git a/src/globals.cpp b/src/globals.cpp
new file mode 100644
index 0000000..10c02db
--- /dev/null
+++ b/src/globals.cpp
@@ -0,0 +1,50 @@
+// $Id: globals.cpp,v 1.6 2002/07/02 22:12:57 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+ const char * const ID3LIB_NAME = _ID3LIB_NAME;
+ const char * const ID3LIB_VERSION = _ID3LIB_VERSION;
+ const char * const ID3LIB_FULL_NAME = _ID3LIB_FULLNAME;
+ const int ID3LIB_MAJOR_VERSION = _ID3LIB_MAJOR_VERSION;
+ const int ID3LIB_MINOR_VERSION = _ID3LIB_MINOR_VERSION;
+ const int ID3LIB_PATCH_VERSION = _ID3LIB_PATCH_VERSION;
+ const int ID3LIB_INTERFACE_AGE = _ID3LIB_INTERFACE_AGE;
+ const int ID3LIB_BINARY_AGE = _ID3LIB_BINARY_AGE;
+
+#ifdef _cplusplus
+}
+#endif
+
diff --git a/src/header.cpp b/src/header.cpp
new file mode 100644
index 0000000..480193e
--- /dev/null
+++ b/src/header.cpp
@@ -0,0 +1,63 @@
+// $Id: header.cpp,v 1.11 2002/07/31 13:20:49 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "header.h"
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+bool ID3_Header::SetSpec(ID3_V2Spec spec)
+{
+ static ID3_Header::Info _spec_info[] =
+ {
+ // Warning, EXT SIZE are minimum sizes, they can be bigger
+ // SIZEOF SIZEOF SIZEOF IS EXT EXT EXPERIM
+ // FRID FRSZ FRFL HEADER SIZE BIT
+ { 3, 3, 0, false, 0, false }, // ID3V2_2_0
+ { 3, 3, 0, true, 8, true }, // ID3V2_2_1
+ { 4, 4, 2, false, 10, false }, // ID3V2_3_0
+ { 4, 4, 2, false, 6, false } // ID3V2_4_0
+ };
+
+ bool changed = false;
+ if (spec < ID3V2_EARLIEST || spec > ID3V2_LATEST)
+ {
+ changed = _spec != ID3V2_UNKNOWN;
+ _spec = ID3V2_UNKNOWN;
+ _info = NULL;
+ }
+ else
+ {
+ changed = _spec != spec;
+ _spec = spec;
+ _info = &_spec_info[_spec - ID3V2_EARLIEST];
+ }
+ _changed = _changed || changed;
+ return changed;
+}
+
diff --git a/src/header.h b/src/header.h
new file mode 100644
index 0000000..53edd3f
--- /dev/null
+++ b/src/header.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+// $Id: header.h,v 1.3 2002/07/31 13:20:49 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_HEADER_H_
+#define _ID3LIB_HEADER_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+#include "flags.h"
+
+class ID3_Reader;
+class ID3_Writer;
+
+class ID3_Header
+{
+public:
+ struct Info
+ {
+ uchar frame_bytes_id;
+ uchar frame_bytes_size;
+ uchar frame_bytes_flags;
+ bool is_extended;
+ size_t extended_bytes; //including the extended header, so everything!
+ bool is_experimental;
+ };
+
+ ID3_Header()
+ : _spec (ID3V2_UNKNOWN),
+ _data_size (0),
+ _changed (false)
+ {
+ this->Clear();
+ _changed = false;
+ }
+ virtual ~ID3_Header() { ; }
+
+ virtual bool SetSpec(ID3_V2Spec);
+ /* */ ID3_V2Spec GetSpec() const { return _spec; }
+
+ /* */ bool SetDataSize(size_t size)
+ {
+ bool changed = size != _data_size;
+ _changed = _changed || changed;
+ _data_size = size;
+ return changed;
+ }
+ /* */ size_t GetDataSize() const { return _data_size; }
+
+ virtual bool Clear()
+ {
+ bool changed = this->SetDataSize(0);
+ if (this->GetSpec() == ID3V2_UNKNOWN)
+ {
+ this->SetSpec(ID3V2_LATEST);
+ changed = true;
+ }
+ changed = _flags.clear() || changed;
+ _changed = changed || _changed;
+ return changed;
+ }
+ virtual size_t Size() const = 0;
+
+ virtual void Render(ID3_Writer&) const = 0;
+ virtual bool Parse(ID3_Reader&) = 0;
+
+ ID3_Header &operator=( const ID3_Header &rhs)
+ {
+ if (this != &rhs)
+ {
+ this->SetSpec(rhs.GetSpec());
+ this->SetDataSize(rhs.GetSpec());
+ this->_flags = rhs._flags;
+ }
+ return *this;
+ }
+
+protected:
+ ID3_V2Spec _spec; // which version of the spec
+ size_t _data_size; // how big is the data?
+ ID3_Flags _flags; // header flags
+ Info* _info; // header info w.r.t. id3v2 spec
+ bool _changed; // has the header changed since parsing
+}
+;
+
+#endif /* _ID3LIB_HEADER_H */
diff --git a/src/header_frame.cpp b/src/header_frame.cpp
new file mode 100644
index 0000000..92da5ac
--- /dev/null
+++ b/src/header_frame.cpp
@@ -0,0 +1,307 @@
+// $Id: header_frame.cpp,v 1.22 2002/07/02 22:13:10 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+
+#include <memory.h>
+#include "header_frame.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "frame_def.h"
+#include "field_def.h"
+#include "field_impl.h"
+#include "io_helpers.h"
+
+using namespace dami;
+
+void ID3_FrameHeader::SetUnknownFrame(const char* id)
+{
+ Clear();
+ _frame_def = new ID3_FrameDef;
+ if (NULL == _frame_def)
+ {
+ // log this;
+ return;
+ }
+ _frame_def->eID = ID3FID_NOFRAME;
+ _frame_def->bTagDiscard = false;
+ _frame_def->bFileDiscard = false;
+ _frame_def->aeFieldDefs = ID3_FieldDef::DEFAULT;
+ _frame_def->sDescription = NULL;
+ if (strlen(id) <= 3)
+ {
+ strcpy(_frame_def->sShortTextID, id);
+ strcpy(_frame_def->sLongTextID, "");
+ }
+ else
+ {
+ strcpy(_frame_def->sLongTextID, id);
+ strcpy(_frame_def->sShortTextID, "");
+ }
+ _dyn_frame_def = true;
+}
+
+bool ID3_FrameHeader::SetFrameID(ID3_FrameID id)
+{
+ if (id == ID3FID_NOFRAME || id == this->GetFrameID())
+ {
+ return false;
+ }
+ _frame_def = ID3_FindFrameDef(id);
+ _flags.set(TAGALTER, _frame_def->bTagDiscard);
+ _flags.set(FILEALTER, _frame_def->bFileDiscard);
+
+ _changed = true;
+ return true;
+}
+
+size_t ID3_FrameHeader::Size() const
+{
+ if (!_info)
+ {
+ return 0;
+ }
+ return
+ _info->frame_bytes_id +
+ _info->frame_bytes_size +
+ _info->frame_bytes_flags;
+}
+
+bool ID3_FrameHeader::isValidFrameIdString(const char *id)
+{
+ if (!id)
+ {
+ return false;
+ }
+
+ if (strlen(id) != 4)
+ {
+ return false;
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ if ((id[i] < 'A' || id[i] > 'Z') && (id[i] < '0' || id[i] > '9'))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool ID3_FrameHeader::Parse(ID3_Reader& reader)
+{
+ ID3D_NOTICE( "ID3_FrameHeader::Parse(): getCur() = " << reader.getCur() );
+ io::ExitTrigger et(reader);
+ if (!_info)
+ {
+ return false;
+ }
+ if (reader.getEnd() < reader.getCur() + 10)
+ {
+ return false;
+ }
+
+ String textID = io::readText(reader, _info->frame_bytes_id);
+
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: textID = " << textID );
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
+
+ ID3_FrameID fid = ID3_FindFrameID(textID.c_str());
+ if (ID3FID_NOFRAME == fid)
+ {
+ this->SetUnknownFrame(textID.c_str());
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: unknown frame id" );
+ }
+ else
+ {
+ this->SetFrameID(fid);
+ }
+
+ uint32 dataSize = 0;
+ if (this->GetSpec() == ID3V2_4_0)
+ {
+ // Some implementations doesn't follow the 2.4 spec and use Big Endian for the frame size.
+ // The 2.4 spec changed the format of the frame size to be 32 bit synchsafe integer.
+ // We are using the synchsafe integer by deafult, but if the next frame dosn't look valid
+ // we test to see if a big endian frame size looks valid. If it does, then use that,
+ // otherwise fallback to the spec version.
+ uint32 current = reader.getCur();
+ dataSize = io::readUInt28(reader);
+
+ uint32 new_position = current + 4 + 2 + dataSize; // 4 bytes size, 2 bytes flags
+ if (reader.getEnd() > new_position)
+ {
+ uint32 original_position = reader.getCur();
+
+ //skip to the begining of the next frame
+ reader.setCur(new_position);
+
+ //validate the next frame id
+ String textID = io::readText(reader, _info->frame_bytes_id);
+ if (!isValidFrameIdString(textID.c_str()))
+ {
+ reader.setCur(current);
+
+ uint32 tmpDataSize = io::readBENumber(reader, _info->frame_bytes_size);
+ textID = io::readText(reader, _info->frame_bytes_id);
+ if (!isValidFrameIdString(textID.c_str())) {
+ reader.setCur(original_position);
+ } else {
+ dataSize = tmpDataSize;
+ }
+ }
+ else
+ {
+ reader.setCur(original_position);
+ }
+ }
+ }
+ else
+ {
+ dataSize = io::readBENumber(reader, _info->frame_bytes_size);
+ }
+
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: dataSize = " << dataSize );
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
+ this->SetDataSize(dataSize);
+
+ uint32 flags = io::readBENumber(reader, _info->frame_bytes_flags);
+ _flags.add(flags);
+
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: flags = " << flags );
+ ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
+ et.setExitPos(reader.getCur());
+
+ return true;
+}
+
+void ID3_FrameHeader::Render(ID3_Writer& writer) const
+{
+ size_t size = 0;
+
+ if (NULL == _frame_def)
+ {
+ // TODO: log this
+ ID3D_WARNING( "ID3_FrameHeader::Render(): _frame_def is NULL!" );
+ return;
+ //ID3_THROW(ID3E_InvalidFrameID);
+ }
+ char *textID;
+ if (_info->frame_bytes_id == strlen(_frame_def->sShortTextID))
+ {
+ textID = _frame_def->sShortTextID;
+ }
+ else
+ {
+ textID = _frame_def->sLongTextID;
+ }
+
+ ID3D_NOTICE( "ID3_FrameHeader::Render(): writing " << textID << ", " << (int) _info->frame_bytes_size << " bytes");
+ writer.writeChars((uchar *) textID, _info->frame_bytes_id);
+
+ io::writeBENumber(writer, _data_size, _info->frame_bytes_size);
+ io::writeBENumber(writer, _flags.get(), _info->frame_bytes_flags);
+}
+
+const char* ID3_FrameHeader::GetTextID() const
+{
+ char *textID = "";
+ if (_info && _frame_def)
+ {
+ if (_info->frame_bytes_id == strlen(_frame_def->sShortTextID))
+ {
+ textID = _frame_def->sShortTextID;
+ }
+ else
+ {
+ textID = _frame_def->sLongTextID;
+ }
+ }
+ return textID;
+}
+
+ID3_FrameHeader& ID3_FrameHeader::operator=(const ID3_FrameHeader& hdr)
+{
+ if (this != &hdr)
+ {
+ this->Clear();
+ this->ID3_Header::operator=(hdr);
+ if (!hdr._dyn_frame_def)
+ {
+ _frame_def = hdr._frame_def;
+ }
+ else
+ {
+ _frame_def = new ID3_FrameDef;
+ if (NULL == _frame_def)
+ {
+ // TODO: throw something here...
+ }
+ _frame_def->eID = hdr._frame_def->eID;
+ _frame_def->bTagDiscard = hdr._frame_def->bTagDiscard;
+ _frame_def->bFileDiscard = hdr._frame_def->bFileDiscard;
+ _frame_def->aeFieldDefs = hdr._frame_def->aeFieldDefs;
+ strcpy(_frame_def->sShortTextID, hdr._frame_def->sShortTextID);
+ strcpy(_frame_def->sLongTextID, hdr._frame_def->sLongTextID);
+ _dyn_frame_def = true;
+ }
+ }
+ return *this;
+}
+
+ID3_FrameID ID3_FrameHeader::GetFrameID() const
+{
+ ID3_FrameID eID = ID3FID_NOFRAME;
+ if (NULL != _frame_def)
+ {
+ eID = _frame_def->eID;
+ }
+
+ return eID;
+}
+
+const ID3_FrameDef *ID3_FrameHeader::GetFrameDef() const
+{
+ return _frame_def;
+}
+
+bool ID3_FrameHeader::Clear()
+{
+ bool changed = this->ID3_Header::Clear();
+ if (_dyn_frame_def)
+ {
+ delete _frame_def;
+ _dyn_frame_def = false;
+ changed = true;
+ }
+ if (_frame_def)
+ {
+ _frame_def = NULL;
+ changed = true;
+ }
+ return changed;
+}
+
diff --git a/src/header_frame.h b/src/header_frame.h
new file mode 100644
index 0000000..16cab5c
--- /dev/null
+++ b/src/header_frame.h
@@ -0,0 +1,91 @@
+// -*- C++ -*-
+// $Id: header_frame.h,v 1.2 2002/07/05 12:31:15 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_HEADER_FRAME_H_
+#define _ID3LIB_HEADER_FRAME_H_
+
+#include "header.h"
+#include "field.h"
+
+struct ID3_FrameDef;
+
+class ID3_FrameHeader : public ID3_Header
+{
+public:
+
+ enum
+ {
+ TAGALTER = 1 << 15,
+ FILEALTER = 1 << 14,
+ READONLY = 1 << 13,
+ COMPRESSION = 1 << 7,
+ ENCRYPTION = 1 << 6,
+ GROUPING = 1 << 5
+ };
+
+ ID3_FrameHeader() : _frame_def(NULL), _dyn_frame_def(false) { ; }
+ virtual ~ID3_FrameHeader() { this->Clear(); }
+
+ /* */ size_t Size() const;
+ /* */ bool Parse(ID3_Reader&);
+ /* */ void Render(ID3_Writer&) const;
+ /* */ bool SetFrameID(ID3_FrameID id);
+ /* */ ID3_FrameID GetFrameID() const;
+ const char* GetTextID() const;
+ const ID3_FrameDef* GetFrameDef() const;
+ /* */ bool Clear();
+ ID3_FrameHeader& operator=(const ID3_FrameHeader&);
+
+ bool SetCompression(bool b) { return this->SetFlags(COMPRESSION, b); }
+ bool SetEncryption(bool b) { return this->SetFlags(ENCRYPTION, b); }
+ bool SetGrouping(bool b) { return this->SetFlags(GROUPING, b); }
+
+ bool GetCompression() const { return _flags.test(COMPRESSION); }
+ bool GetEncryption() const { return _flags.test(ENCRYPTION); }
+ bool GetGrouping() const { return _flags.test(GROUPING); }
+ bool GetReadOnly() const { return _flags.test(READONLY); }
+ void SetUnknownFrame(const char*);
+
+protected:
+ bool SetFlags(uint16 f, bool b)
+ {
+ bool changed = _flags.set(f, b);
+ _changed = _changed || changed;
+ return changed;
+ }
+// following is moved to public due to bug unknownframes corrupting a tag
+// void SetUnknownFrame(const char*);
+
+ bool isValidFrameIdString(const char * id);
+
+private:
+ ID3_FrameDef* _frame_def;
+ bool _dyn_frame_def;
+}
+;
+
+#endif /* _ID3LIB_HEADER_FRAME_ */
diff --git a/src/header_tag.cpp b/src/header_tag.cpp
new file mode 100644
index 0000000..3585def
--- /dev/null
+++ b/src/header_tag.cpp
@@ -0,0 +1,224 @@
+// $Id: header_tag.cpp,v 1.25 2003/03/02 14:30:46 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+
+#include "header_tag.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+#include "tag.h"
+#include "io_helpers.h"
+#include "spec.h"
+
+using namespace dami;
+
+const char* const ID3_TagHeader::ID = "ID3";
+
+bool ID3_TagHeader::SetSpec(ID3_V2Spec spec)
+{
+ bool changed = this->ID3_Header::SetSpec(spec);
+ if (changed)
+ {
+ if (_info)
+ {
+ _flags.set(HEADER_FLAG_EXPERIMENTAL, _info->is_experimental);
+ _flags.set(HEADER_FLAG_EXTENDED, _info->is_extended);
+ }
+ }
+ return changed;
+}
+
+size_t ID3_TagHeader::Size() const
+{
+ size_t bytesUsed = ID3_TagHeader::SIZE;
+
+ if (_info->is_extended)
+ {
+ bytesUsed += _info->extended_bytes;
+ }
+
+ return bytesUsed;
+}
+
+
+void ID3_TagHeader::Render(ID3_Writer& writer) const
+{
+ writer.writeChars((uchar *) ID, strlen(ID));
+
+ writer.writeChar(ID3_V2SpecToVer(ID3V2_LATEST));
+ writer.writeChar(ID3_V2SpecToRev(ID3V2_LATEST));
+
+ // set the flags byte in the header
+ writer.writeChar(static_cast<uchar>(_flags.get() & MASK8));
+ io::writeUInt28(writer, this->GetDataSize()); //now includes the extended header
+
+ // now we render the extended header
+ if (_flags.test(HEADER_FLAG_EXTENDED))
+ {
+ if (this->GetSpec() == ID3V2_4_0)
+ {
+ io::writeUInt28(writer, 6); //write 4 bytes of v2.4.0 ext header containing size '6'
+ io::writeBENumber(writer, 1, 1); //write that it has only one flag byte (value '1')
+ io::writeBENumber(writer, 0, 1); //write flag byte with value '0'
+ }
+ else if (this->GetSpec() == ID3V2_3_0)
+ {
+ io::writeBENumber(writer, 6, sizeof(uint32));
+ for (size_t i = 0; i < 6; ++i)
+ {
+ if (writer.writeChar('\0') == ID3_Writer::END_OF_WRITER)
+ {
+ break;
+ }
+ }
+ }
+ // else //not implemented
+ }
+}
+
+bool ID3_TagHeader::Parse(ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+ if (!ID3_Tag::IsV2Tag(reader))
+ {
+ ID3D_NOTICE( "ID3_TagHeader::Parse(): not an id3v2 header" );
+ return false;
+ }
+
+ uchar id[3];
+ reader.readChars(id, 3);
+ // The spec version is determined with the MAJOR and MINOR OFFSETs
+ uchar major = reader.readChar();
+ uchar minor = reader.readChar();
+ this->SetSpec(ID3_VerRevToV2Spec(major, minor));
+
+ // Get the flags at the appropriate offset
+ _flags.set(static_cast<ID3_Flags::TYPE>(reader.readChar()));
+
+ // set the data size
+ this->SetDataSize(io::readUInt28(reader));
+
+ if (_flags.test(HEADER_FLAG_EXTENDED) && this->GetSpec() == ID3V2_2_1)
+ {
+ //couldn't find anything about this in the draft specifying 2.2.1 -> http://www.id3.org/pipermail/id3v2/2000-April/000126.html
+ _flags.set(HEADER_FLAG_EXTENDED, false);
+ _info->extended_bytes = 0;
+ // rest is checked at ParseExtended()
+ }
+ et.setExitPos(reader.getCur());
+ return true;
+}
+
+void ID3_TagHeader::ParseExtended(ID3_Reader& reader)
+{
+ if (this->GetSpec() == ID3V2_3_0)
+ {
+/*
+ Extended header size $xx xx xx xx
+ Extended Flags $xx xx
+ Size of padding $xx xx xx xx
+*/
+ // skip over header size, we are not using it anyway, we calculate it
+ reader.setCur(reader.getCur()+4); //Extended header size
+ //io::readBENumber(reader, 4); //Extended header size
+ uint16 tmpval = io::readBENumber(reader, 2); //Extended Flags
+ // skip over padding size, we are not using it anyway
+ reader.setCur(reader.getCur()+4); //Size of padding
+ // io::readBENumber(reader, 4); //Size of padding
+ if (tmpval != 0) //there is only one flag defined in ID3V2_3_0: crc
+ {
+ //skip over crc data, we are not using it anyway
+ reader.setCur(reader.getCur()+4); //Crc
+ //io::readBENumber(reader, 4); //Crc
+ _info->extended_bytes = 14;
+ }
+ else
+ _info->extended_bytes = 10;
+ }
+ if (this->GetSpec() == ID3V2_4_0)
+ {
+/*
+ Extended header size 4 * %0xxxxxxx
+ Number of flag bytes $01
+ Extended Flags $xx
+*/
+ uint16 i;
+ uint16 extrabytes;
+
+ io::readUInt28(reader);
+ const int extflagbytes = reader.readChar(); //Number of flag bytes
+ ID3_Flags* extflags[1]; // ID3V2_4_0 has 1 flag byte, extflagbytes should be equal to 1
+ for (i = 0; i < extflagbytes; ++i)
+ {
+ extflags[i] = new ID3_Flags;
+ extflags[i]->set(reader.readChar()); //flags
+ }
+ extrabytes = 0;
+ //extflags[0]->test(EXT_HEADER_FLAG_BIT1); // ID3V2_4_0 ext header flag bit 1 *should* be 0
+ if (extflagbytes > 0 && extflags[0]->test(EXT_HEADER_FLAG_BIT2))
+ {
+ // ID3V2_4_0 ext header flag bit 2 = Tag is an update
+ // read size
+ extrabytes += 1; // add a byte for the char containing the extflagdatasize
+ const int extheaderflagdatasize = reader.readChar();
+ extrabytes += extheaderflagdatasize;
+ // Set the cursor right; we are not parsing the data, no-one is using extended flags anyway
+ reader.setCur(reader.getCur() + extheaderflagdatasize);
+ //reader.readChars(buf, extheaderflagdatasize); //buf should be at least 127 bytes = max extended header flagdata size
+ }
+ if (extflagbytes > 0 && extflags[0]->test(EXT_HEADER_FLAG_BIT3))
+ {
+ // ID3V2_4_0 ext header flag bit 3 = CRC data present
+ // read size
+ extrabytes += 1; // add a byte for the char containing the extflagdatasize
+ const int extheaderflagdatasize = reader.readChar();
+ extrabytes += extheaderflagdatasize;
+ // Set the cursor right; we are not parsing the data, no-one is using extended flags anyway
+ reader.setCur(reader.getCur() + extheaderflagdatasize);
+ //reader.readChars(buf, extheaderflagdatasize); //buf should be at least 127 bytes = max extended header flagdata size
+ }
+ if (extflagbytes > 0 && extflags[0]->test(EXT_HEADER_FLAG_BIT4))
+ {
+ // ID3V2_4_0 ext header flag bit 4 = Tag restrictions
+ // read size
+ extrabytes += 1; // add a byte for the char containing the extflagdatasize
+ const int extheaderflagdatasize = reader.readChar();
+ extrabytes += extheaderflagdatasize;
+ // Set the cursor right; we are not parsing the data, no-one is using extended flags anyway
+ reader.setCur(reader.getCur() + extheaderflagdatasize);
+ //reader.readChars(buf, extheaderflagdatasize); //buf should be at least 127 bytes = max extended header flagdata size
+ }
+ _info->extended_bytes = 5 + extflagbytes + extrabytes;
+ }
+ // a bit unorthodox, but since we are not using any of the extended header, but were merely
+ // parsing it to get the cursor right, we delete it. Be Gone !
+ _flags.set(HEADER_FLAG_EXTENDED, false);
+ if (_info)
+ {
+ _data_size -= _info->extended_bytes;
+ _info->extended_bytes = 0;
+ }//else there is a tag with a higher or lower version than supported
+}
+
diff --git a/src/header_tag.h b/src/header_tag.h
new file mode 100644
index 0000000..48cab15
--- /dev/null
+++ b/src/header_tag.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+// $Id: header_tag.h,v 1.2 2002/07/31 13:20:49 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_HEADER_TAG_H_
+#define _ID3LIB_HEADER_TAG_H_
+
+#include "header.h"
+
+class ID3_TagHeader : public ID3_Header
+{
+public:
+
+ enum
+ {
+ HEADER_FLAG_UNSYNC = 1 << 7,
+ HEADER_FLAG_EXTENDED = 1 << 6,
+ HEADER_FLAG_EXPERIMENTAL = 1 << 5,
+ HEADER_FLAG_FOOTER = 1 << 4
+ };
+
+ enum
+ {
+ EXT_HEADER_FLAG_BIT1 = 1 << 7,
+ EXT_HEADER_FLAG_BIT2 = 1 << 6,
+ EXT_HEADER_FLAG_BIT3 = 1 << 5,
+ EXT_HEADER_FLAG_BIT4 = 1 << 4
+ };
+
+ ID3_TagHeader() : ID3_Header() { ; }
+ virtual ~ID3_TagHeader() { ; }
+ ID3_TagHeader(const ID3_TagHeader& rhs) : ID3_Header() { *this = rhs; }
+
+ bool SetSpec(ID3_V2Spec);
+ size_t Size() const;
+ void Render(ID3_Writer&) const;
+ bool Parse(ID3_Reader&);
+ void ParseExtended(ID3_Reader&);
+ ID3_TagHeader& operator=(const ID3_TagHeader&hdr)
+ { this->ID3_Header::operator=(hdr); return *this; }
+
+ bool SetUnsync(bool b)
+ {
+ bool changed = _flags.set(HEADER_FLAG_UNSYNC, b);
+ _changed = _changed || changed;
+ return changed;
+ }
+ bool GetUnsync() const { return _flags.test(HEADER_FLAG_UNSYNC); }
+ bool SetExtended(bool b)
+ {
+ bool changed = _flags.set(HEADER_FLAG_EXTENDED, b);
+ _changed = _changed || changed;
+ return changed;
+ }
+ bool GetExtended() const { return _flags.test(HEADER_FLAG_EXTENDED); }
+ bool SetExperimental(bool b)
+ {
+ bool changed = _flags.set(HEADER_FLAG_EXPERIMENTAL, b);
+ _changed = _changed || changed;
+ return changed;
+ }
+ bool GetExperimental() const { return _flags.test(HEADER_FLAG_EXPERIMENTAL); }
+ bool SetFooter(bool b)
+ {
+ bool changed = _flags.set(HEADER_FLAG_FOOTER, b);
+ _changed = _changed || changed;
+ return changed;
+ }
+ bool GetFooter() const { return _flags.test(HEADER_FLAG_FOOTER); }
+
+ // id3v2 tag header signature: $49 44 33 MM mm GG ss ss ss ss
+ // MM = major version (will never be 0xFF)
+ // mm = minor version (will never be 0xFF)
+ // ff = flags byte
+ // ss = size bytes (less than $80)
+ static const char* const ID;
+ enum
+ {
+ ID_SIZE = 3,
+ MAJOR_OFFSET = 3,
+ MINOR_OFFSET = 4,
+ FLAGS_OFFSET = 5,
+ SIZE_OFFSET = 6,
+ SIZE = 10 // does not include extented headers
+ };
+
+};
+
+#endif /* _ID3LIB_HEADER_TAG_H_ */
diff --git a/src/helpers.cpp b/src/helpers.cpp
new file mode 100644
index 0000000..46dd63e
--- /dev/null
+++ b/src/helpers.cpp
@@ -0,0 +1,518 @@
+// $Id: helpers.cpp,v 1.12 2002/09/21 17:23:32 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// Lots of hacking added to this file by Scott Wheeler (scott@slackorama.net)
+// 11/02/2001
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+
+#include <ctype.h>
+
+#include "helpers.h"
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+
+using namespace dami;
+
+/** Helper function to get a "good" string for a field, no matter what. */
+String id3::v2::getString(const ID3_Frame* frame, ID3_FieldID fldName)
+{
+ return getStringAtIndex( frame, fldName, 0 );
+}
+
+/** Helper function to get a "good" string for a field, no matter what. */
+String id3::v2::getStringAtIndex(const ID3_Frame* frame, ID3_FieldID fldName,
+ size_t nIndex)
+{
+ if (!frame)
+ return "";
+
+ ID3_Field* fp = frame->GetField(fldName);
+ if (!fp)
+ return "";
+
+ return fp->GetText( nIndex, fp->GetEncoding() );
+}
+
+size_t id3::v2::removeFrames(ID3_TagImpl& tag, ID3_FrameID id)
+{
+ size_t numRemoved = 0;
+ ID3_Frame* frame = NULL;
+
+ while ((frame = tag.Find(id)) != NULL)
+ {
+ frame = tag.RemoveFrame(frame);
+ delete frame;
+ numRemoved++;
+ }
+
+ return numRemoved;
+}
+
+String id3::v2::getFrameText(const ID3_TagImpl& tag, ID3_FrameID id)
+{
+ ID3_Frame* frame = tag.Find(id);
+ return getString(frame, ID3FN_TEXT);
+}
+
+ID3_Frame* id3::v2::setFrameText(ID3_TagImpl& tag, ID3_FrameID id, String text)
+{
+ ID3_Frame* frame = tag.Find(id);
+ if (!frame)
+ {
+ frame = new ID3_Frame(id);
+ if(!tag.AttachFrame(frame)) return NULL;
+ }
+ frame->GetField(ID3FN_TEXT)->Set(text.c_str());
+
+ return frame;
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasArtist(const ID3_TagImpl& tag)
+{
+ ID3_Frame* fp = NULL;
+ (fp = tag.Find(ID3FID_LEADARTIST)) ||
+ (fp = tag.Find(ID3FID_BAND)) ||
+ (fp = tag.Find(ID3FID_CONDUCTOR)) ||
+ (fp = tag.Find(ID3FID_COMPOSER));
+ return fp;
+}
+
+String id3::v2::getArtist(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = hasArtist(tag);
+ return getString(frame, ID3FN_TEXT);
+}
+
+ID3_Frame* id3::v2::setArtist(ID3_TagImpl& tag, String text)
+{
+ removeArtists(tag);
+ return setFrameText(tag, ID3FID_LEADARTIST, text);
+}
+
+size_t id3::v2::removeArtists(ID3_TagImpl& tag)
+{
+ size_t numRemoved = 0;
+ ID3_Frame* frame = NULL;
+
+ while ((frame = hasArtist(tag)) != NULL)
+ {
+ frame = tag.RemoveFrame(frame);
+ delete frame;
+ numRemoved++;
+ }
+
+ return numRemoved;
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasAlbum(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_ALBUM);
+ return(frame);
+}
+
+String id3::v2::getAlbum(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_ALBUM);
+}
+
+ID3_Frame* id3::v2::setAlbum(ID3_TagImpl& tag, String text)
+{
+ return setFrameText(tag, ID3FID_ALBUM, text);
+}
+
+size_t id3::v2::removeAlbums(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_ALBUM);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasTitle(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_TITLE);
+ return(frame);
+}
+
+String id3::v2::getTitle(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_TITLE);
+}
+
+ID3_Frame* id3::v2::setTitle(ID3_TagImpl& tag, String text)
+{
+ return setFrameText(tag, ID3FID_TITLE, text);
+}
+
+size_t id3::v2::removeTitles(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_TITLE);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasYear(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_YEAR);
+ return(frame);
+}
+
+String id3::v2::getYear(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_YEAR);
+}
+
+ID3_Frame* id3::v2::setYear(ID3_TagImpl& tag, String text)
+{
+ return setFrameText(tag, ID3FID_YEAR, text);
+}
+
+size_t id3::v2::removeYears(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_YEAR);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasV1Comment(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = NULL;
+ (frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, STR_V1_COMMENT_DESC)) ||
+ (frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, "" )) ||
+ (frame = tag.Find(ID3FID_COMMENT));
+ return(frame);
+}
+
+ID3_Frame* id3::v2::hasComment(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_COMMENT);
+ return(frame);
+}
+
+String id3::v2::getV1Comment(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame;
+ (frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, STR_V1_COMMENT_DESC)) ||
+ (frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, "" )) ||
+ (frame = tag.Find(ID3FID_COMMENT));
+ return getString(frame, ID3FN_TEXT);
+}
+
+String id3::v2::getComment(const ID3_TagImpl& tag, String desc)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, desc.c_str());
+ return getString(frame, ID3FN_TEXT);
+}
+
+ID3_Frame* id3::v2::setComment(ID3_TagImpl& tag, String text, String desc,
+ String lang)
+{
+ ID3D_NOTICE( "id3::v2::setComment: trying to find frame with description = " << desc );
+ ID3_Frame* frame = NULL;
+ // See if there is already a comment with this description
+ for (ID3_TagImpl::iterator iter = tag.begin(); iter != tag.end(); ++iter)
+ {
+ frame = *iter;
+ if (frame == NULL)
+ {
+ continue;
+ }
+ if (frame->GetID() == ID3FID_COMMENT)
+ {
+ String tmpDesc = getString(frame, ID3FN_DESCRIPTION);
+ if (tmpDesc == desc)
+ {
+ ID3D_NOTICE( "id3::v2::setComment: found frame with description = " << desc );
+ break;
+ }
+ }
+ frame = NULL;
+ }
+ if (frame == NULL)
+ {
+ ID3D_NOTICE( "id3::v2::setComment: creating new comment frame" );
+ frame = new ID3_Frame(ID3FID_COMMENT);
+ if(!tag.AttachFrame(frame)) return NULL;
+ }
+ if (!frame)
+ {
+ ID3D_WARNING( "id3::v2::setComment: ack! no frame" );
+ }
+ else
+ {
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang.c_str());
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc.c_str());
+ frame->GetField(ID3FN_TEXT)->Set(text.c_str());
+ }
+
+ return frame;
+}
+
+// Remove all comments from the tag
+size_t id3::v2::removeAllComments(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_COMMENT);
+}
+
+// Remove all comments from the tag with the given description
+size_t id3::v2::removeComments(ID3_TagImpl& tag, String desc)
+{
+ size_t numRemoved = 0;
+
+ for (ID3_TagImpl::iterator iter = tag.begin(); iter != tag.end(); ++iter)
+ {
+ ID3_Frame* frame = *iter;
+ if (frame == NULL)
+ {
+ continue;
+ }
+ if (frame->GetID() == ID3FID_COMMENT)
+ {
+ // See if the description we have matches the description of the
+ // current comment. If so, remove the comment
+ String tmpDesc = getString(frame, ID3FN_DESCRIPTION);
+ if (tmpDesc == desc)
+ {
+ frame = tag.RemoveFrame(frame);
+ delete frame;
+ numRemoved++;
+ }
+ }
+ }
+
+ return numRemoved;
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasTrack(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_TRACKNUM);
+ return(frame);
+}
+
+String id3::v2::getTrack(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_TRACKNUM);
+}
+
+size_t id3::v2::getTrackNum(const ID3_TagImpl& tag)
+{
+ String sTrack = getTrack(tag);
+ return ::atoi(sTrack.c_str());
+}
+
+ID3_Frame* id3::v2::setTrack(ID3_TagImpl& tag, uchar trk, uchar ttl)
+{
+ ID3_Frame* frame = NULL;
+ String track = toString((size_t)trk);
+ if (ttl > 0)
+ {
+ track += "/";
+ track += toString((size_t)ttl);
+ }
+ setFrameText(tag, ID3FID_TRACKNUM, track);
+
+ return frame;
+}
+
+size_t id3::v2::removeTracks(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_TRACKNUM);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasGenre(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_CONTENTTYPE);
+ return(frame);
+}
+
+String id3::v2::getGenre(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_CONTENTTYPE);
+}
+
+size_t id3::v2::getGenreNum(const ID3_TagImpl& tag)
+{
+ String sGenre = getGenre(tag);
+ size_t ulGenre = 0xFF;
+ size_t size = sGenre.size();
+
+ // If the genre string begins with "(ddd)", where "ddd" is a number, then
+ // "ddd" is the genre number---get it
+ size_t i = 0;
+ if (i < size && size && sGenre[i] == '(')
+ {
+ ++i;
+ while (i < size && isdigit(sGenre[i]))
+ {
+ ++i;
+ }
+ if (i < size && sGenre[i] == ')')
+ {
+ // if the genre number is greater than 255, its invalid.
+ ulGenre = min(0xFF, atoi(&sGenre[1]));
+ }
+ }
+
+ return ulGenre;
+}
+
+ID3_Frame* id3::v2::setGenre(ID3_TagImpl& tag, size_t genre)
+{
+ String sGenre = "(";
+ sGenre += toString(genre) + ")";
+ return setFrameText(tag, ID3FID_CONTENTTYPE, sGenre);
+}
+
+size_t id3::v2::removeGenres(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_CONTENTTYPE);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasLyrics(const ID3_TagImpl& tag)
+{
+ ID3_Frame* frame = tag.Find(ID3FID_UNSYNCEDLYRICS);
+ return(frame);
+}
+
+String id3::v2::getLyrics(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_UNSYNCEDLYRICS);
+}
+
+ID3_Frame* id3::v2::setLyrics(ID3_TagImpl& tag, String text, String desc,
+ String lang)
+{
+ ID3_Frame* frame = NULL;
+ // See if there is already a comment with this description
+ for (ID3_TagImpl::iterator iter = tag.begin(); iter != tag.end(); ++iter)
+ {
+ frame = *iter;
+ if (frame == NULL)
+ {
+ continue;
+ }
+ if (frame->GetID() == ID3FID_COMMENT)
+ {
+ String tmpDesc = getString(frame, ID3FN_DESCRIPTION);
+ if (tmpDesc == desc)
+ {
+ break;
+ }
+ }
+ frame = NULL;
+ }
+ if (frame == NULL)
+ {
+ frame = new ID3_Frame(ID3FID_UNSYNCEDLYRICS);
+ if(!tag.AttachFrame(frame)) return NULL;
+ }
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang.c_str());
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc.c_str());
+ frame->GetField(ID3FN_TEXT)->Set(text.c_str());
+
+ return frame;
+}
+
+size_t id3::v2::removeLyrics(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_UNSYNCEDLYRICS);
+}
+
+String id3::v2::getLyricist(const ID3_TagImpl& tag)
+{
+ return getFrameText(tag, ID3FID_LYRICIST);
+}
+
+ID3_Frame* id3::v2::setLyricist(ID3_TagImpl& tag, String text)
+{
+ return setFrameText(tag, ID3FID_LYRICIST, text);
+}
+
+size_t id3::v2::removeLyricists(ID3_TagImpl& tag)
+{
+ return removeFrames(tag, ID3FID_LYRICIST);
+}
+
+////////////////////////////////////////////////////////////
+
+ID3_Frame* id3::v2::hasSyncLyrics(const ID3_TagImpl& tag, String lang, String desc)
+{
+ ID3_Frame* frame=NULL;
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang.c_str())) ||
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc.c_str()));
+ return(frame);
+}
+
+ID3_Frame* id3::v2::setSyncLyrics(ID3_TagImpl& tag, BString data,
+ ID3_TimeStampFormat format, String desc,
+ String lang, ID3_ContentType type)
+{
+ ID3_Frame* frame = NULL;
+
+ // check if a SYLT frame of this language or descriptor already exists
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang.c_str())) ||
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc.c_str()));
+
+ if (!frame)
+ {
+ frame = new ID3_Frame(ID3FID_SYNCEDLYRICS);
+ if(!tag.AttachFrame(frame)) return NULL;
+ }
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang.c_str());
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc.c_str());
+ frame->GetField(ID3FN_TIMESTAMPFORMAT)->Set(format);
+ frame->GetField(ID3FN_CONTENTTYPE)->Set(type);
+ frame->GetField(ID3FN_DATA)->Set(data.data(), data.size());
+
+ return frame;
+}
+
+BString id3::v2::getSyncLyrics(const ID3_TagImpl& tag, String lang, String desc)
+{
+ // check if a SYLT frame of this language or descriptor exists
+ ID3_Frame* frame = NULL;
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang.c_str())) ||
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc.c_str())) ||
+ (frame = tag.Find(ID3FID_SYNCEDLYRICS));
+
+ // get the lyrics size
+ ID3_Field* fld = frame->GetField(ID3FN_DATA);
+ return BString(reinterpret_cast<const BString::value_type *>(fld->GetRawBinary()), fld->Size());
+}
+
diff --git a/src/io.cpp b/src/io.cpp
new file mode 100644
index 0000000..2e23745
--- /dev/null
+++ b/src/io.cpp
@@ -0,0 +1,36 @@
+// $Id: io.cpp,v 1.2 2002/06/29 17:36:22 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "reader.h"
+#include "writer.h"
+
+const ID3_Reader::int_type ID3_Reader::END_OF_READER = -1;
+const ID3_Writer::int_type ID3_Writer::END_OF_WRITER = -1;
+
diff --git a/src/io_decorators.cpp b/src/io_decorators.cpp
new file mode 100644
index 0000000..1381320
--- /dev/null
+++ b/src/io_decorators.cpp
@@ -0,0 +1,298 @@
+// $Id: io_decorators.cpp,v 1.4 2002/07/02 22:13:40 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "zlib.h"
+
+using namespace dami;
+
+void io::WindowedReader::setWindow(pos_type beg, size_type size)
+{
+ ID3D_NOTICE( "WindowedReader::setWindow() [beg, size] = [" <<
+ this->getBeg() << ", " << size << "]" );
+ pos_type cur = this->getCur();
+
+ // reset the end marker so as to avoid errors
+ this->setEnd(_reader.getEnd());
+
+ // set the beginning marker
+ this->setBeg(beg);
+
+ // since the characters might be more than a byte in size, we need to
+ // manually get all the chars to set the window appropriately
+ this->setCur(beg);
+ ID3D_NOTICE( "WindowedReader::setWindow(): after setCur(beg), cur = "<<
+ this->getCur() );
+
+ this->skipChars(size);
+ ID3D_NOTICE( "WindowedReader::setWindow(): after skipChars, cur = " <<
+ this->getCur() );
+
+ this->setEnd(this->getCur());
+
+ ID3D_NOTICE( "WindowedReader::setWindow() [beg, cur, end] = [" << this->getBeg() << ", " << this->getCur() << ", " << this->getEnd() << "]" );
+
+
+ // reset the stream
+ this->setCur(cur);
+}
+
+ID3_Reader::pos_type io::WindowedReader::setBeg(pos_type beg)
+{
+ // make sure the position we want to set to isn't past the current
+ // end position or the superclass's beginning position
+ if (beg <= this->getEnd() && beg >= _reader.getBeg())
+ {
+ _beg = beg;
+ }
+ else if (beg > this->getEnd())
+ {
+ ID3D_WARNING( "WindowedReader::setBeg() failed, [beg, _end] = " <<
+ beg << ", " << this->getEnd() << "]" );
+ }
+ else
+ {
+ ID3D_WARNING( "WindowedReader::setBeg() failed, [beg, _beg] = " <<
+ beg << ", " << this->getBeg() << "]" );
+ }
+ return _beg;
+}
+
+ID3_Reader::pos_type io::WindowedReader::setEnd(pos_type end)
+{
+ // make sure the position we want to set to isn't beforen the current
+ // beginning position or the superclass's end position
+ if (this->getBeg() <= end && end <= _reader.getEnd())
+ {
+ _end = end;
+ }
+ else
+ {
+ ID3D_WARNING( "WindowedReader::setEnd() failed, end = " << end );
+ ID3D_WARNING( "WindowedReader::setEnd() failed, beg = " <<
+ this->getBeg() );
+ ID3D_WARNING( "WindowedReader::setEnd() failed, super.end = " <<
+ _reader.getEnd() );
+
+ }
+ return _end;
+}
+
+ID3_Reader::int_type io::WindowedReader::readChar()
+{
+ int_type ch = END_OF_READER;
+ if (this->inWindow())
+ {
+ ch = _reader.readChar();
+ }
+ else
+ {
+ ID3D_WARNING( "io::WindowedReader::readChar: not in window, " <<
+ "pos = " << this->getCur() << ", window = [" <<
+ this->getBeg() << ", " << this->getEnd() << "]");
+ }
+ return ch;
+}
+
+ID3_Reader::int_type io::WindowedReader::peekChar()
+{
+ int_type ch = END_OF_READER;
+ if (this->inWindow())
+ {
+ ch = _reader.peekChar();
+ }
+ return ch;
+}
+
+ID3_Reader::size_type io::WindowedReader::readChars(char_type buf[], size_type len)
+{
+ pos_type cur = this->getCur();
+ size_type size = 0;
+ if (this->inWindow(cur))
+ {
+ size = _reader.readChars(buf, min<size_type>(len, _end - cur));
+ }
+ return size;
+}
+
+ID3_Reader::size_type io::CharReader::readChars(char_type buf[], size_type len)
+{
+ size_type numChars = 0;
+ ID3D_NOTICE( "CharReader::readChars(): len = " << len );
+ for (; numChars < len; ++numChars)
+ {
+ if (this->atEnd())
+ {
+ break;
+ }
+ char_type ch = this->readChar();
+ if (buf != NULL)
+ {
+ buf[numChars] = ch;
+ }
+ }
+ ID3D_NOTICE( "CharReader::readChars(): numChars = " << len );
+ return numChars;
+}
+
+ID3_Reader::int_type io::LineFeedReader::readChar()
+{
+ if (this->atEnd())
+ {
+ return END_OF_READER;
+ }
+ char_type ch = _reader.readChar();
+ if (ch == 0x0D && this->peekChar() == 0x0A)
+ {
+ ID3D_NOTICE( "LineFeedReader::readChar(): found CRLF at pos " <<
+ this->getCur() );
+ ch = _reader.readChar();
+ }
+ return ch;
+};
+
+ID3_Reader::int_type io::UnsyncedReader::readChar()
+{
+ if (this->atEnd())
+ {
+ return END_OF_READER;
+ }
+ char_type ch = _reader.readChar();
+ if (ch == 0xFF && this->peekChar() == 0x00)
+ {
+ ID3D_NOTICE( "UnsyncedReader::readChar(): found sync at pos " <<
+ this->getCur() );
+ _reader.readChar();
+ }
+ return ch;
+}
+
+io::CompressedReader::CompressedReader(ID3_Reader& reader, size_type newSize)
+ : _uncompressed(new char_type[newSize])
+{
+ size_type oldSize = reader.remainingBytes();
+
+ BString binary = readBinary(reader, oldSize);
+
+ ::uncompress(_uncompressed,
+ reinterpret_cast<luint*>(&newSize),
+ reinterpret_cast<const uchar*>(binary.data()),
+ oldSize);
+ this->setBuffer(_uncompressed, newSize);
+}
+
+io::CompressedReader::~CompressedReader()
+{
+ delete [] _uncompressed;
+}
+
+ID3_Writer::int_type io::UnsyncedWriter::writeChar(char_type ch)
+{
+ if (_last == 0xFF && (ch == 0x00 || ch >= 0xE0))
+ {
+ _writer.writeChar('\0');
+ _numSyncs++;
+ }
+ _last = _writer.writeChar(ch);
+ return _last;
+}
+
+void io::UnsyncedWriter::flush()
+{
+ if (_last == 0xFF)
+ {
+ _last = _writer.writeChar('\0');
+ _numSyncs++;
+ }
+ _writer.flush();
+}
+
+ID3_Writer::size_type
+io::UnsyncedWriter::writeChars(const char_type buf[], size_type len)
+{
+ pos_type beg = this->getCur();
+ ID3D_NOTICE( "UnsyncedWriter::writeChars(): len = " << len );
+ for (size_t i = 0; i < len; ++i)
+ {
+ if (this->atEnd())
+ {
+ break;
+ }
+ this->writeChar(buf[i]);
+ }
+ size_type numChars = this->getCur() - beg;
+ ID3D_NOTICE( "CharWriter::writeChars(): numChars = " << numChars );
+ return numChars;
+}
+
+void io::CompressedWriter::flush()
+{
+ if (_data.size() == 0)
+ {
+ return;
+ }
+ const char_type* data = reinterpret_cast<const char_type*>(_data.data());
+ size_type dataSize = _data.size();
+ _origSize = dataSize;
+ // The zlib documentation specifies that the destination size needs to
+ // be an unsigned long at least 0.1% larger than the source buffer,
+ // plus 12 bytes
+ unsigned long newDataSize = dataSize + (dataSize / 10) + 12;
+ char_type* newData = new char_type[newDataSize];
+ if (::compress(newData, &newDataSize, data, dataSize) != Z_OK)
+ {
+ // log this
+ ID3D_WARNING("io::CompressedWriter: error compressing");
+ _writer.writeChars(data, dataSize);
+ }
+ else if (newDataSize < dataSize)
+ {
+ ID3D_NOTICE("io::CompressedWriter: compressed size = " << newDataSize << ", original size = " << dataSize );
+ _writer.writeChars(newData, newDataSize);
+ }
+ else
+ {
+ ID3D_NOTICE("io::CompressedWriter: no compression!compressed size = " << newDataSize << ", original size = " << dataSize );
+ _writer.writeChars(data, dataSize);
+ }
+ delete [] newData;
+ _data.erase();
+}
+
+ID3_Writer::size_type
+io::CompressedWriter::writeChars(const char_type buf[], size_type len)
+{
+ ID3D_NOTICE("io::CompressedWriter: writing chars: " << len );
+ _data.append(buf, len);
+ return len;
+}
+
diff --git a/src/io_helpers.cpp b/src/io_helpers.cpp
new file mode 100644
index 0000000..a4bbbe4
--- /dev/null
+++ b/src/io_helpers.cpp
@@ -0,0 +1,404 @@
+// $Id: io_helpers.cpp,v 1.13 2002/07/02 22:13:56 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+
+using namespace dami;
+
+String io::readString(ID3_Reader& reader)
+{
+ String str;
+ while (!reader.atEnd())
+ {
+ ID3_Reader::char_type ch = reader.readChar();
+ if (ch == '\0')
+ {
+ break;
+ }
+ str += static_cast<char>(ch);
+ }
+ return str;
+}
+
+String io::readText(ID3_Reader& reader, size_t len)
+{
+ String str;
+ str.reserve(len);
+ const size_t SIZE = 1024;
+ ID3_Reader::char_type buf[SIZE];
+ size_t remaining = len;
+ while (remaining > 0 && !reader.atEnd())
+ {
+ size_t numRead = reader.readChars(buf, min(remaining, SIZE));
+ remaining -= numRead;
+ str.append(reinterpret_cast<String::value_type *>(buf), numRead);
+ }
+ return str;
+}
+
+namespace
+{
+ bool isNull(unsigned char ch1, unsigned char ch2)
+ {
+ return ch1 == '\0' && ch2 == '\0';
+ }
+
+ int isBOM(unsigned char ch1, unsigned char ch2)
+ {
+ // The following is taken from the following URL:
+ // http://community.roxen.com/developers/idocs/rfc/rfc2781.html
+ /* The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
+ NON-BREAKING SPACE" (0xFEFF), which is also known informally as
+ "BYTE ORDER MARK" (abbreviated "BOM"). The latter name hints at a
+ second possible usage of the character, in addition to its normal
+ use as a genuine "ZERO WIDTH NON-BREAKING SPACE" within text. This
+ usage, suggested by Unicode section 2.4 and ISO 10646 Annex F
+ (informative), is to prepend a 0xFEFF character to a stream of
+ Unicode characters as a "signature"; a receiver of such a serialized
+ stream may then use the initial character both as a hint that the
+ stream consists of Unicode characters and as a way to recognize the
+ serialization order. In serialized UTF-16 prepended with such a
+ signature, the order is big-endian if the first two octets are 0xFE
+ followed by 0xFF; if they are 0xFF followed by 0xFE, the order is
+ little-endian. Note that 0xFFFE is not a Unicode character,
+ precisely to preserve the usefulness of 0xFEFF as a byte-order
+ mark. */
+
+ if (ch1 == 0xFE && ch2 == 0xFF)
+ {
+ return 1;
+ }
+ else if (ch1 == 0xFF && ch2 == 0xFE)
+ {
+ return -1;
+ }
+ return 0;
+ }
+
+ bool readTwoChars(ID3_Reader& reader,
+ ID3_Reader::char_type& ch1,
+ ID3_Reader::char_type& ch2)
+ {
+ if (reader.atEnd())
+ {
+ return false;
+ }
+ io::ExitTrigger et(reader);
+ ch1 = reader.readChar();
+ if (reader.atEnd())
+ {
+ return false;
+ }
+ et.release();
+ ch2 = reader.readChar();
+ return true;
+ }
+}
+
+String io::readUnicodeString(ID3_Reader& reader)
+{
+ String unicode;
+ ID3_Reader::char_type ch1, ch2;
+ if (!readTwoChars(reader, ch1, ch2) || isNull(ch1, ch2))
+ {
+ return unicode;
+ }
+ int bom = isBOM(ch1, ch2);
+ if (!bom)
+ {
+ unicode += static_cast<char>(ch1);
+ unicode += static_cast<char>(ch2);
+ }
+ while (!reader.atEnd())
+ {
+ if (!readTwoChars(reader, ch1, ch2) || isNull(ch1, ch2))
+ {
+ break;
+ }
+ if (bom == -1)
+ {
+ unicode += static_cast<char>(ch2);
+ unicode += static_cast<char>(ch1);
+ }
+ else
+ {
+ unicode += static_cast<char>(ch1);
+ unicode += static_cast<char>(ch2);
+ }
+ }
+ return unicode;
+}
+
+String io::readUnicodeText(ID3_Reader& reader, size_t len)
+{
+ String unicode;
+ ID3_Reader::char_type ch1, ch2;
+ if (!readTwoChars(reader, ch1, ch2))
+ {
+ return unicode;
+ }
+ len -= 2;
+ int bom = isBOM(ch1, ch2);
+#ifdef WORDS_BIGENDIAN
+ bom = -bom; // switch things around for big endian
+#endif
+ if (!bom)
+ {
+#ifdef WORDS_BIGENDIAN
+ unicode += ch2;
+ unicode += ch1;
+ for (size_t i = 0; i < len; i += 2)
+ {
+ if (!readTwoChars(reader, ch1, ch2))
+ {
+ break;
+ }
+ unicode += ch2;
+ unicode += ch1;
+ }
+#else
+ unicode += ch1;
+ unicode += ch2;
+ unicode += readText(reader, len);
+#endif
+ }
+ else if (bom == -1)
+ {
+ unicode = readText(reader, len);
+ }
+ else
+ {
+ for (size_t i = 0; i < len; i += 2)
+ {
+ if (!readTwoChars(reader, ch1, ch2))
+ {
+ break;
+ }
+ unicode += ch2;
+ unicode += ch1;
+ }
+ }
+ unicode += '\0'; // ESL: need to terminate double-byte string properly.
+ return unicode;
+}
+
+BString io::readAllBinary(ID3_Reader& reader)
+{
+ return readBinary(reader, reader.remainingBytes());
+}
+
+BString io::readBinary(ID3_Reader& reader, size_t len)
+{
+ BString binary;
+ binary.reserve(len);
+
+ size_t remaining = len;
+ const size_t SIZE = 1024;
+ ID3_Reader::char_type buf[SIZE];
+ while (!reader.atEnd() && remaining > 0)
+ {
+ size_t numRead = reader.readChars(buf, min(remaining, SIZE));
+ remaining -= numRead;
+ binary.append(reinterpret_cast<BString::value_type *>(buf), numRead);
+ }
+
+ return binary;
+}
+
+uint32 io::readLENumber(ID3_Reader& reader, size_t len)
+{
+ uint32 val = 0;
+ for (size_t i = 0; i < len; i++)
+ {
+ if (reader.atEnd())
+ {
+ break;
+ }
+ val += (static_cast<uint32>(0xFF & reader.readChar()) << (i * 8));
+ }
+ return val;
+}
+
+uint32 io::readBENumber(ID3_Reader& reader, size_t len)
+{
+ uint32 val = 0;
+
+ for (ID3_Reader::size_type i = 0; i < len && !reader.atEnd(); ++i)
+ {
+ val *= 256; // 2^8
+ val += static_cast<uint32>(0xFF & reader.readChar());
+ }
+ return val;
+}
+
+String io::readTrailingSpaces(ID3_Reader& reader, size_t len)
+{
+ io::WindowedReader wr(reader, len);
+ String str;
+ String spaces;
+ str.reserve(len);
+ spaces.reserve(len);
+ while (!wr.atEnd())
+ {
+ ID3_Reader::char_type ch = wr.readChar();
+ if (ch == '\0' || ch == ' ')
+ {
+ spaces += ch;
+ }
+ else
+ {
+ str += spaces + (char) ch;
+ spaces.erase();
+ }
+ }
+ return str;
+}
+
+uint32 io::readUInt28(ID3_Reader& reader)
+{
+ uint32 val = 0;
+ const unsigned short BITSUSED = 7;
+ const uint32 MAXVAL = MASK(BITSUSED * sizeof(uint32));
+ // For each byte of the first 4 bytes in the string...
+ for (size_t i = 0; i < sizeof(uint32); ++i)
+ {
+ if (reader.atEnd())
+ {
+ break;
+ }
+ // ...append the last 7 bits to the end of the temp integer...
+ val = (val << BITSUSED) | static_cast<uint32>(reader.readChar()) & MASK(BITSUSED);
+ }
+
+ // We should always parse 4 characters
+ return min(val, MAXVAL);
+}
+
+size_t io::writeBENumber(ID3_Writer& writer, uint32 val, size_t len)
+{
+ ID3_Writer::char_type bytes[sizeof(uint32)];
+ ID3_Writer::size_type size = min<ID3_Reader::size_type>(len, sizeof(uint32));
+ renderNumber(bytes, val, size);
+ return writer.writeChars(bytes, size);
+}
+
+size_t io::writeTrailingSpaces(ID3_Writer& writer, String buf, size_t len)
+{
+ ID3_Writer::pos_type beg = writer.getCur();
+ ID3_Writer::size_type strLen = buf.size();
+ ID3_Writer::size_type size = min((unsigned int)len, (unsigned int)strLen);
+ writer.writeChars(buf.data(), size);
+ for (; size < len; ++size)
+ {
+ writer.writeChar('\0');
+ }
+ return writer.getCur() - beg;
+}
+
+size_t io::writeUInt28(ID3_Writer& writer, uint32 val)
+{
+ uchar data[sizeof(uint32)];
+ const unsigned short BITSUSED = 7;
+ const uint32 MAXVAL = MASK(BITSUSED * sizeof(uint32));
+ val = min(val, MAXVAL);
+ // This loop renders the value to the character buffer in reverse order, as
+ // it is easy to extract the last 7 bits of an integer. This is why the
+ // loop shifts the value of the integer by 7 bits for each iteration.
+ for (size_t i = 0; i < sizeof(uint32); ++i)
+ {
+ // Extract the last BITSUSED bits from val and put it in its appropriate
+ // place in the data buffer
+ data[sizeof(uint32) - i - 1] = static_cast<uchar>(val & MASK(BITSUSED));
+
+ // The last BITSUSED bits were extracted from the val. So shift it to the
+ // right by that many bits for the next iteration
+ val >>= BITSUSED;
+ }
+
+ // Should always render 4 bytes
+ return writer.writeChars(data, sizeof(uint32));
+}
+
+size_t io::writeString(ID3_Writer& writer, String data)
+{
+ size_t size = writeText(writer, data);
+ writer.writeChar('\0');
+ return size + 1;
+}
+
+size_t io::writeText(ID3_Writer& writer, String data)
+{
+ ID3_Writer::pos_type beg = writer.getCur();
+ writer.writeChars(data.data(), data.size());
+ return writer.getCur() - beg;
+}
+
+size_t io::writeUnicodeString(ID3_Writer& writer, String data, bool bom)
+{
+ size_t size = writeUnicodeText(writer, data, bom);
+ unicode_t null = NULL_UNICODE;
+ writer.writeChars((const unsigned char*) &null, 2);
+ return size + 2;
+}
+
+size_t io::writeUnicodeText(ID3_Writer& writer, String data, bool bom)
+{
+ ID3_Writer::pos_type beg = writer.getCur();
+ size_t size = (data.size() / 2) * 2;
+ if (size == 0)
+ {
+ return 0;
+ }
+ int is_bom = isBOM(data[0],data[1]);
+ if (!is_bom && bom) {
+ // Write the BOM: 0xFEFF
+ const unsigned char BOMch1 = 0xFE;
+ const unsigned char BOMch2 = 0xFF;
+ writer.writeChars(&BOMch1, 1);
+ writer.writeChars(&BOMch2, 1);
+ }
+ for (size_t i = 0; i < size; i += 2)
+ {
+ if (!i && !bom && is_bom) {
+ // Skip unneeded leading BOM
+ continue;
+ }
+ if (is_bom >= 0) {
+ writer.writeChars(data.data()+i, 1);
+ writer.writeChars(data.data()+i+1, 1);
+ }
+ else {
+ writer.writeChars(data.data()+i+1, 1);
+ writer.writeChars(data.data()+i, 1);
+ }
+ }
+ return writer.getCur() - beg;
+}
+
diff --git a/src/misc_support.cpp b/src/misc_support.cpp
new file mode 100644
index 0000000..475b3d1
--- /dev/null
+++ b/src/misc_support.cpp
@@ -0,0 +1,1240 @@
+// $Id: misc_support.cpp,v 1.39 2002/09/19 10:20:45 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+//#include <ctype.h>
+#include <stdio.h>
+
+#include "misc_support.h"
+//#include "field.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+
+//using namespace dami;
+
+char *ID3_GetString(const ID3_Frame *frame, ID3_FieldID fldName)
+{
+ char *text = NULL;
+// if (NULL != frame)
+ ID3_Field* fld;
+ if (NULL != frame && NULL != (fld = frame->GetField(fldName)))
+ {
+// ID3_Field* fld = frame->GetField(fldName);
+ ID3_TextEnc enc = fld->GetEncoding();
+ fld->SetEncoding(ID3TE_ISO8859_1);
+ size_t nText = fld->Size();
+ text = new char[nText + 1];
+ fld->Get(text, nText + 1);
+ fld->SetEncoding(enc);
+ }
+ return text;
+}
+
+char *ID3_GetString(const ID3_Frame *frame, ID3_FieldID fldName, size_t nIndex)
+{
+ char *text = NULL;
+ if (NULL != frame)
+ {
+ size_t nText = frame->GetField(fldName)->Size();
+ text = new char[nText + 1];
+ frame->GetField(fldName)->Get(text, nText + 1, nIndex);
+ }
+ return text;
+}
+
+void ID3_FreeString(char *str)
+{
+ if(str != NULL)
+ delete [] str;
+}
+
+char *ID3_GetArtist(const ID3_Tag *tag)
+{
+ char *sArtist = NULL;
+ if (NULL == tag)
+ {
+ return sArtist;
+ }
+
+ ID3_Frame *frame = NULL;
+ if ((frame = tag->Find(ID3FID_LEADARTIST)) ||
+ (frame = tag->Find(ID3FID_BAND)) ||
+ (frame = tag->Find(ID3FID_CONDUCTOR)) ||
+ (frame = tag->Find(ID3FID_COMPOSER)))
+ {
+ sArtist = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sArtist;
+}
+
+ID3_Frame* ID3_AddArtist(ID3_Tag *tag, const char *text, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != text && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveArtists(tag);
+ }
+ if (replace ||
+ (tag->Find(ID3FID_LEADARTIST) == NULL &&
+ tag->Find(ID3FID_BAND) == NULL &&
+ tag->Find(ID3FID_CONDUCTOR) == NULL &&
+ tag->Find(ID3FID_COMPOSER) == NULL))
+ {
+ frame = new ID3_Frame(ID3FID_LEADARTIST);
+ if (frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+ return frame;
+}
+
+size_t ID3_RemoveArtists(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_LEADARTIST)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+ while ((frame = tag->Find(ID3FID_BAND)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+ while ((frame = tag->Find(ID3FID_CONDUCTOR)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+ while ((frame = tag->Find(ID3FID_COMPOSER)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetAlbum(const ID3_Tag *tag)
+{
+ char *sAlbum = NULL;
+ if (NULL == tag)
+ {
+ return sAlbum;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_ALBUM);
+ if (frame != NULL)
+ {
+ sAlbum = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sAlbum;
+}
+
+ID3_Frame* ID3_AddAlbum(ID3_Tag *tag, const char *text, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != text && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveAlbums(tag);
+ }
+ if (replace || tag->Find(ID3FID_ALBUM) == NULL)
+ {
+ frame = new ID3_Frame(ID3FID_ALBUM);
+ if (frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+size_t ID3_RemoveAlbums(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_ALBUM)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetTitle(const ID3_Tag *tag)
+{
+ char *sTitle = NULL;
+ if (NULL == tag)
+ {
+ return sTitle;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_TITLE);
+ if (frame != NULL)
+ {
+ sTitle = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sTitle;
+}
+
+ID3_Frame* ID3_AddTitle(ID3_Tag *tag, const char *text, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != text && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveTitles(tag);
+ }
+ if (replace || tag->Find(ID3FID_TITLE) == NULL)
+ {
+ frame = new ID3_Frame(ID3FID_TITLE);
+ if (frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+size_t ID3_RemoveTitles(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_TITLE)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetYear(const ID3_Tag *tag)
+{
+ char *sYear = NULL;
+ if (NULL == tag)
+ {
+ return sYear;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_YEAR);
+ if (frame != NULL)
+ {
+ sYear = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sYear;
+}
+
+ID3_Frame* ID3_AddYear(ID3_Tag *tag, const char *text, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != text && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveYears(tag);
+ }
+ if (replace || tag->Find(ID3FID_YEAR) == NULL)
+ {
+ frame = new ID3_Frame(ID3FID_YEAR);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+size_t ID3_RemoveYears(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_YEAR)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetComment(const ID3_Tag *tag, const char* desc)
+{
+ char *comment = NULL;
+ if (NULL == tag)
+ {
+ return comment;
+ }
+
+ ID3_Frame* frame = NULL;
+ if (desc)
+ {
+ frame = tag->Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, desc);
+ }
+ else
+ {
+ frame = tag->Find(ID3FID_COMMENT);
+ if(frame == tag->Find(ID3FID_COMMENT, ID3FN_DESCRIPTION, STR_V1_COMMENT_DESC))
+ frame = tag->Find(ID3FID_COMMENT);
+ }
+
+ if (frame)
+ comment = ID3_GetString(frame, ID3FN_TEXT);
+ return comment;
+}
+
+ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text, bool replace)
+{
+ return ID3_AddComment(tag, text, "", replace);
+}
+
+ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text,
+ const char *desc, bool replace)
+{
+ return ID3_AddComment(tag, text, desc, "XXX", replace);
+}
+
+ID3_Frame* ID3_AddComment(ID3_Tag *tag, const char *text,
+ const char *desc, const char* lang, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag &&
+ NULL != text &&
+ NULL != desc &&
+ strlen(text) > 0)
+ {
+ bool bAdd = true;
+ if (replace)
+ {
+ ID3_RemoveComments(tag, desc);
+ }
+ else
+ {
+ // See if there is already a comment with this description
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+ ID3_Frame* frame = NULL;
+ while ((frame = iter->GetNext()) != NULL)
+ {
+ if (frame->GetID() == ID3FID_COMMENT)
+ {
+ char *tmp_desc = ID3_GetString(frame, ID3FN_DESCRIPTION);
+ if (strcmp(tmp_desc, desc) == 0)
+ {
+ bAdd = false;
+ }
+ delete [] tmp_desc;
+ if (!bAdd)
+ {
+ break;
+ }
+ }
+ }
+ delete iter;
+ }
+ if (bAdd)
+ {
+ frame = new ID3_Frame(ID3FID_COMMENT);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang);
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+ return frame;
+}
+
+// Remove all comments with the given description (remove all comments if
+// desc is NULL)
+size_t ID3_RemoveComments(ID3_Tag *tag, const char *desc)
+{
+ size_t num_removed = 0;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+ ID3_Frame* frame = NULL;
+ while ((frame = iter->GetNext()) != NULL)
+ {
+ if (frame->GetID() == ID3FID_COMMENT)
+ {
+ bool remove = false;
+ // A null description means remove all comments
+ if (NULL == desc)
+ {
+ remove = true;
+ }
+ else
+ {
+ // See if the description we have matches the description of the
+ // current comment. If so, set the "remove the comment" flag to true.
+ char *tmp_desc = ID3_GetString(frame, ID3FN_DESCRIPTION);
+ remove = (strcmp(tmp_desc, desc) == 0);
+ delete [] tmp_desc;
+ }
+ if (remove)
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+ }
+ }
+ delete iter;
+
+ return num_removed;
+}
+
+char *ID3_GetTrack(const ID3_Tag *tag)
+{
+ char *sTrack = NULL;
+ if (NULL == tag)
+ {
+ return sTrack;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_TRACKNUM);
+ if (frame != NULL)
+ {
+ sTrack = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sTrack;
+}
+
+size_t ID3_GetTrackNum(const ID3_Tag *tag)
+{
+ char *sTrack = ID3_GetTrack(tag);
+ size_t nTrack = 0;
+ if (NULL != sTrack)
+ {
+ nTrack = atoi(sTrack);
+ delete [] sTrack;
+ }
+ return nTrack;
+}
+
+ID3_Frame* ID3_AddTrack(ID3_Tag *tag, uchar trk, uchar ttl, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && trk > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveTracks(tag);
+ }
+ if (replace || NULL == tag->Find(ID3FID_TRACKNUM))
+ {
+ frame = new ID3_Frame(ID3FID_TRACKNUM);
+ if (frame)
+ {
+ char *sTrack = NULL;
+ if (0 == ttl)
+ {
+ sTrack = new char[4];
+ sprintf(sTrack, "%lu", (luint) trk);
+ }
+ else
+ {
+ sTrack = new char[8];
+ sprintf(sTrack, "%lu/%lu", (luint) trk, (luint) ttl);
+ }
+
+ frame->GetField(ID3FN_TEXT)->Set(sTrack);
+ tag->AttachFrame(frame);
+
+ delete [] sTrack;
+ }
+ }
+ }
+
+ return frame;
+}
+
+//following routine courtesy of John George
+int ID3_GetPictureData(const ID3_Tag *tag, const char *TempPicPath)
+{
+ if (NULL == tag)
+ return 0;
+ else
+ {
+ ID3_Frame* frame = NULL;
+ frame = tag->Find(ID3FID_PICTURE);
+ if (frame != NULL)
+ {
+ ID3_Field* myField = frame->GetField(ID3FN_DATA);
+ if (myField != NULL)
+ {
+ myField->ToFile(TempPicPath);
+ return (int)myField->Size();
+ }
+ else return 0;
+ }
+ else return 0;
+ }
+}
+
+//following routine courtesy of John George
+char* ID3_GetPictureMimeType(const ID3_Tag *tag)
+{
+ char* sPicMimetype = NULL;
+ if (NULL == tag)
+ return sPicMimetype;
+
+ ID3_Frame* frame = NULL;
+ frame = tag->Find(ID3FID_PICTURE);
+ if (frame != NULL)
+ {
+ sPicMimetype = ID3_GetString(frame, ID3FN_MIMETYPE);
+ }
+ return sPicMimetype;
+}
+
+//following routine courtesy of John George
+bool ID3_HasPicture(const ID3_Tag* tag)
+{
+ if (NULL == tag)
+ return false;
+ else
+ {
+ ID3_Frame* frame = tag->Find(ID3FID_PICTURE);
+ if (frame != NULL)
+ {
+ ID3_Field* myField = frame->GetField(ID3FN_DATA);
+ if (myField != NULL)
+ return true;
+ else
+ return false;
+ }
+ else return false;
+ }
+}
+
+//following routine courtesy of John George
+ID3_Frame* ID3_AddPicture(ID3_Tag* tag, const char* TempPicPath, const char* MimeType, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag )
+ {
+ if (replace)
+ ID3_RemovePictures(tag);
+ if (replace || NULL == tag->Find(ID3FID_PICTURE))
+ {
+ frame = new ID3_Frame(ID3FID_PICTURE);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_DATA)->FromFile(TempPicPath);
+ frame->GetField(ID3FN_MIMETYPE)->Set(MimeType);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+ return frame;
+}
+
+//following routine courtesy of John George
+size_t ID3_RemovePictures(ID3_Tag* tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame* frame = NULL;
+
+ if (NULL == tag)
+ return num_removed;
+
+ while ((frame = tag->Find(ID3FID_PICTURE)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+ return num_removed;
+}
+
+//following routine courtesy of John George
+size_t ID3_RemovePictureType(ID3_Tag* tag, ID3_PictureType pictype)
+{
+ size_t bremoved = 0;
+ ID3_Frame* frame = NULL;
+
+ if (NULL == tag)
+ return bremoved;
+
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext()))
+ {
+ if (frame->GetID() == ID3FID_PICTURE)
+ {
+ if (frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (NULL != frame)
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ bremoved = 1;
+ }
+ return bremoved;
+}
+
+//following routine courtesy of John George
+ID3_Frame* ID3_AddPicture(ID3_Tag *tag, const char *TempPicPath, const char *MimeType, ID3_PictureType pictype, const char* Description, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag )
+ {
+ if (replace)
+ ID3_RemovePictureType(tag, pictype);
+ if (replace || NULL == tag->Find(ID3FID_PICTURE))
+ {
+ frame = new ID3_Frame(ID3FID_PICTURE);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_DATA)->FromFile(TempPicPath);
+ frame->GetField(ID3FN_MIMETYPE)->Set(MimeType);
+ frame->GetField(ID3FN_PICTURETYPE)->Set((uint32)pictype);
+ frame->GetField(ID3FN_DESCRIPTION)->Set(Description);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+ return frame;
+}
+
+//following routine courtesy of John George
+size_t ID3_GetPictureDataOfPicType(ID3_Tag* tag, const char* TempPicPath, ID3_PictureType pictype)
+{
+ if (NULL == tag)
+ return 0;
+ else
+ {
+ ID3_Frame* frame = NULL;
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext() ))
+ {
+ if(frame->GetID() == ID3FID_PICTURE)
+ {
+ if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (frame != NULL)
+ {
+ ID3_Field* myField = frame->GetField(ID3FN_DATA);
+ if (myField != NULL)
+ {
+ myField->ToFile(TempPicPath);
+ return (size_t)myField->Size();
+ }
+ else return 0;
+ }
+ else return 0;
+ }
+}
+
+size_t ID3_GetPictureDataOfPicType(ID3_Tag* tag, const uchar*& data, ID3_PictureType pictype)
+{
+ if (NULL == tag)
+ return 0;
+ else
+ {
+ ID3_Frame* frame = NULL;
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext() ))
+ {
+ if(frame->GetID() == ID3FID_PICTURE)
+ {
+ if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (frame != NULL)
+ {
+ ID3_Field* myField = frame->GetField(ID3FN_DATA);
+ if (myField != NULL)
+ {
+ data = myField->GetRawBinary();
+ return (size_t)myField->BinSize();
+ }
+ else return 0;
+ }
+ else return 0;
+ }
+}
+
+size_t ID3_GetPictureDataOfPicTypeAndStartPosition(ID3_Tag* tag, const uchar*& data, size_t& start, ID3_PictureType pictype)
+{
+ start = 0;
+ if (NULL == tag)
+ return 0;
+ else
+ {
+ ID3_Frame* frame = NULL;
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext() ))
+ {
+ if(frame->GetID() == ID3FID_PICTURE)
+ {
+ if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (frame != NULL)
+ {
+ ID3_Field* myField = frame->GetField(ID3FN_DATA);
+ if (myField != NULL)
+ {
+ data = myField->GetRawBinary();
+ start = myField->GetBinaryStartPosition();
+ return (size_t)myField->BinSize();
+ }
+ else return 0;
+ }
+ else return 0;
+ }
+}
+
+//following routine courtesy of John George
+char* ID3_GetMimeTypeOfPicType(ID3_Tag* tag, ID3_PictureType pictype)
+{
+ char* sPicMimetype = NULL;
+ if (NULL == tag)
+ return sPicMimetype;
+
+ ID3_Frame* frame = NULL;
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext()))
+ {
+ if(frame->GetID() == ID3FID_PICTURE)
+ {
+ if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (frame != NULL)
+ {
+ sPicMimetype = ID3_GetString(frame, ID3FN_MIMETYPE);
+ }
+ return sPicMimetype;
+}
+
+//following routine courtesy of John George
+char* ID3_GetDescriptionOfPicType(ID3_Tag* tag, ID3_PictureType pictype)
+{
+ char* sPicDescription = NULL;
+ if (NULL == tag)
+ return sPicDescription;
+
+ ID3_Frame* frame = NULL;
+ ID3_Tag::Iterator* iter = tag->CreateIterator();
+
+ while (NULL != (frame = iter->GetNext()))
+ {
+ if(frame->GetID() == ID3FID_PICTURE)
+ {
+ if(frame->GetField(ID3FN_PICTURETYPE)->Get() == (uint32)pictype)
+ break;
+ }
+ }
+ delete iter;
+
+ if (frame != NULL)
+ {
+ sPicDescription = ID3_GetString(frame, ID3FN_DESCRIPTION);
+ }
+ return sPicDescription;
+}
+
+
+size_t ID3_RemoveTracks(ID3_Tag* tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame* frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_TRACKNUM)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetGenre(const ID3_Tag *tag)
+{
+ char *sGenre = NULL;
+ if (NULL == tag)
+ {
+ return sGenre;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_CONTENTTYPE);
+ if (frame != NULL)
+ {
+ sGenre = ID3_GetString(frame, ID3FN_TEXT);
+ }
+
+ return sGenre;
+}
+
+size_t ID3_GetGenreNum(const ID3_Tag *tag)
+{
+ char *sGenre = ID3_GetGenre(tag);
+ size_t ulGenre = 0xFF;
+ if (NULL == sGenre)
+ {
+ return ulGenre;
+ }
+
+ // If the genre string begins with "(ddd)", where "ddd" is a number, then
+ // "ddd" is the genre number---get it
+ if (sGenre[0] == '(')
+ {
+ char *pCur = &sGenre[1];
+ while (isdigit(*pCur))
+ {
+ pCur++;
+ }
+ if (*pCur == ')')
+ {
+ // if the genre number is greater than 255, its invalid.
+ ulGenre = dami::min(0xFF, atoi(&sGenre[1]));
+ }
+ }
+
+ delete [] sGenre;
+ return ulGenre;
+}
+
+//following routine courtesy of John George
+ID3_Frame* ID3_AddGenre(ID3_Tag* tag, const char* genre, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != genre && strlen(genre) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveGenres(tag);
+ }
+ if (replace || NULL == tag->Find(ID3FID_CONTENTTYPE))
+ {
+ frame = new ID3_Frame(ID3FID_CONTENTTYPE);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(genre);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+ID3_Frame* ID3_AddGenre(ID3_Tag *tag, size_t genreNum, bool replace)
+{
+ if(0xFF != genreNum)
+ {
+ char sGenre[6];
+ sprintf(sGenre, "(%lu)", (luint) genreNum);
+ return(ID3_AddGenre(tag, sGenre, replace));
+ }
+ else
+ {
+ return(NULL);
+ }
+}
+
+size_t ID3_RemoveGenres(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_CONTENTTYPE)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetLyrics(const ID3_Tag *tag)
+{
+ char *sLyrics = NULL;
+ if (NULL == tag)
+ {
+ return sLyrics;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_UNSYNCEDLYRICS);
+ if (frame != NULL)
+ {
+ sLyrics = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sLyrics;
+}
+
+ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, bool replace)
+{
+ return ID3_AddLyrics(tag, text, "", replace);
+}
+
+ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
+ bool replace)
+{
+ return ID3_AddLyrics(tag, text, desc, "XXX", replace);
+}
+
+ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
+ const char* lang, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveLyrics(tag);
+ }
+ if (replace || tag->Find(ID3FID_UNSYNCEDLYRICS) == NULL)
+ {
+ frame = new ID3_Frame(ID3FID_UNSYNCEDLYRICS);
+ if (NULL != frame)
+ {
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang);
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+size_t ID3_RemoveLyrics(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_UNSYNCEDLYRICS)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+char *ID3_GetLyricist(const ID3_Tag *tag)
+{
+ char *sLyricist = NULL;
+ if (NULL == tag)
+ {
+ return sLyricist;
+ }
+
+ ID3_Frame *frame = tag->Find(ID3FID_LYRICIST);
+ if (frame != NULL)
+ {
+ sLyricist = ID3_GetString(frame, ID3FN_TEXT);
+ }
+ return sLyricist;
+}
+
+ID3_Frame* ID3_AddLyricist(ID3_Tag *tag, const char *text, bool replace)
+{
+ ID3_Frame* frame = NULL;
+ if (NULL != tag && NULL != text && strlen(text) > 0)
+ {
+ if (replace)
+ {
+ ID3_RemoveLyricist(tag);
+ }
+ if (replace || (tag->Find(ID3FID_LYRICIST) == NULL))
+ {
+ frame = new ID3_Frame(ID3FID_LYRICIST);
+ if (frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text);
+ tag->AttachFrame(frame);
+ }
+ }
+ }
+
+ return frame;
+}
+
+size_t ID3_RemoveLyricist(ID3_Tag *tag)
+{
+ size_t num_removed = 0;
+ ID3_Frame *frame = NULL;
+
+ if (NULL == tag)
+ {
+ return num_removed;
+ }
+
+ while ((frame = tag->Find(ID3FID_LYRICIST)))
+ {
+ frame = tag->RemoveFrame(frame);
+ delete frame;
+ num_removed++;
+ }
+
+ return num_removed;
+}
+
+ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
+ ID3_TimeStampFormat format, bool replace)
+{
+ return ID3_AddSyncLyrics(tag, data, datasize, format, "", replace);
+}
+
+ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
+ ID3_TimeStampFormat format, const char *desc,
+ bool replace)
+{
+ return ID3_AddSyncLyrics(tag, data, datasize, format, desc, "XXX", replace);
+}
+
+ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
+ ID3_TimeStampFormat format, const char *desc,
+ const char *lang, bool replace)
+{
+ return ID3_AddSyncLyrics(tag, data, datasize, format, desc, lang,
+ ID3CT_LYRICS, replace);
+}
+
+ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
+ ID3_TimeStampFormat format, const char *desc,
+ const char *lang, ID3_ContentType type,
+ bool replace)
+{
+ ID3_Frame* frame = NULL;
+ // language and descriptor should be mandatory
+ if ((NULL == lang) || (NULL == desc))
+ {
+ return NULL;
+ }
+
+ // check if a SYLT frame of this language or descriptor already exists
+ ID3_Frame* frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
+ if (!frmExist)
+ {
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
+ }
+
+ if (NULL != tag && NULL != data)
+ {
+ if (replace && frmExist)
+ {
+ frmExist = tag->RemoveFrame (frmExist);
+ delete frmExist;
+ frmExist = NULL;
+ }
+
+ // if the frame still exist, cannot continue
+ if (frmExist)
+ {
+ return NULL;
+ }
+
+ ID3_Frame* frame = new ID3_Frame(ID3FID_SYNCEDLYRICS);
+
+ frame->GetField(ID3FN_LANGUAGE)->Set(lang);
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
+ frame->GetField(ID3FN_TIMESTAMPFORMAT)->Set(format);
+ frame->GetField(ID3FN_CONTENTTYPE)->Set(type);
+ frame->GetField(ID3FN_DATA)->Set(data, datasize);
+ tag->AttachFrame(frame);
+ }
+
+ return frame;
+}
+
+ID3_Frame *ID3_GetSyncLyricsInfo(const ID3_Tag *tag, const char *desc,
+ const char *lang,
+ ID3_TimeStampFormat& format,
+ ID3_ContentType& type, size_t& size)
+{
+ // check if a SYLT frame of this language or descriptor exists
+ ID3_Frame* frmExist = NULL;
+ if (NULL != lang)
+ {
+ // search through language
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
+ }
+ else if (NULL != desc)
+ {
+ // search through descriptor
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
+ }
+ else
+ {
+ // both language and description not specified, search the first SYLT frame
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
+ }
+
+ if (!frmExist)
+ {
+ return NULL;
+ }
+
+ // get the lyrics time stamp format
+ format = static_cast<ID3_TimeStampFormat>(frmExist->GetField(ID3FN_TIMESTAMPFORMAT)->Get ());
+
+ // get the lyrics content type
+ type = static_cast<ID3_ContentType>(frmExist->GetField(ID3FN_CONTENTTYPE)->Get ());
+
+ // get the lyrics size
+ size = frmExist->GetField (ID3FN_DATA)->Size ();
+
+ // return the frame pointer for further uses
+ return frmExist;
+}
+
+ID3_Frame *ID3_GetSyncLyrics(const ID3_Tag* tag, const char* lang,
+ const char* desc, const uchar* &pData, size_t& size)
+{
+ // check if a SYLT frame of this language or descriptor exists
+ ID3_Frame* frmExist = NULL;
+ if (NULL != lang)
+ {
+ // search through language
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
+ }
+ else if (NULL != desc)
+ {
+ // search through descriptor
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
+ }
+ else
+ {
+ // both language and description not specified, search the first SYLT frame
+ frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
+ }
+
+ if (NULL == frmExist)
+ {
+ return NULL;
+ }
+
+ // get the lyrics size
+ size = dami::min(size, frmExist->GetField(ID3FN_DATA)->Size());
+
+ // get the lyrics data
+ pData = frmExist->GetField (ID3FN_DATA)->GetRawBinary();
+
+ // return the frame pointer for further uses
+ return frmExist;
+}
+
diff --git a/src/mp3_header.h b/src/mp3_header.h
new file mode 100644
index 0000000..b744c9e
--- /dev/null
+++ b/src/mp3_header.h
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+// $Id: mp3_header.h,v 1.4 2002/11/02 17:48:51 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _MP3_HEADER_H_
+#define _MP3_HEADER_H_
+
+#include "io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+
+class ID3_TagImpl;
+class Mp3Info
+{
+public:
+ friend class ID3_TagImpl;
+
+ Mp3Info() { _mp3_header_output = new Mp3_Headerinfo; };
+ ~Mp3Info() { this->Clean(); };
+ void Clean();
+
+ const Mp3_Headerinfo* GetMp3HeaderInfo() const { return _mp3_header_output; };
+ bool Parse(ID3_Reader&, size_t mp3size);
+
+ Mpeg_Layers Layer() const { return _mp3_header_output->layer; };
+ Mpeg_Version Version() const { return _mp3_header_output->version; };
+ MP3_BitRates Bitrate() const { return _mp3_header_output->bitrate; };
+ Mp3_ChannelMode ChannelMode() const { return _mp3_header_output->channelmode; };
+ Mp3_ModeExt ModeExt() const { return _mp3_header_output->modeext; };
+ Mp3_Emphasis Emphasis() const { return _mp3_header_output->emphasis; };
+ Mp3_Crc Crc() const { return _mp3_header_output->crc; };
+ uint32 VbrBitrate() const { return _mp3_header_output->vbr_bitrate; };
+ uint32 Frequency() const { return _mp3_header_output->frequency; };
+ uint32 Framesize() const { return _mp3_header_output->framesize; };
+ uint32 Frames() const { return _mp3_header_output->frames; };
+ bool Private() const { return _mp3_header_output->privatebit; };
+ bool Copyrighted() const { return _mp3_header_output->copyrighted; };
+ bool Original() const { return _mp3_header_output->original; };
+ uint32 Seconds() const { return _mp3_header_output->time; };
+
+private:
+
+#ifdef _LINUX
+#pragma pack(push, 1) /* required pragma syntax on LINUX */
+#else
+#pragma pack(push) /* push current alignment to stack */
+#pragma pack(1) /* set alignment to 1 byte boundary */
+#endif
+
+ struct _mp3_header_internal //http://www.mp3-tech.org/programmer/frame_header.html
+ {
+//byte 1
+ unsigned char frame_sync_a : 8; /* all bits should be set */
+//byte 2
+#ifdef __BIG_ENDIAN__
+ unsigned char frame_sync_b : 3; /* all bits should be set */
+ unsigned char id : 2;
+ unsigned char layer : 2;
+ unsigned char protection_bit : 1;
+#else
+ unsigned char protection_bit : 1;
+ unsigned char layer : 2;
+ unsigned char id : 2;
+ unsigned char frame_sync_b : 3; /* all bits should be set */
+#endif
+//byte 3
+#ifdef __BIG_ENDIAN__
+ unsigned char bitrate_index : 4;
+ unsigned char frequency : 2;
+ unsigned char padding_bit : 1;
+ unsigned char private_bit : 1;
+#else
+ unsigned char private_bit : 1;
+ unsigned char padding_bit : 1;
+ unsigned char frequency : 2;
+ unsigned char bitrate_index : 4;
+#endif
+//byte 4
+#ifdef __BIG_ENDIAN__
+ unsigned char mode : 2;
+ unsigned char mode_ext : 2;//only used in joint stereo
+ unsigned char copyright : 1;
+ unsigned char original : 1;
+ unsigned char emphasis : 2;
+#else
+ unsigned char emphasis : 2;
+ unsigned char original : 1;
+ unsigned char copyright : 1;
+ unsigned char mode_ext : 2;//only used in joint stereo
+ unsigned char mode : 2;
+#endif
+ };
+#pragma pack(pop) /* restore original alignment from stack */
+
+ Mp3_Headerinfo* _mp3_header_output;
+}; //Info
+
+#endif /* _MP3_HEADER_H_ */
+
diff --git a/src/mp3_parse.cpp b/src/mp3_parse.cpp
new file mode 100644
index 0000000..aba95ff
--- /dev/null
+++ b/src/mp3_parse.cpp
@@ -0,0 +1,571 @@
+// -*- C++ -*-
+// $Id: mp3_parse.cpp,v 1.6 2002/11/02 17:48:51 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 2002, Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "mp3_header.h"
+
+#define FRAMES_FLAG 0x0001
+#define BYTES_FLAG 0x0002
+#define TOC_FLAG 0x0004
+#define SCALE_FLAG 0x0008
+
+static int ExtractI4(unsigned char *buf)
+{
+ int x;
+ // big endian extract
+
+ x = buf[0];
+ x <<= 8;
+ x |= buf[1];
+ x <<= 8;
+ x |= buf[2];
+ x <<= 8;
+ x |= buf[3];
+
+ return x;
+}
+
+uint32 fto_nearest_i(float f)
+{
+ uint32 i;
+
+ i = (uint32)f;
+ if (i < f)
+ {
+ f -= i;
+ if (f >= 0.5)
+ return i+1;
+ else
+ return i;
+ }
+ else
+ return i;
+}
+
+uint16 calcCRC(char *pFrame, size_t audiodatasize)
+{
+ size_t icounter;
+ int tmpchar, crcmask, tmpi;
+ uint16 crc = 0xffff;
+
+ for (icounter = 2; icounter < audiodatasize; ++icounter)
+ {
+ if (icounter != 4 && icounter != 5) //skip the 2 chars of the crc itself
+ {
+ crcmask = 1 << 8;
+ tmpchar = pFrame[icounter];
+ while (crcmask >>= 1)
+ {
+ tmpi = crc & 0x8000;
+ crc <<= 1;
+ if (!tmpi ^ !(tmpchar & crcmask))
+ crc ^= 0x8005;
+ }
+ }
+ }
+ crc &= 0xffff;
+ return crc;
+}
+
+void Mp3Info::Clean()
+{
+ if (_mp3_header_output != NULL)
+ delete _mp3_header_output;
+ _mp3_header_output = NULL;
+}
+
+using namespace dami;
+
+bool Mp3Info::Parse(ID3_Reader& reader, size_t mp3size)
+{
+ MP3_BitRates _mp3_bitrates[2][3][16] =
+ {
+ {
+ { //MPEG 1, LAYER I
+ MP3BITRATE_NONE,
+ MP3BITRATE_32K,
+ MP3BITRATE_64K,
+ MP3BITRATE_96K,
+ MP3BITRATE_128K,
+ MP3BITRATE_160K,
+ MP3BITRATE_192K,
+ MP3BITRATE_224K,
+ MP3BITRATE_256K,
+ MP3BITRATE_288K,
+ MP3BITRATE_320K,
+ MP3BITRATE_352K,
+ MP3BITRATE_384K,
+ MP3BITRATE_416K,
+ MP3BITRATE_448K,
+ MP3BITRATE_FALSE
+ },
+ { //MPEG 1, LAYER II
+ MP3BITRATE_NONE,
+ MP3BITRATE_32K,
+ MP3BITRATE_48K,
+ MP3BITRATE_56K,
+ MP3BITRATE_64K,
+ MP3BITRATE_80K,
+ MP3BITRATE_96K,
+ MP3BITRATE_112K,
+ MP3BITRATE_128K,
+ MP3BITRATE_160K,
+ MP3BITRATE_192K,
+ MP3BITRATE_224K,
+ MP3BITRATE_256K,
+ MP3BITRATE_320K,
+ MP3BITRATE_384K,
+ MP3BITRATE_FALSE
+ },
+ { //MPEG 1, LAYER III
+ MP3BITRATE_NONE,
+ MP3BITRATE_32K,
+ MP3BITRATE_40K,
+ MP3BITRATE_48K,
+ MP3BITRATE_56K,
+ MP3BITRATE_64K,
+ MP3BITRATE_80K,
+ MP3BITRATE_96K,
+ MP3BITRATE_112K,
+ MP3BITRATE_128K,
+ MP3BITRATE_160K,
+ MP3BITRATE_192K,
+ MP3BITRATE_224K,
+ MP3BITRATE_256K,
+ MP3BITRATE_320K,
+ MP3BITRATE_FALSE
+ }
+ },
+ {
+ { //MPEG 2 or 2.5, LAYER I
+ MP3BITRATE_NONE,
+ MP3BITRATE_32K,
+ MP3BITRATE_48K,
+ MP3BITRATE_56K,
+ MP3BITRATE_64K,
+ MP3BITRATE_80K,
+ MP3BITRATE_96K,
+ MP3BITRATE_112K,
+ MP3BITRATE_128K,
+ MP3BITRATE_144K,
+ MP3BITRATE_160K,
+ MP3BITRATE_176K,
+ MP3BITRATE_192K,
+ MP3BITRATE_224K,
+ MP3BITRATE_256K,
+ MP3BITRATE_FALSE
+ },
+ { //MPEG 2 or 2.5, LAYER II
+ MP3BITRATE_NONE,
+ MP3BITRATE_8K,
+ MP3BITRATE_16K,
+ MP3BITRATE_24K,
+ MP3BITRATE_32K,
+ MP3BITRATE_40K,
+ MP3BITRATE_48K,
+ MP3BITRATE_56K,
+ MP3BITRATE_64K,
+ MP3BITRATE_80K,
+ MP3BITRATE_96K,
+ MP3BITRATE_112K,
+ MP3BITRATE_128K,
+ MP3BITRATE_144K,
+ MP3BITRATE_160K,
+ MP3BITRATE_FALSE
+ },
+ { //MPEG 2 or 2.5, LAYER III
+ MP3BITRATE_NONE,
+ MP3BITRATE_8K,
+ MP3BITRATE_16K,
+ MP3BITRATE_24K,
+ MP3BITRATE_32K,
+ MP3BITRATE_40K,
+ MP3BITRATE_48K,
+ MP3BITRATE_56K,
+ MP3BITRATE_64K,
+ MP3BITRATE_80K,
+ MP3BITRATE_96K,
+ MP3BITRATE_112K,
+ MP3BITRATE_128K,
+ MP3BITRATE_144K,
+ MP3BITRATE_160K,
+ MP3BITRATE_FALSE
+ }
+ }
+ };
+
+ Mp3_Frequencies _mp3_frequencies[4][4] =
+ {
+ { MP3FREQUENCIES_11025HZ, MP3FREQUENCIES_12000HZ, MP3FREQUENCIES_8000HZ,MP3FREQUENCIES_Reserved }, //MPEGVERSION_2_5
+ { MP3FREQUENCIES_Reserved, MP3FREQUENCIES_Reserved, MP3FREQUENCIES_Reserved, MP3FREQUENCIES_Reserved}, //MPEGVERSION_Reserved
+ { MP3FREQUENCIES_22050HZ, MP3FREQUENCIES_24000HZ, MP3FREQUENCIES_16000HZ, MP3FREQUENCIES_Reserved }, //MPEGVERSION_2
+ { MP3FREQUENCIES_44100HZ, MP3FREQUENCIES_48000HZ, MP3FREQUENCIES_32000HZ, MP3FREQUENCIES_Reserved } //MPEGVERSION_1
+ };
+
+ _mp3_header_internal *_tmpheader;
+
+ const size_t HEADERSIZE = 4;//
+ char buf[HEADERSIZE+1]; //+1 to hold the \0 char
+ ID3_Reader::pos_type beg = reader.getCur() ;
+ ID3_Reader::pos_type end = beg + HEADERSIZE ;
+ reader.setCur(beg);
+ int bitrate_index;
+
+ _mp3_header_output->layer = MPEGLAYER_FALSE;
+ _mp3_header_output->version = MPEGVERSION_FALSE;
+ _mp3_header_output->bitrate = MP3BITRATE_FALSE;
+ _mp3_header_output->channelmode = MP3CHANNELMODE_FALSE;
+ _mp3_header_output->modeext = MP3MODEEXT_FALSE;
+ _mp3_header_output->emphasis = MP3EMPHASIS_FALSE;
+ _mp3_header_output->crc = MP3CRC_MISMATCH;
+ _mp3_header_output->frequency = 0;
+ _mp3_header_output->framesize = 0;
+ _mp3_header_output->frames = 0;
+ _mp3_header_output->time = 0;
+ _mp3_header_output->vbr_bitrate = 0;
+
+ reader.readChars(buf, HEADERSIZE);
+ buf[HEADERSIZE]='\0';
+ // copy the pointer to the struct
+
+ if (((buf[0] & 0xFF) != 0xFF) || ((buf[1] & 0xE0) != 0xE0)) //first 11 bits should be 1
+ {
+ this->Clean();
+ return false;
+ }
+
+ _tmpheader = reinterpret_cast<_mp3_header_internal *>(buf);
+
+ bitrate_index = 0;
+ switch (_tmpheader->id)
+ {
+ case 3:
+ _mp3_header_output->version = MPEGVERSION_1;
+ bitrate_index = 0;
+ break;
+ case 2:
+ _mp3_header_output->version = MPEGVERSION_2;
+ bitrate_index = 1;
+ break;
+ case 1:
+ this->Clean();
+ return false; //wouldn't know how to handle it
+ break;
+ case 0:
+ _mp3_header_output->version = MPEGVERSION_2_5;
+ bitrate_index = 1;
+ break;
+ default:
+ this->Clean();
+ return false;
+ break;
+ };
+
+ switch (_tmpheader->layer)
+ {
+ case 3:
+ _mp3_header_output->layer = MPEGLAYER_I;
+ break;
+ case 2:
+ _mp3_header_output->layer = MPEGLAYER_II;
+ break;
+ case 1:
+ _mp3_header_output->layer = MPEGLAYER_III;
+ break;
+ case 0:
+ this->Clean();
+ return false; //wouldn't know how to handle it
+ break;
+ default:
+ this->Clean();
+ return false; //how can two unsigned bits be something else??
+ break;
+ };
+
+ // mpegversion, layer and bitrate are all valid
+ _mp3_header_output->bitrate = _mp3_bitrates[bitrate_index][3-_tmpheader->layer][_tmpheader->bitrate_index];
+ if (_mp3_header_output->bitrate == MP3BITRATE_FALSE)
+ {
+ this->Clean();
+ return false;
+ }
+ _mp3_header_output->frequency = _mp3_frequencies[_tmpheader->id][_tmpheader->frequency];
+ if (_mp3_header_output->frequency == MP3FREQUENCIES_Reserved)
+ {
+ this->Clean();
+ return false;
+ }
+
+ _mp3_header_output->privatebit = (bool)_tmpheader->private_bit;
+ _mp3_header_output->copyrighted = (bool)_tmpheader->copyright;
+ _mp3_header_output->original = (bool)_tmpheader->original;
+ _mp3_header_output->crc = (Mp3_Crc)!(bool)_tmpheader->protection_bit;
+
+ switch (_tmpheader->mode)
+ {
+ case 3:
+ _mp3_header_output->channelmode = MP3CHANNELMODE_SINGLE_CHANNEL;
+ break;
+ case 2:
+ _mp3_header_output->channelmode = MP3CHANNELMODE_DUAL_CHANNEL;
+ break;
+ case 1:
+ _mp3_header_output->channelmode = MP3CHANNELMODE_JOINT_STEREO;
+ break;
+ case 0:
+ _mp3_header_output->channelmode = MP3CHANNELMODE_STEREO;
+ break;
+ default:
+ this->Clean();
+ return false; //wouldn't know how to handle it
+ break;
+ }
+
+ if (_mp3_header_output->channelmode == MP3CHANNELMODE_JOINT_STEREO)
+ {
+ // these have a different meaning for different layers, better give them a generic name in the enum
+ switch (_tmpheader->mode_ext)
+ {
+ case 3:
+ _mp3_header_output->modeext = MP3MODEEXT_3;
+ break;
+ case 2:
+ _mp3_header_output->modeext = MP3MODEEXT_2;
+ break;
+ case 1:
+ _mp3_header_output->modeext = MP3MODEEXT_1;
+ break;
+ case 0:
+ _mp3_header_output->modeext = MP3MODEEXT_0;
+ break;
+ default:
+ this->Clean();
+ return false; //wouldn't know how to handle it
+ break;
+ }
+ }
+ else //it's valid to have a valid false one in this case, since it's only used with joint stereo
+ _mp3_header_output->modeext = MP3MODEEXT_FALSE;
+
+ switch (_tmpheader->emphasis)
+ {
+ case 3:
+ _mp3_header_output->emphasis = MP3EMPHASIS_CCIT_J17;
+ break;
+ case 2:
+ _mp3_header_output->emphasis = MP3EMPHASIS_Reserved;
+ break;
+ case 1:
+ _mp3_header_output->emphasis = MP3EMPHASIS_50_15MS;
+ break;
+ case 0:
+ _mp3_header_output->emphasis = MP3EMPHASIS_NONE;
+ break;
+ default:
+ this->Clean();
+ return false; //wouldn't know how to handle it
+ break;
+ }
+
+//http://www.mp3-tech.org/programmer/frame_header.html
+ if (_mp3_header_output->bitrate != MP3BITRATE_NONE && _mp3_header_output->frequency > 0)
+ {
+
+ switch(_mp3_header_output->layer)
+ {
+ case MPEGLAYER_I: // Layer 1
+ _mp3_header_output->framesize = 4 * (12 * _mp3_header_output->bitrate / _mp3_header_output->frequency + (_tmpheader->padding_bit ? 1 : 0));
+ break;
+ case MPEGLAYER_II: // Layer 2
+ _mp3_header_output->framesize = 144 * _mp3_header_output->bitrate / _mp3_header_output->frequency + (_tmpheader->padding_bit ? 1 : 0);
+ break;
+ case MPEGLAYER_III: // Layer 3
+ // See http://www.hydrogenaudio.org/forums/lofiversion/index.php/t43172.html
+ // and http://minnie.tuhs.org/pipermail/mp3encoder/2003-February/005598.html
+ // on discussion about the frame size calculation. --DmitryD
+ if(_mp3_header_output->version == MPEGVERSION_1)
+ _mp3_header_output->framesize = 144 * _mp3_header_output->bitrate / _mp3_header_output->frequency + (_tmpheader->padding_bit ? 1 : 0); //Mpeg1
+ else
+ _mp3_header_output->framesize = 72 * _mp3_header_output->bitrate / _mp3_header_output->frequency + (_tmpheader->padding_bit ? 1 : 0); //Mpeg2 + Mpeg2.5
+ break;
+ }
+// if (_mp3_header_output->layer == MPEGLAYER_I)
+// _mp3_header_output->framesize = fto_nearest_i((float)((48 * (float)_mp3_header_output->bitrate) / _mp3_header_output->frequency)) + (_tmpheader->padding_bit ? 4 : 0);
+// else
+// _mp3_header_output->framesize = fto_nearest_i((float)((144 * (float)_mp3_header_output->bitrate) / _mp3_header_output->frequency)) + (_tmpheader->padding_bit ? 1 : 0);
+ }
+ else
+ _mp3_header_output->framesize = 0; //unable to determine
+
+ const size_t CRCSIZE = 2;
+ size_t sideinfo_len;
+
+ if (_mp3_header_output->version == MPEGVERSION_1) /* MPEG 1 */
+ sideinfo_len = (_mp3_header_output->channelmode == MP3CHANNELMODE_SINGLE_CHANNEL) ? 4 + 17 : 4 + 32;
+ else /* MPEG 2 */
+ sideinfo_len = (_mp3_header_output->channelmode == MP3CHANNELMODE_SINGLE_CHANNEL) ? 4 + 9 : 4 + 17;
+
+ int vbr_header_offest = beg + sideinfo_len;
+ int vbr_frames = 0;
+
+ sideinfo_len += 2; // add two for the crc itself
+
+ if ((_mp3_header_output->crc == MP3CRC_OK) && mp3size < sideinfo_len)
+ _mp3_header_output->crc = MP3CRC_ERROR_SIZE;
+
+ if (_mp3_header_output->crc == MP3CRC_OK)
+ {
+ char audiodata[38 + 1]; //+1 to hold the 0 char
+ uint16 crc16;
+ uint16 crcstored;
+
+ _mp3_header_output->crc = MP3CRC_MISMATCH; //as a starting point, we assume the worst
+
+ reader.setCur(beg);
+
+ reader.readChars(audiodata, sideinfo_len);
+ audiodata[sideinfo_len] = '\0';
+
+ crc16 = calcCRC(audiodata, sideinfo_len);
+
+ beg = end;
+ end = beg + CRCSIZE;
+
+ reader.setCur(beg);
+ crcstored = (uint16)io::readBENumber(reader, CRCSIZE);
+
+ // a mismatch doesn't mean the file is unusable
+ // it has just some bits in the wrong place
+ if (crcstored == crc16)
+ _mp3_header_output->crc = MP3CRC_OK;
+ }
+
+ // read xing/vbr header if present
+ // derived from code in vbrheadersdk.zip
+ // from http://www.xingtech.com/developer/mp3/
+
+ const size_t VBR_HEADER_MIN_SIZE = 8; // "xing" + flags are fixed
+ const size_t VBR_HEADER_MAX_SIZE = 120; // frames, bytes, toc and scale are optional
+
+ if (mp3size >= vbr_header_offest + VBR_HEADER_MIN_SIZE)
+ {
+ char vbrheaderdata[VBR_HEADER_MAX_SIZE+1]; //+1 to hold the 0 char
+ unsigned char *pvbrdata = (unsigned char *)vbrheaderdata;
+ int vbr_filesize = 0;
+ int vbr_scale = 0;
+ int vbr_flags = 0;
+
+ // get fixed part of vbr header
+ // and check if valid
+
+ beg = vbr_header_offest;
+ reader.setCur(beg);
+ reader.readChars(vbrheaderdata, VBR_HEADER_MIN_SIZE);
+ vbrheaderdata[VBR_HEADER_MIN_SIZE] = '\0';
+
+ if (pvbrdata[0] == 'X' &&
+ pvbrdata[1] == 'i' &&
+ pvbrdata[2] == 'n' &&
+ pvbrdata[3] == 'g')
+ {
+ // get vbr flags
+ pvbrdata += 4;
+ vbr_flags = ExtractI4(pvbrdata);
+ pvbrdata += 4;
+
+ // read entire vbr header
+ int vbr_header_size = VBR_HEADER_MIN_SIZE
+ + ((vbr_flags & FRAMES_FLAG)? 4:0)
+ + ((vbr_flags & BYTES_FLAG)? 4:0)
+ + ((vbr_flags & TOC_FLAG)? 100:0)
+ + ((vbr_flags & SCALE_FLAG)? 4:0);
+
+ if (mp3size >= vbr_header_offest + vbr_header_size)
+ {
+ reader.readChars(&vbrheaderdata[VBR_HEADER_MIN_SIZE], vbr_header_size - VBR_HEADER_MIN_SIZE);
+ vbrheaderdata[vbr_header_size] = '\0';
+
+ // get frames, bytes, toc and scale
+
+ if (vbr_flags & FRAMES_FLAG)
+ {
+ vbr_frames = ExtractI4(pvbrdata);
+ pvbrdata +=4;
+ }
+
+ if (vbr_flags & BYTES_FLAG)
+ {
+ vbr_filesize = ExtractI4(pvbrdata);
+ pvbrdata +=4;
+ }
+
+ if (vbr_flags & TOC_FLAG)
+ {
+ // seek offsets
+ // we are not using
+ // for(i=0;i<100;i++) seek_offsets[i] = pvbrdata[i];
+
+ pvbrdata +=100;
+ }
+
+ if (vbr_flags & SCALE_FLAG)
+ {
+ vbr_scale = ExtractI4(pvbrdata);
+ pvbrdata +=4;
+ }
+
+ if (vbr_frames > 0)
+ {
+ _mp3_header_output->vbr_bitrate = (((vbr_filesize!=0) ? vbr_filesize : mp3size) / vbr_frames) * _mp3_header_output->frequency / 144;
+ _mp3_header_output->vbr_bitrate -= _mp3_header_output->vbr_bitrate%1000; // round the bitrate:
+ }
+ }
+ }
+ }
+
+ if (_mp3_header_output->framesize > 0 && mp3size >= _mp3_header_output->framesize) // this means bitrate is not none too
+ {
+ if (vbr_frames == 0)
+ _mp3_header_output->frames = fto_nearest_i((float)mp3size / _mp3_header_output->framesize);
+ else
+ _mp3_header_output->frames = vbr_frames;
+
+ // bitrate becomes byterate (per second) if divided by 8
+ if (_mp3_header_output->vbr_bitrate == 0)
+ _mp3_header_output->time = fto_nearest_i( (float)mp3size / (_mp3_header_output->bitrate / 8) );
+ else
+ _mp3_header_output->time = fto_nearest_i( (float)mp3size / (_mp3_header_output->vbr_bitrate / 8) );
+ }
+ else
+ {
+ _mp3_header_output->frames = 0;
+ _mp3_header_output->time = 0;
+ }
+ //if we got to here it's okay
+ return true;
+}
+
+
diff --git a/src/readers.cpp b/src/readers.cpp
new file mode 100644
index 0000000..d0b91e9
--- /dev/null
+++ b/src/readers.cpp
@@ -0,0 +1,40 @@
+// $Id: readers.cpp,v 1.7 2002/07/02 22:14:10 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "readers.h"
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+
+using namespace dami;
+
+ID3_Reader::size_type
+ID3_MemoryReader::readChars(char_type buf[], size_type len)
+{
+ size_type size = dami::min<size_type>(len, _end - _cur);
+ ::memcpy(buf, _cur, size);
+ _cur += size;
+ return size;
+}
+
diff --git a/src/spec.cpp b/src/spec.cpp
new file mode 100644
index 0000000..e7b53b2
--- /dev/null
+++ b/src/spec.cpp
@@ -0,0 +1,109 @@
+// $Id: spec.cpp,v 1.2 2002/07/31 13:20:49 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "spec.h"
+
+ID3_V2Spec ID3_VerRevToV2Spec(uchar ver, uchar rev)
+{
+ ID3_V2Spec spec = ID3V2_UNKNOWN;
+ if (2 == ver)
+ {
+ if (0 == rev)
+ {
+ spec = ID3V2_2_0;
+ }
+ else if (1 == rev)
+ {
+ spec = ID3V2_2_1;
+ }
+ }
+ else if (3 == ver)
+ {
+ if (0 == rev)
+ {
+ spec = ID3V2_3_0;
+ }
+ }
+ else if (4 == ver)
+ {
+ if (0 == rev)
+ {
+ spec = ID3V2_4_0;
+ }
+ }
+
+ return spec;
+}
+
+uchar ID3_V2SpecToVer(ID3_V2Spec spec)
+{
+ uchar ver = 0;
+ switch (spec)
+ {
+ case ID3V2_2_0:
+ case ID3V2_2_1:
+ ver = 2;
+ break;
+ case ID3V2_3_0:
+ ver = 3;
+ break;
+ case ID3V2_4_0:
+ ver = 4;
+ break;
+ default:
+ break;
+ }
+ return ver;
+}
+
+uchar ID3_V2SpecToRev(ID3_V2Spec spec)
+{
+ uchar rev = 0;
+ switch (spec)
+ {
+ case ID3V2_4_0:
+ rev = 0;
+ break;
+ case ID3V2_3_0:
+ rev = 0;
+ break;
+ case ID3V2_2_1:
+ rev = 1;
+ break;
+ case ID3V2_2_0:
+ rev = 0;
+ break;
+ default:
+ break;
+ }
+ return rev;
+}
+
diff --git a/src/spec.h b/src/spec.h
new file mode 100644
index 0000000..34e48e7
--- /dev/null
+++ b/src/spec.h
@@ -0,0 +1,38 @@
+// -*- C++ -*-
+// $Id: spec.h,v 1.2 2002/07/02 22:14:16 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_SPEC_H_
+#define _ID3LIB_SPEC_H_
+
+#include "id3/globals.h" //has <stdlib.h> "id3/sized_types.h"
+
+ID3_V2Spec ID3_VerRevToV2Spec(uchar ver, uchar rev);
+uchar ID3_V2SpecToVer(ID3_V2Spec spec);
+uchar ID3_V2SpecToRev(ID3_V2Spec spec);
+
+#endif /* _ID3LIB_SPEC_H_ */
+
diff --git a/src/tag.cpp b/src/tag.cpp
new file mode 100644
index 0000000..56dc6ba
--- /dev/null
+++ b/src/tag.cpp
@@ -0,0 +1,1141 @@
+// $Id: tag.cpp,v 1.55 2003/03/02 13:35:58 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+//#include "readers.h"
+#include "writers.h"
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+
+using namespace dami;
+
+/** \mainpage id3lib Library Documentation
+ **
+ ** \section tutorial Quick Tutorial
+ **
+ ** This tutorial will quickly get you up and running with id3lib.
+ **
+ ** \subsection download Downloading id3lib
+ **
+ ** First, id3lib must be a part of your development environment. The latest
+ ** files can always be downloaded from the <a href="http://id3lib.sourceforge.net">id3lib homepage</a>.
+ **
+ ** \subsection include Preparing your source code
+ **
+ ** To use the basic functionality of id3lib in your C++ code, a single
+ ** \c #include is necessary.
+ **
+ ** \code
+ ** #include <id3/tag.h>
+ ** \endcode
+ **
+ ** There are other files that must be included to access more advanced
+ ** functionality, but this will do most of the core functionality.
+ **
+ ** \subsection creation Creating a tag
+ **
+ ** Almost all functionality occurs via an ID3_Tag object. An ID3_Tag object
+ ** basically encapsulates two things: a collection of ID3_Frame objects and
+ ** file information. The goal is to populate an ID3_Tag object with ID3_Frame
+ ** objects, and the easiest way to do this is to associate the tag with a
+ ** file. This is done primarily via the ID3_Tag constructor, like so:
+ **
+ ** \code
+ ** ID3_Tag myTag("song.mp3");
+ ** \endcode
+ **
+ ** This constructor links, or associates, the object \c myTag with the file
+ ** "song.mp3". In doing so, the tagging information from "song.mp3" is parsed
+ ** and added to \c myTag. This association can also be accomplished by creating
+ ** an empty tag and making an explicit call to Link().
+ **
+ ** \code
+ ** ID3_Tag myTag;
+ ** myTag.Link("song.mp3");
+ ** \endcode
+ **
+ ** The default behavior of Link() is to parse all possible tagging information
+ ** and convert it into ID3v2 frames. The tagging information parsed can be
+ ** limited to a particular type (or types) of tag by passing an ID3_TagType
+ ** (or combination of ID3_TagTypes). For example, to read only the ID3v1
+ ** tag, pass in the constant ID3TT_ID3V1.
+ **
+ ** \code
+ ** myTag.Link("song.mp3", ID3TT_ID3V1);
+ ** \endcode
+ **
+ ** Another example would be to read in all tags that could possibly appear at
+ ** the end of the file.
+ **
+ ** \code
+ ** myTag.Link("song.mp3", ID3TT_ID3V1 | ID3TT_LYRICS3V2 | ID3TT_MUSICMATCH);
+ ** \endcode
+ **
+ ** \section accessing Accessing the Tag Data
+ **
+ ** After linking with a file, the object \c myTag now contains some or all of
+ ** the tagging information present in the file "song.mp3", represented as
+ ** ID3v2 frames. How can that information be accessed? There are a variety of
+ ** ways to do this. One is to iterate through all the frames in the tag.
+ **
+ ** \code
+ ** // use an std::auto_ptr here to handle object cleanup automatically
+ ** ID3_Tag::Iterator* iter = myTag.CreateIterator();
+ ** ID3_Frame* myFrame = NULL;
+ ** while (NULL != (myFrame = iter->GetNext()))
+ ** {
+ ** // do something with myFrame
+ ** }
+ ** delete iter;
+ ** \endcode
+ **
+ ** Another way to access tagging information is by searching for specific
+ ** frames using the Find() method. For example, the album frame can be found
+ ** in the following manner:
+ **
+ ** \code
+ ** ID3_Frame* myFrame = myTag.Find(ID3FID_ALBUM);
+ ** if (NULL != myFrame)
+ ** {
+ ** // do something with myFrame
+ ** }
+ ** \endcode
+ **
+ ** The Find() method can be used to search for frames with specific
+ ** information. For example, the following code can be used to find the frame
+ ** with the title "Nirvana".
+ **
+ ** \code
+ ** ID3_Frame* myFrame = myTag.Find(ID3FID_TITLE, ID3FN_TEXT, "Nirvana")));
+ ** if (NULL != myFrame)
+ ** {
+ ** // do something with myFrame
+ ** }
+ ** \endcode
+ **
+ ** As indicated, the Find() method will return a NULL pointer if no such frame
+ ** can be found. If more than one frame meets the search criteria, subsequent
+ ** calls to Find() with the same parameters will return the other matching
+ ** frames. The Find() method is guaranteed to return all matching frames
+ ** before it wraps around to return the first matching frame.
+ **
+ ** All ID3_Frame objects are comprised of a collection of ID3_Field objects.
+ ** These fields can represent text, numbers, or binary data. As with frames,
+ ** fields can be accessed in a variety of manners. The fields of a frame
+ ** can be iterated over in much the same manner of the frames of a tag.
+ **
+ ** \code
+ ** // use an std::auto_ptr here to handle object cleanup automatically
+ ** ID3_Frame::Iterator* iter = myFrame->CreateIterator();
+ ** ID3_Field* myField = NULL;
+ ** while (NULL != (myField = iter->GetNext()))
+ ** {
+ ** // do something with myField
+ ** }
+ ** delete iter;
+ ** \endcode
+ **
+ ** If you know which field type you're looking for, you can access it
+ ** directly.
+ **
+ ** \code
+ ** ID3_Field* myField = myFrame->GetField(ID3FN_TEXT);
+ ** while (NULL != myField)
+ ** {
+ ** // do something with myField
+ ** }
+ ** \endcode
+ **
+ ** Note: The ID3_FrameInfo class provides information about the frame types known
+ ** to id3lib.
+ **
+ ** The ID3_Field represents a single piece of data within an ID3v2 frame. As
+ ** mentioned, an ID3_Field can represent three possible types of
+ ** data: integers, binary data, and text strings. The type of a particular
+ ** field object is immutable; it is determined at the time of its construction
+ ** (almost always when a frame is constructed) and can't be changed. If in
+ ** doubt, the field type can be accessed through its GetType() method.
+ **
+ ** Having an ID3_Field object isn't much use if you cannot access and/or
+ ** alter its data. Luckily, the id3lib API provides overloaded \c Set and
+ ** \c Get methods for all data types.
+ **
+ ** If the field is an integer, the following methods can be used to access
+ ** the data.
+ **
+ ** \code
+ ** uint32 val = myField->Get();
+ ** myField->Set(5);
+ ** (*myField) = 10;
+ ** \endcode
+ **
+ ** All text data is accessed in a slightly different manner. The following
+ ** code example best illustrates these differences.
+ **
+ ** \code
+ ** // for ascii strings
+ ** char str1[1024];
+ ** const char* p1 = "My String";
+ ** const char* p2 = "My Other String";
+ **
+ ** myField->Set(p1);
+ ** (*myField) = p2; // equivalent to Set
+ **
+ ** myField->Get(str1, 1024); // copies up to 1024 bytes of the field data into str1
+ ** p1 = myField->GetRawText(); // returns a pointer to the internal string
+ ** \endcode
+ **
+ ** Binary data is similar to text data, except that its base type is a pointer
+ ** to an unsigned, rather than a signed, char.
+ **
+ ** \code
+ ** // for binary strings
+ ** uchar data[1024];
+ ** const uchar *p1 = getBinaryData(); // not an id3lib function
+ ** size_t size = getBinarySize(); // not an id3lib function
+ **
+ ** myField->Set(p1, size);
+ **
+ ** myField->Get(data, 1024); // copies up to 1024 bytes of the field data into str1
+ ** p1 = myField->GetRawBinary(); // returns a pointer to the internal string
+ ** \endcode
+ **
+ ** \section updating Updating the Tag
+ **
+ ** When you're ready to save your changes back to the file, a single call to
+ ** Update() is sufficient.
+ **
+ ** \code
+ ** tag.Update();
+ ** \endcode
+ **
+ **/
+
+/** \class ID3_Tag tag.h id3/tag.h
+ ** \brief The representative class of an id3 tag.
+ **
+ ** The ID3_Tag is, at its simplest, a container for ID3v2 frames. At its
+ ** most complicated, it's a kitchen-sink, monolithic "catch-all" class for
+ ** handling almost every task associated with creating, parsing, rendering,
+ ** and manipulating digital audio data using id3lib.
+ **
+ ** This simple \c #include does it all. In order to read an existing tag, do
+ ** the following:
+ **
+ ** \code
+ ** ID3_Tag myTag;
+ ** myTag.Link("something.mp3");
+ ** \endcode
+ **
+ ** That is all there is to it. Now all you have to do is use the Find()
+ ** method to locate the frames you are interested in is the following:
+ **
+ ** \code
+ ** ID3_Frame* myFrame = myTag.Find(ID3FID_TITLE);
+ ** if (NULL != myFrame)
+ ** {
+ ** const char* title = myFrame->GetField(ID3FN_TEXT)->GetText();
+ ** cout << "Title: " << title << endl;
+ ** }
+ ** \endcode
+ **
+ ** This code snippet locates the ID3FID_TITLE frame and displays the
+ ** text field.
+ **
+ ** When using the ID3_Tag::Link() method, you automatically gain access to any
+ ** ID3v1/1.1, ID3v2, Lyrics3 v2.0, and MusicMatch tags present in the file.
+ ** The class will automaticaly parse and convert any of these foreign tag
+ ** formats into ID3v2 tags. Also, id3lib will correctly parse any correctly
+ ** formatted 'CDM' frames from the unreleased ID3v2 2.01 draft specification.
+ **
+ ** \author Dirk Mahoney
+ ** \version $Id: tag.cpp,v 1.55 2003/03/02 13:35:58 t1mpy Exp $
+ ** \sa ID3_Frame
+ ** \sa ID3_Field
+ ** \sa ID3_Err
+ **/
+
+/** Default constructor; it can accept an optional filename as a parameter.
+ **
+ ** If this file exists, it will be opened and all id3lib-supported tags will
+ ** be parsed and converted to ID3v2 if necessary. After the conversion, the
+ ** file will remain unchanged, and will continue to do so until you use the
+ ** Update() method on the tag (if you choose to Update() at all).
+ **
+ ** \param name The filename of the mp3 file to link to
+ **/
+#ifdef WIN32
+ID3_Tag::ID3_Tag(const wchar_t *name)
+#else
+ID3_Tag::ID3_Tag(const char *name)
+#endif
+ : _impl(new ID3_TagImpl(name))
+{
+}
+
+/** Standard copy constructor.
+ **
+ ** \param tag What is copied into this tag
+ **/
+ID3_Tag::ID3_Tag(const ID3_Tag &tag)
+ : _impl(new ID3_TagImpl(tag))
+{
+}
+
+ID3_Tag::~ID3_Tag()
+{
+ delete _impl;
+}
+
+/** Clears the object and disassociates it from any files.
+ **
+ ** Frees any resources for which the object is responsible, including all
+ ** frames and files. After a call to Clear(), the object can be used
+ ** again for any new or existing tag.
+ **/
+void ID3_Tag::Clear()
+{
+ _impl->Clear();
+}
+
+
+/** Indicates whether the tag has been altered since the last parse, render,
+ ** or update.
+ **
+ ** If you have a tag linked to a file, you do not need this method since the
+ ** Update() method will check for changes before writing the tag.
+ **
+ ** This method is primarily intended as a status indicator for applications
+ ** and for applications that use the Parse() and Render() methods.
+ **
+ ** Setting a field, changed the ID of an attached frame, setting or grouping
+ ** or encryption IDs, and clearing a frame or field all constitute a change
+ ** to the tag, as do calls to the SetUnsync(), SetExtendedHeader(), and
+ ** SetPadding() methods.
+ **
+ ** \code
+ ** if (myTag.HasChanged())
+ ** {
+ ** // render and output the tag
+ ** }
+ ** \endcode
+ **
+ ** \return Whether or not the tag has been altered.
+ **/
+bool ID3_Tag::HasChanged() const
+{
+ return _impl->HasChanged();
+}
+
+/** Returns an over estimate of the number of bytes required to store a
+ ** binary version of a tag.
+ **
+ ** When using Render() to render a binary tag to a
+ ** memory buffer, first use the result of this call to allocate a buffer of
+ ** unsigned chars.
+ **
+ ** \code
+ ** if (myTag.HasChanged())
+ ** {
+ ** size_t tagSize; = myTag.Size();
+ ** if (tagSize > 0)
+ ** {
+ ** uchar *buffer = new uchar[tagSize];
+ ** if (NULL != buffer)
+ ** {
+ ** size_t actualSize = myTag.Render(buffer);
+ ** // do something useful with the first
+ ** // 'actualSize' bytes of the buffer,
+ ** // like push it down a socket
+ ** delete [] buffer;
+ ** }
+ ** }
+ ** }
+ ** \endcode
+ **
+ ** @see #Render
+ ** @return The (overestimated) number of bytes required to store a binary
+ ** version of a tag
+ **/
+size_t ID3_Tag::Size() const
+{
+ return _impl->Size();
+}
+
+/** Turns unsynchronization on or off, dependant on the value of the boolean
+ ** parameter.
+ **
+ ** If you call this method with 'false' as the parameter, the
+ ** binary tag will not be unsync'ed, regardless of whether the tag should
+ ** be. This option is useful when the file is only going to be used by
+ ** ID3v2-compliant software. See the ID3v2 standard document for futher
+ ** details on unsync.
+ **
+ ** Be default, tags are created without unsync.
+ **
+ ** \code
+ ** myTag.SetUnsync(false);
+ ** \endcode
+ **
+ ** \param bSync Whether the tag should be unsynchronized
+ **/
+bool ID3_Tag::SetUnsync(bool b)
+{
+ return _impl->SetUnsync(b);
+}
+
+
+/** Turns extended header rendering on or off, dependant on the value of the
+ ** boolean parameter.
+ **
+ ** This option is currently ignored as id3lib doesn't yet create extended
+ ** headers. This option only applies when rendering tags for ID3v2 versions
+ ** that support extended headers.
+ **
+ ** \code
+ ** myTag.SetExtendedHeader(true);
+ ** \endcode
+ **
+ ** \param bExt Whether to render an extended header
+ **/
+bool ID3_Tag::SetExtendedHeader(bool ext)
+{
+ return _impl->SetExtended(ext);
+}
+
+/** Turns padding on or off, dependant on the value of the boolean
+ ** parameter.
+ **
+ ** When using ID3v2 tags in association with files, id3lib can optionally
+ ** add padding to the tags to ensure minmal file write times when updating
+ ** the tag in the future.
+ **
+ ** When the padding option is switched on, id3lib automatically creates
+ ** padding according to the 'ID3v2 Programming Guidelines'. Specifically,
+ ** enough padding will be added to round out the entire file (song plus
+ ** tag) to an even multiple of 2K. Padding will only be created when the
+ ** tag is attached to a file and that file is not empty (aside from a
+ ** pre-existing tag).
+ **
+ ** id3lib's addition to the guidelines for padding, is that if frames are
+ ** removed from a pre-existing tag (or the tag simply shrinks because of
+ ** other reasons), the new tag will continue to stay the same size as the
+ ** old tag (with padding making the difference of course) until such time as
+ ** the padding is greater than 4K. When this happens, the padding will be
+ ** reduced and the new tag will be smaller than the old.
+ **
+ ** By default, padding is switched on.
+ **
+ ** \code
+ ** myTag.SetPadding(false);
+ ** \endcode
+ **
+ ** \param bPad Whether or not render the tag with padding.
+ **/
+bool ID3_Tag::SetPadding(bool pad)
+{
+ return _impl->SetPadding(pad);
+}
+
+bool ID3_Tag::SetExperimental(bool exp)
+{
+ return _impl->SetExperimental(exp);
+}
+
+bool ID3_Tag::GetUnsync() const
+{
+ return _impl->GetUnsync();
+}
+
+bool ID3_Tag::GetExtendedHeader() const
+{
+ return _impl->GetExtended();
+}
+
+bool ID3_Tag::GetExperimental() const
+{
+ return _impl->GetExperimental();
+}
+
+void ID3_Tag::AddFrame(const ID3_Frame& frame)
+{
+ _impl->AddFrame(frame);
+}
+
+/** Attaches a frame to the tag; the tag doesn't take responsibility for
+ ** releasing the frame's memory when tag goes out of scope.
+ **
+ ** Optionally, operator<< can also be used to attach a frame to a tag. To
+ ** use, simply supply its parameter a pointer to the ID3_Frame object you wish
+ ** to attach.
+ **
+ ** \code
+ ** ID3_Frame myFrame;
+ ** myTag.AddFrame(&myFrame);
+ ** \endcode
+ **
+ ** As stated, this method attaches the frames to the tag---the tag does
+ ** not create its own copy of the frame. Frames created by an application
+ ** must exist until the frame is removed or the tag is finished with it.
+ **
+ ** \param pFrame A pointer to the frame that is being added to the tag.
+ ** \sa ID3_Frame
+ **/
+void ID3_Tag::AddFrame(const ID3_Frame* frame)
+{
+ _impl->AddFrame(frame);
+}
+
+/** Attaches a frame to the tag; the tag takes responsibility for
+ ** releasing the frame's memory when tag goes out of scope.
+ **
+ ** This method accepts responsibility for the attached frame's memory, and
+ ** will delete the frame and its contents when the tag goes out of scope or is
+ ** deleted. Therefore, be sure the frame isn't "Attached" to other tags.
+ **
+ ** \code
+ ** ID3_Frame *frame = new ID3_Frame;
+ ** myTag.AttachFrame(frame);
+ ** \endcode
+ **
+ ** \param frame A pointer to the frame that is being added to the tag.
+ **/
+bool ID3_Tag::AttachFrame(ID3_Frame *frame)
+{
+ return _impl->AttachFrame(frame);
+}
+
+
+/** Removes a frame from the tag.
+ **
+ ** If you already own the frame object in question, then you should already
+ ** have a pointer to the frame you want to delete. If not, or if you wish to
+ ** delete a pre-existing frame (from a tag you have parsed, for example), the
+ ** use one of the Find methods to obtain a frame pointer to pass to this
+ ** method.
+ **
+ ** \code
+ ** ID3_Frame *someFrame;
+ ** if (someFrame = myTag.Find(ID3FID_TITLE))
+ ** {
+ ** myTag.RemoveFrame(someFrame);
+ ** }
+ ** \endcode
+ **
+ ** \sa ID3_Tag#Find
+ ** \param pOldFrame A pointer to the frame that is to be removed from the
+ ** tag
+ **/
+ID3_Frame* ID3_Tag::RemoveFrame(const ID3_Frame *frame)
+{
+ return _impl->RemoveFrame(frame);
+}
+
+bool ID3_Tag::Parse(ID3_Reader& reader)
+{
+ return id3::v2::parse(*_impl, reader);
+}
+
+size_t ID3_Tag::Parse(const uchar* buffer, size_t bytes)
+{
+ ID3_MemoryReader mr(buffer, bytes);
+ ID3_Reader::pos_type beg = mr.getCur();
+ id3::v2::parse(*_impl, mr);
+ return mr.getEnd() - beg;
+}
+
+/** Turns a binary tag into a series of ID3_Frame objects attached to the
+ ** tag.
+ **
+ ** \code
+ ** ID3_Tag myTag;
+ ** uchar header[ID3_TAGHEADERSIZE];
+ ** uchar *buffer;
+ ** luint tagSize;
+ **
+ ** // get ID3_TAGHEADERSIZE from a socket or somewhere
+ ** // ...
+ **
+ ** if ((tagSize = ID3_IsTagHeader(ourSourceBuffer)) > -1)
+ ** {
+ ** // read a further 'tagSize' bytes in
+ ** // from our data source
+ ** // ...
+ **
+ ** if (buffer = new uchar[tagSize])
+ ** {
+ ** // now we will call ID3_Tag::Parse()
+ ** // with these values (explained later)
+ ** myTag.Parse(header, buffer);
+ **
+ ** // do something with the objects,
+ ** // like look for titles, artists, etc.
+ ** // ...
+ **
+ ** // free the buffer
+ ** delete [] buffer;
+ ** }
+ ** }
+ ** \endcode
+ **
+ ** \sa ID3_Frame
+ ** @param header The byte header read in from the data source.
+ ** @param buffer The remainder of the tag (not including the data source)
+ ** read in from the data source.
+ **/
+size_t ID3_Tag::Parse(const uchar header[ID3_TAGHEADERSIZE], const uchar *buffer)
+{
+ size_t size = ID3_Tag::IsV2Tag(header);
+ if (0 == size)
+ {
+ return 0;
+ }
+ BString buf;
+ buf.reserve(ID3_TagHeader::SIZE + size);
+ buf.append(reinterpret_cast<const BString::value_type *>(header),
+ ID3_TagHeader::SIZE);
+ buf.append(reinterpret_cast<const BString::value_type *>(buffer), size);
+ return this->Parse(buf.data(), buf.size());
+}
+
+/** Renders the tag and writes it to the attached file; the type of tag
+ ** rendered can be specified as a parameter. The default is to update only
+ ** the ID3v2 tag. See the ID3_TagType enumeration for the constants that
+ ** can be used.
+ **
+ ** Make sure the rendering parameters are set before calling the method.
+ ** See the Link documentation for an example of this method in use.
+ **
+ ** \sa ID3_TagType
+ ** \sa Link
+ ** \param tt The type of tag to update.
+ **/
+/** Renders a binary image of the tag into the supplied buffer.
+ **
+ ** See Size() for an example. This method returns the actual number of the
+ ** bytes of the buffer used to store the tag. This will be no more than the
+ ** size of the buffer itself, because Size() over estimates the required
+ ** buffer size when padding is enabled.
+ **
+ ** Before calling this method, it is advisable to call HasChanged() first as
+ ** this will let you know whether you should bother rendering the tag.
+ **
+ ** @see ID3_IsTagHeader
+ ** @see ID3_Tag#HasChanged
+ ** @return The actual number of the bytes of the buffer used to store the
+ ** tag
+ ** @param buffer The buffer that will contain the rendered tag.
+ **/
+size_t ID3_Tag::Render(uchar* buffer, ID3_TagType tt) const
+{
+ ID3_MemoryWriter mw(buffer, -1);
+ return this->Render(mw, tt);
+}
+
+size_t ID3_Tag::Render(ID3_Writer& writer, ID3_TagType tt) const
+{
+ ID3_Writer::pos_type beg = writer.getCur();
+ if (ID3TT_ID3V2 & tt)
+ {
+ id3::v2::render(writer, *this);
+ }
+ else if (ID3TT_ID3V1 & tt)
+ {
+ id3::v1::render(writer, *this);
+ }
+ return writer.getCur() - beg;
+}
+
+
+/** Attaches a file to the tag, parses the file, and adds any tag information
+ ** found in the file to the tag.
+ **
+ ** Use this method if you created your ID3_Tag object without supplying a
+ ** parameter to the constructor (maybe you created an array of ID3_Tag
+ ** pointers). This is the preferred method of interacting with files, since
+ ** id3lib can automatically do things like parse foreign tag formats and
+ ** handle padding when linked to a file. When a tag is linked to a file, you
+ ** do not need to use the Size(), Render(const uchar*, size_t), or
+ ** Parse(ID3_Reader&) methods or the IsV2Tag(ID3_Reader&) static function--
+ ** id3lib will take care of those details for you. The single parameter is a
+ ** pointer to a file name.
+ **
+ ** Link returns the size of the the ID3v2 tag (if any) that begins the file.
+ **
+ ** \code
+ ** ID3_Tag myTag;
+ ** myTag.Link("mysong.mp3");
+ **
+ ** // do whatever we want with the tag
+ ** // ...
+ **
+ ** // setup all our rendering parameters
+ ** myTag->SetUnsync(false);
+ ** myTag->SetExtendedHeader(true);
+ ** myTag->SetCompression(true);
+ ** myTag->SetPadding(true);
+ **
+ ** // write any changes to the file
+ ** myTag->Update()
+ **
+ ** \endcode
+ **
+ ** @see IsV2Tag
+ ** @param fileInfo The filename of the file to link to.
+ **/
+#ifdef WIN32
+size_t ID3_Tag::Link(const wchar_t *fileInfo, flags_t flags)
+#else
+size_t ID3_Tag::Link(const char *fileInfo, flags_t flags)
+#endif
+{
+ return _impl->Link(fileInfo, flags);
+}
+
+/**
+ ** Same as above, but takes a ID3_Reader as argument.
+ */
+size_t ID3_Tag::Link(ID3_Reader &reader, flags_t flags)
+{
+ return _impl->Link(reader, flags);
+}
+
+flags_t ID3_Tag::Update(flags_t flags)
+{
+ return _impl->Update(flags);
+}
+
+/**
+ ** Get's the mp3 Info like bitrate, mpeg version, etc.
+ ** Can be run after Link(<filename>)
+ **
+ **/
+const Mp3_Headerinfo* ID3_Tag::GetMp3HeaderInfo() const
+{
+ return _impl->GetMp3HeaderInfo();
+}
+
+/** Strips the tag(s) from the attached file. The type of tag stripped
+ ** can be specified as a parameter. The default is to strip all tag types.
+ **
+ ** \param tt The type of tag to strip
+ ** \sa ID3_TagType
+ **/
+flags_t ID3_Tag::Strip(flags_t flags)
+{
+ return _impl->Strip(flags);
+}
+
+size_t ID3_Tag::GetPrependedBytes() const
+{
+ return _impl->GetPrependedBytes();
+}
+
+size_t ID3_Tag::GetAppendedBytes() const
+{
+ return _impl->GetAppendedBytes();
+}
+
+size_t ID3_Tag::GetFileSize() const
+{
+ return _impl->GetFileSize();
+}
+
+const char* ID3_Tag::GetFileName() const
+{
+#ifdef WIN32
+ _ASSERT(false);
+ return NULL;
+#else
+ //fix because GetFileName need to return a pointer which keeps to be valid
+ String fn = _impl->GetFileName();
+ if (fn.size())
+ {
+ memset((char *)_tmp_filename, 0, ID3_PATH_LENGTH);
+ memmove((char *)_tmp_filename, fn.c_str(), fn.size());
+ return _tmp_filename; //_impl->GetFileName().c_str();
+ }
+ else
+ return NULL;
+#endif
+}
+
+/// Finds frame with given frame id
+ /** Returns a pointer to the next ID3_Frame with the given ID3_FrameID;
+ ** returns NULL if no such frame found.
+ **
+ ** If there are multiple frames in the tag with the same ID (which, for some
+ ** frames, is allowed), then subsequent calls to Find() will return
+ ** subsequent frame pointers, wrapping if necessary.
+ **
+ ** \code
+ ** ID3_Frame *myFrame;
+ ** if (myFrame = myTag.Find(ID3FID_TITLE))
+ ** {
+ ** // do something with the frame, like copy
+ ** // the contents into a buffer, display the
+ ** // contents in a window, etc.
+ ** // ...
+ ** }
+ ** \endcode
+ **
+ ** You may optionally supply to more parameters ot this method, being an
+ ** ID3_FieldID and a value of some sort. Depending on the field name/ID you
+ ** supply, you may supply an integer, a char* or a unicode_t* as the third
+ ** parameter. If you supply an ID3_FrameID, you must also supply a data
+ ** value to compare against.
+ **
+ ** This method will then return the first frame that has a matching frame
+ ** ID, and which has a field with the same name as that which you supplied
+ ** in the second parameter, whose calue matches that which you supplied as
+ ** the third parameter. For example:
+ **
+ ** \code
+ ** ID3_Frame *myFrame;
+ ** if (myFrame = myTag.Find(ID3FID_TITLE, ID3FN_TEXT, "Nirvana"))
+ ** {
+ ** // found it, do something with it.
+ ** // ...
+ ** }
+ ** \endcode
+ **
+ ** This example will return the first TITLE frame and whose TEXT field is
+ ** 'Nirvana'. Currently there is no provision for things like 'contains',
+ ** 'greater than', or 'less than'. If there happens to be more than one of
+ ** these frames, subsequent calls to the Find() method will return
+ ** subsequent frames and will wrap around to the beginning.
+ **
+ ** Another example...
+ **
+ ** \code
+ ** ID3_Frame *myFrame;
+ ** if (myFrame = myTag.Find(ID3FID_COMMENT, ID3FN_TEXTENC, ID3TE_UNICODE))
+ ** {
+ ** // found it, do something with it.
+ ** // ...
+ ** }
+ ** \endcode
+ **
+ ** This returns the first COMMENT frame that uses Unicode as its text
+ ** encdoing.
+ **
+ ** @name Find
+ ** @param id The ID of the frame that is to be located
+ ** @return A pointer to the first frame found that has the given frame id,
+ ** or NULL if no such frame.
+ **/
+ID3_Frame* ID3_Tag::Find(ID3_FrameID id) const
+{
+ return _impl->Find(id);
+}
+
+/// Finds frame with given frame id, fld id, and integer data
+ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, uint32 data) const
+{
+ return _impl->Find(id, fld, data);
+}
+
+/// Finds frame with given frame id, fld id, and ISO8859-1 data
+ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, const char* data) const
+{
+ String str(data);
+ return _impl->Find(id, fld, str.c_str(), ID3TE_ISO8859_1);
+}
+
+/// Finds frame with given frame id, fld id, and utf16 little endian data
+ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, const unicode_t* data) const
+{
+ return _impl->Find(id, fld, (const char*) data, ID3TE_UTF16);
+}
+
+/** Returns the number of frames present in the tag object.
+ **
+ ** This includes only those frames that id3lib recognises. This is used as
+ ** the upper bound on calls to the GetFrame() and operator[]() methods.
+ **
+ ** \return The number of frames present in the tag object.
+ **/
+size_t ID3_Tag::NumFrames() const
+{
+ return _impl->NumFrames();
+}
+
+/** Returns a pointer to the frame with the given index; returns NULL if
+ ** there is no such frame at that index.
+ **
+ ** Optionally, operator[](size_t) can be used as an alternative to this
+ ** method. Indexing is 0-based (that is, the first frame is number 0, and the
+ ** last frame in a tag that holds n frames is n-1).
+ **
+ ** If you wish to have a more comlex searching facility, then at least for
+ ** now you will have to devise it yourself and implement it useing these
+ ** methods.
+ **
+ ** @param nIndex The index of the frame that is to be retrieved
+ ** @return A pointer to the requested frame, or NULL if no such frame.
+ **/
+/*
+ID3_Frame* ID3_Tag::GetFrameNum(size_t num) const
+{
+ const size_t numFrames = this->NumFrames();
+ if (num >= numFrames)
+ {
+ return NULL;
+ }
+
+ ID3_Frame* frame = NULL;
+ size_t curNum = 0;
+ // search from the cursor to the end
+ for (ID3_TagImpl::const_iterator cur = _impl->begin(); cur != _impl->end(); ++cur)
+ {
+ if (curNum++ == num)
+ {
+ frame = *cur;
+ break;
+ }
+ }
+
+ return frame;
+}
+*/
+
+/** Returns a pointer to the frame with the given index; returns NULL if
+ ** there is no such frame at that index.
+ **
+ ** @name operator[]
+ ** @param index The index of the frame that is to be retrieved
+ ** @return A pointer to the requested frame, or NULL if no such frame.
+ ** @see #GetFrameNum
+ **/
+/*
+ID3_Frame* ID3_Tag::operator[](size_t index) const
+{
+ return this->GetFrameNum(index);
+}
+*/
+
+ID3_Tag& ID3_Tag::operator=( const ID3_Tag &rTag )
+{
+ if (this != &rTag)
+ {
+ *_impl = rTag;
+ }
+ return *this;
+}
+
+bool ID3_Tag::HasTagType(ID3_TagType tt) const
+{
+ return _impl->HasTagType(tt);
+}
+
+ID3_V2Spec ID3_Tag::GetSpec() const
+{
+ return _impl->GetSpec();
+}
+
+bool ID3_Tag::SetSpec(ID3_V2Spec spec)
+{
+ return _impl->SetSpec(spec);
+}
+
+/** Analyses a buffer to determine if we have a valid ID3v2 tag header.
+ ** If so, return the total number of bytes (including the header) to
+ ** read so we get all of the tag
+ **/
+size_t ID3_Tag::IsV2Tag(const uchar* const data)
+{
+ ID3_MemoryReader mr(data, ID3_TagHeader::SIZE);
+ return ID3_TagImpl::IsV2Tag(mr);
+}
+
+size_t ID3_Tag::IsV2Tag(ID3_Reader& reader)
+{
+ return ID3_TagImpl::IsV2Tag(reader);
+}
+
+/// Deprecated
+void ID3_Tag::AddNewFrame(ID3_Frame* f)
+{
+ _impl->AttachFrame(f);
+}
+
+/** Copies an array of frames to the tag.
+ **
+ ** This method copies each frame in an array to the tag. As in
+ ** AddFrame, the tag adds a copy of the frame, and it assumes responsiblity
+ ** for freeing the frames' memory when the tag goes out of scope.
+ **
+ ** \code
+ ** ID3_Frame myFrames[10];
+ ** myTag.AddFrames(myFrames, 10);
+ ** \endcode
+ **
+ ** \sa ID3_Frame
+ ** \sa ID3_Frame#AddFrame
+ ** \param pNewFrames A pointer to an array of frames to be added to the tag.
+ ** \param nFrames The number of frames in the array pNewFrames.
+ **/
+void ID3_Tag::AddFrames(const ID3_Frame *frames, size_t numFrames)
+{
+ for (int i = numFrames - 1; i >= 0; i--)
+ {
+ this->AddFrame(frames[i]);
+ }
+}
+
+#ifdef WIN32
+size_t ID3_Tag::Link(const wchar_t *fileInfo, bool parseID3v1, bool parseLyrics3)
+#else
+size_t ID3_Tag::Link(const char *fileInfo, bool parseID3v1, bool parseLyrics3)
+#endif
+{
+ return _impl->Link(fileInfo, parseID3v1, parseLyrics3);
+}
+
+void ID3_Tag::SetCompression(bool b)
+{
+ ;
+}
+
+bool ID3_Tag::HasLyrics() const
+{
+ return this->HasTagType(ID3TT_LYRICS);
+}
+bool ID3_Tag::HasV2Tag() const
+{
+ return this->HasTagType(ID3TT_ID3V2);
+}
+bool ID3_Tag::HasV1Tag() const
+{
+ return this->HasTagType(ID3TT_ID3V1);
+}
+
+/** Copies a frame to the tag. The frame parameter can thus safely be deleted
+ ** or allowed to go out of scope.
+ **
+ ** Operator<< supports the addition of a pointer to a frame object, or
+ ** the frame object itself.
+ **
+ ** \code
+ ** ID3_Frame *pFrame, frame;
+ ** p_frame = &frame;
+ ** myTag << pFrame;
+ ** myTag << frame;
+ ** \endcode
+ **
+ ** Both these methods copy the given frame to the tag---the tag creates its
+ ** own copy of the frame.
+ **
+ ** \name operator<<
+ ** \param frame The frame to be added to the tag.
+ **/
+ID3_Tag& ID3_Tag::operator<<(const ID3_Frame& frame)
+{
+ this->AddFrame(frame);
+ return *this;
+}
+
+
+ID3_Tag& ID3_Tag::operator<<(const ID3_Frame* frame)
+{
+ if (frame)
+ {
+ this->AddFrame(frame);
+ }
+ return *this;
+}
+
+int32 ID3_IsTagHeader(const uchar data[ID3_TAGHEADERSIZE])
+{
+ size_t size = ID3_Tag::IsV2Tag(data);
+
+ if (!size)
+ {
+ return -1;
+ }
+
+ return size - ID3_TagHeader::SIZE;
+}
+
+
+namespace
+{
+ class IteratorImpl : public ID3_Tag::Iterator
+ {
+ ID3_TagImpl::iterator _cur;
+ ID3_TagImpl::iterator _end;
+ public:
+ IteratorImpl(ID3_TagImpl& tag)
+ : _cur(tag.begin()), _end(tag.end())
+ {
+ }
+
+ ID3_Frame* GetNext()
+ {
+ ID3_Frame* next = NULL;
+ while (next == NULL && _cur != _end)
+ {
+ next = *_cur;
+ ++_cur;
+ }
+ return next;
+ }
+ };
+
+
+ class ConstIteratorImpl : public ID3_Tag::ConstIterator
+ {
+ ID3_TagImpl::const_iterator _cur;
+ ID3_TagImpl::const_iterator _end;
+ public:
+ ConstIteratorImpl(ID3_TagImpl& tag)
+ : _cur(tag.begin()), _end(tag.end())
+ {
+ }
+ const ID3_Frame* GetNext()
+ {
+ ID3_Frame* next = NULL;
+ while (next == NULL && _cur != _end)
+ {
+ next = *_cur;
+ ++_cur;
+ }
+ return next;
+ }
+ };
+}
+
+ID3_Tag::Iterator*
+ID3_Tag::CreateIterator()
+{
+ return new IteratorImpl(*_impl);
+}
+
+ID3_Tag::ConstIterator*
+ID3_Tag::CreateIterator() const
+{
+ return new ConstIteratorImpl(*_impl);
+}
+
diff --git a/src/tag_file.cpp b/src/tag_file.cpp
new file mode 100644
index 0000000..3fe3be7
--- /dev/null
+++ b/src/tag_file.cpp
@@ -0,0 +1,480 @@
+// $Id: tag_file.cpp,v 1.43 2003/03/02 14:14:08 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include <stdio.h> //for BUFSIZ and functions remove & rename
+#include "writers.h"
+#include "io_strings.h"
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+
+using namespace dami;
+
+#if !defined HAVE_MKSTEMP
+# include <stdio.h>
+#endif
+
+#if defined HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if defined HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if defined WIN32 //Klenotic
+# include <io.h>
+#endif
+#if defined WIN32 && (!defined(WINCE))
+# include <windows.h>
+static int truncate(const char *path, size_t length)
+{
+ int result = -1;
+ HANDLE fh;
+
+ fh = ::CreateFileA(path,
+ GENERIC_WRITE | GENERIC_READ,
+ 0,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if(INVALID_HANDLE_VALUE != fh)
+ {
+ SetFilePointer(fh, length, NULL, FILE_BEGIN);
+ SetEndOfFile(fh);
+ CloseHandle(fh);
+ result = 0;
+ }
+
+ return result;
+}
+
+// prevents a weird error I was getting compiling this under windows
+# if defined CreateFile
+# undef CreateFile
+# endif
+
+#elif defined(WINCE)
+// Createfile is apparently to defined to CreateFileW. (Bad Bad Bad), so we
+// work around it by converting path to Unicode
+# include <windows.h>
+static int truncate(const char *path, size_t length)
+{
+ int result = -1;
+ wchar_t wcTempPath[256];
+ mbstowcs(wcTempPath,path,255);
+ HANDLE fh;
+ fh = ::CreateFile(wcTempPath,
+ GENERIC_WRITE | GENERIC_READ,
+ 0,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (INVALID_HANDLE_VALUE != fh)
+ {
+ SetFilePointer(fh, length, NULL, FILE_BEGIN);
+ SetEndOfFile(fh);
+ CloseHandle(fh);
+ result = 0;
+ }
+
+ return result;
+}
+
+#elif defined(macintosh)
+
+static int truncate(const char *path, size_t length)
+{
+ /* not implemented on the Mac */
+ return -1;
+}
+
+#endif
+
+#ifdef WIN32
+size_t ID3_TagImpl::Link(const wchar_t *fileInfo, bool parseID3v1, bool parseLyrics3)
+#else
+size_t ID3_TagImpl::Link(const char *fileInfo, bool parseID3v1, bool parseLyrics3)
+#endif
+{
+ flags_t tt = ID3TT_NONE;
+ if (parseID3v1)
+ {
+ tt |= ID3TT_ID3V1;
+ }
+ if (parseLyrics3)
+ {
+ tt |= ID3TT_LYRICS;
+ }
+ return this->Link(fileInfo, tt);
+}
+
+#ifdef WIN32
+size_t ID3_TagImpl::Link(const wchar_t *fileInfo, flags_t tag_types)
+#else
+size_t ID3_TagImpl::Link(const char *fileInfo, flags_t tag_types)
+#endif
+{
+ _tags_to_parse.set(tag_types);
+
+ if (NULL == fileInfo)
+ {
+ return 0;
+ }
+
+ _file_name = fileInfo;
+ _changed = true;
+
+ this->ParseFile();
+
+ return this->GetPrependedBytes();
+}
+
+// used for streaming:
+size_t ID3_TagImpl::Link(ID3_Reader &reader, flags_t tag_types)
+{
+ _tags_to_parse.set(tag_types);
+
+#ifdef WIN32
+ _file_name = L"";
+#else
+ _file_name = "";
+#endif
+ _changed = true;
+
+ this->ParseReader(reader);
+
+ return this->GetPrependedBytes();
+}
+
+size_t RenderV1ToFile(ID3_TagImpl& tag, fstream& file)
+{
+ if (!file)
+ {
+ return 0;
+ }
+
+ // Heck no, this is stupid. If we do not read in an initial V1(.1)
+ // header then we are constantly appending new V1(.1) headers. Files
+ // can get very big that way if we never overwrite the old ones.
+ // if (ID3_V1_LEN > tag.GetAppendedBytes()) - Daniel Hazelbaker
+ if (ID3_V1_LEN > tag.GetFileSize())
+ {
+ file.seekp(0, ios::end);
+ }
+ else
+ {
+ // We want to check if there is already an id3v1 tag, so we can write over
+ // it. First, seek to the beginning of any possible id3v1 tag
+ file.seekg(0-ID3_V1_LEN, ios::end);
+ char sID[ID3_V1_LEN_ID];
+
+ // Read in the TAG characters
+ file.read(sID, ID3_V1_LEN_ID);
+
+ // If those three characters are TAG, then there's a preexisting id3v1 tag,
+ // so we should set the file cursor so we can overwrite it with a new tag.
+ if (memcmp(sID, "TAG", ID3_V1_LEN_ID) == 0)
+ {
+ file.seekp(0-ID3_V1_LEN, ios::end);
+ }
+ // Otherwise, set the cursor to the end of the file so we can append on
+ // the new tag.
+ else
+ {
+ file.seekp(0, ios::end);
+ }
+ }
+
+ ID3_IOStreamWriter out(file);
+
+ id3::v1::render(out, tag);
+
+ return ID3_V1_LEN;
+}
+
+//Klenotic: The RewriteFile() function assists RenderV2ToFile() and ID3_TagImpl::Strip(). It uses
+// C File IO for fast performance and adds code to properly copy file permissions on
+// Windows systems.
+size_t RewriteFile(const ID3_TagImpl& tag, const char* tagData, const size_t tagSize)
+{
+ ID3D_NOTICE( "RewriteFile: starting" );
+
+ bool bSuccess = false;
+
+#ifdef WIN32
+ _ASSERT(false);
+ return false;
+#else
+ String filename = tag.GetFileName();
+ String sTmpSuffix = ".XXXXXX";
+
+ char* sTempFile = new char[filename.size() + sTmpSuffix.size() + 1];
+ strcpy(sTempFile, filename.c_str());
+ strcat(sTempFile, sTmpSuffix.c_str());
+
+#if defined(WIN32)
+ _mktemp(sTempFile);
+#elif defined(HAVE_MKTEMP)
+ mktemp(sTempFile);
+#endif
+
+ FILE* fileIn = fopen(filename.c_str(), "r+b"); // Technically, we don't need to open this with write access. However, to the user, this is supposed to be an in-place update. To be consistent with that model, we'll open the source file with write access.
+ if (fileIn)
+ {
+ FILE* tmpOut = fopen(sTempFile, "w+b");
+ if (tmpOut)
+ {
+ // Begin Write Tag //
+ size_t ioResult = 0;
+ if ( (tagData) && (tagSize > 0) )
+ ioResult = fwrite(tagData, sizeof(char), tagSize, tmpOut);
+ // End Write Tag //
+
+ // Begin Write File Data //
+ if (ioResult == tagSize) // The tag was written correctly
+ {
+ unsigned char tmpBuffer[BUFSIZ] = {0};
+ fseek(fileIn, tag.GetPrependedBytes(), SEEK_SET);
+ while (!feof(fileIn))
+ {
+ size_t nBytes = fread(tmpBuffer, sizeof(unsigned char), BUFSIZ, fileIn);
+ fwrite(tmpBuffer, sizeof(unsigned char), nBytes, tmpOut);
+ }
+
+ if (!ferror(fileIn) && !ferror(tmpOut))
+ bSuccess = true;
+ }
+ // End Write File Data //
+
+ fclose(tmpOut);
+ }
+
+ fclose(fileIn);
+ }
+
+ if (bSuccess)
+ {
+ bSuccess = false;
+
+ // the following sets the permissions of the new file
+ // to be the same as the original
+#if defined(WIN32)
+ DWORD dwLength = 0;
+ GetFileSecurityA(filename.c_str(), DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, NULL, 0, &dwLength);
+ SECURITY_DESCRIPTOR* pSecurityDescriptor = reinterpret_cast<SECURITY_DESCRIPTOR*>(new char[dwLength + 1]);
+ if (GetFileSecurityA(filename.c_str(), DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, pSecurityDescriptor, dwLength, &dwLength))
+ SetFileSecurityA(sTempFile, DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, pSecurityDescriptor);
+ delete[] pSecurityDescriptor;
+#elif defined(HAVE_SYS_STAT_H)
+ struct stat fileStat;
+ if(stat(filename.c_str(), &fileStat) == 0)
+ {
+#endif //defined(HAVE_SYS_STAT_H)
+
+ // Begin File Replacement //
+ if (remove(filename.c_str()) == 0)
+ {
+ rename(sTempFile, filename.c_str());
+ bSuccess = true; // This must set this to true even if the rename fails. The source file has already been deleted. If the success flag is not set, the temp file will be removed as well.
+ }
+ // End File Replacement //
+
+#if defined(HAVE_SYS_STAT_H)
+ #if !defined(WIN32)
+ chmod(filename.c_str(), fileStat.st_mode);
+ }
+ #endif
+#endif //defined(HAVE_SYS_STAT_H)
+ }
+
+ if (!bSuccess)
+ remove(sTempFile);
+
+ delete[] sTempFile;
+
+ return bSuccess ? tagSize : -1;
+#endif // WIN32
+}
+
+//Klenotic: This is the modified version of the RenderV2ToFile function.
+size_t RenderV2ToFile(const ID3_TagImpl& tag, fstream& file)
+{
+#ifdef WIN32
+ _ASSERT(false);
+ return false;
+#else
+ ID3D_NOTICE( "RenderV2ToFile: starting" );
+ if (!file)
+ {
+ ID3D_WARNING( "RenderV2ToFile: error in file" );
+ return 0;
+ }
+
+ String tagString;
+ io::StringWriter writer(tagString);
+ id3::v2::render(writer, tag);
+ ID3D_NOTICE( "RenderV2ToFile: rendered v2" );
+
+ const char* tagData = tagString.data();
+ size_t tagSize = tagString.size();
+ // if the new tag fits perfectly within the old and the old one
+ // actually existed (ie this isn't the first tag this file has had)
+ if ((!tag.GetPrependedBytes() && !ID3_GetDataSize(tag)) ||
+ (tagSize == tag.GetPrependedBytes()))
+ {
+ file.seekp(0, ios::beg);
+ file.write(tagData, tagSize);
+ }
+ else
+ {
+ file.close(); // We need to close the fstream file to gain access to the file.
+ tagSize = RewriteFile(tag, tagData, tagSize);
+ if (tagSize == -1)
+ tagSize = 0;
+
+ file.clear();//to clear the eof mark
+ openWritableFile(tag.GetFileName(), file); // The code we're returning to expects the file to be open.
+ }
+
+ return tagSize;
+#endif
+}
+
+flags_t ID3_TagImpl::Update(flags_t ulTagFlag)
+{
+#ifdef WIN32
+ _ASSERT(false);
+ return false;
+#else
+ flags_t tags = ID3TT_NONE;
+
+ fstream file;
+ String filename = this->GetFileName();
+ ID3_Err err = openWritableFile(filename, file);
+ _file_size = getFileSize(file);
+
+ if (err == ID3E_NoFile)
+ {
+ err = createFile(filename, file);
+ }
+ if (err == ID3E_ReadOnly)
+ {
+ return tags;
+ }
+
+ if ((ulTagFlag & ID3TT_ID3V2) && this->HasChanged())
+ {
+ _prepended_bytes = RenderV2ToFile(*this, file);
+ if (_prepended_bytes)
+ {
+ tags |= ID3TT_ID3V2;
+ }
+ }
+
+ if ((ulTagFlag & ID3TT_ID3V1) &&
+ (!this->HasTagType(ID3TT_ID3V1) || this->HasChanged()))
+ {
+ size_t tag_bytes = RenderV1ToFile(*this, file);
+ if (tag_bytes)
+ {
+ // only add the tag_bytes if there wasn't an id3v1 tag before
+ if (! _file_tags.test(ID3TT_ID3V1))
+ {
+ _appended_bytes += tag_bytes;
+ }
+ tags |= ID3TT_ID3V1;
+ }
+ }
+ _changed = false;
+ _file_tags.add(tags);
+ _file_size = getFileSize(file);
+ file.close();
+ return tags;
+#endif
+}
+
+//Klenotic: this is the modified version of ID3_TagImpl::Strip.
+// returns 0 on failure or ulTagFlag on success.
+flags_t ID3_TagImpl::Strip(flags_t ulTagFlag)
+{
+#ifdef WIN32
+ _ASSERT(false);
+ return false;
+#else
+ flags_t ulTags = ID3TT_NONE;
+ const size_t data_size = ID3_GetDataSize(*this);
+
+ // First remove the prepended tag(s), if requested.
+ if ( (ulTagFlag & ID3TT_PREPENDED) && (_file_tags.get() & ID3TT_PREPENDED) )
+ {
+ size_t tagSize = RewriteFile(*this, NULL, 0);
+ if (tagSize == -1)
+ return 0;
+
+ ulTags |= _file_tags.get() & ID3TT_PREPENDED;
+ }
+
+ // Then remove the appended tag(s), if requested.
+ if ( (ulTagFlag & ID3TT_APPENDED) && (_file_tags.get() & ID3TT_APPENDED) )
+ {
+ size_t nNewFileSize = data_size;
+
+ ulTags |= _file_tags.get() & ID3TT_APPENDED;
+
+ if (!((ulTagFlag & ID3TT_PREPENDED) && (_file_tags.get() & ID3TT_PREPENDED)))
+ {
+ // add the original prepended tag size since we don't want to delete it,
+ // and the new file size represents the file size _not_ counting the ID3v2
+ // tag
+ nNewFileSize += this->GetPrependedBytes();
+ }
+ //else
+ //{
+ // // If we're stripping the ID3v2 tag, there's no need to adjust the new
+ // // file size, since it doesn't account for the ID3v2 tag size
+ //}
+
+ if (ulTags && (truncate(_file_name.c_str(), nNewFileSize) == -1))
+ {
+ // log this
+ return 0;
+ //ID3_THROW(ID3E_NoFile);
+ }
+ }
+
+ _prepended_bytes = (ulTags & ID3TT_PREPENDED) ? 0 : _prepended_bytes;
+ _appended_bytes = (ulTags & ID3TT_APPENDED) ? 0 : _appended_bytes;
+ _file_size = data_size + _prepended_bytes + _appended_bytes;
+
+ _changed = _file_tags.remove(ulTags) || _changed;
+
+ return ulTagFlag;
+#endif // WIN32
+}
diff --git a/src/tag_find.cpp b/src/tag_find.cpp
new file mode 100644
index 0000000..daad671
--- /dev/null
+++ b/src/tag_find.cpp
@@ -0,0 +1,189 @@
+// $Id: tag_find.cpp,v 1.28 2003/03/02 14:39:25 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+
+using namespace dami;
+
+ID3_TagImpl::const_iterator ID3_TagImpl::Find(const ID3_Frame *frame) const
+{
+ const_iterator cur = _frames.begin();
+
+ for (; cur != _frames.end(); ++cur)
+ {
+ if (*cur == frame)
+ {
+ break;
+ }
+ }
+
+ return cur;
+}
+
+ID3_TagImpl::iterator ID3_TagImpl::Find(const ID3_Frame *frame)
+{
+ iterator cur = _frames.begin();
+
+ for (; cur != _frames.end(); ++cur)
+ {
+ if (*cur == frame)
+ {
+ break;
+ }
+ }
+
+ return cur;
+}
+
+ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id) const
+{
+ ID3_Frame *frame = NULL;
+
+ // reset the cursor if it isn't set
+ if (_frames.end() == _cursor)
+ {
+ _cursor = _frames.begin();
+ }
+
+
+ for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
+ {
+ // We want to cycle through the list to find the matching frame. We
+ // should begin from the cursor, search each successive frame, wrapping
+ // if necessary. The enclosing loop and the assignment statments below
+ // ensure that we first begin at the cursor and search to the end of the
+ // list and, if unsuccessful, start from the beginning of the list and
+ // search to the cursor.
+ const_iterator
+ begin = (0 == iCount ? _cursor : _frames.begin()),
+ end = (0 == iCount ? _frames.end() : _cursor);
+ // search from the cursor to the end
+ for (const_iterator cur = begin; cur != end; ++cur)
+ {
+ if ((*cur != NULL) && ((*cur)->GetID() == id))
+ {
+ // We've found a valid frame. Set the cursor to be the next element
+ frame = *cur;
+ _cursor = ++cur;
+ break;
+ }
+ }
+ }
+
+ return frame;
+}
+
+ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id, ID3_FieldID fldID, const char* data, ID3_TextEnc sourceEnc) const
+{
+ ID3_Frame *frame = NULL;
+ ID3D_NOTICE( "Find: looking for comment with data = " << data.c_str() );
+
+ // reset the cursor if it isn't set
+ if (_frames.end() == _cursor)
+ {
+ _cursor = _frames.begin();
+ ID3D_NOTICE( "Find: resetting cursor" );
+ }
+
+ for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
+ {
+ ID3D_NOTICE( "Find: iCount = " << iCount );
+ // We want to cycle through the list to find the matching frame. We
+ // should begin from the cursor, search each successive frame, wrapping
+ // if necessary. The enclosing loop and the assignment statments below
+ // ensure that we first begin at the cursor and search to the end of the
+ // list and, if unsuccessful, start from the beginning of the list and
+ // search to the cursor.
+ const_iterator
+ begin = (0 == iCount ? _cursor : _frames.begin()),
+ end = (0 == iCount ? _frames.end() : _cursor);
+ // search from the cursor to the end
+ for (const_iterator cur = begin; cur != end; ++cur)
+ {
+ ID3D_NOTICE( "Find: frame = " << iCount << (uint32) *cur );
+ if ((*cur != NULL) && ((*cur)->GetID() == id) &&
+ (*cur)->Contains(fldID))
+ {
+ ID3_Field* fld = (*cur)->GetField(fldID);
+ if (NULL == fld)
+ {
+ continue;
+ ID3D_NOTICE( "Find: didn't have the right field" );
+ }
+
+ if ( data == fld->GetText(sourceEnc) ) // bug, does only look in the first text item!
+ {
+ // We've found a valid frame. Set cursor to be the next element
+ frame = *cur;
+ _cursor = ++cur;
+ break;
+ }
+ }
+ }
+ }
+
+ return frame;
+}
+
+
+ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id, ID3_FieldID fldID, uint32 data) const
+{
+ ID3_Frame *frame = NULL;
+
+ // reset the cursor if it isn't set
+ if (_frames.end() == _cursor)
+ {
+ _cursor = _frames.begin();
+ }
+
+ for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
+ {
+ // We want to cycle through the list to find the matching frame. We
+ // should begin from the cursor, search each successive frame, wrapping
+ // if necessary. The enclosing loop and the assignment statments below
+ // ensure that we first begin at the cursor and search to the end of the
+ // list and, if unsuccessful, start from the beginning of the list and
+ // search to the cursor.
+ const_iterator
+ begin = (0 == iCount ? _cursor : _frames.begin()),
+ end = (0 == iCount ? _frames.end() : _cursor);
+ // search from the cursor to the end
+ for (const_iterator cur = begin; cur != end; ++cur)
+ {
+ if ((*cur != NULL) && ((*cur)->GetID() == id) &&
+ ((*cur)->GetField(fldID)->Get() == data))
+ {
+ // We've found a valid frame. Set the cursor to be the next element
+ frame = *cur;
+ _cursor = ++cur;
+ break;
+ }
+ }
+ }
+
+ return frame;
+}
+
diff --git a/src/tag_impl.cpp b/src/tag_impl.cpp
new file mode 100644
index 0000000..68fef52
--- /dev/null
+++ b/src/tag_impl.cpp
@@ -0,0 +1,331 @@
+// $Id: tag_impl.cpp,v 1.13 2002/09/21 17:23:32 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+//#include "io_helpers.h"
+#include "io_strings.h"
+
+using namespace dami;
+
+size_t ID3_TagImpl::IsV2Tag(ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+ size_t tagSize = 0;
+ String id = io::readText(reader, ID3_TagHeader::ID_SIZE);
+ String ver = io::readText(reader, 2);
+ char flags = reader.readChar();
+ String size = io::readText(reader, 4);
+
+ if (id == ID3_TagHeader::ID &&
+ (uchar) ver [0] < 0xFF && (uchar) ver [1] < 0xFF &&
+ (uchar) size[0] < 0x80 && (uchar) size[1] < 0x80 &&
+ (uchar) size[2] < 0x80 && (uchar) size[3] < 0x80)
+ {
+ io::StringReader sr(size);
+ tagSize = io::readUInt28(sr) + ID3_TagHeader::SIZE;
+ }
+ else if (id != ID3_TagHeader::ID)
+ {
+ // clog << "*** IsV2Tag: Not an id3v2 tag header" << endl;
+ }
+ else if ((uchar)ver[0] >= 0xFF)
+ {
+ // clog << "*** IsV2Tag: Major offset" << endl;
+ }
+ else if ((uchar)ver[1] >= 0xFF)
+ {
+ // clog << "*** ISV2Tag: Minor offset" << endl;
+ }
+ else if ((uchar)size[0] >= 0x80)
+ {
+ // clog << "*** ISV2Tag: 1st size offset" << endl;
+ }
+ else if ((uchar)size[1] >= 0x80)
+ {
+ // clog << "*** ISV2Tag: 2nd size offset" << endl;
+ }
+ else if ((uchar)size[2] >= 0x80)
+ {
+ // clog << "*** ISV2Tag: 3rd size offset" << endl;
+ }
+ else if ((uchar)size[3] >= 0x80)
+ {
+ // clog << "*** ISV2Tag: 4th size offset" << endl;
+ }
+ else
+ {
+ // clog << "*** shouldn't get here!" << endl;
+ }
+
+ return tagSize;
+}
+
+#ifdef WIN32
+ID3_TagImpl::ID3_TagImpl(const wchar_t *name)
+#else
+ID3_TagImpl::ID3_TagImpl(const char *name)
+#endif
+ : _frames(),
+ _cursor(_frames.begin()),
+ _file_name(),
+ _file_size(0),
+ _prepended_bytes(0),
+ _appended_bytes(0),
+ _is_file_writable(false),
+ _mp3_info(NULL) // need to do this before this->Clear()
+{
+ this->Clear();
+ if (name)
+ {
+ this->Link(name);
+ }
+}
+
+ID3_TagImpl::ID3_TagImpl(const ID3_Tag &tag)
+ : _frames(),
+ _cursor(_frames.begin()),
+ _file_name(),
+ _file_size(0),
+ _prepended_bytes(0),
+ _appended_bytes(0),
+ _is_file_writable(false),
+ _mp3_info(NULL) // need to do this before this->Clear()
+{
+ *this = tag;
+}
+
+ID3_TagImpl::~ID3_TagImpl()
+{
+ this->Clear();
+}
+
+void ID3_TagImpl::Clear()
+{
+ for (iterator cur = _frames.begin(); cur != _frames.end(); ++cur)
+ {
+ if (*cur)
+ {
+ delete *cur;
+ *cur = NULL;
+ }
+ }
+ _frames.clear();
+ _cursor = _frames.begin();
+ _is_padded = true;
+
+ _hdr.Clear();
+ _hdr.SetSpec(ID3V2_LATEST);
+
+ _tags_to_parse.clear();
+ if (_mp3_info)
+ delete _mp3_info; // Also deletes _mp3_header
+
+ _mp3_info = NULL;
+
+ _changed = true;
+}
+
+
+void ID3_TagImpl::AddFrame(const ID3_Frame& frame)
+{
+ this->AddFrame(&frame);
+}
+
+void ID3_TagImpl::AddFrame(const ID3_Frame* frame)
+{
+ if (frame)
+ {
+ ID3_Frame* frm = new ID3_Frame(*frame);
+ this->AttachFrame(frm);
+ }
+}
+
+bool ID3_TagImpl::AttachFrame(ID3_Frame *frame)
+{
+
+ if (NULL == frame)
+ {
+ // log this
+ return false;
+ //ID3_THROW(ID3E_NoData);
+ }
+
+ _frames.push_back(frame);
+ _cursor = _frames.begin();
+
+ _changed = true;
+ return true;
+}
+
+
+ID3_Frame* ID3_TagImpl::RemoveFrame(const ID3_Frame *frame)
+{
+ ID3_Frame *frm = NULL;
+
+ iterator fi = Find(frame);
+ if (fi != _frames.end())
+ {
+ frm = *fi;
+ _frames.erase(fi);
+ _cursor = _frames.begin();
+ _changed = true;
+ }
+
+ return frm;
+}
+
+
+bool ID3_TagImpl::HasChanged() const
+{
+ bool changed = _changed;
+
+ if (! changed)
+ {
+ for (const_iterator fi = _frames.begin(); fi != _frames.end(); ++fi)
+ {
+ if (*fi)
+ {
+ changed = (*fi)->HasChanged();
+ }
+
+ if (changed)
+ {
+ break;
+ }
+ }
+ }
+
+ return changed;
+}
+
+bool ID3_TagImpl::SetSpec(ID3_V2Spec spec)
+{
+ bool changed = _hdr.SetSpec(spec);
+ _changed = _changed || changed;
+ return changed;
+}
+
+ID3_V2Spec ID3_TagImpl::GetSpec() const
+{
+ return _hdr.GetSpec();
+}
+
+bool ID3_TagImpl::SetUnsync(bool b)
+{
+ bool changed = _hdr.SetUnsync(b);
+ _changed = changed || _changed;
+ return changed;
+}
+
+bool ID3_TagImpl::SetExtended(bool ext)
+{
+ bool changed = _hdr.SetExtended(ext);
+ _changed = changed || _changed;
+ return changed;
+}
+
+bool ID3_TagImpl::SetExperimental(bool exp)
+{
+ bool changed = _hdr.SetExperimental(exp);
+ _changed = changed || _changed;
+ return changed;
+}
+
+bool ID3_TagImpl::GetUnsync() const
+{
+ return _hdr.GetUnsync();
+}
+
+bool ID3_TagImpl::GetExtended() const
+{
+ return _hdr.GetExtended();
+}
+
+bool ID3_TagImpl::GetExperimental() const
+{
+ return _hdr.GetExperimental();
+}
+
+bool ID3_TagImpl::GetFooter() const
+{
+ return _hdr.GetFooter();
+}
+
+size_t ID3_TagImpl::GetExtendedBytes() const
+{
+ if (this->GetExtended())
+ if (this->GetSpec() == ID3V2_4_0)
+ return 6; //minimal ID3v2.4 ext header size
+ else if (this->GetSpec() == ID3V2_3_0)
+ return 10; //minimal ID3v2.3 ext header size
+ else
+ return 0; //not implemented
+ else
+ return 0;;
+}
+
+bool ID3_TagImpl::SetPadding(bool pad)
+{
+ bool changed = (_is_padded != pad);
+ _changed = changed || _changed;
+ if (changed)
+ {
+ _is_padded = pad;
+ }
+
+ return changed;
+}
+
+
+ID3_TagImpl &
+ID3_TagImpl::operator=( const ID3_Tag &rTag )
+{
+ this->Clear();
+
+ this->SetUnsync(rTag.GetUnsync());
+ this->SetExtended(rTag.GetExtendedHeader());
+ this->SetExperimental(rTag.GetExperimental());
+
+ ID3_Tag::ConstIterator* iter = rTag.CreateIterator();
+ const ID3_Frame* frame = NULL;
+ while (NULL != (frame = iter->GetNext()))
+ {
+ this->AttachFrame(new ID3_Frame(*frame));
+ }
+ delete iter;
+ return *this;
+}
+
+size_t ID3_GetDataSize(const ID3_TagImpl& tag)
+{
+ return tag.GetFileSize() - tag.GetPrependedBytes() - tag.GetAppendedBytes();
+}
+
diff --git a/src/tag_impl.h b/src/tag_impl.h
new file mode 100644
index 0000000..318acc5
--- /dev/null
+++ b/src/tag_impl.h
@@ -0,0 +1,199 @@
+// -*- C++ -*-
+// $Id: tag_impl.h,v 1.10 2002/11/02 17:35:56 t1mpy Exp $
+
+// id3lib: a software library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#ifndef _ID3LIB_TAG_IMPL_H_
+#define _ID3LIB_TAG_IMPL_H_
+
+#include <list>
+#include <stdio.h>
+#include "tag.h" // has frame.h, field.h
+#include "header_tag.h"
+#include "mp3_header.h" //has io_decorators.h
+
+class ID3_Reader;
+class ID3_Writer;
+
+namespace dami
+{
+ namespace id3
+ {
+ namespace v1
+ {
+ bool parse(ID3_TagImpl&, ID3_Reader&);
+ void render(ID3_Writer&, const ID3_TagImpl&);
+ };
+ namespace v2
+ {
+ bool parse(ID3_TagImpl& tag, ID3_Reader& rdr);
+ void render(ID3_Writer& writer, const ID3_TagImpl& tag);
+ };
+ };
+ namespace lyr3
+ {
+ namespace v1
+ {
+ bool parse(ID3_TagImpl&, ID3_Reader&);
+ };
+ namespace v2
+ {
+ bool parse(ID3_TagImpl&, ID3_Reader&);
+ };
+ };
+ namespace mm
+ {
+ bool parse(ID3_TagImpl&, ID3_Reader&);
+ };
+};
+
+class ID3_TagImpl
+{
+ typedef std::list<ID3_Frame *> Frames;
+public:
+ typedef Frames::iterator iterator;
+ typedef Frames::const_iterator const_iterator;
+public:
+#ifdef WIN32
+ ID3_TagImpl(const wchar_t *name = NULL);
+#else
+ ID3_TagImpl(const char *name = NULL);
+#endif
+ ID3_TagImpl(const ID3_Tag &tag);
+ virtual ~ID3_TagImpl();
+
+ void Clear();
+ bool HasChanged() const;
+ void SetChanged(bool b) { _changed = b; }
+ size_t Size() const;
+
+ bool SetUnsync(bool);
+ bool SetExtended(bool);
+ bool SetExperimental(bool);
+ bool SetPadding(bool);
+
+ bool GetUnsync() const;
+ bool GetExtended() const;
+ bool GetExperimental() const;
+ bool GetFooter() const;
+
+ size_t GetExtendedBytes() const;
+
+ void AddFrame(const ID3_Frame&);
+ void AddFrame(const ID3_Frame*);
+ bool AttachFrame(ID3_Frame*);
+ ID3_Frame* RemoveFrame(const ID3_Frame *);
+
+#ifdef WIN32
+ size_t Link(const wchar_t *fileInfo, flags_t = (flags_t) ID3TT_ALL);
+#else
+ size_t Link(const char *fileInfo, flags_t = (flags_t) ID3TT_ALL);
+#endif
+ size_t Link(ID3_Reader &reader, flags_t = (flags_t) ID3TT_ALL);
+ flags_t Update(flags_t = (flags_t) ID3TT_ALL);
+ flags_t Strip(flags_t = (flags_t) ID3TT_ALL);
+
+ size_t GetPrependedBytes() const { return _prepended_bytes; }
+ size_t GetAppendedBytes() const { return _appended_bytes; }
+ size_t GetFileSize() const { return _file_size; }
+#ifdef WIN32
+ std::wstring GetFileName() const { return _file_name; }
+#else
+ dami::String GetFileName() const { return _file_name; }
+#endif
+
+ ID3_Frame* Find(ID3_FrameID id) const;
+ ID3_Frame* Find(ID3_FrameID id, ID3_FieldID fld, uint32 data) const;
+ ID3_Frame* Find(ID3_FrameID id, ID3_FieldID fld, const char* data, ID3_TextEnc enc = ID3TE_ISO8859_1 ) const;
+ // ID3_Frame* Find(ID3_FrameID id, ID3_FieldID fld, dami::WString) const;
+
+ size_t NumFrames() const { return _frames.size(); }
+ ID3_TagImpl& operator=( const ID3_Tag & );
+
+ bool HasTagType(ID3_TagType tt) const { return _file_tags.test(tt); }
+ ID3_V2Spec GetSpec() const;
+ bool SetSpec(ID3_V2Spec);
+
+ static size_t IsV2Tag(ID3_Reader&);
+
+ const Mp3_Headerinfo* GetMp3HeaderInfo() const { if (_mp3_info) return _mp3_info->GetMp3HeaderInfo(); else return NULL; }
+
+ iterator begin() { return _frames.begin(); }
+ iterator end() { return _frames.end(); }
+ const_iterator begin() const { return _frames.begin(); }
+ const_iterator end() const { return _frames.end(); }
+
+ /* Deprecated! */
+ void AddNewFrame(ID3_Frame* f) { this->AttachFrame(f); }
+#ifdef WIN32
+ size_t Link(const wchar_t *fileInfo, bool parseID3v1, bool parseLyrics3);
+#else
+ size_t Link(const char *fileInfo, bool parseID3v1, bool parseLyrics3);
+#endif
+ void SetCompression(bool) { ; }
+ void AddFrames(const ID3_Frame *, size_t);
+ bool HasLyrics() const { return this->HasTagType(ID3TT_LYRICS); }
+ bool HasV2Tag() const { return this->HasTagType(ID3TT_ID3V2); }
+ bool HasV1Tag() const { return this->HasTagType(ID3TT_ID3V1); }
+ size_t PaddingSize(size_t) const;
+
+protected:
+ const_iterator Find(const ID3_Frame *) const;
+ iterator Find(const ID3_Frame *);
+
+ void RenderExtHeader(uchar *);
+
+ void ParseFile();
+ void ParseReader(ID3_Reader &reader);
+
+private:
+ ID3_TagHeader _hdr; // information relevant to the tag header
+ bool _is_padded; // add padding to tags?
+
+ Frames _frames;
+
+ mutable const_iterator _cursor; // which frame in list are we at
+ mutable bool _changed; // has tag changed since last parse or render?
+
+ // file-related member variables
+#ifdef WIN32
+ std::wstring _file_name; // name of the file we are linked to
+#else
+ dami::String _file_name; // name of the file we are linked to
+#endif
+ size_t _file_size; // the size of the file (without any tag(s))
+ size_t _prepended_bytes; // number of tag bytes at start of file
+ size_t _appended_bytes; // number of tag bytes at end of file
+ bool _is_file_writable;// is the associated file (via Link) writable?
+ ID3_Flags _tags_to_parse; // which tag types should attempt to be parsed
+ ID3_Flags _file_tags; // which tag types does the file contain
+ Mp3Info *_mp3_info; // class used to retrieve _mp3_header
+};
+
+size_t ID3_GetDataSize(const ID3_TagImpl&);
+
+#endif /* _ID3LIB_TAG_IMPL_H_ */
+
diff --git a/src/tag_parse.cpp b/src/tag_parse.cpp
new file mode 100644
index 0000000..9db703c
--- /dev/null
+++ b/src/tag_parse.cpp
@@ -0,0 +1,503 @@
+// $Id: tag_parse.cpp,v 1.47 2002/11/24 17:33:30 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+//#if defined HAVE_CONFIG_H
+//#include <config.h> // Must include before zlib.h to compile on WinCE
+//#endif
+
+//#include <zlib.h>
+//#include <string.h>
+//#include <memory.h>
+
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+//#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "io_strings.h"
+
+using namespace dami;
+
+namespace
+{
+ bool parseFrames(ID3_TagImpl& tag, ID3_Reader& rdr)
+ {
+ ID3_Reader::pos_type beg = rdr.getCur();
+ io::ExitTrigger et(rdr, beg);
+ ID3_Reader::pos_type last_pos = beg;
+ size_t totalSize = 0;
+ size_t frameSize = 0;
+ while (!rdr.atEnd() && rdr.peekChar() != '\0')
+ {
+ ID3D_NOTICE( "id3::v2::parseFrames(): rdr.getBeg() = " << rdr.getBeg() );
+ ID3D_NOTICE( "id3::v2::parseFrames(): rdr.getCur() = " << rdr.getCur() );
+ ID3D_NOTICE( "id3::v2::parseFrames(): rdr.getEnd() = " << rdr.getEnd() );
+ last_pos = rdr.getCur();
+ ID3_Frame* f = new ID3_Frame;
+ f->SetSpec(tag.GetSpec());
+ bool goodParse = f->Parse(rdr);
+ frameSize = rdr.getCur() - last_pos;
+ ID3D_NOTICE( "id3::v2::parseFrames(): frameSize = " << frameSize );
+ totalSize += frameSize;
+
+ if (frameSize == 0)
+ {
+ // There is a problem.
+ // If the frame size is 0, then we can't progress.
+ ID3D_WARNING( "id3::v2::parseFrames(): frame size is 0, can't " <<
+ "continue parsing frames");
+ delete f;
+ // Break for now.
+ break;
+ }
+ else if (!goodParse)
+ {
+ // bad parse! we can't attach this frame.
+ ID3D_WARNING( "id3::v2::parseFrames(): bad parse, deleting frame");
+ delete f;
+ }
+ else if (f->GetID() != ID3FID_METACOMPRESSION)
+ {
+ ID3D_NOTICE( "id3::v2::parseFrames(): attaching non-compressed " <<
+ "frame");
+ // a good, uncompressed frame. attach away!
+ tag.AttachFrame(f);
+ }
+ else
+ {
+ ID3D_NOTICE( "id3::v2::parseFrames(): parsing ID3v2.2.1 " <<
+ "compressed frame");
+ // hmm. an ID3v2.2.1 compressed frame. It contains 1 or more
+ // compressed frames. Uncompress and call parseFrames recursively.
+ ID3_Field* fld = f->GetField(ID3FN_DATA);
+ if (fld)
+ {
+ ID3_MemoryReader mr(fld->GetRawBinary(), fld->BinSize());
+ ID3_Reader::char_type ch = mr.readChar();
+ if (ch != 'z')
+ {
+ // unknown compression method
+ ID3D_WARNING( "id3::v2::parseFrames(): unknown compression id " <<
+ " = '" << ch << "'" );
+ }
+ else
+ {
+ uint32 newSize = io::readBENumber(mr, sizeof(uint32));
+ size_t oldSize = f->GetDataSize() - sizeof(uint32) - 1;
+ io::CompressedReader cr(mr, newSize);
+ parseFrames(tag, cr);
+ if (!cr.atEnd())
+ {
+ // hmm. it didn't parse the entire uncompressed data. wonder
+ // why.
+ ID3D_WARNING( "id3::v2::parseFrames(): didn't parse entire " <<
+ "id3v2.2.1 compressed memory stream");
+ }
+ }
+ }
+ delete f;
+ }
+ et.setExitPos(rdr.getCur());
+ }
+ if (rdr.peekChar() == '\0')
+ {
+ ID3D_NOTICE( "id3::v2::parseFrames: done parsing, padding at postion " <<
+ rdr.getCur() );
+ }
+ else
+ {
+ ID3D_NOTICE( "id3::v2::parseFrames: done parsing, [cur, end] = [" <<
+ rdr.getCur() << ", " << rdr.getEnd() << "]" );
+ }
+ return true;
+ }
+};
+
+bool id3::v2::parse(ID3_TagImpl& tag, ID3_Reader& reader)
+{
+ ID3_Reader::pos_type beg = reader.getCur();
+ io::ExitTrigger et(reader);
+
+ ID3_TagHeader hdr;
+
+ io::WindowedReader wr(reader, ID3_TagHeader::SIZE);
+
+ if (!hdr.Parse(wr) || wr.getCur() == beg)
+ {
+ ID3D_NOTICE( "id3::v2::parse(): parsing header failes" );
+ return false;
+ }
+ if (hdr.GetExtended())
+ {
+ hdr.ParseExtended(reader);
+ }
+ tag.SetSpec(hdr.GetSpec());
+
+ size_t dataSize = hdr.GetDataSize();
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): dataSize = " << dataSize);
+
+ wr.setWindow(wr.getCur(), dataSize);
+ et.setExitPos(wr.getEnd());
+
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): data window beg = " << wr.getBeg() );
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): data window cur = " << wr.getCur() );
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): data window end = " << wr.getEnd() );
+ tag.SetExtended(hdr.GetExtended());
+ if (!hdr.GetUnsync())
+ {
+ tag.SetUnsync(false);
+ parseFrames(tag, wr);
+ }
+ else
+ {
+ // The buffer has been unsynced. It will have to be resynced to be
+ // readable. This has to be done a character at a time.
+ //
+ // The original reader may be reading in characters from a file. Doing
+ // this a character at a time is quite slow. To improve performance, read
+ // in the entire buffer into a string, then create an UnsyncedReader from
+ // the string.
+ //
+ // It might be better to implement a BufferedReader so that the details
+ // of this can be abstracted away behind a class
+ tag.SetUnsync(true);
+ BString raw = io::readAllBinary(wr);
+ io::BStringReader bsr(raw);
+ io::UnsyncedReader ur(bsr);
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): unsync beg = " << ur.getBeg() );
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): unsync cur = " << ur.getCur() );
+ ID3D_NOTICE( "ID3_TagImpl::Parse(ID3_Reader&): unsync end = " << ur.getEnd() );
+
+ // Now read the UnsyncedReader into another string, and parse the frames
+ // from the string. This is done so that 1. the unsynced reader is
+ // unsynced exactly once, removing the possibility of multiple unsyncings
+ // of the same string, and 2) so that calls to readChars aren't done a
+ // character at a time for every call
+ BString synced = io::readAllBinary(ur);
+ io::BStringReader sr(synced);
+ parseFrames(tag, sr);
+ }
+
+ return true;
+}
+
+void ID3_TagImpl::ParseFile()
+{
+ ifstream file;
+ if (ID3E_NoError != openReadableFile(this->GetFileName(), file))
+ {
+ // log this...
+ return;
+ }
+ ID3_IFStreamReader ifsr(file);
+ ParseReader(ifsr);
+ file.close();
+}
+
+//used for streaming media
+void ID3_TagImpl::ParseReader(ID3_Reader &reader)
+{
+ size_t mp3_core_size;
+ size_t bytes_till_sync;
+
+ io::WindowedReader wr(reader);
+ wr.setBeg(wr.getCur());
+
+ _file_tags.clear();
+ _file_size = reader.getEnd();
+
+ ID3_Reader::pos_type beg = wr.getBeg();
+ ID3_Reader::pos_type cur = wr.getCur();
+ ID3_Reader::pos_type end = wr.getEnd();
+
+ ID3_Reader::pos_type last = cur;
+
+ if (_tags_to_parse.test(ID3TT_ID3V2))
+ {
+ int count = 4096; // ESL, limit to 4k buffer to avoid scanning the whole file
+ do
+ {
+ last = cur;
+ // Parse tags at the beginning of the file first...
+ if (id3::v2::parse(*this, wr))
+ {
+ _file_tags.add(ID3TT_ID3V2);
+ }
+ cur = wr.getCur();
+ wr.setBeg(cur);
+ } while (!wr.atEnd() && (cur > last) && count--);
+ }
+
+#if 0 // ESL Aug 6th 2009: do we really need to do all this since all what we really care about are the sync bits???
+
+ // add silly padding outside the tag to _prepended_bytes
+ if (!wr.atEnd() && wr.peekChar() == '\0')
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): found padding outside tag" );
+ int count = 4096; // ESL, limit to 4k buffer to avoid scanning the whole file
+ do
+ {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setBeg(cur);
+ wr.setCur(cur);
+ } while (!wr.atEnd() && (cur > last) && (wr.peekChar() == '\0') && count--);
+ }
+ if (!wr.atEnd() && _file_size - (cur - beg) > 4 && wr.peekChar() == 255)
+ { //unfortunatly, this is necessary for finding an invalid padding
+ wr.setCur(cur + 1); //cur is known by peekChar
+ if (wr.readChar() == '\0' && wr.readChar() == '\0' && wr.peekChar() == '\0')
+ { //three empty bytes found, enough for me, this is stupid padding
+ cur += 3; //those are now allready read in (excluding the peekChar, since it will be added by do{})
+ int count = 4096; // ESL, limit to 4k buffer to avoid scanning the whole file
+ do
+ {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setBeg(cur);
+ wr.setCur(cur);
+ } while (!wr.atEnd() && (cur > last) && (wr.peekChar() == '\0') && count--);
+ }
+ else
+ wr.setCur(cur);
+ }
+ _prepended_bytes = cur - beg;
+ // go looking for the first sync byte to add to bytes_till_sync
+ // by not adding it to _prepended_bytes, we preserve this 'unknown' data
+ // The routine's only effect is helping the lib to find things as bitrate etc.
+ beg = wr.getBeg();
+
+ if (!wr.atEnd() && wr.peekChar() != 0xFF) //no sync byte, so, either this is not followed by a mp3 file or it's a fLaC file, or an encapsulating format, better check it
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): Didn't find mp3 sync byte" );
+ if ((_file_size - (cur - beg)) >= 4)
+ { //there is room to search for some kind of ID
+ unsigned char buf[5];
+ wr.readChars(buf, 4);
+ buf[4] = '\0';
+ // check for RIFF (an encapsulating format) ID
+ if (strncmp((char*)buf, "RIFF", 4) == 0 || strncmp((char*)buf, "RIFX", 4) == 0)
+ {
+ // next 4 bytes are RIFF size, skip them
+ cur = wr.getCur() + 4;
+ wr.setCur(cur);
+ // loop until first possible sync byte
+ if (!wr.atEnd() && wr.peekChar() != 0xFF)
+ {
+ int count = 4096; // ESL, limit to 4k buffer to avoid scanning the whole file
+ do
+ {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setCur(cur);
+ } while (!wr.atEnd() && (cur > last) && (wr.peekChar() != 0xFF) && count--);
+ }
+ }
+ else if (strncmp((char*)buf, "fLaC", 4) == 0)
+ { //a FLAC file, no need looking for a sync byte
+ beg = cur;
+ }
+ else
+ { //since we set the cursor 4 bytes ahead for looking for RIFF, RIFX or fLaC, better set it back
+ // but peekChar allready checked the first one, so we add one
+ cur = cur + 1;
+ wr.setCur(cur);
+
+ //go looking for a sync byte;
+ // ESL added: There is a problem with the current implementation, we were looking for 0xFF only,
+ // however that is not enough we should be looking for a a least 3 more bits to be set after that
+ // or even 4 if we exclude MPEG 2.5 which is only for very low bit rates / sampling anyway.
+ // See: http://www.mp3-tech.org/programmer/frame_header.html
+ // The previous implementation is disabled through the use of the following #if 0...#else...#endif
+#if 0
+ if (!wr.atEnd() && wr.peekChar() != 0xFF) //no sync byte, we have an unknown byte
+ {
+ do
+ {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setCur(cur);
+ } while (!wr.atEnd() && (cur > last) && (wr.peekChar() != 0xFF));
+ }
+#else
+ int count = 4096; // ESL, limit to 4k buffer to avoid scanning the whole file
+ last = cur - 1; // to pass the first test
+ while(!wr.atEnd() && (cur > last) && count--) {
+
+ if(wr.peekChar() == 0xFF) {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setCur(cur);
+ if(wr.atEnd()) {
+ break;
+ }
+ // Check second part of header, use 0xE0 instead to include MPEG 2.5
+ // also 0x02 exludes all non layer 3 files
+ if(((wr.peekChar() & 0xE0) == 0xE0) && ((wr.peekChar() & 0x06) == 0x02)) {
+ cur--; // go back to the begining of the sync word
+ break;
+ }
+ }
+ else {
+ last = cur;
+ cur = wr.getCur() + 1;
+ wr.setCur(cur);
+ }
+ }
+
+#endif
+ }
+ } //if ((_file_size - (cur - beg)) >= 4)
+ else
+ { //remaining size is smaller than 4 bytes, can't be useful, but leave it for now
+ beg = cur;
+ //file.close();
+ //return;
+ }
+ }
+
+ bytes_till_sync = cur - beg;
+
+#else // ESL Aug 6th 2009: new implementation that just look for the sync bits, this seems a lot more robust espcially when handling 'unknown' blocks as reported by ASFViewer
+
+ _prepended_bytes = wr.getCur() - beg;
+
+ int count = 64*1024; // ESL, limits to 64k to avoid scanning the whole file, this should be enough.
+ bool found = false;
+ while(!wr.atEnd() && count--) {
+
+ if(wr.readChar() == 0xFF) {
+
+ if(wr.atEnd()) {
+ return; // could not find the frames
+ }
+
+ // Check second part of header, use 0xE0 instead to include MPEG 2.5
+ // also 0x02 exludes all non layer 3 files
+ if(((wr.peekChar() & 0xE0) == 0xE0) && ((wr.peekChar() & 0x06) == 0x02)) {
+ size_t currentPos = wr.getCur();
+ // Reverse back past readChar so that Parse() is pointing
+ // to the correct character
+ wr.setCur(currentPos - 1);
+
+ Mp3Info mp3_info;
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): mp3header? cur = " << wr.getCur() );
+
+ if (mp3_info.Parse(wr, _file_size) && mp3_info.Seconds() != 0)
+ {
+ wr.setCur(currentPos);
+ found = true;
+ break;
+ } else {
+ wr.setCur(currentPos);
+ }
+ }
+ }
+ }
+
+ if(!found)
+ return; // could not find the frames
+
+ bytes_till_sync = (wr.getCur() - 1) - _prepended_bytes;
+
+#endif
+
+ cur = wr.setCur(end);
+ if (_file_size > _prepended_bytes)
+ {
+ do
+ {
+ last = cur;
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): beg = " << wr.getBeg() );
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): cur = " << wr.getCur() );
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): end = " << wr.getEnd() );
+ // ...then the tags at the end
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): musicmatch? cur = " << wr.getCur() );
+ if (_tags_to_parse.test(ID3TT_MUSICMATCH) && mm::parse(*this, wr))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): musicmatch! cur = " << wr.getCur() );
+ _file_tags.add(ID3TT_MUSICMATCH);
+ wr.setEnd(wr.getCur());
+ }
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): lyr3v1? cur = " << wr.getCur() );
+ if (_tags_to_parse.test(ID3TT_LYRICS3) && lyr3::v1::parse(*this, wr))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): lyr3v1! cur = " << wr.getCur() );
+ _file_tags.add(ID3TT_LYRICS3);
+ wr.setEnd(wr.getCur());
+ }
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): lyr3v2? cur = " << wr.getCur() );
+ if (_tags_to_parse.test(ID3TT_LYRICS3V2) && lyr3::v2::parse(*this, wr))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): lyr3v2! cur = " << wr.getCur() );
+ _file_tags.add(ID3TT_LYRICS3V2);
+ cur = wr.getCur();
+ wr.setCur(wr.getEnd());//set to end to seek id3v1 tag
+ //check for id3v1 tag and set End accordingly
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): id3v1? cur = " << wr.getCur() );
+ if (_tags_to_parse.test(ID3TT_ID3V1) && id3::v1::parse(*this, wr))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): id3v1! cur = " << wr.getCur() );
+ _file_tags.add(ID3TT_ID3V1);
+ }
+ wr.setCur(cur);
+ wr.setEnd(cur);
+ }
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): id3v1? cur = " << wr.getCur() );
+ if (_tags_to_parse.test(ID3TT_ID3V1) && id3::v1::parse(*this, wr))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): id3v1! cur = " << wr.getCur() );
+ wr.setEnd(wr.getCur());
+ _file_tags.add(ID3TT_ID3V1);
+ }
+ cur = wr.getCur();
+ } while (cur != last);
+ _appended_bytes = end - cur;
+
+ // Now get the mp3 header
+ mp3_core_size = (_file_size - _appended_bytes) - (_prepended_bytes + bytes_till_sync);
+ if (mp3_core_size >= 4)
+ { //it has at least the size for a mp3 header (a mp3 header is 4 bytes)
+ wr.setBeg(_prepended_bytes + bytes_till_sync);
+ wr.setCur(_prepended_bytes + bytes_till_sync);
+ wr.setEnd(_file_size - _appended_bytes);
+
+ _mp3_info = new Mp3Info;
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): mp3header? cur = " << wr.getCur() );
+
+ if (_mp3_info->Parse(wr, mp3_core_size))
+ {
+ ID3D_NOTICE( "ID3_TagImpl::ParseReader(): mp3header! cur = " << wr.getCur() );
+ }
+ else
+ {
+ delete _mp3_info;
+ _mp3_info = NULL;
+ }
+ }
+ }
+ else
+ this->SetPadding(false); //no need to pad an empty file
+}
+
diff --git a/src/tag_parse_lyrics3.cpp b/src/tag_parse_lyrics3.cpp
new file mode 100644
index 0000000..e502888
--- /dev/null
+++ b/src/tag_parse_lyrics3.cpp
@@ -0,0 +1,370 @@
+// $Id: tag_parse_lyrics3.cpp,v 1.35 2002/10/04 08:52:23 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include <ctype.h>
+#include <memory.h>
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+#include "helpers.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "io_strings.h"
+
+using namespace dami;
+
+namespace
+{
+ uint32 readIntegerString(ID3_Reader& reader, size_t numBytes)
+ {
+ uint32 val = 0;
+ for (size_t i = 0; i < numBytes && isdigit(reader.peekChar()); ++i)
+ {
+ val = (val * 10) + (reader.readChar() - '0');
+ }
+ ID3D_NOTICE( "readIntegerString: val = " << val );
+ return val;
+ }
+
+ uint32 readIntegerString(ID3_Reader& reader)
+ {
+ return readIntegerString(reader, reader.remainingBytes());
+ }
+
+ bool isTimeStamp(ID3_Reader& reader)
+ {
+ ID3_Reader::pos_type cur = reader.getCur();
+ if (reader.getEnd() < cur + 7)
+ {
+ return false;
+ }
+ bool its = ('[' == reader.readChar() &&
+ isdigit(reader.readChar()) && isdigit(reader.readChar()) &&
+ ':' == reader.readChar() &&
+ isdigit(reader.readChar()) && isdigit(reader.readChar()) &&
+ ']' == reader.readChar());
+ reader.setCur(cur);
+ if (its)
+ {
+ ID3D_NOTICE( "isTimeStamp(): found timestamp, cur = " << reader.getCur() );
+ }
+ return its;
+ }
+
+ uint32 readTimeStamp(ID3_Reader& reader)
+ {
+ reader.skipChars(1);
+ size_t sec = readIntegerString(reader, 2) * 60;
+ reader.skipChars(1);
+ sec += readIntegerString(reader, 2);
+ reader.skipChars(1);
+ ID3D_NOTICE( "readTimeStamp(): timestamp = " << sec );
+ return sec * 1000;
+ }
+
+ bool findText(ID3_Reader& reader, String text)
+ {
+ if (text.empty())
+ {
+ return true;
+ }
+
+ size_t index = 0;
+ while (!reader.atEnd())
+ {
+ ID3_Reader::char_type ch = reader.readChar();
+ if (ch == text[index])
+ {
+ index++;
+ }
+ else if (ch == text[0])
+ {
+ index = 1;
+ }
+ else
+ {
+ index = 0;
+ }
+ if (index == text.size())
+ {
+ reader.setCur(reader.getCur() - index);
+ ID3D_NOTICE( "findText: found \"" << text << "\" at " <<
+ reader.getCur() );
+ break;
+ }
+ }
+ return !reader.atEnd();
+ };
+
+ void lyrics3ToSylt(ID3_Reader& reader, ID3_Writer& writer)
+ {
+ while (!reader.atEnd())
+ {
+ bool lf = false;
+ size_t ms = 0;
+ size_t count = 0;
+ while (isTimeStamp(reader))
+ {
+ // For now, just skip over multiple time stamps
+ if (count++ > 0)
+ {
+ readTimeStamp(reader);
+ }
+ else
+ {
+ ms = readTimeStamp(reader);
+ }
+ }
+ while (!reader.atEnd() && !isTimeStamp(reader))
+ {
+ ID3_Reader::char_type ch = reader.readChar();
+ if (0x0A == ch && (reader.atEnd() || isTimeStamp(reader)))
+ {
+ lf = true;
+ break;
+ }
+ else
+ {
+ writer.writeChar(ch);
+ }
+ }
+
+ // put synch identifier
+ writer.writeChar('\0');
+
+ // put timestamp
+ ID3D_NOTICE( "lyrics3toSylt: ms = " << ms );
+
+ io::writeBENumber(writer, ms, sizeof(uint32));
+ if (lf)
+ {
+ ID3D_NOTICE( "lyrics3toSylt: adding lf" );
+
+ // put the LF
+ writer.writeChar(0x0A);
+ }
+ }
+ }
+};
+
+bool lyr3::v1::parse(ID3_TagImpl& tag, ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+ ID3_Reader::pos_type end = reader.getCur();
+ if (end < reader.getBeg() + 9 + 128)
+ {
+ ID3D_NOTICE( "id3::v1::parse: bailing, not enough bytes to parse, pos = " << end );
+ return false;
+ }
+ reader.setCur(end - (9 + 128));
+
+ {
+ if (io::readText(reader, 9) != "LYRICSEND" ||
+ io::readText(reader, 3) != "TAG")
+ {
+ return false;
+ }
+ }
+
+ // we have a Lyrics3 v1.00 tag
+ if (end < reader.getBeg() + 11 + 9 + 128)
+ {
+ // the file size isn't large enough to actually hold lyrics
+ ID3D_WARNING( "id3::v1::parse: not enough data to parse lyrics3" );
+ return false;
+ }
+
+ // reserve enough space for lyrics3 + id3v1 tag
+ size_t window = end - reader.getBeg();
+ size_t lyrDataSize = min<size_t>(window, 11 + 5100 + 9 + 128);
+ reader.setCur(end - lyrDataSize);
+ io::WindowedReader wr(reader, lyrDataSize - (9 + 128));
+
+ if (!findText(wr, "LYRICSBEGIN"))
+ {
+ ID3D_WARNING( "id3::v1::parse: couldn't find LYRICSBEGIN, bailing" );
+ return false;
+ }
+
+ et.setExitPos(wr.getCur());
+ wr.skipChars(11);
+ wr.setBeg(wr.getCur());
+
+ io::LineFeedReader lfr(wr);
+ String lyrics = io::readText(lfr, wr.remainingBytes());
+ id3::v2::setLyrics(tag, lyrics, "Converted from Lyrics3 v1.00", "XXX");
+
+ return true;
+}
+
+//bool parse(TagImpl& tag, ID3_Reader& reader)
+bool lyr3::v2::parse(ID3_TagImpl& tag, ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+ ID3_Reader::pos_type end = reader.getCur();
+ if (end < reader.getBeg() + 6 + 9 + 128)
+ {
+ ID3D_NOTICE( "lyr3::v2::parse: bailing, not enough bytes to parse, pos = " << reader.getCur() );
+ return false;
+ }
+
+ reader.setCur(end - (6 + 9 + 128));
+ uint32 lyrSize = 0;
+
+ ID3_Reader::pos_type beg = reader.getCur();
+ lyrSize = readIntegerString(reader, 6);
+ if (reader.getCur() < beg + 6)
+ {
+ ID3D_NOTICE( "lyr3::v2::parse: couldn't find numeric string, lyrSize = " <<
+ lyrSize );
+ return false;
+ }
+
+ if (io::readText(reader, 9) != "LYRICS200" ||
+ io::readText(reader, 3) != "TAG")
+ {
+ return false;
+ }
+
+ if (end < reader.getBeg() + lyrSize + 6 + 9 + 128)
+ {
+ ID3D_WARNING( "lyr3::v2::parse: not enough data to parse tag, lyrSize = " << lyrSize );
+ return false;
+ }
+ reader.setCur(end - (lyrSize + 6 + 9 + 128));
+
+ io::WindowedReader wr(reader);
+ wr.setWindow(wr.getCur(), lyrSize);
+
+ beg = wr.getCur();
+
+ if (io::readText(wr, 11) != "LYRICSBEGIN")
+ {
+ // not a lyrics v2.00 tag
+ ID3D_WARNING( "lyr3::v2::parse: couldn't find LYRICSBEGIN, bailing" );
+ return false;
+ }
+
+ bool has_time_stamps = false;
+
+ ID3_Frame* lyr_frame = NULL;
+
+ while (!wr.atEnd())
+ {
+ uint32 fldSize;
+
+ String fldName = io::readText(wr, 3);
+ ID3D_NOTICE( "lyr3::v2::parse: fldName = " << fldName );
+ fldSize = readIntegerString(wr, 5);
+ ID3D_NOTICE( "lyr3::v2::parse: fldSize = " << fldSize );
+
+ String fldData;
+
+ io::WindowedReader wr2(wr, fldSize);
+ io::LineFeedReader lfr(wr2);
+
+ fldData = io::readText(lfr, fldSize);
+ ID3D_NOTICE( "lyr3::v2::parse: fldData = \"" << fldData << "\"" );
+
+ // the IND field
+ if (fldName == "IND")
+ {
+ has_time_stamps = (fldData.size() > 1 && fldData[1] == '1');
+ }
+
+ // the TITLE field
+ else if (fldName == "ETT" && !id3::v2::hasTitle(tag))
+ {
+ //tag.setTitle(fldData);
+ id3::v2::setTitle(tag, fldData);
+ }
+
+ // the ARTIST field
+ else if (fldName == "EAR" && !id3::v2::hasArtist(tag))
+ {
+ //tag.setArtist(fldData);
+ id3::v2::setArtist(tag, fldData);
+ }
+
+ // the ALBUM field
+ else if (fldName == "EAL" && !id3::v2::hasAlbum(tag))
+ {
+ //tag.setAlbum(fldData);
+ id3::v2::setAlbum(tag, fldData);
+ }
+
+ // the Lyrics/Music AUTHOR field
+ else if (fldName == "AUT")
+ {
+ //tag.setAuthor(fldData);
+ id3::v2::setLyricist(tag, fldData);
+ }
+
+ // the INFORMATION field
+ else if (fldName == "INF")
+ {
+ //tag.setInfo(fldData);
+ id3::v2::setComment(tag, fldData, "Lyrics3 v2.00 INF", "XXX");
+ }
+
+ // the LYRICS field
+ else if (fldName == "LYR")
+ {
+ // if already found an INF field, use it as description
+ String desc = "Converted from Lyrics3 v2.00";
+ //tag.setLyrics(fldData);
+ if (!has_time_stamps)
+ {
+ lyr_frame = id3::v2::setLyrics(tag, fldData, desc, "XXX");
+ }
+ else
+ {
+ // converts from lyrics3 to SYLT in-place
+ io::StringReader sr(fldData);
+ ID3D_NOTICE( "lyr3::v2::parse: determining synced lyrics" );
+ BString sylt;
+ io::BStringWriter sw(sylt);
+ lyrics3ToSylt(sr, sw);
+
+ lyr_frame = id3::v2::setSyncLyrics(tag, sylt, ID3TSF_MS, desc,
+ "XXX", ID3CT_LYRICS);
+ ID3D_NOTICE( "lyr3::v2::parse: determined synced lyrics" );
+ }
+ }
+ else if (fldName == "IMG")
+ {
+ // currently unsupported
+ ID3D_WARNING( "lyr3::v2::parse: IMG field unsupported" );
+ }
+ else
+ {
+ ID3D_WARNING( "lyr3::v2::parse: undefined field id: " <<
+ fldName );
+ }
+ }
+
+ et.setExitPos(beg);
+ return true;
+}
+
diff --git a/src/tag_parse_musicmatch.cpp b/src/tag_parse_musicmatch.cpp
new file mode 100644
index 0000000..a80d8f4
--- /dev/null
+++ b/src/tag_parse_musicmatch.cpp
@@ -0,0 +1,353 @@
+// $Id: tag_parse_musicmatch.cpp,v 1.19 2002/07/02 22:15:18 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <ctype.h>
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+#include "helpers.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+
+using namespace dami;
+
+namespace
+{
+ uint32 readSeconds(ID3_Reader& reader, size_t len)
+ {
+ io::ExitTrigger et(reader);
+ io::WindowedReader wr(reader, len);
+ ID3_Reader::pos_type beg = wr.getCur();
+ uint32 seconds = 0;
+ uint32 cur = 0;
+ while (!wr.atEnd())
+ {
+ ID3_Reader::char_type ch = wr.readChar();
+ if (':' == ch)
+ {
+ seconds += 60 * cur;
+ cur = 0;
+ }
+ else if (!isdigit(ch))
+ {
+ return 0;
+ }
+ else
+ {
+ cur = cur * 10 + (ch - '0');
+ }
+ }
+ et.release();
+ return seconds + cur;
+ }
+
+ ID3_Frame* readTextFrame(ID3_Reader& reader, ID3_FrameID id, const String desc = "")
+ {
+ uint32 size = io::readLENumber(reader, 2);
+ ID3D_NOTICE( "readTextFrame: size = " << size );
+ if (size == 0)
+ {
+ return NULL;
+ }
+
+ String text;
+ if (ID3FID_SONGLEN != id)
+ {
+ io::LineFeedReader lfr(reader);
+ text = io::readText(lfr, size);
+ ID3D_NOTICE( "readTextFrame: text = " << text );
+ }
+ else
+ {
+ text = toString(readSeconds(reader, size) * 1000);
+ ID3D_NOTICE( "readTextFrame: songlen = " << text );
+ }
+
+ ID3_Frame* frame = new ID3_Frame(id);
+ if (frame)
+ {
+ if (frame->Contains(ID3FN_TEXT))
+ {
+ frame->GetField(ID3FN_TEXT)->Set(text.c_str());
+ }
+ else if (frame->Contains(ID3FN_URL))
+ {
+ frame->GetField(ID3FN_URL)->Set(text.c_str());
+ }
+ if (frame->Contains(ID3FN_LANGUAGE))
+ {
+ frame->GetField(ID3FN_LANGUAGE)->Set("XXX");
+ }
+ if (frame->Contains(ID3FN_DESCRIPTION))
+ {
+ frame->GetField(ID3FN_DESCRIPTION)->Set(desc.c_str());
+ }
+ }
+ return frame;
+ }
+};
+
+bool mm::parse(ID3_TagImpl& tag, ID3_Reader& rdr)
+{
+ io::ExitTrigger et(rdr);
+ ID3_Reader::pos_type end = rdr.getCur();
+ if (end < rdr.getBeg() + 48)
+ {
+ ID3D_NOTICE( "mm::parse: bailing, not enough bytes to parse, pos = " << end );
+ return false;
+ }
+
+ rdr.setCur(end - 48);
+ String version;
+
+ {
+ if (io::readText(rdr, 32) != "Brava Software Inc. ")
+ {
+ ID3D_NOTICE( "mm::parse: bailing, couldn't find footer" );
+ return false;
+ }
+
+ version = io::readText(rdr, 4);
+ if (version.size() != 4 ||
+ !isdigit(version[0]) || version[1] != '.' ||
+ !isdigit(version[2]) ||
+ !isdigit(version[3]))
+ {
+ ID3D_WARNING( "mm::parse: bailing, nonstandard version = " << version );
+ return false;
+ }
+ }
+
+ ID3_Reader::pos_type beg = rdr.setCur(end - 48);
+ et.setExitPos(beg);
+ if (end < 68)
+ {
+ ID3D_NOTICE( "mm::parse: bailing, not enough bytes to parse offsets, pos = " << end );
+ return false;
+ }
+ rdr.setCur(end - 68);
+
+ io::WindowedReader dataWindow(rdr);
+ dataWindow.setEnd(rdr.getCur());
+
+ uint32 offsets[5];
+
+ io::WindowedReader offsetWindow(rdr, 20);
+ for (size_t i = 0; i < 5; ++i)
+ {
+ offsets[i] = io::readLENumber(rdr, sizeof(uint32));
+ }
+
+ size_t metadataSize = 0;
+ if (version <= "3.00")
+ {
+ // All MusicMatch tags up to and including version 3.0 had metadata
+ // sections exactly 7868 bytes in length.
+ metadataSize = 7868;
+ }
+ else
+ {
+ // MusicMatch tags after version 3.0 had three possible lengths for their
+ // metadata sections. We can determine which it was by searching for
+ // the version section signature that should precede the metadata section
+ // by exactly 256 bytes.
+ size_t possibleSizes[] = { 8132, 8004, 7936 };
+
+ for (size_t i = 0; i < sizeof(possibleSizes)/sizeof(size_t); ++i)
+ {
+ dataWindow.setCur(dataWindow.getEnd());
+
+ // Our offset will be exactly 256 bytes prior to our potential metadata
+ // section
+ size_t offset = possibleSizes[i] + 256;
+ if (dataWindow.getCur() < offset)
+ {
+ // if our filesize is less than the offset, then it can't possibly
+ // be the correct offset, so try again.
+ continue;
+ }
+ dataWindow.setCur(dataWindow.getCur() - offset);
+
+ // now read in the signature to see if it's a match
+ if (io::readText(dataWindow, 8) == "18273645")
+ {
+ metadataSize = possibleSizes[i];
+ break;
+ }
+ }
+ }
+ if (0 == metadataSize)
+ {
+ // if we didn't establish a size for the metadata, then something is
+ // wrong. probably should log this.
+ ID3D_WARNING( "mm::parse: bailing, couldn't find meta data signature, end = " << end );
+ return false;
+ }
+
+ // parse the offset pointers to determine the actual sizes of all the
+ // sections
+ size_t sectionSizes[5];
+ size_t tagSize = metadataSize;
+
+ // we already know the size of the last section
+ sectionSizes[4] = metadataSize;
+
+ size_t lastOffset = 0;
+ for (int i = 0; i < 5; i++)
+ {
+ size_t thisOffset = offsets[i];
+ //ASSERT(thisOffset > lastOffset);
+ if (i > 0)
+ {
+ size_t sectionSize = thisOffset - lastOffset;
+ sectionSizes[i-1] = sectionSize;
+ tagSize += sectionSize;
+ }
+ lastOffset = thisOffset;
+ }
+
+ // now check to see that our tag size is reasonable
+ if (dataWindow.getEnd() < tagSize)
+ {
+ // Ack! The tag size doesn't jive with the tag's ending position in
+ // the file. Bail!
+ ID3D_WARNING( "mm::parse: bailing, tag size is too big, tag size = " << tagSize << ", end = " << end );
+ return false;
+ }
+
+ dataWindow.setBeg(dataWindow.getEnd() - tagSize);
+ dataWindow.setCur(dataWindow.getBeg());
+
+ // Now calculate the adjusted offsets
+ offsets[0] = dataWindow.getBeg();
+ for (size_t i = 0; i < 4; ++i)
+ {
+ offsets[i+1] = offsets[i] + sectionSizes[i];
+ }
+
+ // now check for a tag header and adjust the tag_beg pointer appropriately
+ if (dataWindow.getBeg() >= 256)
+ {
+ rdr.setCur(dataWindow.getBeg() - 256);
+ if (io::readText(rdr, 8) == "18273645")
+ {
+ et.setExitPos(rdr.getCur() - 8);
+ }
+ else
+ {
+ et.setExitPos(dataWindow.getBeg());
+ }
+ dataWindow.setCur(dataWindow.getBeg());
+ }
+
+ // Now parse the various sections...
+
+ // Parse the image extension at offset 0
+ dataWindow.setCur(offsets[0]);
+ String imgExt = io::readTrailingSpaces(dataWindow, 4);
+
+ // Parse the image binary at offset 1
+ dataWindow.setCur(offsets[1]);
+ uint32 imgSize = io::readLENumber(dataWindow, 4);
+ if (imgSize == 0)
+ {
+ // no image binary. don't do anything.
+ }
+ else
+ {
+ io::WindowedReader imgWindow(dataWindow, imgSize);
+ if (imgWindow.getEnd() < imgWindow.getBeg() + imgSize)
+ {
+ // Ack! The image size given extends beyond the next offset! This is
+ // not good... log?
+ }
+ else
+ {
+ BString imgData = io::readAllBinary(imgWindow);
+ ID3_Frame* frame = new ID3_Frame(ID3FID_PICTURE);
+ if (frame)
+ {
+ String mimetype("image/");
+ mimetype += imgExt;
+ frame->GetField(ID3FN_MIMETYPE)->Set(mimetype.c_str());
+ frame->GetField(ID3FN_IMAGEFORMAT)->Set("");
+ frame->GetField(ID3FN_PICTURETYPE)->Set(static_cast<unsigned int>(0));
+ frame->GetField(ID3FN_DESCRIPTION)->Set("");
+ frame->GetField(ID3FN_DATA)->Set(reinterpret_cast<const uchar*>(imgData.data()), imgData.size());
+ tag.AttachFrame(frame);
+ }
+ }
+ }
+
+ //file.seekg(offsets[2]);
+ //file.seekg(offsets[3]);
+ dataWindow.setCur(offsets[4]);
+
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_TITLE));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_ALBUM));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_LEADARTIST));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_CONTENTTYPE));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Tempo"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Mood"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Situation"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Preference"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_SONGLEN));
+
+ // The next 12 bytes can be ignored. The first 8 represent the
+ // creation date as a 64 bit floating point number. The last 4 are
+ // for a play counter.
+ dataWindow.skipChars(12);
+
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Path"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Serial"));
+
+ // 2 bytes for track
+ uint32 trkNum = io::readLENumber(dataWindow, 2);
+ if (trkNum > 0)
+ {
+ String trkStr = toString(trkNum);
+ ID3_Frame* frame = new ID3_Frame(ID3FID_TRACKNUM);
+ if (frame)
+ {
+ frame->GetField(ID3FN_TEXT)->Set(trkStr.c_str());
+ tag.AttachFrame(frame);
+ }
+ }
+
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Notes"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_Bio"));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_UNSYNCEDLYRICS));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_WWWARTIST));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_WWWCOMMERCIALINFO));
+ tag.AttachFrame(readTextFrame(dataWindow, ID3FID_COMMENT, "MusicMatch_ArtistEmail"));
+
+ // email?
+
+ return true;
+}
+
diff --git a/src/tag_parse_v1.cpp b/src/tag_parse_v1.cpp
new file mode 100644
index 0000000..928fd61
--- /dev/null
+++ b/src/tag_parse_v1.cpp
@@ -0,0 +1,169 @@
+// $Id: tag_parse_v1.cpp,v 1.27 2002/07/31 13:45:18 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+#include "helpers.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "io_strings.h"
+
+using namespace dami;
+
+bool id3::v1::parse(ID3_TagImpl& tag, ID3_Reader& reader)
+{
+ io::ExitTrigger et(reader);
+
+ ID3_Reader::pos_type end = reader.getCur();
+ // posn ourselves at 128 bytes from the current position
+ if (end < reader.getBeg() + ID3_V1_LEN)
+ {
+ ID3D_NOTICE( "id3::v1::parse: not enough bytes to parse, pos = " << end );
+ return false;
+ }
+ reader.setCur(end - ID3_V1_LEN);
+ ID3_Reader::pos_type beg = reader.getCur();
+ //file.seekg(-static_cast<long>(ID3_V1_LEN), ios::cur);
+ if (end != beg + ID3_V1_LEN)
+ {
+ ID3D_WARNING( "id3::v1::parse: failed to reposition " << ID3_V1_LEN <<
+ " bytes" );
+ return false;
+ }
+
+ // read the next 128 bytes in;
+ String field = io::readText(reader, ID3_V1_LEN_ID);
+
+ // check to see if it was a tag
+ if (field != "TAG")
+ {
+ return false;
+ }
+ et.setExitPos(beg);
+
+ // guess so, let's start checking the v2 tag for frames which are the
+ // equivalent of the v1 fields. When we come across a v1 field that has
+ // no current equivalent v2 frame, we create the frame, copy the data
+ // from the v1 frame and attach it to the tag
+
+ // (Scott Wheeler) The above comment was nice in theory, but it wasn't
+ // first checking (before my hacks) to see if there already was v2 data.
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ String title = io::readTrailingSpaces(reader, ID3_V1_LEN_TITLE);
+ field = id3::v2::getTitle(tag);
+ if (title.size() > 0 && (field.size() == 0 || field == ""))
+ {
+ id3::v2::setTitle(tag, title);
+ }
+ ID3D_NOTICE( "id3::v1::parse: title = \"" << title << "\"" );
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ String artist = io::readTrailingSpaces(reader, ID3_V1_LEN_ARTIST);
+ field = id3::v2::getArtist(tag);
+ if (artist.size() > 0 && (field.size() == 0 || field == ""))
+ {
+ id3::v2::setArtist(tag, artist);
+ }
+ ID3D_NOTICE( "id3::v1::parse: artist = \"" << artist << "\"" );
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ String album = io::readTrailingSpaces(reader, ID3_V1_LEN_ALBUM);
+ field = id3::v2::getAlbum(tag);
+ if (album.size() > 0 && (field.size() == 0 || field == ""))
+ {
+ id3::v2::setAlbum(tag, album);
+ }
+ ID3D_NOTICE( "id3::v1::parse: album = \"" << title << "\"" );
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ String year = io::readTrailingSpaces(reader, ID3_V1_LEN_YEAR);
+ field = id3::v2::getYear(tag);
+ if (year.size() > 0 && (field.size() == 0 || field == ""))
+ {
+ id3::v2::setYear(tag, year);
+ }
+ ID3D_NOTICE( "id3::v1::parse: year = \"" << year << "\"" );
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ String comment = io::readTrailingSpaces(reader, ID3_V1_LEN_COMMENT-2);
+ // fixes bug for when tracknumber is 0x20
+ BString trackno = io::readBinary(reader, ID3_V1_LEN_COMMENT-28);
+ if(trackno.size() > 1) { // defensive test to fix Windows WinQual Report# 557960782
+ if (trackno[0] == '\0')
+ {
+ if (trackno[1] != '\0')
+ { //we've got a tracknumber
+ size_t track = trackno[1];
+ field = id3::v2::getTrack(tag);
+ if (field.size() == 0 || field == "00")
+ {
+ id3::v2::setTrack(tag, track, 0);
+ }
+ ID3D_NOTICE( "id3::v1::parse: track = \"" << track << "\"" );
+ ID3D_NOTICE( "id3::v1::parse: comment length = \"" << comment.length() << "\"" );
+ }
+ }
+ else
+ {
+ // trackno[0] != '\0'
+ const int paddingsize = (ID3_V1_LEN_COMMENT-2) - comment.size();
+ const char * padding = " "; //28 spaces
+
+ if (trackno[1] == '\0' || trackno[1] == 0x20 && trackno[0] != 0x20)
+ {
+ // if there used to be spaces they are gone now, we need to rebuild them
+ comment.append(padding, paddingsize);
+ comment.append((const char *)trackno.data(), 1);
+ }
+ else if (trackno[1] != '\0' && trackno[1] != 0x20 && trackno[0] != 0x20)
+ {
+ // if there used to be spaces they are gone now, we need to rebuild them
+ comment.append(padding, paddingsize);
+ comment.append((const char *)trackno.data(), 2);
+ }
+ }
+ }
+ ID3D_NOTICE( "id3::v1::parse: comment = \"" << comment << "\"" );
+ if (comment.size() > 0)
+ {
+ id3::v2::setComment(tag, comment, STR_V1_COMMENT_DESC, "XXX");
+ }
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ // the GENRE field/frame
+ uchar genre = reader.readChar();
+ field = id3::v2::getGenre(tag);
+ if (genre != 0xFF && (field.size() == 0 || field == ""))
+ {
+ id3::v2::setGenre(tag, genre);
+ }
+ ID3D_NOTICE( "id3::v1::parse: genre = \"" << (int) genre << "\"" );
+
+ ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
+ return true;
+}
+
+
diff --git a/src/tag_render.cpp b/src/tag_render.cpp
new file mode 100644
index 0000000..a4a6351
--- /dev/null
+++ b/src/tag_render.cpp
@@ -0,0 +1,228 @@
+// $Id: tag_render.cpp,v 1.44 2002/07/31 13:20:49 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#include <memory.h>
+#include "tag_impl.h" //has <stdio.h> "tag.h" "header_tag.h" "frame.h" "field.h" "spec.h" "id3lib_strings.h" "utils.h"
+#include "helpers.h"
+#include "writers.h"
+#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"
+#include "io_helpers.h"
+#include "io_strings.h"
+
+#if defined HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+using namespace dami;
+
+void id3::v1::render(ID3_Writer& writer, const ID3_TagImpl& tag)
+{
+ writer.writeChars("TAG", 3);
+
+ io::writeTrailingSpaces(writer, id3::v2::getTitle(tag), ID3_V1_LEN_TITLE);
+ io::writeTrailingSpaces(writer, id3::v2::getArtist(tag), ID3_V1_LEN_ARTIST);
+ io::writeTrailingSpaces(writer, id3::v2::getAlbum(tag), ID3_V1_LEN_ALBUM);
+ io::writeTrailingSpaces(writer, id3::v2::getYear(tag), ID3_V1_LEN_YEAR);
+
+ size_t track = id3::v2::getTrackNum(tag);
+ String comment = id3::v2::getV1Comment(tag);
+ if (track > 0)
+ {
+ io::writeTrailingSpaces(writer, comment, ID3_V1_LEN_COMMENT - 2);
+ writer.writeChar('\0');
+ writer.writeChar((char) track);
+ }
+ else
+ {
+ io::writeTrailingSpaces(writer, comment, ID3_V1_LEN_COMMENT);
+ }
+ writer.writeChar((char) id3::v2::getGenreNum(tag));
+}
+
+namespace
+{
+ void renderFrames(ID3_Writer& writer, const ID3_TagImpl& tag)
+ {
+ for (ID3_TagImpl::const_iterator iter = tag.begin(); iter != tag.end(); ++iter)
+ {
+ const ID3_Frame* frame = *iter;
+ if (frame) frame->Render(writer);
+ }
+ }
+}
+
+void id3::v2::render(ID3_Writer& writer, const ID3_TagImpl& tag)
+{
+ // There has to be at least one frame for there to be a tag...
+ if (tag.NumFrames() == 0)
+ {
+ ID3D_WARNING( "id3::v2::render(): no frames to render" );
+ return;
+ }
+
+ ID3D_NOTICE( "id3::v2::render(): rendering" );
+ ID3_TagHeader hdr;
+ hdr.SetSpec(tag.GetSpec());
+ hdr.SetExtended(tag.GetExtended());
+ hdr.SetExperimental(tag.GetExperimental());
+ hdr.SetFooter(tag.GetFooter());
+
+ // set up the encryption and grouping IDs
+
+ // ...
+ String frms;
+ io::StringWriter frmWriter(frms);
+ if (!tag.GetUnsync())
+ {
+ ID3D_NOTICE( "id3::v2::render(): rendering frames" );
+ renderFrames(frmWriter, tag);
+ hdr.SetUnsync(false);
+ }
+ else
+ {
+ ID3D_NOTICE( "id3::v2::render(): rendering unsynced frames" );
+ io::UnsyncedWriter uw(frmWriter);
+ renderFrames(uw, tag);
+ uw.flush();
+ ID3D_NOTICE( "id3::v2::render(): numsyncs = " << uw.getNumSyncs() );
+ hdr.SetUnsync(uw.getNumSyncs() > 0);
+ }
+ size_t frmSize = frms.size();
+ if (frmSize == 0)
+ {
+ ID3D_WARNING( "id3::v2::render(): rendered frame size is 0 bytes" );
+ return;
+ }
+
+ // zero the remainder of the buffer so that our padding bytes are zero
+ luint nPadding = tag.PaddingSize(frmSize);
+ ID3D_NOTICE( "id3::v2::render(): padding size = " << nPadding );
+
+ hdr.SetDataSize(frmSize + tag.GetExtendedBytes() + nPadding);
+
+ hdr.Render(writer);
+
+ writer.writeChars(frms.data(), frms.size());
+
+ for (size_t i = 0; i < nPadding; ++i)
+ {
+ if (writer.writeChar('\0') == ID3_Writer::END_OF_WRITER)
+ {
+ break;
+ }
+ }
+}
+
+size_t ID3_TagImpl::Size() const
+{
+ if (this->NumFrames() == 0)
+ {
+ return 0;
+ }
+ ID3_TagHeader hdr;
+
+ hdr.SetSpec(this->GetSpec());
+ size_t bytesUsed = hdr.Size();
+
+ size_t frameBytes = 0;
+ for (const_iterator cur = _frames.begin(); cur != _frames.end(); ++cur)
+ {
+ if (*cur)
+ {
+ (*cur)->SetSpec(this->GetSpec());
+ frameBytes += (*cur)->Size();
+ }
+ }
+
+ if (!frameBytes)
+ {
+ return 0;
+ }
+
+ bytesUsed += frameBytes;
+ // add 30% for sync
+ if (this->GetUnsync())
+ {
+ bytesUsed += bytesUsed / 3;
+ }
+
+ bytesUsed += this->PaddingSize(bytesUsed);
+ return bytesUsed;
+}
+
+
+void ID3_TagImpl::RenderExtHeader(uchar *buffer)
+{
+ if (this->GetSpec() == ID3V2_3_0)
+ {
+ }
+
+ return ;
+}
+
+
+#define ID3_PADMULTIPLE (2048)
+#define ID3_PADMAX (4096)
+
+
+size_t ID3_TagImpl::PaddingSize(size_t curSize) const
+{
+ luint newSize = 0;
+
+ // if padding is switched off
+ if (! _is_padded)
+ {
+ return 0;
+ }
+
+ // if the old tag was large enough to hold the new tag, then we will simply
+ // pad out the difference - that way the new tag can be written without
+ // shuffling the rest of the song file around
+ if ((this->GetPrependedBytes()-ID3_TagHeader::SIZE > 0) &&
+ (this->GetPrependedBytes()-ID3_TagHeader::SIZE >= curSize) &&
+ (this->GetPrependedBytes()-ID3_TagHeader::SIZE - curSize) < ID3_PADMAX)
+ {
+ newSize = this->GetPrependedBytes()-ID3_TagHeader::SIZE;
+ }
+ else
+ {
+ luint tempSize = curSize + ID3_GetDataSize(*this) +
+ this->GetAppendedBytes() + ID3_TagHeader::SIZE;
+
+ // this method of automatic padding rounds the COMPLETE FILE up to the
+ // nearest 2K. If the file will already be an even multiple of 2K (with
+ // the tag included) then we just add another 2K of padding
+ tempSize = ((tempSize / ID3_PADMULTIPLE) + 1) * ID3_PADMULTIPLE;
+
+ // the size of the new tag is the new filesize minus the audio data
+ newSize = tempSize - ID3_GetDataSize(*this) - this->GetAppendedBytes () -
+ ID3_TagHeader::SIZE;
+ }
+
+ return newSize - curSize;
+}
+
diff --git a/src/utils.cpp b/src/utils.cpp
new file mode 100644
index 0000000..09f2c8d
--- /dev/null
+++ b/src/utils.cpp
@@ -0,0 +1,540 @@
+/*$off*/
+// $Id: utils.cpp,v 1.26 2002/07/02 22:04:36 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+/*$on*/
+#include <ctype.h>
+#include <errno.h>
+#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
+
+#if (defined(__GNUC__) && __GNUC__ == 2)
+#define NOCREATE ios::nocreate
+#else
+#define NOCREATE ((std::ios_base::openmode) 0)
+#endif
+#ifdef WIN32
+#include <windows.h>
+#else
+#define min(a, b) (a < b ? a : b)
+#endif
+using namespace dami;
+
+// ESL: The original code is complicated, but maybe supports a wider range of platforms? The changes hereafter
+// leverage Unicode utilities and known shortcuts between encodings.
+#include "../unicode.org/ConvertUTF.c"
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+inline bool _legalTagChar(int c)
+{
+ // NULL, TAB, CR, LF and anything higher or equal to space is legal
+ return !c || (c >= 0x20) || (c == 0x09) || (c == 0x0a) || (c == 0x0d);
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Utf8FromLatin1String(const char *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const unsigned char *src_buf = (const unsigned char *) input;
+ if(!src_buf || !src_sz) {
+ return convertedString;
+ }
+
+ // Allocate buffer and perform conversion. Since input is Latin1 it never expands to more than 2 octets
+ size_t dest_sz = src_sz * 2;
+ unsigned char *dest_buf = new unsigned char[dest_sz + 2];
+ unsigned char *dest_ptr = dest_buf;
+
+ int c = (int) *((const unsigned char *) src_buf);
+
+ while(c && src_sz--) {
+ if(c >= 128) {
+ *dest_ptr++ = (char) (((c & 0x7c0) >> 6) | 0xc0);
+ *dest_ptr++ = (char) ((c & 0x3f) | 0x80);
+ }
+ else if(!_legalTagChar(c)) {
+ *dest_ptr++ = '?';
+ }
+ else {
+ *dest_ptr++ = (char) c;
+ }
+
+ c = (int) *((const unsigned char *)++src_buf);
+ }
+
+ size_t length = dest_ptr - dest_buf;
+ if(length) {
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf);
+ }
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Utf8FromUtf16String(const unicode_t *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const UTF16 *src_buf = (const UTF16 *) input;
+ if(!src_buf || !src_sz || ((src_sz % 2) != 0)) {
+ return convertedString;
+ }
+
+ // allocate buffer and perform conversion. At most each UCS2 expands to 3 octets in UTF8, but since this is
+ // physical length in octet alreay
+ size_t dest_sz = (size_t) (((float) src_sz) * 1.5) + 1;
+ unsigned char *dest_buf = new unsigned char[dest_sz + 2];
+ unsigned char *dest_ptr = dest_buf;
+ ConversionResult result = ConvertUTF16toUTF8((const UTF16 **) &src_buf, ((const UTF16 *) src_buf) + (src_sz / sizeof(UTF16)), (UTF8 **) &dest_ptr,
+ ((UTF8 *) dest_buf) + dest_sz, strictConversion);
+
+ // On success set the string in _data
+ if(result == conversionOK) {
+ size_t length = dest_ptr - dest_buf; // physical length
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf);
+ }
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Latin1FromUtf8String(const char *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const unsigned char *src_buf = (const unsigned char *) input;
+ if(!src_buf || !src_sz) {
+ return convertedString;
+ }
+
+ // allocate buffer. The latin1 string will not be larger than the UTF-8 one
+ unsigned char *dest_buf = new unsigned char[src_sz + 2];
+ unsigned char *dest_ptr = dest_buf;
+
+ // perform conversion
+ int c = (int) *src_buf;
+ while(c && src_sz--) {
+ if(c >= 128) {
+ int c2 = (int) * ++src_buf;
+ if(!c2) {
+ break; // We reached the end of string
+ }
+
+ // conversion rule: 110yyyyy(C2-DF) 10zzzzzz(80-BF);
+ // However we really only care about 2 of the 'y'
+ *dest_ptr++ = (unsigned char) (((c & 0x3) << 6) + (c2 & 0x3F));
+
+ // Decrement counter since we consumed one more character
+ src_sz--;
+ }
+ else if(!_legalTagChar(c)) {
+ *dest_ptr++ = (unsigned char) '?';
+ }
+ else {
+ *dest_ptr++ = (unsigned char) c;
+ }
+
+ c = (int) * ++src_buf;
+ }
+
+ size_t length = dest_ptr - dest_buf;
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf);
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Latin1FromUtf16String(const unicode_t *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const UTF16 *src_buf = (const UTF16 *) input;
+ if(!src_buf || !src_sz || ((src_sz % 2) != 0)) {
+ return convertedString;
+ }
+
+ // Each UCS2 character hanles one Latin1 character. But takes half the physical space
+ size_t dest_sz = src_sz / sizeof(UTF16);
+ size_t length = src_sz / sizeof(UTF16);
+ unsigned char *dest_buf = new unsigned char[dest_sz + 2];
+ unsigned char *dest_ptr = dest_buf;
+ while(dest_sz--) {
+ unsigned char c = (unsigned char) (0x00FF & (*src_buf++));
+ if(!_legalTagChar(c)) {
+ *dest_ptr++ = '?';
+ }
+ else {
+ *dest_ptr++ = c;
+ }
+ }
+
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf);
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Utf16FromLatin1String(const char *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const unsigned char *src_buf = (const unsigned char *) input;
+ if(!src_buf || !src_sz) {
+ return convertedString;
+ }
+
+ // allocate the buffer
+ size_t length = src_sz * sizeof(UTF16);
+ unsigned char *dest_buf = new unsigned char[length + 2];
+ UTF16 *dest_ptr = (UTF16 *) dest_buf;
+ while(src_sz--) {
+ if(!_legalTagChar(*src_buf)) {
+ *dest_ptr++ = (UTF16) '?';
+ src_buf++;
+ }
+ else {
+ *dest_ptr++ = (UTF16) * src_buf++;
+ }
+ }
+
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf, length + 2);
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String Utf16FromUtf8String(const char *input, size_t src_sz)
+{
+ String convertedString("");
+
+ // check the input
+ const unsigned char *src_buf = (const unsigned char *) input;
+ if(!src_buf || !src_sz) {
+ return convertedString;
+ }
+
+ // allocate buffer and perform conversion
+ size_t dest_sz = src_sz;
+ unsigned char *dest_buf = new unsigned char[(dest_sz + 1) * sizeof(UTF16)];
+ unsigned char *dest_ptr = dest_buf;
+ ConversionResult result = ConvertUTF8toUTF16((const UTF8 **) &src_buf, (const UTF8 *) (src_buf + src_sz), (UTF16 **) &dest_ptr,
+ ((UTF16 *) dest_buf) + dest_sz, strictConversion);
+
+ // On success set the string in _data
+ if(result == conversionOK) {
+ size_t length = dest_ptr - dest_buf; // physical length
+ dest_buf[length] = dest_buf[length + 1] = '\0';
+ convertedString = String((const char *) dest_buf, length + 2);
+ }
+
+ delete[] dest_buf;
+ return convertedString;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+size_t dami::renderNumber(uchar *buffer, uint32 val, size_t size)
+{
+ uint32 num = val;
+ for(size_t i = 0; i < size; i++) {
+ buffer[size - i - 1] = (uchar) (num & MASK8);
+ num >>= 8;
+ }
+
+ return size;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+String dami::renderNumber(uint32 val, size_t size)
+{
+ String str(size, '\0');
+ uint32 num = val;
+ for(size_t i = 0; i < size; i++) {
+ str[size - i - 1] = (uchar) (num & MASK8);
+ num >>= 8;
+ }
+
+ return str;
+}
+
+// =====================================================================================================================
+// this should be convert( const String&, ...) to be changed soon...
+// =====================================================================================================================
+String dami::convert(String data, ID3_TextEnc sourceEnc, ID3_TextEnc targetEnc)
+{
+ if((sourceEnc == targetEnc) || (data.size() == 0)) {
+ return String(data);
+ }
+
+ switch(sourceEnc) {
+ case ID3TE_ISO8859_1:
+ {
+ size_t len = data.length();
+ if(targetEnc == ID3TE_UTF8) {
+ return Utf8FromLatin1String(data.c_str(), len);
+ }
+ else if(targetEnc == ID3TE_UTF16) {
+ return Utf16FromLatin1String(data.c_str(), len);
+ }
+ }
+
+ break;
+
+ case ID3TE_UTF8:
+ {
+ size_t len = data.length();
+ if(targetEnc == ID3TE_ISO8859_1) {
+ return Latin1FromUtf8String(data.c_str(), len);
+ }
+ else if(targetEnc == ID3TE_UTF16) {
+ return Utf16FromUtf8String(data.c_str(), len);
+ }
+ }
+
+ break;
+
+ case ID3TE_UTF16:
+ {
+ size_t len = ucslen((const unicode_t *) data.c_str()) * sizeof(unicode_t);
+ if(targetEnc == ID3TE_ISO8859_1) {
+ return Latin1FromUtf16String((unicode_t *) data.c_str(), len);
+ }
+ else if(targetEnc == ID3TE_UTF8) {
+ return Utf8FromUtf16String((unicode_t *) data.c_str(), len);
+ }
+ }
+
+ break;
+ }
+
+ return "";
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+size_t dami::ucslen(const unicode_t *unicode)
+{
+ if(NULL != unicode) {
+ for(size_t size = 0; true; size++) {
+ if(NULL_UNICODE == unicode[size]) {
+ return size;
+ }
+ }
+ }
+
+ return 0;
+}
+
+namespace
+{
+
+ /* =================================================================================================================
+ =================================================================================================================== */
+ bool exists(String name)
+ {
+ ifstream file(name.c_str(), NOCREATE);
+ return file.is_open() != 0;
+ }
+};
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+ID3_Err dami::createFile(String name, fstream &file)
+{
+ if(file.is_open()) {
+ file.close();
+ }
+
+ file.open(name.c_str(), ios::in | ios::out | ios::binary | ios::trunc);
+ if(!file) {
+ return ID3E_ReadOnly;
+ }
+
+ return ID3E_NoError;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+size_t dami::getFileSize(fstream &file)
+{
+ size_t size = 0;
+ if(file.is_open()) {
+ streamoff curpos = file.tellg();
+ file.seekg(0, ios::end);
+ size = file.tellg();
+ file.seekg(curpos);
+ }
+
+ return size;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+size_t dami::getFileSize(ifstream &file)
+{
+ size_t size = 0;
+ if(file.is_open()) {
+ streamoff curpos = file.tellg();
+ file.seekg(0, ios::end);
+ size = file.tellg();
+ file.seekg(curpos);
+ }
+
+ return size;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+size_t dami::getFileSize(ofstream &file)
+{
+ size_t size = 0;
+ if(file.is_open()) {
+ streamoff curpos = file.tellp();
+ file.seekp(0, ios::end);
+ size = file.tellp();
+ file.seekp(curpos);
+ }
+
+ return size;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+ID3_Err dami::openWritableFile(String name, fstream &file)
+{
+ if(!exists(name)) {
+ return ID3E_NoFile;
+ }
+
+ if(file.is_open()) {
+ file.close();
+ }
+
+ file.open(name.c_str(), ios::in | ios::out | ios::binary | NOCREATE);
+ if(!file) {
+ return ID3E_ReadOnly;
+ }
+
+ return ID3E_NoError;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+ID3_Err dami::openWritableFile(String name, ofstream &file)
+{
+ if(!exists(name)) {
+ return ID3E_NoFile;
+ }
+
+ if(file.is_open()) {
+ file.close();
+ }
+
+ file.open(name.c_str(), ios::in | ios::out | ios::binary | NOCREATE);
+ if(!file) {
+ return ID3E_ReadOnly;
+ }
+
+ return ID3E_NoError;
+}
+
+/* =====================================================================================================================
+ ======================================================================================================================= */
+ID3_Err dami::openReadableFile(String name, fstream &file)
+{
+ if(file.is_open()) {
+ file.close();
+ }
+
+ file.open(name.c_str(), ios::in | ios::binary | NOCREATE);
+ if(!file) {
+ return ID3E_NoFile;
+ }
+
+ return ID3E_NoError;
+}
+
+#ifdef WIN32
+ID3_Err dami:: openReadableFile(std::wstring name, ifstream &file)
+#else
+ID3_Err dami::openReadableFile(String name, ifstream &file)
+#endif
+{
+ if(file.is_open()) {
+ file.close();
+ }
+
+ file.open(name.c_str(), ios::in | ios::binary | NOCREATE);
+
+ if(!file) {
+ return ID3E_NoFile;
+ }
+
+ return ID3E_NoError;
+}
+
+// =====================================================================================================================
+// wow, did we really had to implement string by ourself (ralf)
+// =====================================================================================================================
+String dami::toString(uint32 val)
+{
+ if(val == 0) {
+ return "0";
+ }
+
+ String text;
+ while(val > 0) {
+ String tmp;
+ char ch = (val % 10) + '0';
+ tmp += ch;
+ text = tmp + text;
+ val /= 10;
+ }
+
+ return text;
+}
diff --git a/src/writers.cpp b/src/writers.cpp
new file mode 100644
index 0000000..8e9011e
--- /dev/null
+++ b/src/writers.cpp
@@ -0,0 +1,45 @@
+// $Id: writers.cpp,v 1.2 2002/06/29 17:37:42 t1mpy Exp $
+
+// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
+// Copyright 1999, 2000 Scott Thomas Haug
+
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Library General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or (at your
+// option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Library General Public License
+// along with this library; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+// The id3lib authors encourage improvements and optimisations to be sent to
+// the id3lib coordinator. Please see the README file for details on where to
+// send such submissions. See the AUTHORS file for a list of people who have
+// contributed to id3lib. See the ChangeLog file for a list of changes to
+// id3lib. These files are distributed with id3lib at
+// http://download.sourceforge.net/id3lib/
+
+#if defined HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "writers.h"
+
+//using namespace dami;
+
+/*
+ID3_Writer::size_type
+ID3_MemoryWriter::writeChars(const char_type buf[], size_type len)
+{
+ size_type size = ::min<size_type>(len, this->getEnd() - this->getCur());
+ ::memcpy(_cur, buf, size);
+ _cur += size;
+ return size;
+}
+*/
+
diff --git a/unicode.org/ConvertUTF.c b/unicode.org/ConvertUTF.c
new file mode 100644
index 0000000..9e836fa
--- /dev/null
+++ b/unicode.org/ConvertUTF.c
@@ -0,0 +1,549 @@
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ *
+ * Disclaimer
+ *
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ *
+ * Limitations on Rights to Redistribute This Code
+ *
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+/* ---------------------------------------------------------------------
+
+ Conversions between UTF32, UTF-16, and UTF-8. Source code file.
+ Author: Mark E. Davis, 1994.
+ Rev History: Rick McGowan, fixes & updates May 2001.
+ Sept 2001: fixed const & error conditions per
+ mods suggested by S. Parent & A. Lillich.
+ June 2002: Tim Dodd added detection and handling of incomplete
+ source sequences, enhanced error detection, added casts
+ to eliminate compiler warnings.
+ July 2003: slight mods to back out aggressive FFFE detection.
+ Jan 2004: updated switches in from-UTF8 conversions.
+ Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
+
+ See the header file "ConvertUTF.h" for complete documentation.
+
+------------------------------------------------------------------------ */
+
+
+#include "ConvertUTF.h"
+#ifdef CVTUTF_DEBUG
+#include <stdio.h>
+#endif
+
+static const int halfShift = 10; /* used for shifting by 10 bits */
+
+static const UTF32 halfBase = 0x0010000UL;
+static const UTF32 halfMask = 0x3FFUL;
+
+#define UNI_SUR_HIGH_START (UTF32)0xD800
+#define UNI_SUR_HIGH_END (UTF32)0xDBFF
+#define UNI_SUR_LOW_START (UTF32)0xDC00
+#define UNI_SUR_LOW_END (UTF32)0xDFFF
+#define false 0
+#define true 1
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF32toUTF16 (
+ const UTF32** sourceStart, const UTF32* sourceEnd,
+ UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF32* source = *sourceStart;
+ UTF16* target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ if (target >= targetEnd) {
+ result = targetExhausted; break;
+ }
+ ch = *source++;
+ if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
+ /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = (UTF16)ch; /* normal case */
+ }
+ } else if (ch > UNI_MAX_LEGAL_UTF32) {
+ if (flags == strictConversion) {
+ result = sourceIllegal;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ /* target is a character in range 0xFFFF - 0x10FFFF. */
+ if (target + 1 >= targetEnd) {
+ --source; /* Back up source pointer! */
+ result = targetExhausted; break;
+ }
+ ch -= halfBase;
+ *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
+ *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF16toUTF32 (
+ const UTF16** sourceStart, const UTF16* sourceEnd,
+ UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF16* source = *sourceStart;
+ UTF32* target = *targetStart;
+ UTF32 ch, ch2;
+ while (source < sourceEnd) {
+ const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
+ ch = *source++;
+ /* If we have a surrogate pair, convert to UTF32 first. */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
+ /* If the 16 bits following the high surrogate are in the source buffer... */
+ if (source < sourceEnd) {
+ ch2 = *source;
+ /* If it's a low surrogate, convert to UTF32. */
+ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
+ ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
+ + (ch2 - UNI_SUR_LOW_START) + halfBase;
+ ++source;
+ } else if (flags == strictConversion) { /* it's an unpaired high surrogate */
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ } else { /* We don't have the 16 bits following the high surrogate. */
+ --source; /* return to the high surrogate */
+ result = sourceExhausted;
+ break;
+ }
+ } else if (flags == strictConversion) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+ if (target >= targetEnd) {
+ source = oldSource; /* Back up source pointer! */
+ result = targetExhausted; break;
+ }
+ *target++ = ch;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+#ifdef CVTUTF_DEBUG
+if (result == sourceIllegal) {
+ fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
+ fflush(stderr);
+}
+#endif
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Index into the table below with the first byte of a UTF-8 sequence to
+ * get the number of trailing bytes that are supposed to follow it.
+ * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
+ * left as-is for anyone who may want to do such conversion, which was
+ * allowed in earlier algorithms.
+ */
+static const char trailingBytesForUTF8[256] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
+};
+
+/*
+ * Magic values subtracted from a buffer value during UTF8 conversion.
+ * This table contains as many values as there might be trailing bytes
+ * in a UTF-8 sequence.
+ */
+static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
+ 0x03C82080UL, 0xFA082080UL, 0x82082080UL };
+
+/*
+ * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
+ * into the first byte, depending on how many bytes follow. There are
+ * as many entries in this table as there are UTF-8 sequence types.
+ * (I.e., one byte sequence, two byte... etc.). Remember that sequencs
+ * for *legal* UTF-8 will be 4 or fewer bytes total.
+ */
+static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+
+/* --------------------------------------------------------------------- */
+
+/* The interface converts a whole buffer to avoid function-call overhead.
+ * Constants have been gathered. Loops & conditionals have been removed as
+ * much as possible for efficiency, in favor of drop-through switches.
+ * (See "Note A" at the bottom of the file for equivalent code.)
+ * If your compiler supports it, the "isLegalUTF8" call can be turned
+ * into an inline function.
+ */
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF16toUTF8 (
+ const UTF16** sourceStart, const UTF16* sourceEnd,
+ UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF16* source = *sourceStart;
+ UTF8* target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ unsigned short bytesToWrite = 0;
+ const UTF32 byteMask = 0xBF;
+ const UTF32 byteMark = 0x80;
+ const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
+ ch = *source++;
+ /* If we have a surrogate pair, convert to UTF32 first. */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
+ /* If the 16 bits following the high surrogate are in the source buffer... */
+ if (source < sourceEnd) {
+ UTF32 ch2 = *source;
+ /* If it's a low surrogate, convert to UTF32. */
+ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
+ ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
+ + (ch2 - UNI_SUR_LOW_START) + halfBase;
+ ++source;
+ } else if (flags == strictConversion) { /* it's an unpaired high surrogate */
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ } else { /* We don't have the 16 bits following the high surrogate. */
+ --source; /* return to the high surrogate */
+ result = sourceExhausted;
+ break;
+ }
+ } else if (flags == strictConversion) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+
+ // TPN: substitute all control characters except for NULL, TAB, LF or CR
+ if (ch && (ch != (UTF32)0x09) && (ch != (UTF32)0x0a) && (ch != (UTF32)0x0d) && (ch < (UTF32)0x20) ) {
+ ch = (UTF32)0x3f;
+ }
+ // TPN: filter out byte order marks and invalid character 0xFFFF
+ if((ch == (UTF32)0xFEFF) || (ch == (UTF32)0xFFFE)|| (ch == (UTF32)0xFFFF)) {
+ continue;
+ }
+
+ /* Figure out how many bytes the result will require */
+ if (ch < (UTF32)0x80) { bytesToWrite = 1;
+ } else if (ch < (UTF32)0x800) { bytesToWrite = 2;
+ } else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
+ } else if (ch < (UTF32)0x110000) { bytesToWrite = 4;
+ } else { bytesToWrite = 3;
+ ch = UNI_REPLACEMENT_CHAR;
+ }
+
+ target += bytesToWrite;
+ if (target > targetEnd) {
+ source = oldSource; /* Back up source pointer! */
+ target -= bytesToWrite; result = targetExhausted; break;
+ }
+ switch (bytesToWrite) { /* note: everything falls through. */
+ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
+ }
+ target += bytesToWrite;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Utility routine to tell whether a sequence of bytes is legal UTF-8.
+ * This must be called with the length pre-determined by the first byte.
+ * If not calling this from ConvertUTF8to*, then the length can be set by:
+ * length = trailingBytesForUTF8[*source]+1;
+ * and the sequence is illegal right away if there aren't that many bytes
+ * available.
+ * If presented with a length > 4, this returns false. The Unicode
+ * definition of UTF-8 goes up to 4-byte sequences.
+ */
+
+inline Boolean isLegalUTF8(const UTF8 *source, int length) {
+ UTF8 a;
+ const UTF8 *srcptr = source+length;
+ switch (length) {
+ default: return false;
+ /* Everything else falls through when "true"... */
+ case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
+ case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
+ case 2: if ((a = (*--srcptr)) > 0xBF) return false;
+
+ switch (*source) {
+ /* no fall-through in this inner switch */
+ case 0xE0: if (a < 0xA0) return false; break;
+ case 0xED: if (a > 0x9F) return false; break;
+ case 0xF0: if (a < 0x90) return false; break;
+ case 0xF4: if (a > 0x8F) return false; break;
+ default: if (a < 0x80) return false;
+ }
+
+ case 1: if (*source >= 0x80 && *source < 0xC2) return false;
+ }
+ if (*source > 0xF4) return false;
+ return true;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Exported function to return whether a UTF-8 sequence is legal or not.
+ * This is not used here; it's just exported.
+ */
+Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
+ int length = trailingBytesForUTF8[*source]+1;
+ if (source+length > sourceEnd) {
+ return false;
+ }
+ return isLegalUTF8(source, length);
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF8toUTF16 (
+ const UTF8** sourceStart, const UTF8* sourceEnd,
+ UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF8* source = *sourceStart;
+ UTF16* target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch = 0;
+ unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
+ if (source + extraBytesToRead >= sourceEnd) {
+ result = sourceExhausted; break;
+ }
+ /* Do this check whether lenient or strict */
+ if (! isLegalUTF8(source, extraBytesToRead+1)) {
+ result = sourceIllegal;
+ break;
+ }
+ /*
+ * The cases all fall through. See "Note A" below.
+ */
+ switch (extraBytesToRead) {
+ case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
+ case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
+ case 3: ch += *source++; ch <<= 6;
+ case 2: ch += *source++; ch <<= 6;
+ case 1: ch += *source++; ch <<= 6;
+ case 0: ch += *source++;
+ }
+ ch -= offsetsFromUTF8[extraBytesToRead];
+
+ if (target >= targetEnd) {
+ source -= (extraBytesToRead+1); /* Back up source pointer! */
+ result = targetExhausted; break;
+ }
+ if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ source -= (extraBytesToRead+1); /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = (UTF16)ch; /* normal case */
+ }
+ } else if (ch > UNI_MAX_UTF16) {
+ if (flags == strictConversion) {
+ result = sourceIllegal;
+ source -= (extraBytesToRead+1); /* return to the start */
+ break; /* Bail out; shouldn't continue */
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ /* target is a character in range 0xFFFF - 0x10FFFF. */
+ if (target + 1 >= targetEnd) {
+ source -= (extraBytesToRead+1); /* Back up source pointer! */
+ result = targetExhausted; break;
+ }
+ ch -= halfBase;
+ *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
+ *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF32toUTF8 (
+ const UTF32** sourceStart, const UTF32* sourceEnd,
+ UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF32* source = *sourceStart;
+ UTF8* target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ unsigned short bytesToWrite = 0;
+ const UTF32 byteMask = 0xBF;
+ const UTF32 byteMark = 0x80;
+ ch = *source++;
+ if (flags == strictConversion ) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+ /*
+ * Figure out how many bytes the result will require. Turn any
+ * illegally large UTF32 things (> Plane 17) into replacement chars.
+ */
+ if (ch < (UTF32)0x80) { bytesToWrite = 1;
+ } else if (ch < (UTF32)0x800) { bytesToWrite = 2;
+ } else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
+ } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4;
+ } else { bytesToWrite = 3;
+ ch = UNI_REPLACEMENT_CHAR;
+ result = sourceIllegal;
+ }
+
+ target += bytesToWrite;
+ if (target > targetEnd) {
+ --source; /* Back up source pointer! */
+ target -= bytesToWrite; result = targetExhausted; break;
+ }
+ switch (bytesToWrite) { /* note: everything falls through. */
+ case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
+ case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);
+ }
+ target += bytesToWrite;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult ConvertUTF8toUTF32 (
+ const UTF8** sourceStart, const UTF8* sourceEnd,
+ UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
+ ConversionResult result = conversionOK;
+ const UTF8* source = *sourceStart;
+ UTF32* target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch = 0;
+ unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
+ if (source + extraBytesToRead >= sourceEnd) {
+ result = sourceExhausted; break;
+ }
+ /* Do this check whether lenient or strict */
+ if (! isLegalUTF8(source, extraBytesToRead+1)) {
+ result = sourceIllegal;
+ break;
+ }
+ /*
+ * The cases all fall through. See "Note A" below.
+ */
+ switch (extraBytesToRead) {
+ case 5: ch += *source++; ch <<= 6;
+ case 4: ch += *source++; ch <<= 6;
+ case 3: ch += *source++; ch <<= 6;
+ case 2: ch += *source++; ch <<= 6;
+ case 1: ch += *source++; ch <<= 6;
+ case 0: ch += *source++;
+ }
+ ch -= offsetsFromUTF8[extraBytesToRead];
+
+ if (target >= targetEnd) {
+ source -= (extraBytesToRead+1); /* Back up the source pointer! */
+ result = targetExhausted; break;
+ }
+ if (ch <= UNI_MAX_LEGAL_UTF32) {
+ /*
+ * UTF-16 surrogate values are illegal in UTF-32, and anything
+ * over Plane 17 (> 0x10FFFF) is illegal.
+ */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ source -= (extraBytesToRead+1); /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = ch;
+ }
+ } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
+ result = sourceIllegal;
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* ---------------------------------------------------------------------
+
+ Note A.
+ The fall-through switches in UTF-8 reading code save a
+ temp variable, some decrements & conditionals. The switches
+ are equivalent to the following loop:
+ {
+ int tmpBytesToRead = extraBytesToRead+1;
+ do {
+ ch += *source++;
+ --tmpBytesToRead;
+ if (tmpBytesToRead) ch <<= 6;
+ } while (tmpBytesToRead > 0);
+ }
+ In UTF-8 writing code, the switches on "bytesToWrite" are
+ similarly unrolled loops.
+
+ --------------------------------------------------------------------- */
diff --git a/unicode.org/ConvertUTF.h b/unicode.org/ConvertUTF.h
new file mode 100644
index 0000000..e264915
--- /dev/null
+++ b/unicode.org/ConvertUTF.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ *
+ * Disclaimer
+ *
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ *
+ * Limitations on Rights to Redistribute This Code
+ *
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+/* ---------------------------------------------------------------------
+
+ Conversions between UTF32, UTF-16, and UTF-8. Header file.
+
+ Several funtions are included here, forming a complete set of
+ conversions between the three formats. UTF-7 is not included
+ here, but is handled in a separate source file.
+
+ Each of these routines takes pointers to input buffers and output
+ buffers. The input buffers are const.
+
+ Each routine converts the text between *sourceStart and sourceEnd,
+ putting the result into the buffer between *targetStart and
+ targetEnd. Note: the end pointers are *after* the last item: e.g.
+ *(sourceEnd - 1) is the last item.
+
+ The return result indicates whether the conversion was successful,
+ and if not, whether the problem was in the source or target buffers.
+ (Only the first encountered problem is indicated.)
+
+ After the conversion, *sourceStart and *targetStart are both
+ updated to point to the end of last text successfully converted in
+ the respective buffers.
+
+ Input parameters:
+ sourceStart - pointer to a pointer to the source buffer.
+ The contents of this are modified on return so that
+ it points at the next thing to be converted.
+ targetStart - similarly, pointer to pointer to the target buffer.
+ sourceEnd, targetEnd - respectively pointers to the ends of the
+ two buffers, for overflow checking only.
+
+ These conversion functions take a ConversionFlags argument. When this
+ flag is set to strict, both irregular sequences and isolated surrogates
+ will cause an error. When the flag is set to lenient, both irregular
+ sequences and isolated surrogates are converted.
+
+ Whether the flag is strict or lenient, all illegal sequences will cause
+ an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
+ or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
+ must check for illegal sequences.
+
+ When the flag is set to lenient, characters over 0x10FFFF are converted
+ to the replacement character; otherwise (when the flag is set to strict)
+ they constitute an error.
+
+ Output parameters:
+ The value "sourceIllegal" is returned from some routines if the input
+ sequence is malformed. When "sourceIllegal" is returned, the source
+ value will point to the illegal value that caused the problem. E.g.,
+ in UTF-8 when a sequence is malformed, it points to the start of the
+ malformed sequence.
+
+ Author: Mark E. Davis, 1994.
+ Rev History: Rick McGowan, fixes & updates May 2001.
+ Fixes & updates, Sept 2001.
+
+------------------------------------------------------------------------ */
+
+/* ---------------------------------------------------------------------
+ The following 4 definitions are compiler-specific.
+ The C standard does not guarantee that wchar_t has at least
+ 16 bits, so wchar_t is no less portable than unsigned short!
+ All should be unsigned values to avoid sign extension during
+ bit mask & shift operations.
+------------------------------------------------------------------------ */
+
+typedef unsigned long UTF32; /* at least 32 bits */
+typedef unsigned short UTF16; /* at least 16 bits */
+typedef unsigned char UTF8; /* typically 8 bits */
+typedef unsigned char Boolean; /* 0 or 1 */
+
+/* Some fundamental constants */
+#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
+#define UNI_MAX_BMP (UTF32)0x0000FFFF
+#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
+#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
+#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
+
+typedef enum {
+ conversionOK, /* conversion successful */
+ sourceExhausted, /* partial character in source, but hit end */
+ targetExhausted, /* insuff. room in target for conversion */
+ sourceIllegal /* source sequence is illegal/malformed */
+} ConversionResult;
+
+typedef enum {
+ strictConversion = 0,
+ lenientConversion
+} ConversionFlags;
+
+/* This is for C++ and does no harm in C */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ConversionResult ConvertUTF8toUTF16 (
+ const UTF8** sourceStart, const UTF8* sourceEnd,
+ UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
+
+ConversionResult ConvertUTF16toUTF8 (
+ const UTF16** sourceStart, const UTF16* sourceEnd,
+ UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
+
+ConversionResult ConvertUTF8toUTF32 (
+ const UTF8** sourceStart, const UTF8* sourceEnd,
+ UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
+
+ConversionResult ConvertUTF32toUTF8 (
+ const UTF32** sourceStart, const UTF32* sourceEnd,
+ UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
+
+ConversionResult ConvertUTF16toUTF32 (
+ const UTF16** sourceStart, const UTF16* sourceEnd,
+ UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
+
+ConversionResult ConvertUTF32toUTF16 (
+ const UTF32** sourceStart, const UTF32* sourceEnd,
+ UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
+
+Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/unicode.org/readme.txt b/unicode.org/readme.txt
new file mode 100644
index 0000000..78dcd9f
--- /dev/null
+++ b/unicode.org/readme.txt
@@ -0,0 +1,44 @@
+NOTE: Code downloaded from http://www.unicode.org
+
+The accompanying C source code file "ConvertUTF.c" and the associated header
+file "ConvertUTF.h" provide for conversion between various transformation
+formats of Unicode characters. The following conversions are supported:
+
+ UTF-32 to UTF-16
+ UTF-32 to UTF-8
+ UTF-16 to UTF-32
+ UTF-16 to UTF-8
+ UTF-8 to UTF-16
+ UTF-8 to UTF-32
+
+In addition, there is a test harness which runs various tests.
+
+The files "CVTUTF7.C" and "CVTUTF7.H" are for archival and historical purposes
+only. They have not been updated to Unicode 3.0 or later and should be
+considered obsolescent. "CVTUTF7.C" contains two functions that can convert
+between UCS2 (i.e., the BMP characters only) and UTF-7. Surrogates are
+not supported, the code has not been tested, and should be considered
+unsuitable for general purpose use.
+
+Please submit any bug reports about these programs here:
+
+ http://www.unicode.org/unicode/reporting.html
+
+Version 1.0: initial version.
+
+Version 1.1: corrected some minor problems; added stricter checks.
+
+Version 1.2: corrected switch statements associated with "extraBytesToRead"
+ in 4 & 5 byte cases, in functions for conversion from UTF8.
+ Note: formally, the 4 & 5 byte cases are illegal in the latest
+ UTF8, but the table and this code has always catered for those,
+ cases since at one time they were legal.
+
+Version 1.3: Updated UTF-8 legality check;
+ updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions
+ Updated UTF-8 legality tests in harness.c
+
+
+Last update: October 19, 2004
+
+